From f7c72a6a17297036f67cebf0c4a4d662d84c6332 Mon Sep 17 00:00:00 2001 From: Thomas Gutmann Date: Mon, 13 Jan 2025 21:30:39 +0100 Subject: [PATCH] Fix font-tag to avoid NPE and optimize the handling of font family and coloring (#2028) --- .../emitter/docx/writer/BasicComponent.java | 98 ++++++++++--------- 1 file changed, 52 insertions(+), 46 deletions(-) diff --git a/engine/org.eclipse.birt.report.engine.emitter.docx/src/org/eclipse/birt/report/engine/emitter/docx/writer/BasicComponent.java b/engine/org.eclipse.birt.report.engine.emitter.docx/src/org/eclipse/birt/report/engine/emitter/docx/writer/BasicComponent.java index ad175ac2b8f..716ab4be815 100644 --- a/engine/org.eclipse.birt.report.engine.emitter.docx/src/org/eclipse/birt/report/engine/emitter/docx/writer/BasicComponent.java +++ b/engine/org.eclipse.birt.report.engine.emitter.docx/src/org/eclipse/birt/report/engine/emitter/docx/writer/BasicComponent.java @@ -1078,46 +1078,50 @@ private Node convertFontTagToSpanTag(Node nodeFont, HashMap cssSty Element spanTag = doc.createElement(HTMLTags.TAG_SPAN); NamedNodeMap nodeAttributes = nodeFont.getAttributes(); - if (nodeAttributes != null && nodeAttributes.getNamedItem(HTMLTags.ATTR_TAG_FONT_SIZE) != null) { - String size = nodeAttributes.getNamedItem(HTMLTags.ATTR_TAG_FONT_SIZE).getNodeValue().trim(); - // size: absolute value converting - if (size.equals("0") || size.equals("1")) { - fontSize = "8pt"; - } else if (size.equals("2")) { - fontSize = "10pt"; - } else if (size.equals("3")) { - // MS Word, MHT-file: font size 12pt won't be correct converted - fontSize = DOCX_MHT_FONT_SIZE_REPLACEMENT; - } else if (size.equals("4")) { - fontSize = "14pt"; - } else if (size.equals("5")) { - fontSize = "18pt"; - } else if (size.equals("6")) { - fontSize = "24pt"; - } else if (size.equals("7")) { - fontSize = "36pt"; - } - // size: relative value converting - if (fontSize == null) { - if (size.length() > 2) { - size = size.substring(0, 2); - } - if (size.equals("-2")) { - fontSize = "0.75em"; - } else if (size.equals("-1")) { - fontSize = "1.0em"; - } else if (size.equals("-0") || size.equals("+0")) { - fontSize = "1.25em"; - } else if (size.equals("+1")) { - fontSize = "1.35em"; - } else if (size.equals("+2")) { - fontSize = "1.8em"; - } else if (size.equals("+3")) { - fontSize = "2.4em"; - } else if (size.equals("+4")) { - fontSize = "3.6em"; - } else { + if (nodeAttributes != null) { + + if (nodeAttributes.getNamedItem(HTMLTags.ATTR_TAG_FONT_SIZE) != null) { + String size = nodeAttributes.getNamedItem(HTMLTags.ATTR_TAG_FONT_SIZE).getNodeValue().trim(); + + // size: absolute value converting + if (size.equals("0") || size.equals("1")) { + fontSize = "8pt"; + } else if (size.equals("2")) { fontSize = "10pt"; + } else if (size.equals("3")) { + // MS Word, MHT-file: font size 12pt won't be correct converted + fontSize = DOCX_MHT_FONT_SIZE_REPLACEMENT; + } else if (size.equals("4")) { + fontSize = "14pt"; + } else if (size.equals("5")) { + fontSize = "18pt"; + } else if (size.equals("6")) { + fontSize = "24pt"; + } else if (size.equals("7")) { + fontSize = "36pt"; + } + // size: relative value converting + if (fontSize == null) { + if (size.length() > 2) { + size = size.substring(0, 2); + } + if (size.equals("-2")) { + fontSize = "0.75em"; + } else if (size.equals("-1")) { + fontSize = "1.0em"; + } else if (size.equals("-0") || size.equals("+0")) { + fontSize = "1.25em"; + } else if (size.equals("+1")) { + fontSize = "1.35em"; + } else if (size.equals("+2")) { + fontSize = "1.8em"; + } else if (size.equals("+3")) { + fontSize = "2.4em"; + } else if (size.equals("+4")) { + fontSize = "3.6em"; + } else { + fontSize = "10pt"; + } } } Node colorNode = nodeAttributes.getNamedItem(HTMLTags.ATTR_TAG_FONT_COLOR); @@ -1133,10 +1137,10 @@ private Node convertFontTagToSpanTag(Node nodeFont, HashMap cssSty if (fontSize != null && fontSize.length() > 0) { styleValues += HTMLTags.ATTR_FONT_SIZE + ":" + fontSize + ";"; } - if (fontColor != null && fontSize.length() > 0) { + if (fontColor != null && fontColor.length() > 0) { styleValues += HTMLTags.ATTR_COLOR + ":" + fontColor + ";"; } - if (fontFamily != null && fontSize.length() > 0) { + if (fontFamily != null && fontFamily.length() > 0) { styleValues += HTMLTags.ATTR_FONT_FAMILY + ":" + fontFamily + ";"; } if (styleValues != null && styleValues.trim().length() > 0) { @@ -1165,11 +1169,13 @@ private Node convertFontTagToSpanTag(Node nodeFont, HashMap cssSty */ private void getCorrectFontSize(Node nodeTag, HashMap cssStyles) { HashMap nodeStyle = (HashMap) cssStyles.get(nodeTag); - for (Object key : nodeStyle.keySet()) { - if (((String) key).contains(HTMLTags.ATTR_FONT_SIZE) && nodeStyle.get(key) != null - && ((String) nodeStyle.get(key)).equalsIgnoreCase(DOCX_MHT_FONT_SIZE_ISSUE)) { - nodeStyle.replace((String) key, DOCX_MHT_FONT_SIZE_REPLACEMENT); - break; + if (nodeStyle != null) { + for (Object key : nodeStyle.keySet()) { + if (((String) key).contains(HTMLTags.ATTR_FONT_SIZE) && nodeStyle.get(key) != null + && ((String) nodeStyle.get(key)).equalsIgnoreCase(DOCX_MHT_FONT_SIZE_ISSUE)) { + nodeStyle.replace((String) key, DOCX_MHT_FONT_SIZE_REPLACEMENT); + break; + } } } }