Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix little refactoring of css applier util and continue it #7

Open
wants to merge 4 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,9 @@ This file is part of the iText (R) project.

import com.itextpdf.html2pdf.attach.ProcessorContext;
import com.itextpdf.html2pdf.css.CssConstants;
import com.itextpdf.html2pdf.css.apply.util.enums.BorderEnum;
import com.itextpdf.html2pdf.css.apply.util.enums.BorderRadii;
import com.itextpdf.html2pdf.css.apply.util.enums.RgbaColorProperty;
import com.itextpdf.kernel.colors.ColorConstants;
import com.itextpdf.kernel.colors.DeviceRgb;
import com.itextpdf.layout.IPropertyContainer;
Expand All @@ -63,6 +66,7 @@ This file is part of the iText (R) project.
import com.itextpdf.styledxmlparser.css.util.CssDimensionParsingUtils;

import java.util.Map;
import java.util.Objects;

/**
* Utilities class to apply border styles.
Expand All @@ -86,39 +90,8 @@ public static void applyBorders(Map<String, String> cssProps, ProcessorContext c
float em = CssDimensionParsingUtils.parseAbsoluteLength(cssProps.get(CssConstants.FONT_SIZE));
float rem = context.getCssContext().getRootFontSize();

Border[] bordersArray = getBordersArray(cssProps, em, rem);
if (bordersArray[0] != null) {
element.setProperty(Property.BORDER_TOP, bordersArray[0]);
}

if (bordersArray[1] != null) {
element.setProperty(Property.BORDER_RIGHT, bordersArray[1]);
}

if (bordersArray[2] != null) {
element.setProperty(Property.BORDER_BOTTOM, bordersArray[2]);
}

if (bordersArray[3] != null) {
element.setProperty(Property.BORDER_LEFT, bordersArray[3]);
}

BorderRadius[] borderRadii = getBorderRadiiArray(cssProps, em, rem);
if (borderRadii[0] != null) {
element.setProperty(Property.BORDER_TOP_LEFT_RADIUS, borderRadii[0]);
}

if (borderRadii[1] != null) {
element.setProperty(Property.BORDER_TOP_RIGHT_RADIUS, borderRadii[1]);
}

if (borderRadii[2] != null) {
element.setProperty(Property.BORDER_BOTTOM_RIGHT_RADIUS, borderRadii[2]);
}

if (borderRadii[3] != null) {
element.setProperty(Property.BORDER_BOTTOM_LEFT_RADIUS, borderRadii[3]);
}
setBorderProperties(cssProps, element, em, rem);
setBorderRadiusProperties(cssProps, element, em, rem);
}

/**
Expand All @@ -131,21 +104,14 @@ public static void applyBorders(Map<String, String> cssProps, ProcessorContext c
*/
public static Border[] getBordersArray(Map<String, String> styles, float em, float rem) {
Border[] borders = new Border[4];
Border topBorder = getCertainBorder(styles.get(CssConstants.BORDER_TOP_WIDTH),
styles.get(CssConstants.BORDER_TOP_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_TOP_COLOR), em, rem);
borders[0] = topBorder;

Border rightBorder = getCertainBorder(styles.get(CssConstants.BORDER_RIGHT_WIDTH),
styles.get(CssConstants.BORDER_RIGHT_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_RIGHT_COLOR), em, rem);
borders[1] = rightBorder;

Border bottomBorder = getCertainBorder(styles.get(CssConstants.BORDER_BOTTOM_WIDTH),
styles.get(CssConstants.BORDER_BOTTOM_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_BOTTOM_COLOR), em, rem);
borders[2] = bottomBorder;

Border leftBorder = getCertainBorder(styles.get(CssConstants.BORDER_LEFT_WIDTH),
styles.get(CssConstants.BORDER_LEFT_STYLE), getSpecificBorderColorOrDefaultColor(styles, CssConstants.BORDER_LEFT_COLOR), em, rem);
borders[3] = leftBorder;
borders[BorderEnum.TOP.ordinal()] = getCertainBorder(CssConstants.BORDER_TOP_WIDTH, CssConstants.BORDER_TOP_STYLE,
CssConstants.BORDER_TOP_COLOR, em, rem, styles);
borders[BorderEnum.RIGHT.ordinal()] = getCertainBorder(CssConstants.BORDER_RIGHT_WIDTH, CssConstants.BORDER_RIGHT_STYLE,
CssConstants.BORDER_RIGHT_COLOR, em, rem, styles);
borders[BorderEnum.BOTTOM.ordinal()] = getCertainBorder(CssConstants.BORDER_BOTTOM_WIDTH, CssConstants.BORDER_BOTTOM_STYLE,
CssConstants.BORDER_BOTTOM_COLOR, em, rem, styles);
borders[BorderEnum.LEFT.ordinal()] = getCertainBorder(CssConstants.BORDER_LEFT_WIDTH, CssConstants.BORDER_LEFT_STYLE,
CssConstants.BORDER_LEFT_COLOR, em, rem, styles);

return borders;
}
Expand All @@ -161,30 +127,31 @@ public static Border[] getBordersArray(Map<String, String> styles, float em, flo
* @return the border
*/
public static Border getCertainBorder(String borderWidth, String borderStyle, String borderColor, float em, float rem) {
if (borderStyle == null || CssConstants.NONE.equals(borderStyle)) {
if (Objects.isNull(borderStyle) || CssConstants.NONE.equals(borderStyle)) {
return null;
}

if (borderWidth == null) {
if (Objects.isNull(borderWidth)) {
borderWidth = CssDefaults.getDefaultValue(CssConstants.BORDER_WIDTH);
}

float borderWidthValue;
if (CssConstants.BORDER_WIDTH_VALUES.contains(borderWidth)) {
if (CssConstants.THIN.equals(borderWidth)) {
borderWidth = "1px";
} else if (CssConstants.MEDIUM.equals(borderWidth)) {
borderWidth = "2px";
} else if (CssConstants.THICK.equals(borderWidth)) {
borderWidth = "3px";
switch (borderWidth) {
case CssConstants.THIN:
borderWidth = "1px";
break;
case CssConstants.MEDIUM:
borderWidth = "2px";
break;
case CssConstants.THICK:
borderWidth = "3px";
break;
}
}

UnitValue unitValue = CssDimensionParsingUtils.parseLengthValueToPt(borderWidth, em, rem);
if (unitValue == null) {
return null;
}
if (unitValue.isPercentValue()) {
if (Objects.isNull(unitValue) || unitValue.isPercentValue()) {
return null;
}

Expand All @@ -196,48 +163,46 @@ public static Border getCertainBorder(String borderWidth, String borderStyle, St
if (borderColor != null) {
if (!CssConstants.TRANSPARENT.equals(borderColor)) {
float[] rgbaColor = CssDimensionParsingUtils.parseRgbaColor(borderColor);
color = new DeviceRgb(rgbaColor[0], rgbaColor[1], rgbaColor[2]);
opacity = rgbaColor[3];
color = new DeviceRgb(rgbaColor[
RgbaColorProperty.RED.ordinal()],
rgbaColor[RgbaColorProperty.GREEN.ordinal()],
rgbaColor[RgbaColorProperty.BLUE.ordinal()]);
opacity = rgbaColor[RgbaColorProperty.ALPHA.ordinal()];
} else {
opacity = 0f;
}
} else if (CssConstants.GROOVE.equals(borderStyle) || CssConstants.RIDGE.equals(borderStyle)
|| CssConstants.INSET.equals(borderStyle) || CssConstants.OUTSET.equals(borderStyle)) {
color = new DeviceRgb(212, 208, 200);
}
switch (borderStyle) {
case CssConstants.SOLID:
border = new SolidBorder(color, borderWidthValue, opacity);
break;
case CssConstants.DASHED:
border = new DashedBorder(color, borderWidthValue, opacity);
break;
case CssConstants.DOTTED:
border = new RoundDotsBorder(color, borderWidthValue, opacity);
break;
case CssConstants.DOUBLE:
border = new DoubleBorder(color, borderWidthValue, opacity);
break;
case CssConstants.GROOVE:
border = new GrooveBorder(color, borderWidthValue, opacity);
break;
case CssConstants.RIDGE:
border = new RidgeBorder(color, borderWidthValue, opacity);
break;
case CssConstants.INSET:
border = new InsetBorder(color, borderWidthValue, opacity);
break;
case CssConstants.OUTSET:
border = new OutsetBorder(color, borderWidthValue, opacity);
break;
default:
border = null;
break;
}
border = getBorder(borderStyle, borderWidthValue, color, opacity);
}
return border;
}

private static Border getBorder(String borderStyle, float borderWidthValue, DeviceRgb color, float opacity) {
switch (borderStyle) {
case CssConstants.SOLID:
return new SolidBorder(color, borderWidthValue, opacity);
case CssConstants.DASHED:
return new DashedBorder(color, borderWidthValue, opacity);
case CssConstants.DOTTED:
return new RoundDotsBorder(color, borderWidthValue, opacity);
case CssConstants.DOUBLE:
return new DoubleBorder(color, borderWidthValue, opacity);
case CssConstants.GROOVE:
return new GrooveBorder(color, borderWidthValue, opacity);
case CssConstants.RIDGE:
return new RidgeBorder(color, borderWidthValue, opacity);
case CssConstants.INSET:
return new InsetBorder(color, borderWidthValue, opacity);
case CssConstants.OUTSET:
return new OutsetBorder(color, borderWidthValue, opacity);
default:
return null;
}
}

/**
* Gets the array that defines the borders.
*
Expand All @@ -252,30 +217,17 @@ public static BorderRadius[] getBorderRadiiArray(Map<String, String> styles, flo
BorderRadius borderRadius = null;
UnitValue borderRadiusUV = CssDimensionParsingUtils
.parseLengthValueToPt(styles.get(CssConstants.BORDER_RADIUS), em, rem);
if (null != borderRadiusUV) {
if (Objects.nonNull(borderRadiusUV)) {
borderRadius = new BorderRadius(borderRadiusUV);
}

UnitValue[] borderTopLeftRadiusUV = CssDimensionParsingUtils
.parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_TOP_LEFT_RADIUS), em, rem);
borderRadii[0] = null == borderTopLeftRadiusUV
? borderRadius
: new BorderRadius(borderTopLeftRadiusUV[0], borderTopLeftRadiusUV[1]);
UnitValue[] borderTopRightRadiusUV = CssDimensionParsingUtils
.parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_TOP_RIGHT_RADIUS), em, rem);
borderRadii[1] = null == borderTopRightRadiusUV
? borderRadius
: new BorderRadius(borderTopRightRadiusUV[0], borderTopRightRadiusUV[1]);
UnitValue[] borderBottomRightRadiusUV = CssDimensionParsingUtils
.parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_BOTTOM_RIGHT_RADIUS), em, rem);
borderRadii[2] = null == borderBottomRightRadiusUV
? borderRadius
: new BorderRadius(borderBottomRightRadiusUV[0], borderBottomRightRadiusUV[1]);
UnitValue[] borderBottomLeftRadiusUV = CssDimensionParsingUtils
.parseSpecificCornerBorderRadius(styles.get(CssConstants.BORDER_BOTTOM_LEFT_RADIUS), em, rem);
borderRadii[3] = null == borderBottomLeftRadiusUV
? borderRadius
: new BorderRadius(borderBottomLeftRadiusUV[0], borderBottomLeftRadiusUV[1]);
borderRadii[BorderRadii.TOP_LEFT.ordinal()] = getBorderRadius(CssConstants.BORDER_TOP_LEFT_RADIUS,
borderRadius, em, rem, styles);
borderRadii[BorderRadii.TOP_RIGHT.ordinal()] = getBorderRadius(CssConstants.BORDER_TOP_RIGHT_RADIUS,
borderRadius, em, rem, styles);
borderRadii[BorderRadii.BOTTOM_RIGHT.ordinal()] = getBorderRadius(CssConstants.BORDER_BOTTOM_RIGHT_RADIUS,
borderRadius, em, rem, styles);
borderRadii[BorderRadii.BOTTOM_LEFT.ordinal()] = getBorderRadius(CssConstants.BORDER_BOTTOM_LEFT_RADIUS,
borderRadius, em, rem, styles);

return borderRadii;
}
Expand All @@ -288,4 +240,54 @@ private static String getSpecificBorderColorOrDefaultColor(Map<String, String> s
return borderColor;
}

private static Border getCertainBorder(String widthConstant, String styleConstant, String colorConstant,
float em, float rem, Map<String, String> styles) {
String widthCssValue = styles.get(widthConstant);
String styleCssValue = styles.get(styleConstant);
String colorCssValue = getSpecificBorderColorOrDefaultColor(styles, colorConstant);
return getCertainBorder(widthCssValue, styleCssValue, colorCssValue, em, rem);
}

private static BorderRadius getBorderRadius(UnitValue[] borderRadiusUnitValue, BorderRadius borderRadius) {
if(Objects.isNull(borderRadiusUnitValue)) {
return borderRadius;
}
return new BorderRadius(borderRadiusUnitValue[0], borderRadiusUnitValue[1]);
}

private static BorderRadius getBorderRadius(String cssConstant, BorderRadius borderRadius, float em, float rem,
Map<String, String> cssProps) {
UnitValue[] borderRadiusUnitValue = CssDimensionParsingUtils
.parseSpecificCornerBorderRadius(cssProps.get(cssConstant), em, rem);
return getBorderRadius(borderRadiusUnitValue, borderRadius);
}

private static void setBorderRadiusProperties(Map<String, String> cssProps, IPropertyContainer element, float em, float rem) {
BorderRadius[] borderRadii = getBorderRadiiArray(cssProps, em, rem);
setBorderRadiusProperty(element, borderRadii[BorderRadii.TOP_LEFT.ordinal()], Property.BORDER_TOP_LEFT_RADIUS);
setBorderRadiusProperty(element, borderRadii[BorderRadii.TOP_RIGHT.ordinal()], Property.BORDER_TOP_RIGHT_RADIUS);
setBorderRadiusProperty(element, borderRadii[BorderRadii.BOTTOM_RIGHT.ordinal()], Property.BORDER_BOTTOM_RIGHT_RADIUS);
setBorderRadiusProperty(element, borderRadii[BorderRadii.BOTTOM_LEFT.ordinal()], Property.BORDER_BOTTOM_LEFT_RADIUS);
}

private static void setBorderProperties(Map<String, String> cssProps, IPropertyContainer element, float em, float rem) {
Border[] borders = getBordersArray(cssProps, em, rem);
setBorderProperty(element, borders[BorderEnum.TOP.ordinal()], Property.BORDER_TOP);
setBorderProperty(element, borders[BorderEnum.RIGHT.ordinal()], Property.BORDER_RIGHT);
setBorderProperty(element, borders[BorderEnum.BOTTOM.ordinal()], Property.BORDER_BOTTOM);
setBorderProperty(element, borders[BorderEnum.LEFT.ordinal()], Property.BORDER_LEFT);
}

private static void setBorderRadiusProperty(IPropertyContainer element, BorderRadius borderRadius, int propertyValue) {
if(Objects.nonNull(borderRadius)) {
element.setProperty(propertyValue, borderRadius);
}
}

private static void setBorderProperty(IPropertyContainer element, Border border, int propertyValue) {
if (Objects.nonNull(border)) {
element.setProperty(propertyValue, border);
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ This file is part of the iText (R) project.
package com.itextpdf.html2pdf.css.apply.util;

import com.itextpdf.html2pdf.css.CssConstants;
import com.itextpdf.html2pdf.css.apply.util.enums.CssCounterManagerOperation;
import com.itextpdf.html2pdf.css.resolve.CssContext;
import com.itextpdf.html2pdf.css.resolve.func.counter.CssCounterManager;
import com.itextpdf.styledxmlparser.css.util.CssDimensionParsingUtils;
Expand All @@ -63,10 +64,10 @@ public class CounterProcessorUtil {
*/
public static void processCounters(Map<String, String> cssProps, CssContext context) {
String counterReset = cssProps.get(CssConstants.COUNTER_RESET);
processReset(counterReset, context);
processCounter(counterReset, context, CssCounterManagerOperation.RESET);

String counterIncrement = cssProps.get(CssConstants.COUNTER_INCREMENT);
processIncrement(counterIncrement, context);
processCounter(counterIncrement, context, CssCounterManagerOperation.INCREMENT);
}

/**
Expand All @@ -93,38 +94,37 @@ public static void endProcessingCounters(CssContext context, IElementNode elemen
counterManager.popEveryCounterFromCounters(element);
}

private static void processReset(String counterReset, CssContext context) {
if (counterReset != null) {
private static void processCounter(String counter, CssContext context, CssCounterManagerOperation operation) {
if (counter != null) {
final CssCounterManager counterManager = context.getCounterManager();
final String[] params = counterReset.split(" ");
final String[] params = counter.split(" ");
for (int i = 0; i < params.length; i++) {
final String counterName = params[i];
final Integer possibleCounterValue;
if (i + 1 < params.length && (possibleCounterValue = CssDimensionParsingUtils.parseInteger(params[i + 1])) != null) {
counterManager.resetCounter(counterName, (int) possibleCounterValue);
processCounter(counterManager, counterName, operation, possibleCounterValue);
i++;
} else {
counterManager.resetCounter(counterName);
processCounter(counterManager, counterName, operation);
}
}
}
}

private static void processIncrement(String counterIncrement, CssContext context) {
if (counterIncrement != null) {
final CssCounterManager counterManager = context.getCounterManager();
final String[] params = counterIncrement.split(" ");
for (int i = 0; i < params.length; i++) {
final String counterName = params[i];
final Integer possibleIncrementValue;
if (i + 1 < params.length && (possibleIncrementValue = CssDimensionParsingUtils.parseInteger(params[i + 1])) != null) {
counterManager.incrementCounter(counterName, (int) possibleIncrementValue);
i++;
} else {
counterManager.incrementCounter(counterName);
}
}
private static void processCounter(CssCounterManager counterManager, String counterName,
CssCounterManagerOperation operation, Integer possibleCounterValue) {
switch (operation) {
case RESET:
counterManager.resetCounter(counterName, possibleCounterValue);
break;
case INCREMENT:
counterManager.incrementCounter(counterName, possibleCounterValue);
}
}

private static void processCounter(CssCounterManager counterManager, String counterName,
CssCounterManagerOperation operation) {
processCounter(counterManager, counterName, operation, null);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,6 @@ private static void applyAlignItems(Map<String, String> cssProps, IPropertyConta
LOGGER.warn(MessageFormatUtil.format(Html2PdfLogMessageConstant.FLEX_PROPERTY_IS_NOT_SUPPORTED_YET,
CommonCssConstants.ALIGN_ITEMS, alignItemsString));
alignItems = AlignmentPropertyValue.STRETCH;
break;
}
element.setProperty(Property.ALIGN_ITEMS, alignItems);
}
Expand Down
Loading