From b0df89dc8f908985d2934173fa3884c0a90ed081 Mon Sep 17 00:00:00 2001 From: Yvan Lussaud Date: Tue, 5 Nov 2024 14:13:54 +0100 Subject: [PATCH] Added ignore some
in HTML parser. - see #534 --- .../m2doc/html/services/M2DocHTMLParser.java | 386 ++++++++++++++---- .../html/br/br-expected-generation.OK.docx | Bin 0 -> 12877 bytes .../html/br/br-expected-generation.docx | Bin 12247 -> 12949 bytes .../resources/html/br/doc.html | 66 ++- .../bug449_2-expected-generation.docx | Bin 12799 -> 12789 bytes .../bug486/bug486-expected-generation.docx | Bin 39886 -> 39875 bytes .../bug487/bug487-expected-generation.docx | Bin 12988 -> 12978 bytes .../bug499/bug499-expected-generation.docx | Bin 12915 -> 12915 bytes .../bug514/bug514-expected-generation.docx | Bin 39162 -> 39162 bytes .../bug515/bug515-expected-generation.docx | Bin 12536 -> 12536 bytes 10 files changed, 364 insertions(+), 88 deletions(-) create mode 100644 tests/org.obeonetwork.m2doc.html.tests/resources/html/br/br-expected-generation.OK.docx diff --git a/plugins/org.obeonetwork.m2doc.html/src/org/obeonetwork/m2doc/html/services/M2DocHTMLParser.java b/plugins/org.obeonetwork.m2doc.html/src/org/obeonetwork/m2doc/html/services/M2DocHTMLParser.java index 1d72dcc22..b4a45f780 100644 --- a/plugins/org.obeonetwork.m2doc.html/src/org/obeonetwork/m2doc/html/services/M2DocHTMLParser.java +++ b/plugins/org.obeonetwork.m2doc.html/src/org/obeonetwork/m2doc/html/services/M2DocHTMLParser.java @@ -21,9 +21,11 @@ import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Stack; import org.apache.poi.xwpf.usermodel.XWPFDocument; @@ -96,6 +98,108 @@ public class M2DocHTMLParser extends Parser { */ private static final String UL_TAG = "ul"; + /** + * The ul HTML tag. + */ + private static final String BR_TAG = "br"; + + private static final Set BR_CONTINUE_TAGS = initializeBrContinueTags(); + + /** + * The small HTML tag. + */ + private static final String SMALL_TAG = "small"; + + /** + * The big HTML tag. + */ + private static final String BIG_TAG = "big"; + + /** + * The a HTML tag. + */ + private static final String A_TAG = "a"; + + /** + * The font HTML tag. + */ + private static final String FONT_TAG = "font"; + + /** + * The sup HTML tag. + */ + private static final String SUP_TAG = "sup"; + + /** + * The sub HTML tag. + */ + private static final String SUB_TAG = "sub"; + + /** + * The ins HTML tag. + */ + private static final String INS_TAG = "ins"; + + /** + * The u HTML tag. + */ + private static final String U_TAG = "u"; + + /** + * The del HTML tag. + */ + private static final String DEL_TAG = "del"; + + /** + * The strike HTML tag. + */ + private static final String STRIKE_TAG = "strike"; + + /** + * The s HTML tag. + */ + private static final String S_TAG = "s"; + + /** + * The cite HTML tag. + */ + private static final String CITE_TAG = "cite"; + + /** + * The var HTML tag. + */ + private static final String VAR_TAG = "var"; + + /** + * The i HTML tag. + */ + private static final String I_TAG = "i"; + + /** + * The em HTML tag. + */ + private static final String EM_TAG = "em"; + + /** + * The b HTML tag. + */ + private static final String B_TAG = "b"; + + /** + * The strong HTML tag. + */ + private static final String STRONG_TAG = "strong"; + + /** + * The span HTML tag. + */ + private static final String SPAN_TAG = "span"; + + /** + * The p HTML tag. + */ + private static final String P_TAG = "p"; + /** * The svg HTML tag. */ @@ -644,6 +748,37 @@ public M2DocHTMLParser(URIConverter uriConverter, XWPFDocument destinationDocume this.destinationDocument = destinationDocument; } + /** + * Initializes the {@link Set} of tags that can continue a list for {@link #BR_TAG} removal. + * + * @return the {@link Set} of tags that can continue a list for {@link #BR_TAG} removal + */ + private static Set initializeBrContinueTags() { + final Set res = new HashSet(); + + res.add(BR_TAG); + res.add(SMALL_TAG); + res.add(BIG_TAG); + res.add(A_TAG); + res.add(FONT_TAG); + res.add(SUP_TAG); + res.add(SUB_TAG); + res.add(INS_TAG); + res.add(U_TAG); + res.add(DEL_TAG); + res.add(STRIKE_TAG); + res.add(S_TAG); + res.add(CITE_TAG); + res.add(VAR_TAG); + res.add(I_TAG); + res.add(EM_TAG); + res.add(B_TAG); + res.add(STRONG_TAG); + res.add(SPAN_TAG); + + return res; + } + /** * Parses the given HTML {@link String} with the given base URI. * @@ -670,6 +805,7 @@ public List parse(URI baseURI, String htmlString) { parseHead(baseURI, headElement); final Element bodyElement = htmlElement.getElementsByTag("body").get(0); + cleanHTML(bodyElement); final MStyle defaultStyle = new MStyleImpl(null, -1, null, null, -1); if (document.body().hasAttr("bgcolor")) { defaultStyle.setBackgroundColor(htmlToColor(bodyElement.attr("bgcolor").toLowerCase())); @@ -693,6 +829,85 @@ public List parse(URI baseURI, String htmlString) { return res; } + /** + * Cleans the HTML code. + * + * @param node + * the Node to clean + */ + private void cleanHTML(Node node) { + final List toRemove = new ArrayList(); + + if (node instanceof Element) { + if (isHidden(node)) { + toRemove.add(node); + } else { + List nodeList = new ArrayList(); + for (Node child : node.childNodes()) { + cleanHTML(child); + if (continueBrList(child)) { + nodeList.add(child); + } else if (!nodeList.isEmpty()) { + removeBrTags(toRemove, nodeList); + nodeList = new ArrayList(); + } + } + if (!nodeList.isEmpty()) { + removeBrTags(toRemove, nodeList); + } + } + } + + for (Node remove : toRemove) { + remove.remove(); + } + } + + /** + * Tells if the {@link #BR_TAG} removal {@link List} should be continued with the given {@link Node}. + * + * @param node + * the {@link Node} + * @return true if the {@link #BR_TAG} removal {@link List} should be continued, false otherwise + */ + private boolean continueBrList(Node node) { + final boolean res; + + if (node instanceof TextNode) { + res = true; + } else { + res = BR_CONTINUE_TAGS.contains(node.nodeName()); + } + + return res; + } + + /** + * Add irrelevant {@link #BR_TAG} from the given {@link Node} {@link List} to the given to remove {@link List}. + * + * @param toRemove + * the to remove {@link List} + * @param nodeList + * the {@link Node} {@link List} + */ + private void removeBrTags(final List toRemove, List nodeList) { + boolean onlyBrTag = true; + Node lastBrTag = null; + for (Node child : nodeList) { + final boolean isEmptyTextChild = child instanceof TextNode && text((TextNode) child).trim().isEmpty(); + final boolean isBrChild = BR_TAG.equals(child.nodeName()); + onlyBrTag = onlyBrTag && (isBrChild || isEmptyTextChild); + if (isBrChild) { + lastBrTag = child; + } else if (lastBrTag != null && !isEmptyTextChild) { + lastBrTag = null; + } + } + if (!onlyBrTag && lastBrTag != null) { + toRemove.add(lastBrTag); + } + } + /** * Initializes SVG to prevent JSoup's HTML parser from breaking case sensitive SVG. * @@ -758,7 +973,7 @@ private void parseHead(URI baseURI, Element headElement) { */ private void walkNodeTree(MParagraph parent, Context context, Node node, Element lastElement) { final Context contextCopy = context.copy(); - if (node instanceof Element && !isHidden(node)) { + if (node instanceof Element) { if ("table".equals(node.nodeName())) { Node tHeader = null; for (Node child : node.childNodes()) { @@ -1332,7 +1547,7 @@ private MParagraph startElement(MParagraph parent, Context context, Element elem final String nodeName = element.nodeName(); boolean isNumbering = false; - if ("p".equals(nodeName)) { + if (P_TAG.equals(nodeName)) { res = createMParagraph(context, parent, element, null, null); } else if (BLOCKQUOTE_TAG.equals(nodeName)) { if (element.childNodeSize() > 0 && element.childNode(0) instanceof TextNode) { @@ -1347,91 +1562,92 @@ private MParagraph startElement(MParagraph parent, Context context, Element elem } else { res = parent; } - } else if ("strong".equals(nodeName) || "b".equals(nodeName)) { + } else if (STRONG_TAG.equals(nodeName) || B_TAG.equals(nodeName)) { setModifiers(context.style, MStyle.FONT_BOLD); res = parent; - } else if ("em".equals(nodeName) || "i".equals(nodeName) || "var".equals(nodeName) || "cite".equals(nodeName)) { - setModifiers(context.style, MStyle.FONT_ITALIC); - res = parent; - } else if ("s".equals(nodeName) || "strike".equals(nodeName) || "del".equals(nodeName)) { - setModifiers(context.style, MStyle.FONT_STRIKE_THROUGH); - res = parent; - } else if ("u".equals(nodeName) || "ins".equals(nodeName)) { - setModifiers(context.style, MStyle.FONT_UNDERLINE); - res = parent; - } else if ("sub".equals(nodeName)) { - setModifiers(context.style, MStyle.SUBSCRIPT); - res = parent; - } else if ("sup".equals(nodeName)) { - setModifiers(context.style, MStyle.SUPERSCRIPT); - res = parent; - } else if ("font".equals(nodeName)) { - if (element.hasAttr("color")) { - context.style.setForegroundColor(htmlToColor(element.attr("color").toLowerCase())); - } - if (element.hasAttr("face")) { - // TODO double check this - context.style.setFontName(element.attr("face")); - } - if (element.hasAttr(SIZE_ATTR)) { - context.style.setFontSize(fontSizeToPoint(element.attr(SIZE_ATTR))); - } - res = parent; - } else if ("a".equals(nodeName)) { - context.linkTargetURI = toURI(context.baseURI, element.attr(HREF_ATTR)); - if (element.hasAttr("title")) { - context.linkTitle = element.attr("title"); - } - res = parent; - } else if ("br".equals(nodeName)) { - final MList parentContents = (MList) parent.getContents(); - parentContents.add(MPagination.ligneBreak); - res = parent; - } else if ("li".equals(nodeName)) { - res = createMParagraph(context, parent, element, context.numberingID.longValue(), - context.numberingLevel - 1); - isNumbering = true; - } else if (OL_TAG.equals(nodeName)) { - setOrderedListNumbering(context, element); - isNumbering = true; - res = parent; - } else if (UL_TAG.equals(nodeName)) { - setUnorderedListNumbering(context, element); - isNumbering = true; - res = parent; - } else if ("img".equals(nodeName)) { - final MImage mImage = createMImage(context, element); - final MList parentContents = (MList) parent.getContents(); - parentContents.add(mImage); - res = parent; - } else if ("big".equals(nodeName)) { - setBigFont(context); - res = parent; - } else if ("small".equals(nodeName)) { - setSmallFont(context); - res = parent; - } else - if ("tt".equals(nodeName) || "code".equals(nodeName) || "samp".equals(nodeName) || "kbd".equals(nodeName)) { - context.style.setFontName(COURIER_NEW_FONT); + } else if (EM_TAG.equals(nodeName) || I_TAG.equals(nodeName) || VAR_TAG.equals(nodeName) + || CITE_TAG.equals(nodeName)) { + setModifiers(context.style, MStyle.FONT_ITALIC); res = parent; - } else if ("h1".equals(nodeName)) { - res = createHeading(parent, context, element, H1_FONT_SIZE); - } else if ("h2".equals(nodeName)) { - res = createHeading(parent, context, element, H2_FONT_SIZE); - } else if ("h3".equals(nodeName)) { - res = createHeading(parent, context, element, H3_FONT_SIZE); - } else if ("h4".equals(nodeName)) { - res = createHeading(parent, context, element, H4_FONT_SIZE); - } else if ("h5".equals(nodeName)) { - res = createHeading(parent, context, element, H5_FONT_SIZE); - } else if ("h6".equals(nodeName)) { - res = createHeading(parent, context, element, H6_FONT_SIZE); - } else if (CENTER_TAG.equals(nodeName)) { - res = createMParagraph(context, parent, element, null, null); - res.setHAlignment(HAlignment.CENTER); - } else { + } else if (S_TAG.equals(nodeName) || STRIKE_TAG.equals(nodeName) || DEL_TAG.equals(nodeName)) { + setModifiers(context.style, MStyle.FONT_STRIKE_THROUGH); res = parent; - } + } else if (U_TAG.equals(nodeName) || INS_TAG.equals(nodeName)) { + setModifiers(context.style, MStyle.FONT_UNDERLINE); + res = parent; + } else if (SUB_TAG.equals(nodeName)) { + setModifiers(context.style, MStyle.SUBSCRIPT); + res = parent; + } else if (SUP_TAG.equals(nodeName)) { + setModifiers(context.style, MStyle.SUPERSCRIPT); + res = parent; + } else if (FONT_TAG.equals(nodeName)) { + if (element.hasAttr("color")) { + context.style.setForegroundColor(htmlToColor(element.attr("color").toLowerCase())); + } + if (element.hasAttr("face")) { + // TODO double check this + context.style.setFontName(element.attr("face")); + } + if (element.hasAttr(SIZE_ATTR)) { + context.style.setFontSize(fontSizeToPoint(element.attr(SIZE_ATTR))); + } + res = parent; + } else if (A_TAG.equals(nodeName)) { + context.linkTargetURI = toURI(context.baseURI, element.attr(HREF_ATTR)); + if (element.hasAttr("title")) { + context.linkTitle = element.attr("title"); + } + res = parent; + } else if (BR_TAG.equals(nodeName)) { + final MList parentContents = (MList) parent.getContents(); + parentContents.add(MPagination.ligneBreak); + res = parent; + } else if ("li".equals(nodeName)) { + res = createMParagraph(context, parent, element, context.numberingID.longValue(), + context.numberingLevel - 1); + isNumbering = true; + } else if (OL_TAG.equals(nodeName)) { + setOrderedListNumbering(context, element); + isNumbering = true; + res = parent; + } else if (UL_TAG.equals(nodeName)) { + setUnorderedListNumbering(context, element); + isNumbering = true; + res = parent; + } else if ("img".equals(nodeName)) { + final MImage mImage = createMImage(context, element); + final MList parentContents = (MList) parent.getContents(); + parentContents.add(mImage); + res = parent; + } else if (BIG_TAG.equals(nodeName)) { + setBigFont(context); + res = parent; + } else if (SMALL_TAG.equals(nodeName)) { + setSmallFont(context); + res = parent; + } else if ("tt".equals(nodeName) || "code".equals(nodeName) || "samp".equals(nodeName) + || "kbd".equals(nodeName)) { + context.style.setFontName(COURIER_NEW_FONT); + res = parent; + } else if ("h1".equals(nodeName)) { + res = createHeading(parent, context, element, H1_FONT_SIZE); + } else if ("h2".equals(nodeName)) { + res = createHeading(parent, context, element, H2_FONT_SIZE); + } else if ("h3".equals(nodeName)) { + res = createHeading(parent, context, element, H3_FONT_SIZE); + } else if ("h4".equals(nodeName)) { + res = createHeading(parent, context, element, H4_FONT_SIZE); + } else if ("h5".equals(nodeName)) { + res = createHeading(parent, context, element, H5_FONT_SIZE); + } else if ("h6".equals(nodeName)) { + res = createHeading(parent, context, element, H6_FONT_SIZE); + } else if (CENTER_TAG.equals(nodeName)) { + res = createMParagraph(context, parent, element, null, null); + res.setHAlignment(HAlignment.CENTER); + } else { + res = parent; + } if (!isNumbering) { context.numbering = null; @@ -1688,13 +1904,13 @@ private void setOrderedListNumbering(Context context, Element element) { } else if ("A".equals(typeStr) || CSS_PARSER.hasCSS(context.cssProperties, M2DocCSSParser.CSS_LIST_STYLE_TYPE, "upper-alpha")) { type = STNumberFormat.UPPER_LETTER; - } else if ("a".equals(typeStr) + } else if (A_TAG.equals(typeStr) || CSS_PARSER.hasCSS(context.cssProperties, M2DocCSSParser.CSS_LIST_STYLE_TYPE, "lower-alpha")) { type = STNumberFormat.LOWER_LETTER; } else if ("I".equals(typeStr) || CSS_PARSER.hasCSS(context.cssProperties, M2DocCSSParser.CSS_LIST_STYLE_TYPE, "upper-roman")) { type = STNumberFormat.UPPER_ROMAN; - } else if ("i".equals(typeStr) || CSS_PARSER.hasCSS(context.cssProperties, + } else if (I_TAG.equals(typeStr) || CSS_PARSER.hasCSS(context.cssProperties, M2DocCSSParser.CSS_LIST_STYLE_TYPE, "lower-roman")) { type = STNumberFormat.LOWER_ROMAN; } else diff --git a/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/br-expected-generation.OK.docx b/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/br-expected-generation.OK.docx new file mode 100644 index 0000000000000000000000000000000000000000..4aa7a930abec865481b2ff1be2832793e2768fc7 GIT binary patch literal 12877 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 literal 0 HcmV?d00001 diff --git a/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/br-expected-generation.docx b/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/br-expected-generation.docx index 912d6f00642b05f9416be92d5e0592c3438522cb..806562ce8147fdd7f13221061ee38ef438f80545 100644 GIT binary patch delta 2666 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 diff --git a/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/doc.html b/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/doc.html index 7c7165279..87e9988ed 100644 --- a/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/doc.html +++ b/tests/org.obeonetwork.m2doc.html.tests/resources/html/br/doc.html @@ -2,9 +2,69 @@ -

