class FontSizeTranslator {

    public float translateFontSize(final Tag tag) {
        float size = Font.UNDEFINED;
        if (tag.getCSS().get(CSS.Property.FONT_SIZE) != null) {
            String value = tag.getCSS().get(CSS.Property.FONT_SIZE);
            if (value.equalsIgnoreCase(CSS.Value.XX_SMALL)) {
                size = 6.75f;
            } else if (value.equalsIgnoreCase(CSS.Value.X_SMALL)) {
                size = 7.5f;
            } else if (value.equalsIgnoreCase(CSS.Value.SMALL)) {
                size = 9.75f;
            } else if (value.equalsIgnoreCase(CSS.Value.MEDIUM)) {
                size = 12f;
            } else if (value.equalsIgnoreCase(CSS.Value.LARGE)) {
                size = 13.5f;
            } else if (value.equalsIgnoreCase(CSS.Value.X_LARGE)) {
                size = 18f;
            } else if (value.equalsIgnoreCase(CSS.Value.XX_LARGE)) {
                size = 24f;
            } else if (value.equalsIgnoreCase(CSS.Value.SMALLER)) {
                if (tag.getParent() != null) {
                    float parentSize =
                        getFontSize(tag.getParent()); // if the font-size of the parent can be set in some memory the translation part is not needed anymore.
                    if (parentSize == Font.UNDEFINED) {
                        size = 9.75f;
                    } else if (parentSize <= 6.75f) {
                        size = parentSize - 1;
                    } else if (parentSize == 7.5f) {
                        size = 6.75f;
                    } else if (parentSize == 9.75f) {
                        size = 7.5f;
                    } else if (parentSize == 12f) {
                        size = 9.75f;
                    } else if (parentSize == 13.5f) {
                        size = 12f;
                    } else if (parentSize == 18f) {
                        size = 13.5f;
                    } else if (parentSize == 24f) {
                        size = 18f;
                    } else if (parentSize < 24f) {
                        size = parentSize * 0.85f;
                    } else if (parentSize >= 24) {
                        size = parentSize * 2 / 3;
                    }
                } else {
                    size = 9.75f;
                }
            } else if (value.equalsIgnoreCase(CSS.Value.LARGER)) {
                if (tag.getParent() != null) {
                    float parentSize = getFontSize(tag.getParent()); // if the font-size of the parent can be set in some memory the translation part is not needed anymore.
                    if (parentSize == Font.UNDEFINED) {
                        size = 13.5f;
                    } else if (parentSize == 6.75f) {
                        size = 7.5f;
                    } else if (parentSize == 7.5f) {
                        size = 9.75f;
                    } else if (parentSize == 9.75f) {
                        size = 12f;
                    } else if (parentSize == 12f) {
                        size = 13.5f;
                    } else if (parentSize == 13.5f) {
                        size = 18f;
                    } else if (parentSize == 18f) {
                        size = 24f;
                    } else {
                        size = parentSize * 1.5f;
                    }
                } else {
                    size = 13.5f;
                }
            } else if (utils.isMetricValue(value) || utils.isNumericValue(value)) {
                size = utils.parsePxInCmMmPcToPt(value);
            } else if (utils.isRelativeValue(value)) {
                float baseValue = Font.UNDEFINED;
                if (tag.getParent() != null) {
                    baseValue = getFontSize(tag.getParent());
                }
                if (baseValue == Font.UNDEFINED) {
                    baseValue = 12;
                }
                size = utils.parseRelativeValue(value, baseValue);
            }
        }
        return size;
    }

}