i18npool/source/breakiterator/breakiterator_unicode.cxx |    5 +
 sw/qa/extras/layout/data/no-line-break-at-slash.fodt    |   50 ++++++++++++++++
 sw/qa/extras/layout/layout.cxx                          |   40 ++++++++++++
 3 files changed, 94 insertions(+), 1 deletion(-)

New commits:
commit ba4ffef2c9b97dbbc97d8783589ef798a5d7682e
Author:     Michael Stahl <michael.st...@cib.de>
AuthorDate: Mon Jul 20 20:22:55 2020 +0200
Commit:     Michael Stahl <michael.st...@cib.de>
CommitDate: Tue Jul 21 13:27:15 2020 +0200

    i18npool: don't break line at slash '/'
    
    If sw text formatting gets the result of the special-case code added to
    the "word boundary break" condition, it may call again the next time
    with the preceding index, and fall into the "Line boundary break"
    condition, which hence also needs to special case '/'.
    
    (regression from ICU 60, 9206a08ada00e8762c4a634f242bd566028964bb)
    
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/99104
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <michael.st...@cib.de>
    (cherry picked from commit a916e2253df2bf1415c25fb7f974e0d16b615d03)
    
    Change-Id: I2aaefbc7b25af157e0a6ef15fabaa71bff1e8d9a