-To break lines
in a text,
use the br element. -

+ To break lines
in a text,
use the br element. +

********************

+
+

********************

+
+
+

********************

+
+
+
+

********************

+ A Line
+

********************

+
A Line +

********************

+
A Line
+

********************

+ A Line
+
    +
  • Item1
  • +
  • Item2
  • +
  • Item3
  • +
+

********************

+

+ To break lines
in a text,
use the br element. +

+

********************

+

+
+

+

********************

+

+
+
+

+

********************

+

+
+
+
+

+

********************

+

+ A Line
+

+

********************

+

+
A Line +

+

********************

+

+
A Line
+

+

********************

+

+ A Line
+

    +
  • Item1
  • +
  • Item2
  • +
  • Item3
  • +
+

diff --git a/tests/org.obeonetwork.m2doc.html.tests/resources/m2DocHtmlServices/bug449_2/bug449_2-expected-generation.docx b/tests/org.obeonetwork.m2doc.html.tests/resources/m2DocHtmlServices/bug449_2/bug449_2-expected-generation.docx index d286cd9006e2d256e43e41612506b7a1741c42a8..f8cf20b054a9c30aad4e2845f86654ab80d04dc1 100644 GIT binary patch delta 1362 zcmeyL{56>`z?+#xgn@&DgW+*#YUD<~g^Vm9#^%k8%23uVrms-eWtLhfD}>D&!kRpp zU6Jwa3cVKXPlJk73$3|W|F%5ch_&zn=I$=*F5D}+hG>cwNiW@o1Bu; zG)~c*SALh&7aM)McP4J`^gyM@O~Q$S{fl?|c=S&1@!4ziX0egXf}qw~e#RLFfh!-a zoF2Ve>ArcPpM}}-Ime=;X5P9SQ53&Sv$r$eYwnM|3OuXkUNWjzJLd4jTPN(smV!T) zvqD@NjHb>?=3aEJrthosLO+JsMDOWS0)KPdIJlv8V(|J4N?8hi*ElVwukc$D8O2}g zap%_4Rf)^HUSuCqVAu5V3k^T^eo>=QzGK+$u86{GTNU2OUvJj#^^UMQ;C#tHOa0ud zGvAfl4l>FX3S{>?2i@qoS)X>uP&D?z{YB3>cRqY@ouTSBgO>F=%k5EOtDF}fUwF5( z-E^A5{+6pIKQl9*?MM-`3_CLW;E~8vPcE+Inksl^`IE<2xSKAj?2))v@%CcO?!$2f zWo5GK_}6=Mai`6neg5vnvkUAc?}P|miP`OXo%^s7^I_4n;Qo%u{@my1&;8wdt3E#3 zd6m)LYf?UM7c=cL>iu~rDR=H)`xon7gR;M#JHvmLNkR7f#6SzSl%<`DRjehk3eG!| zSX5gM-`Tipmc7R^4&~>$***VNnr}{TdU0I-{$kz)_Y0fzV)?2jUrY&4HZ#558|n4) z0b7-;_KgcHJaaZ4ka_j*ci6t8ADz!;WOIwuuh%tSS@z)Z_QemM9$C#D;o&zyHD33S z*v&Z$R8Ov`I9N5y-CbnQy?|{=x<`GtE!gdSYx9PMdx}?dC9AY1Jlr8~@{8?z>&vRM zZ{p|M*UVGovFlscwJU)Ev3loZAta>1udBLs`XqDNxpJejgr4hSiqQ;fAoH)dkrgtO8wU zXg1xhXA2gZ{6o(a!Z6ggf-v&+ts#tc`nJ5FybpKGyFR9E)#im&%a${%6=S!>%3`?aM7(|iuGB7w#?l)8c`y@K|?__46Pd);% X2#T5r-N|*jVv}DQ3b4)91IYjYskt_{ delta 1218 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 ABLDyZ delta 2004 zcmY+Fc|6o>8^(V#hM}=EMr6>jglHOTMktKPl5EMYvNec?bdVThZ$aZ1jTy4M)`&Nf zExTmN60(dzZ^~9#8kFKVIpclbbDq!V`8?m}damcb@Bgm0YG_|Il;6^f111D;b8`bj z01Jud9wI?Ro3AME{tCc?LKI7a=vC zF8;s}ki*`cjGlZ6QFu4`vp(iuDz>61?+KQfr@$L^q3|?*#?-@pku&DY;d2jz!EB{g zE4)o&igFD)4^KH%=y&b?=s>%!5o%#n2i84^p?3cJ%S*=|Un9m&$vNa;9Y*C2o9CzrDoUXr`$VF0<77f%4B0oO zuQZ2j23*QSd`?e@6{~mJiuVHPQe=(?x_6L^Qom2$XEC)$q%S<+;G%e`fGlqvTd|;y z*p$`hCihUM1jrY|TzUHrq&K^ltw^o>^tWu4`1%FC{gp%7?fh#a9aw8cFO+10x7WgL z9UjGKj_O8aM0G!go(ORzVp9)x)oN_$_}MKG3y$U|52nIH1AN9=&CHI|*5w@chEUtZ zp{D9Qky$^o7_PNU!lwK>qMWd(IApJ2SMuAI!_0}q&V)}lR?EEWG|Q@zlu9|rZD(_s z(O?h|<=#4R$UM1`d9#MaPnw$yk>j&8T+>(B|JH_Q34J7m>6816(p0!(zzA;ek@*^* z3#4}R>&uyN)ADmgZQY5ZJl*!vCk(@Bz%s#e6MmZ;>0#tsI1?{9zjY$l=STl^ON!e} zb`>F0!p<>qq@Wq|jftXOyG)jWY2+!wQ@(A)97K;)H^TKt;Kz(e?xupozEQIP)7G5p zVN!?ystNX0nPno@!AWXRJ4A4*@4f@g!9=$x6G9kROCIR45u%jyw}*7`Px_^w}N~e zdYE?OmW=h+b(&}1nmIqOk)Ynb9%}3+THa!89|odSq$N+wrZ`?HTP{h#49j?GLQTmT zEm4D&Rrxbmg!#>M)9(`@$CX{=8|29fdRm?BA@3Yx+IaIx?=f+I3igOo(dw0YwU62 zHkjZZoEk|ugmU)b(9Lo{(ptXXi_hwVqh#Y%V>_A%E)Jm)`4TA!7Ihw8T>3p>GDY__ ztO9=HwzP(V>9;RAV!?@zT6HfxyAE}#O)AD$=&haCt2dqsdQbzMad*u-v*b2kzbN7t z@kn_yGOH>zxJ=!AE3@f|c#N20xxcc1k$+J1(&`q8qUM;q1M!io4gIENVdSWZ8VKJv zjXm%AT+Ty9jU~}mjC!v=NN0rMeaD(K){bZ-;P@{qypE4}(e&xtI`#!GN~y1JTfpzL zFqCi#OWlUeTZIJVZhkg_{j^@13N01Z&5mdn4y?pqRr&7Ra!w}(hn#gaplJx>iM<{Z zYT=|Q#S}|oj#n+5^eOIj&D+CN(WBN-kw3=Olrni-T>^%mmm93jekm6dj7Yv>r;Vw3 z70+26VNVqMb%fdzo#Hu1m8O$L`ZcP;nT)h)y{5J?Tz%5McP(^Ru8WCG_YZH|PZ_$G zP_}2up6|+ahy)|ocIj}HH=53eLWV_{M@a&o=@h%i(sEGYSO*=-1qW@OA$&}5exJn|Am_;v(J9RBWWZ`zLwro14_mPHaPgrMu;-^e-e_)X_&=fxUa)B z%IhjCLMJnddwo@8!wq;6D^7~ui5Wn=Z87fWX?w)$NwEGt);TuY$gOlhtz?k-V_sDP z+U?VDNfc-36jUv^x`hv#yJ%?!7vqjK(pi_|0)W%U0N|eyQ@P1^b1y}L1z3CJk0g7s zbB7h|@xNp_P)Q8M@v`-jSPX(q6Zer^Y+6Y(*z@A3C;yVb5bAL@Jf&)}VVSDU25kCC z{@rN%|7c)nx(fTPEFBHm0K3wU{n{S{C5lBiv({W4}w=|?8(7fG&FQ27=(lffu;Y|UeM4GdvKH{$!`Di*R==~rXTvN t{nOj$S%aLvN{a!&fq#@918wMs*D&!kRpp zUAg{l-(xkA=3a>&Lxq)~@wp3o_l7$K8VuKoO6^$c9^>c7h_IJ$y|OU`d@h^E|*bv(gS z9B-a1(3p|3@l}gXaiq*+ft{?v6K{X5Szq(Gsnx^F_LJ@sZH?@mZ?;N3?s#=;e!cel z0G{GSakJ0+UOl|PUeacY@`s%U{E6}`mt3URDa^F$h^vjVc=zVk+F5tEZY`U7^t)3= z@Yh48>s$`xEL;$9?4S1A?cEJ)k35Z6;mS z8G8GHhqOd8m$B{p^Zjp_dFJb0ycMP#7oE4*?9pTX#Sh;ev1|~i@!81oi}|3Cy2Go# z;qzNKL?V_p7_pipsEJ&0U*HrU@;p1D+eCazkZLT|hzQ0w$OW>|p3+u&f#|VMH zK!#xkkZ~Bqu)6&5WxPzsxt)9$xLpd@DSu%K+|r)WnsldWgMylF$1C~v>yuV^Y^mRu zC3N@P?THnSIc)-4UD}j*M74zF9F_*mtpC$-vbDfit@||35hHaLO@^)8d?Ni8T}s+H zb5_O~s|TKc|NfR&JM9#hSdyTm;D3Iu-%icDhMFR_Yq?J?D!Hw5inU?K5}i|#j$i(5 zm%jCH$@}`fryGMm{5_p|?A_kxCmj=<#f6tT78@5bOg^~A^3A)8Wr;blmT$~0ldksU z?JD11|99`@ZMwa4c5AByu6UNzA7$ya>4&em=&$V!_J-FFx=wiY{oxMtbvsn-4-0WU z-nH+2zn6N!q*cpyq?oRtWNoZr10$2Q5Pc`J17v83H~$kW%M`j1D)1C7~h624U&yIYafA=-YyY zCU4a@g)rXfTR|8)2G$Tpwt+1lr~pGaX!14#Lx|jK11ZM6li3Wl-@D&!kRpp zUAf*j@3EQ4@$a^*3rmwd|7{bfo^VoplSaZ7VC`;+~DApEMLH+*M47zTq0Urw9Eb;nypfq*H zBA!!WZO#W(x7W}bc|(SAaAM#r6P&#RxxitD%py_&dQG1g({l+*K88}_Zp>zR3C z!6ny;J0wN=E%#q|C8K3?oMpB8+P7b)8|A!t(!@6P$k9`ZmsL0Lg-%c9FFdhh+i73d zT5l4!YMJ!qr6-c^tB6UioPOZF+;%o|Cb3^Z+;WfVQmj*tRPBqu z_?<68Ph!YuwTg-cy8 z`e%lA@3AwjoMXIMr09uH$&s0xU!07w)L@dGzv%w)zURDd|3d$tiwyIvZ(W&FJ@?$& z{j2sk8lLH_%Cj>KE#LcYMR|DNf#ru{TJ{Qf2+EJv&zD+-3k@E z&$ZC^s_^w4LX4YdHaSWDmfv#!(ur+dbLYvwYMo{>hxugUim5vtggRS~m9nawvv5>! zn%QUVHRU7w1__6RD(%%Dwd8#MotRi(@$32f1m_zJRokMj@BNlxaBHiHPrl>MPywzEoucC62~nyJVV(&cc5BT;P~Q`1te zxcXODSL?-pU2?%@v-u326GiT!-HUI_ElQmm|8~PF=f7*_mdX1p+Zh-C|N7;(kIPvX z-EG*QV8zS9z34WOQ3Yb$2Qt{y|NOeie#qWhVD0v*#(9ce+pAiE`t*(t5HCHQ(-Q&(FGd?KdyOC?_^tt=OZQqu4Jyl<8n_K+4`QOR%0B?4Vd6Qpj zF|#l*$S5!{pcXEhPjfp$%MStG&(QKifLC<041XR}yidS~2U7mrlhNUZu=q3t*&r-s zJ!hz{EPY$B(B#$nrVz#xeJcn<$-o-INHnnJ0~KWm2TfjMUPXfvYVkIgqv+B#l*}%x!q6!!e0%P?wWiI#(iZdWp_)4fuTIVC`G@xq%tS9Sg#^C zC%~JLNrVBZEbR>We2JBTVW~6&gD3+s;F|1YqyjNI%SehzUT?CYp4j9$MgnXp`XF@x DRiAl( diff --git a/tests/org.obeonetwork.m2doc.html.tests/resources/m2DocHtmlServices/bug499/bug499-expected-generation.docx b/tests/org.obeonetwork.m2doc.html.tests/resources/m2DocHtmlServices/bug499/bug499-expected-generation.docx index 05a46ae51cfb2924fb9ca545dd1ec82b0399c5c2..a833672b9cbe821151e65b357b40d7db291351ab 100644 GIT binary patch delta 1183 zcmeyI@;QYsz?+#xgn@&DgMlSFHF6{0LPi!4WAkQ4WhmVNLcI z5S_e&U7-H9nLzFPaE_{XQIoERC%!#U-74QDarfEI1*%?3XQDlBoqLx3N%!X_KG)cs z^^YxHv#@skYJGI(!_GPtHorvzd0}^BnHhX(IlAa<6>e7I^>msTI$w8IG0inOcAHh zQ|=UsN?A6UL##tbnUimu(^5zCoTej_nx^n7Hmte2b=!t54bNNV?{eQADV(b_UkrQ{rshRk9ix*-c{FP_gmM?_4SLU#TQ4+SSp}xeZf2GVB3;}gkH;} z3E%JgKN3^bKAw@wEn+_HcS!Vyi*E}G%)j{uyf|y)wdH52XXxL<*U#7r>{@7gKJ>(b z*~_=;tg2Ygw?+0x_RX2+c+=v(*z>FM-~Asp`L^8i8|PS??PvZdFcUG@AQG|0Ce$kM zbIFVOMfJgFTT)}S55`6;5lopm`GAj-_8+e~99kj4wLdJ6zS}WVcG`l@PrNLD>fBB( zuD5-9d;3zGw>8<<i3p#k-bnZTL*09v>*b>W{=hy7^By2r0W!|nv@8)k@b{FNo z{cW25c!JyXyZ7!^-C6Sa@0Rw>@BYTV&$#7x`4DTngOqyO!uq}iQ{z58Kfj=9{SytT z+y8AZn0>I3i0#*k`(z*B+11ehbA>qXX$6nC8D+agj&WRjr+Kby3#*%E+xfOci%qwE zI5uxSdwtoRHsAT#6T)PoX9w}rtIQYKn0)5j$)*`Bi}uL1T(y1>q$7WqJ>kN??{oe! z2Y9n{B>$5z$YW+;SkK46&w!edH#=~zf#%f@JfER?^#hOS=0AM?P;q|&A09|vpD&}s z4Pl*E7i5F5p6EJ5b!qF{f`umM=$k?qOZBZFjK})c5QdV0Eib6pfV*gNj)4(GYLS5( fgz?6}2Ex!Wgfemrq1sm)T0*2=7}`S^+D0A#6l@mq delta 1183 zcmeyI@;QYsz?+#xgn@&DgW+;xN5n?Hg^Vm9#^%k8%23uVrms-eWtLhfD}>D&!kX+a zAUb&kyFmSA1A*G-+KX&9`(Ao$dP}Ty{VV20Ne?A=c217?%6mLFa$j5i!_yMScYbku zS?1``vBzSbOU?CzHbRCEU!M5;Q z*fEW#`0WObIm==+OqN$XS=ZdRnQzy*C^p&aj0W@Cvn6})_|#`hR>jGs&RDqTsK*i) zJ)yf@ET3H_P2i}`UYNB0EqmQZwW%Ei^O~Pa9|_l3|KNt*tO+xkjRdHH?yS)qgxS?go3T7j3C+Pso5bZ0Pb#Eu#o;3H+;^hXd5-jJ9 zm1diqb7f8qYh2T(x-n@>y{6-Z%1GWk(Wt{080HDp<%k<*Dcko+{7?@$;&4UVk2CRh zx+te}i+SJqMQP1<7W}qp_@>w36CXB*U3J|;gnMTvT6HuW*q17 zeABn^@fp`YDQ+*~`JzaZ3AYTrTgzt|xw)23P%sUU-Qn^-F2y zzNufd|MAAFtC}aymtu90ns+#65yyn3hb+Ui7i2$r(&E`QSHk#(b(HAeITF_=LP2;V88zN-q{PbP793-HBNq=@4f1dea*=?+zYj%KE|~1?8=Ne z*)-{Uk>h6O|2o!>R~|dV`R{YUhYSC$SZ4OV1s}y_-+gQ2k($QT-MW}dJxl8Q z-Q>Je^Xd)OXQ}Ss?Y`2avQg-TXG-JuBNG=mUA@|VT+8hC*_7=prBl)cKKyE#!d`Ft z^!4W;x$Sk=UYF~>T^4ljy{YW}%aUP7#kkM+KAGwMMqK>QyVyD2J})<(-er)H_gdNd zq>QVD`|ipprETjT9#&f$Uq0>MlG^IamNT|pH7Th6^VH&!aeXPn+7FZL>R3f<0@x2; z_@i`?ulf7E2Sov&Chc=&)nwZDyV>u8ev?Axve_?VGIS%1ms{MtkS1|dVxPgUe+PVo z6~7!aiG7vy>bkoUd*;cF8#Rx7IRA4&$IFT|@3S3!3a3ubilLYy8~GM8vVa(yH!~_jS+|(JLRpttYN4zUHftzr zGJ7d2L?)r(DIaea> zMPUAxgVWw!-N`R2&9`*5fBa{jHG=vEs==paEyNsD78$C&yz=YQpMt{7+F5^#LfZ^` z!z`7Uo&^4|RGo6zwQX70OST0i?F&-!5*Rt%x;CWLU%V2VY^zszo$R{i^P1aC<`((N_y$DA9@6Z0ZqNB3pRdIxYglEdJz{Vd@+g?kFSfoob8J>Dt?f&7_ zU*-%Zg@Dzry&v@?&-{y1{P*kr{`!Y}8?pjY<5JEpEsRg8_cHnU#_HNK)dJOwyZo8^ zCjQpn->^zBH8dr9 z`{BclZ+O-3P1fb|u4l4+bGHA3?9&qKFKUlH=X>1R`lfpc>r(w!=cjr-@{pG?zbQ21 z^pXEnOUwsc3D zp6gCAX}>4~6}l+%UhZT@-~0uZf82^YRG%GJIo_FC_xQx^e=oN*ooti0-WO(B^89+= zl*P9kC!0S%`>OV?<&10ZjeeBfe4PFMo!JZB-P=kEzS&KF#dzgKy)7hda~y5O~&H%s!--y4fpws9^^ z%AT>#<$K7KM3>D>Q*!&K`kTsLelaom=q?^%ljBO0B7ZIZ7P!iLP2TIvlgr8rs=wI> zc(Ze?jEl}zW?^7>qszd6T4*pJfz4mIRiR~sEbnJ1ON8Ht2U4n}Nb7JzSX0yl*&wWy zI?m9t5XMJ+ Ts5S!wONdCWfjxw=!N3CmX#Ym( delta 1282 zcmey7_#=@oz?+#xgn@&DgW+;xN5n?HDU2*2#^z;=%23u>rms-eF_u~=%bm>{!kXO1 zu2Nt0$U@}q`S2Bc`0JPsioQ5iU1b=0Ma6dS8=-AEAscmjbqdn=rR_`Im!op}n1D=M zo<^$SEf$?`2-?SKC>&l*8(L(OH=tP6A+x;l>R@K}Cr`t$Z~@7I^#Okb_l zZ*7=v440fEjaAnmUhLCpxAy;^H6b^J5)vw7g**a~`ocM~&QDPt?=2}^px(C=vB#z`B@4KY{?`0gn`L>f;!#|`+?uk?b59mMumACH@9xMw&YUr+ zHTP@vrpvV*O!*PuzMxo*eOVii*vf*K!#PqoF8;`=Q&qbcA|hn}L3_a3gP z`_C|mf#XTuI)ihQ4!$`rnza6Z{U6zP45!(yK6Aas)B9WLx7LLtn_oxFo_0V~eU<#7 z8s&5Gf0$RLw``lJDsHr7j?t74`@XV1ob#kstnG5@d$E{~OBdI_pZ)KK`OV##w{Blu zxj(S>L-dqM>@Ba&^d?kTFI-kNqd;Z%y#?F;1n1Tsi;-Dy`*P@R-okSZ^VT`+Tj$WY zj>F;bcjlYYesd=4aCz6W*uFVC{e$e&66-H&k3Hvm+}gTF)RWsO?n%G))+2&;7I~X= z6ZC}sfAh#o_;RUEF?^rXyBwSH)P9!zdnEhw)J=a_7qQtaelN3QK^}*Pfwtv?PwdO* zKH@*HDrZLSmCitQx49CfNeITt&WSx%hOdsSn4DW0w5Wrl-a*;F$Hwr}krTqo{(jvl zPdX>6yUmlROad{|`@h&vQm<3?{~@&5c;#ee>re9K@9xF*Yp=AJ?fm_DR{J}qyN#z( zpL=X7f9M;S@H{PM|LFzoa`~s^;;YNIJLca!b?M;Sul^dYcImbmrBlAV)K~o)Q?8V+ z8~!k;MlSZ(bl>>;OZOA*iZ~sudeHY;Wl6~EWnPy{i&y^LbyMhIgq>3I^B_NAryti$ zVn4oPTy>};MRmn3Iq&&ZmTDK34^LVksdqup^sFI_=X$n$pb`q