From 2e9d6daac2403bcf919aa8659b0be82fde9ec187 Mon Sep 17 00:00:00 2001 From: TruongQuangSB <131350493+TruongQuangSB@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:01:50 +0100 Subject: [PATCH] Add zero width space to long text by export (#1163) * Add zero width space to long text by export * Fix --- .../export/pdf/TableToTableDocument.xtend | 31 ++++++++++------- .../extensions/CellContentExtensions.xtend | 6 +++- .../eclipse/set/utils/StringExtensions.xtend | 33 +++++++++++++++++-- 3 files changed, 56 insertions(+), 14 deletions(-) diff --git a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/TableToTableDocument.xtend b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/TableToTableDocument.xtend index c0fb274ec..c0f2536fd 100644 --- a/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/TableToTableDocument.xtend +++ b/java/bundles/org.eclipse.set.feature.export/src/org/eclipse/set/feature/export/pdf/TableToTableDocument.xtend @@ -20,6 +20,7 @@ import org.eclipse.set.model.tablemodel.MultiColorCellContent import org.eclipse.set.model.tablemodel.MultiColorContent import org.eclipse.set.model.tablemodel.SimpleFootnoteContainer import org.eclipse.set.model.tablemodel.Table +import org.eclipse.set.model.tablemodel.TableCell import org.eclipse.set.model.tablemodel.TableContent import org.eclipse.set.model.tablemodel.TableRow import org.eclipse.set.model.tablemodel.extensions.TableExtensions.FootnoteInfo @@ -35,11 +36,11 @@ import org.w3c.dom.Document import org.w3c.dom.Element import static extension org.eclipse.set.model.tablemodel.extensions.CellContentExtensions.* +import static extension org.eclipse.set.model.tablemodel.extensions.ColumnDescriptorExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.TableContentExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.TableExtensions.* import static extension org.eclipse.set.model.tablemodel.extensions.TableRowExtensions.* import static extension org.eclipse.set.utils.StringExtensions.* -import org.eclipse.set.model.tablemodel.extensions.TableExtensions.FootnoteType /** * Transformation from {@link Table} to TableDocument {@link Document}. @@ -237,8 +238,9 @@ class TableToTableDocument { var element = doc.createElement("StringContent") if (isRemarkColumn) element = doc.createElement("DiffContent") - - val stringValue = content.plainStringValue + val columnWidth = content.tableCell.columndescriptor.columnWidth + val stringValue = content.plainStringValue. + intersperseWithZeroSpacesLength(columnWidth.maxCharInCell) if (isRemarkColumn) { val child = doc.createElement("UnchangedValue") element.appendChild( @@ -283,6 +285,8 @@ class TableToTableDocument { private def dispatch Element createContent(CompareCellContent content, FootnoteContainer fc, int columnNumber, boolean isRemarkColumn) { val element = doc.createElement("DiffContent") + val columndWidth = content.tableCell.columndescriptor.columnWidth + val maxChar = columndWidth.maxCharInCell formatCompareContent( content.oldValue, content.newValue, @@ -290,7 +294,8 @@ class TableToTableDocument { [doc.createElement("UnchangedValue")], [doc.createElement("NewValue")], [ text, child | - text.addContentToElement(child, columnNumber, isRemarkColumn) + text.intersperseWithZeroSpacesLength(maxChar). + addContentToElement(child, columnNumber, isRemarkColumn) ] ).forEach[element.appendChild(it)] @@ -364,14 +369,20 @@ class TableToTableDocument { private def Element createMultiColorElement(MultiColorContent content, int columnNumber, boolean isRemarkColumn) { + val columndWidth = content.tableCell.columndescriptor.columnWidth + val maxChar = columndWidth.maxCharInCell if (content.multiColorValue === null) { - return content.stringFormat.createContentElement("SimpleValue", - columnNumber, isRemarkColumn) + val cellValue = content.stringFormat. + intersperseWithZeroSpacesLength(maxChar) + return cellValue.createContentElement("SimpleValue", columnNumber, + isRemarkColumn) } // IMPROVE: currently the order of multicolor content is static. // The underlying issue is a limitation in XSL 1.0 and string splitting. - val multiColorElement = content.stringFormat.replace("%s", ""). + val multiColorValue = content.stringFormat. + intersperseWithZeroSpacesLength(maxChar) + val multiColorElement = multiColorValue.replace("%s", ""). createContentElement("MultiColorValue", columnNumber, isRemarkColumn) multiColorElement.setAttribute("multicolorValue", @@ -401,10 +412,8 @@ class TableToTableDocument { private def Element addContentToElement(String content, Element element, int columnNumber, boolean isRemarkColumn) { val checkOutput = content.checkForTestOutput(columnNumber) - element.textContent = if (isRemarkColumn) - checkOutput - else - checkOutput.intersperseWithZeroSpacesSC + element.textContent = isRemarkColumn ? checkOutput : checkOutput. + intersperseWithZeroSpacesSC return element } diff --git a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend index 3245cf622..0fb15ba13 100644 --- a/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend +++ b/java/bundles/org.eclipse.set.model.tablemodel.extensions/src/org/eclipse/set/model/tablemodel/extensions/CellContentExtensions.xtend @@ -205,9 +205,13 @@ class CellContentExtensions { * * @return the table cell of this cell content */ - static def TableCell getTableCell(CellContent content) { + static def dispatch TableCell getTableCell(CellContent content) { return content.eContainer as TableCell } + + static def dispatch TableCell getTableCell(MultiColorContent content) { + return content.eContainer.eContainer as TableCell + } private static def String getTextAlign(CellContent content) { return content.tableCell.format.textAlignment.literal diff --git a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/StringExtensions.xtend b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/StringExtensions.xtend index b4acd2506..b9791307b 100644 --- a/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/StringExtensions.xtend +++ b/java/bundles/org.eclipse.set.utils/src/org/eclipse/set/utils/StringExtensions.xtend @@ -19,6 +19,13 @@ class StringExtensions { static val ENV_PATTERN = Pattern.compile("(?[^$]*)\\$(?[^$]+)\\$(?.*)") static val ENV_VAR = "var" + + + /** + * This constant determine manual with OpenSans font + */ + static val int CHARACTER_PRO_CM = 6 + static final String ZERO_WIDTH_SPACE = "\u200b" /** * @param string this string @@ -26,7 +33,7 @@ class StringExtensions { * @return the string interspersed with "zero spaces" */ static def String intersperseWithZeroSpaces(String string) { - return string.replaceAll("(.)", "$1\u200B") + return string.replaceAll("(.)", "$1" + ZERO_WIDTH_SPACE) } /** @@ -37,7 +44,29 @@ class StringExtensions { * @return the string interspersed with "zero spaces" */ static def String intersperseWithZeroSpacesSC(String string) { - return string.replaceAll("([ /\\-_)}\\]])", "$1\u200B") + return string.replaceAll("([ /\\-_)}\\]])", "$1" + ZERO_WIDTH_SPACE) + } + + static def String intersperseWithZeroSpacesLength(String string , int maxChar) { + if (string.length < maxChar) { + return string + } + val result = string.split(" ").map[ + if (it.length < maxChar) { + return it + } + val sb = new StringBuilder(it) + val head = sb.subSequence(0, maxChar) + val tail = sb.substring(maxChar) + val newTail = tail.intersperseWithZeroSpacesLength(maxChar) + return head + ZERO_WIDTH_SPACE + newTail + + ] + return result.join(' ') + } + + static def int maxCharInCell(float cellWidth) { + return Math.round(cellWidth * CHARACTER_PRO_CM) } /**