diff --git a/i18npool/source/breakiterator/breakiterator_unicode.cxx 
b/i18npool/source/breakiterator/breakiterator_unicode.cxx
index 398bdd7326c0..ff889e87e72d 100644
--- a/i18npool/source/breakiterator/breakiterator_unicode.cxx
+++ b/i18npool/source/breakiterator/breakiterator_unicode.cxx
@@ -498,7 +498,10 @@ LineBreakResults SAL_CALL 
BreakIterator_Unicode::getLineBreak(
     icu::BreakIterator* pLineBI = line.mpValue->mpBreakIterator.get();
     bool GlueSpace=true;
     while (GlueSpace) {
-        if (pLineBI->preceding(nStartPos + 1) == nStartPos) { //Line boundary 
break
+        // don't break with Slash U+002F SOLIDUS at end of line; see "else" 
below!
+        if (pLineBI->preceding(nStartPos + 1) == nStartPos
+                && (nStartPos == 0 || Text[nStartPos - 1] != '/'))
+        { //Line boundary break
             lbr.breakIndex = nStartPos;
             lbr.breakType = BreakType::WORDBOUNDARY;
         } else if (hOptions.rHyphenator.is()) { //Hyphenation break
diff --git a/sw/qa/extras/layout/data/no-line-break-at-slash.fodt 
b/sw/qa/extras/layout/data/no-line-break-at-slash.fodt
new file mode 100644
index 000000000000..e900594fa0c8
--- /dev/null
+++ b/sw/qa/extras/layout/data/no-line-break-at-slash.fodt
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<office:document xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:dc="http://purl.org/dc/eleme
 nts/1.1/" xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 
xmlns:calcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0"
 xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0
 " xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; office:version="1.2" 
office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:font-face-decls>
+  <style:font-face style:name="Liberation Serif" 
svg:font-family="&apos;Liberation Serif&apos;" 
style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Lohit Devanagari" svg:font-family="&apos;Lohit 
Devanagari&apos;" style:font-family-generic="system" 
style:font-pitch="variable"/>
+  <style:font-face style:name="Source Han Serif CN" 
svg:font-family="&apos;Source Han Serif CN&apos;" 
style:font-family-generic="system" style:font-pitch="variable"/>
+ </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#3465a4" 
draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" 
draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" 
draw:start-line-spacing-vertical="0.283cm" 
draw:end-line-spacing-horizontal="0.283cm" 
draw:end-line-spacing-vertical="0.283cm" style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" style:writing-mode="lr-tb" 
style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han 
Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lohit Devanagari" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:orphans="2" fo:widows="2" 
fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" 
style:punctuation-wrap="hanging" style:line-break="strict" 
style:tab-stop-distance="1.251cm" style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" 
style:font-name="Liberation Serif" fo:font-size="12pt" fo:language="de" 
fo:country="DE" style:letter-kerning="true" style:font-name-asian="Source Han 
Serif CN" style:font-size-asian="10.5pt" style:language-asian="zh" 
style:country-asian="CN" style:font-name-complex="Lohit Devanagari" 
style:font-size-complex="12pt" style:language-complex="hi" 
style:country-complex="IN" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" 
text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.499cm" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+ </office:styles>
+ <office:automatic-styles>
+  <style:page-layout style:name="pm1">
+   <style:page-layout-properties fo:page-width="10.5cm" 
fo:page-height="14.801cm" style:num-format="1" 
style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" 
fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" 
style:footnote-max-height="0cm">
+    <style:footnote-sep style:width="0.018cm" 
style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>
+   <text:p text:style-name="Standard">Blah blah bla bla bla Foostrasse 13/c/2, 
etc.</text:p>
+  </office:text>
+ </office:body>
+</office:document>
diff --git a/sw/qa/extras/layout/layout.cxx b/sw/qa/extras/layout/layout.cxx
index 22e51db58447..8760640d86bf 100644
--- a/sw/qa/extras/layout/layout.cxx
+++ b/sw/qa/extras/layout/layout.cxx
@@ -1194,6 +1194,46 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter, 
testTableOverlapFooterFly)
                 "253");
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testNoLineBreakAtSlash)
+{
+    load(DATA_DIRECTORY, "no-line-break-at-slash.fodt");
+    xmlDocPtr pLayout = parseLayoutDump();
+
+    // the line break was between  "Foostrasse 13/c/" and "2"
+    xmlXPathObjectPtr pXmlObj = getXPathNode(pLayout, 
"/root/page[1]/body/txt[1]/child::*[2]");
+    CPPUNIT_ASSERT_EQUAL(std::string("Text"), 
std::string(reinterpret_cast<char const*>(
+                                                  
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[3]");
+    CPPUNIT_ASSERT_EQUAL(std::string("LineBreak"), 
std::string(reinterpret_cast<char const*>(
+                                                       
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[4]");
+    CPPUNIT_ASSERT_EQUAL(std::string("Text"), 
std::string(reinterpret_cast<char const*>(
+                                                  
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[5]");
+    CPPUNIT_ASSERT_EQUAL(std::string("Special"), 
std::string(reinterpret_cast<char const*>(
+                                                     
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[6]");
+    CPPUNIT_ASSERT_EQUAL(std::string("Text"), 
std::string(reinterpret_cast<char const*>(
+                                                  
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[7]");
+    CPPUNIT_ASSERT_EQUAL(std::string("LineBreak"), 
std::string(reinterpret_cast<char const*>(
+                                                       
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+    pXmlObj = getXPathNode(pLayout, "/root/page[1]/body/txt[1]/child::*[8]");
+    CPPUNIT_ASSERT_EQUAL(std::string("Finish"), 
std::string(reinterpret_cast<char const*>(
+                                                    
pXmlObj->nodesetval->nodeTab[0]->name)));
+    xmlXPathFreeObject(pXmlObj);
+
+    assertXPath(pLayout, "/root/page[1]/body/txt[1]/Text[1]", "Portion", "Blah 
blah bla bla bla ");
+    assertXPath(pLayout, "/root/page[1]/body/txt[1]/Text[2]", "Portion", 
"Foostrasse");
+    assertXPath(pLayout, "/root/page[1]/body/txt[1]/Text[3]", "Portion", 
"13/c/2, etc.");
+}
+
 CPPUNIT_TEST_FIXTURE(SwLayoutWriter, testRedlineFlysInFlys)
 {
     // currently need experimental mode
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to