jenkins-bot has submitted this change and it was merged.

Change subject: Improvements to full-nowiki wrapping in a quote context
......................................................................


Improvements to full-nowiki wrapping in a quote context

* When there are non-quote escapable characters in a string,
  verify that they actually need escaping before doing a full
  nowiki wrap.

* Fixes nowiki wrapping issues like this:
  
http://parsoid-tests.wikimedia.org/resultFlagNew/0554e63c5c90ff3d799f7a3990b534fd9e79787d/56cd9926b3ddd38c7670810671ff957bc4e35298/frwiki/T%C3%A9m%C3%A9raire_%28fantasy%29

* Updated existing parser test to capture this expectation.

Change-Id: Ib4d3f0c88b1836d4247546d013cf9276b2676fb9
---
M lib/wts.escapeWikitext.js
M tests/parserTests-blacklist.js
M tests/parserTests.txt
3 files changed, 27 insertions(+), 19 deletions(-)

Approvals:
  Cscott: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/lib/wts.escapeWikitext.js b/lib/wts.escapeWikitext.js
index 6c0c68f..f90a155 100644
--- a/lib/wts.escapeWikitext.js
+++ b/lib/wts.escapeWikitext.js
@@ -533,21 +533,27 @@
                return this.escapedText(state, false, text, true);
        }
 
-       // Full-wrapping <nowiki>..</nowiki> scenario for quotes
-       if ((fullCheckNeeded || hasNonQuoteEscapableChars || indentPreUnsafe) &&
-               (/''+/.test(text)
+       // Quote-escape test
+       if (/''+/.test(text)
                || hasLeadingEscapableQuoteChar(text, opts)
-               || hasTrailingEscapableQuoteChar(text, opts)))
+               || hasTrailingEscapableQuoteChar(text, opts))
        {
-               state.env.log("trace/wt-escape", "---quotes: full nowiki 
wrap---");
-               return this.escapedText(state, false, text, true);
-       }
-
-       // Selective <nowiki/> escaping for quotes
-       var quoteEscapedText = escapedIBSiblingNodeText(text, opts);
-       if (quoteEscapedText) {
-               state.env.log("trace/wt-escape", "---sibling of i/b tag---");
-               return quoteEscapedText;
+               // Check if we need full-wrapping <nowiki>..</nowiki>
+               // or selective <nowiki/> escaping for quotes.
+               if (fullCheckNeeded
+                       || indentPreUnsafe
+                       || (hasNonQuoteEscapableChars &&
+                               this.hasWikitextTokens(state, sol, 
this.serializer.options, text)))
+               {
+                       state.env.log("trace/wt-escape", "---quotes: full 
nowiki wrap---");
+                       return this.escapedText(state, false, text, true);
+               } else {
+                       var quoteEscapedText = escapedIBSiblingNodeText(text, 
opts);
+                       if (quoteEscapedText) {
+                               state.env.log("trace/wt-escape", "---sibling of 
i/b tag---");
+                               return quoteEscapedText;
+                       }
+               }
        }
 
        // Template and template-arg markers are escaped unconditionally!
diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js
index 80d1462..2b54a07 100644
--- a/tests/parserTests-blacklist.js
+++ b/tests/parserTests-blacklist.js
@@ -1200,7 +1200,7 @@
 add("html2wt", "Magic Word: {{SUBJECTPAGENAMEE}}", 
"User:%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason\n");
 add("html2wt", "Magic Word: {{NUMBEROFFILES}}", "5\n");
 add("html2wt", "Magic Word: {{PAGENAME}}", "Ævar Arnfjörð Bjarmason\n");
-add("html2wt", "Magic Word: {{PAGENAME}} with metacharacters", "''<nowiki>'foo 
& bar = baz'</nowiki>''\n");
+add("html2wt", "Magic Word: {{PAGENAME}} with metacharacters", 
"''<nowiki/>'foo & bar = baz'<nowiki/>''\n");
 add("html2wt", "Magic Word: {{PAGENAME}} with metacharacters (bug 26781)", 
"<nowiki>*RFC 1234 http://example.com/</nowiki>\n");
 add("html2wt", "Magic Word: {{PAGENAMEE}}", 
"%C3%86var_Arnfj%C3%B6r%C3%B0_Bjarmason\n");
 add("html2wt", "Magic Word: {{PAGENAMEE}} with metacharacters (bug 26781)", 
"<nowiki>*RFC_1234_http://example.com/</nowiki>\n");
@@ -2817,11 +2817,11 @@
 add("selser", "Entities in ref name [1]", "<ref name=\"test &amp; 
me\">hi</ref>");
 add("selser", "Headings: 5. Empty headings [[2],3,2,0,4,4,0,2,1,3,0]", 
"=hnjo2713bjvjwcdi<nowiki/>=\nx2d05yq3dapaxlxr\n==<nowiki/>==\n\nkaovt9si227ta9k9\n\nb2688fvzpaocrf6r\n====<nowiki/>====\nljshl952j0emte29\n\n=====<nowiki/>=====\n\n======<nowiki/>======");
 add("selser", "Headings: 6a. Heading chars in SOL context (with trailing 
spaces) [4,0,1,0,4,4,[2],3]", "o4fu7yz6zedvlsor\n\n<nowiki>=a=</nowiki> 
\n\nfzi337zwgfmbzkt9\n\nrziif3qr3rspp66r\n\nzm9kz709iqpsnhfr<nowiki>=a=</nowiki>
 \t");
-add("selser", "1. Quotes inside <b> and <i> 
[[2,3,[1],4,0,0,[3],0,2,2,0,4,0,0,4,1,0,0,0,0,3,1,4,3,2,4,0,0,0,0,0,0,0,2,1,0,2,[2],0,3,0,0,4]]",
 
"b9ve2r72aq44e7b9''<nowiki/>'foo'<nowiki/>''''<nowiki>''foo''</nowiki>''jduad2jvmauac3di''<nowiki>'''foo'''</nowiki>''\n''<nowiki/>''<nowiki/>hb7ucb9xukofajor's\nimf9p1zrvbbdfgvi'''<nowiki/>'foo'<nowiki/>'''\nd92wpym0cizwu3di\n'''<nowiki>'''foo'''</nowiki>'''4mia6l6nhzolxr'''foo'<nowiki/>''bar'<nowiki/>''baz'''\n'''foo'''<nowiki/>'s\n'''foo''6wag5p5b648l4n29rs74ede4dxiuow29<nowiki/>s455j5uyzl0daemi<nowiki/>''foo''<nowiki/>'\n'<nowiki/>'''foo'''\nc9hosabzbqhbyb9'''foo'''<nowiki/>'\n'1yl4yeqhhtr19k9<nowiki/>'''9k3pgwyb0uvaq0k9foo'''<nowiki/>''fools'<span>
 errand</span>''\n3mwa3kwctc8r529\n");
-add("selser", "1. Quotes inside <b> and <i> 
[[[2,0,3],0,[[3]],4,4,2,[3],3,0,[0,3,1],3,[2],3,[[3]],3,[0,1,2,2],3,3,0,4,4,4,0,[4],0,0,0,0,4,0,2,1,0,3,0,2,0,2,4,2,[3,1],4,1]]",
 
"''rou4oqqj45pwg66r<nowiki/>'foo'''\n''<nowiki></nowiki>''6o82gwbgw9xxn7b9n4fc723rbxtg9zfr2po5rm4z5rhehfr\n''<nowiki/>''<nowiki/>'s\n'''<nowiki/><nowiki/>''''''8vtzkg2u8wnopqfr<nowiki>''foo''</nowiki>''''''<nowiki></nowiki>''''''foo'<nowiki/>ipon7rm9iy0hpvi''bar'<nowiki/>''jsehige2uxov42t9baz'''<nowiki/>dinfburnti0ms4ibximthck3qgaxlxrrbhllev1hoo2mx6r\n''tvi87wnpldblc8fr''<nowiki/>'\n'<nowiki/>''foo''mans72mc33csdcxr'\n'dnvvbq5ayqc6usor<nowiki/>'''foo'''\n<nowiki/>9293k6dvvmoq1tt9'\n'<nowiki/>zs5z7v3q0qaug14i'''foo'''deu4ioyka97fogvii2578yu6svt5ipb9'\n''<span
 data-foobar=\"ntagvrajvtoqolxr\"> 
errand</span>''icug3imme9mjkyb9''<span>fool</span>'s errand''");
-add("selser", "1. Quotes inside <b> and <i> 
[[3,0,[[4]],4,0,0,3,0,0,[2,0,3],0,2,0,[4],0,[0,0,1,2],4,0,0,2,0,1,2,0,0,3,0,[4],0,0,3,[2],3,4,3,4,0,[4],1,3,1,3,3]]",
 
"\n''<nowiki>9du4tukpxr5p14i</nowiki>''a3oxn4o6xuoez5mi''<nowiki>'''foo'''</nowiki>''\n<nowiki/>'s\n'''zb6b8p4dsrgj5rk9<nowiki/>'foo''''\nn5g2nainzi9evcxr'''<nowiki>''foo''</nowiki>'''\n'''fjf9en2rxyw1xlxr'''\n'''foo'<nowiki/>''bar'<nowiki/>''3t058jjruq4wvcxrbaz'''w3assj8fjchm2t9'''foo'''<nowiki/>406bo4oovs3sdcxr's\n'<nowiki/>''foo''l8ur9en9wqe8w7b9\n''foo''<nowiki/><nowiki/>''upyarw5tif1rlik9''<nowiki/>'\n''''xf76q2gb9hmbcsorfoo'''zeaqonfmvysexw295dvwath003dqjjor<nowiki/>'''q5arckx2cdk4vx6r'''<nowiki/>''fools'<span>
 errand</span>''\n");
-add("selser", "1. Quotes inside <b> and <i> 
[[4,2,0,0,[2],0,1,0,4,[0,0,3],2,0,2,[[3]],0,[0,1,[3,0],0],0,4,4,0,1,2,0,[3],0,0,1,0,4,4,3,0,4,[2],0,4,4,3,0,4,4,4,[[4],3]]]",
 
"acy673rinovfgviplr0nwpq14079zfr\n''<nowiki>''foo''</nowiki>''\n''x9s8roz7iecul3di<nowiki>'''foo'''</nowiki>''\n''foo''<nowiki/>ncaawjaqbiall3di'''<nowiki/>'foo''''7mofib93ncj714i\n'''<nowiki>''foo''</nowiki>'''a0h559r0kaf9a4i\n'''<nowiki></nowiki>'''\n'''foo'<nowiki/>''<nowiki/>''baz'''\n265zz6wn68zg2e29dcfy6wfyuuonipb9's\n'<nowiki/>n0so9m9gubthjjor''foo''\n''<nowiki/>''<nowiki/>'\n'<nowiki/>''foo''eu8bi30kt40lik9enwlc3t7myt4kj4i'''foo'''x6ngpya7ros10pb9'''pil88s26p0mp9zfrfoo'''<nowiki/>guy0jrmki6v18aor79cji1kde00jxlxr<nowiki/>ce9yefc1ixp3nmiudh3zchhff94fgvi41nysayj1hsemi''<span>6nuqrvo7e9qtcsor</span>''\n");
-add("selser", "1. Quotes inside <b> and <i> 
[[4,0,4,0,0,2,1,4,2,1,3,[3],3,[[2]],3,3,3,0,4,0,3,4,0,[3],0,0,4,[2],3,0,0,[4],0,3,0,0,1,[3],0,0,[0,4],2,[0,4]]]",
 
"bcv9t18xvahh0k9\n7j4ebaxa7o9ftj4i\n''<nowiki>'''foo'''</nowiki>''mry7gwh281tt9\n''foo''6z57b2fhe9yn9udi7d4vr8m4oxcivn29's\n'''<nowiki/>'foo'<nowiki/>''''''<nowiki/>''''''<nowiki>x4ljrkxn00jxlxr'''foo'''</nowiki>''''''foo'''eg408kyvbtck57b9's\n'72iu8q6iuihehfr\n''<nowiki/>''<nowiki/>'\n'hs9psbz3fcdw8kt9''hpob0uhvs0885mifoo'''\n'<nowiki/>'''1ikpa9oovowghkt9'''\n<nowiki/>'\n'<nowiki/>'''<nowiki/>'''<nowiki/>'\n''fools'2cecdk1nov927qfr''qgboi2cpqmovquxr\n''<span>fool</span>kx25x3hw1m7vi''");
+add("selser", "1. Quotes inside <b> and <i> 
[[2,3,[1],4,0,0,[3],0,2,2,0,4,0,0,4,1,0,0,0,0,3,1,4,3,2,4,0,0,0,0,0,0,0,2,1,0,2,[2],0,3,0,0,4,0,0,1]]",
 
"b9ve2r72aq44e7b9''<nowiki/>'foo'<nowiki/>''''<nowiki>''foo''</nowiki>''jduad2jvmauac3di''<nowiki>'''foo'''</nowiki>''\n''<nowiki/>''<nowiki/>hb7ucb9xukofajor's\nimf9p1zrvbbdfgvi'''<nowiki/>'foo'<nowiki/>'''\nd92wpym0cizwu3di\n'''<nowiki>'''foo'''</nowiki>'''4mia6l6nhzolxr'''foo'<nowiki/>''bar'<nowiki/>''baz'''\n'''foo'''<nowiki/>'s\n'''foo''6wag5p5b648l4n29rs74ede4dxiuow29<nowiki/>s455j5uyzl0daemi<nowiki/>''foo''<nowiki/>'\n'<nowiki/>'''foo'''\nc9hosabzbqhbyb9'''foo'''<nowiki/>'\n'1yl4yeqhhtr19k9<nowiki/>'''9k3pgwyb0uvaq0k9foo'''<nowiki/>''fools'<span>
 errand</span>''\n3mwa3kwctc8r529\na|!*#-:;+-~[]{}b'<nowiki/>''x''");
+add("selser", "1. Quotes inside <b> and <i> 
[[[2,0,3],0,[[3]],4,4,2,[3],3,0,[0,3,1],3,[2],3,[[3]],3,[0,1,2,2],3,3,0,4,4,4,0,[4],0,0,0,0,4,0,2,1,0,3,0,2,0,2,4,2,[3,1],4,1,2,0,4]]",
 
"''rou4oqqj45pwg66r<nowiki/>'foo'''\n''<nowiki></nowiki>''6o82gwbgw9xxn7b9n4fc723rbxtg9zfr2po5rm4z5rhehfr\n''<nowiki/>''<nowiki/>'s\n'''<nowiki/><nowiki/>''''''8vtzkg2u8wnopqfr<nowiki>''foo''</nowiki>''''''<nowiki></nowiki>''''''foo'<nowiki/>ipon7rm9iy0hpvi''bar'<nowiki/>''jsehige2uxov42t9baz'''<nowiki/>dinfburnti0ms4ibximthck3qgaxlxrrbhllev1hoo2mx6r\n''tvi87wnpldblc8fr''<nowiki/>'\n'<nowiki/>''foo''mans72mc33csdcxr'\n'dnvvbq5ayqc6usor<nowiki/>'''foo'''\n<nowiki/>9293k6dvvmoq1tt9'\n'<nowiki/>zs5z7v3q0qaug14i'''foo'''deu4ioyka97fogvii2578yu6svt5ipb9'\n''<span
 data-foobar=\"ntagvrajvtoqolxr\"> 
errand</span>''icug3imme9mjkyb9''<span>fool</span>'s 
errand''wglst0tvcv2w3ik9\na|!*#-:;+-~[]{}b'<nowiki/>i9b91kkaoiggb9");
+add("selser", "1. Quotes inside <b> and <i> 
[[3,0,[[4]],4,0,0,3,0,0,[2,0,3],0,2,0,[4],0,[0,0,1,2],4,0,0,2,0,1,2,0,0,3,0,[4],0,0,3,[2],3,4,3,4,0,[4],1,3,1,3,3,4,0,2]]",
 
"\n''<nowiki>9du4tukpxr5p14i</nowiki>''a3oxn4o6xuoez5mi''<nowiki>'''foo'''</nowiki>''\n<nowiki/>'s\n'''zb6b8p4dsrgj5rk9<nowiki/>'foo''''\nn5g2nainzi9evcxr'''<nowiki>''foo''</nowiki>'''\n'''fjf9en2rxyw1xlxr'''\n'''foo'<nowiki/>''bar'<nowiki/>''3t058jjruq4wvcxrbaz'''w3assj8fjchm2t9'''foo'''<nowiki/>406bo4oovs3sdcxr's\n'<nowiki/>''foo''l8ur9en9wqe8w7b9\n''foo''<nowiki/><nowiki/>''upyarw5tif1rlik9''<nowiki/>'\n''''xf76q2gb9hmbcsorfoo'''zeaqonfmvysexw295dvwath003dqjjor<nowiki/>'''q5arckx2cdk4vx6r'''<nowiki/>''fools'<span>
 errand</span>''4prh3f1lk2j7cik9<nowiki/>wyd9n604zjafko6r''x''");
+add("selser", "1. Quotes inside <b> and <i> 
[[4,2,0,0,[2],0,1,0,4,[0,0,3],2,0,2,[[3]],0,[0,1,[3,0],0],0,4,4,0,1,2,0,[3],0,0,1,0,4,4,3,0,4,[2],0,4,4,3,0,4,4,4,[[4],3],0,4,0]]",
 
"acy673rinovfgviplr0nwpq14079zfr\n''<nowiki>''foo''</nowiki>''\n''x9s8roz7iecul3di<nowiki>'''foo'''</nowiki>''\n''foo''<nowiki/>ncaawjaqbiall3di'''<nowiki/>'foo''''7mofib93ncj714i\n'''<nowiki>''foo''</nowiki>'''a0h559r0kaf9a4i\n'''<nowiki></nowiki>'''\n'''foo'<nowiki/>''<nowiki/>''baz'''\n265zz6wn68zg2e29dcfy6wfyuuonipb9's\n'<nowiki/>n0so9m9gubthjjor''foo''\n''<nowiki/>''<nowiki/>'\n'<nowiki/>''foo''eu8bi30kt40lik9enwlc3t7myt4kj4i'''foo'''x6ngpya7ros10pb9'''pil88s26p0mp9zfrfoo'''<nowiki/>guy0jrmki6v18aor79cji1kde00jxlxr<nowiki/>ce9yefc1ixp3nmiudh3zchhff94fgvi41nysayj1hsemi''<span>6nuqrvo7e9qtcsor</span>''\na|!*#-:;+-~[]{}b'j80zfyt47psyvi''x''");
+add("selser", "1. Quotes inside <b> and <i> 
[[4,0,4,0,0,2,1,4,2,1,3,[3],3,[[2]],3,3,3,0,4,0,3,4,0,[3],0,0,4,[2],3,0,0,[4],0,3,0,0,1,[3],0,0,[0,4],2,[0,4],4,0,3]]",
 
"bcv9t18xvahh0k9\n7j4ebaxa7o9ftj4i\n''<nowiki>'''foo'''</nowiki>''mry7gwh281tt9\n''foo''6z57b2fhe9yn9udi7d4vr8m4oxcivn29's\n'''<nowiki/>'foo'<nowiki/>''''''<nowiki/>''''''<nowiki>x4ljrkxn00jxlxr'''foo'''</nowiki>''''''foo'''eg408kyvbtck57b9's\n'72iu8q6iuihehfr\n''<nowiki/>''<nowiki/>'\n'hs9psbz3fcdw8kt9''hpob0uhvs0885mifoo'''\n'<nowiki/>'''1ikpa9oovowghkt9'''\n<nowiki/>'\n'<nowiki/>'''<nowiki/>'''<nowiki/>'\n''fools'2cecdk1nov927qfr''qgboi2cpqmovquxr\n''<span>fool</span>kx25x3hw1m7vi''8qfgpvlpg7v9ggb9<nowiki/>\n");
 add("selser", "HTML tag with broken attribute value quoting [1]", "<span 
title=\"Hello world>Foo</span>");
 add("selser", "HTML tag with broken attribute value quoting [2]", 
"zlkpme7jgj76tj4i\n\n<span title=\"Hello world>Foo</span>");
 add("selser", "HTML tag with broken attribute value quoting [[2]]", 
"19ydfukj49zoajor<span title=\"Hello world>Foo</span>");
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index d0c7ed7..f0a4af2 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -20795,6 +20795,7 @@
 '<nowiki/>'''foo'''<nowiki/>'
 ''fools'<span> errand</span>''
 ''<span>fool</span>'s errand''
+a|!*#-:;+-~[]{}b'<nowiki/>''x''
 !! html/*
 <p><i>'foo'</i>
 <i>''foo''</i>
@@ -20813,6 +20814,7 @@
 '<b>foo</b>'
 <i>fools'<span> errand</span></i>
 <i><span>fool</span>'s errand</i>
+a|!*#-:;+-~[]{}b'<i>x</i>
 </p>
 !! end
 

-- 
To view, visit https://gerrit.wikimedia.org/r/179908
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: Ib4d3f0c88b1836d4247546d013cf9276b2676fb9
Gerrit-PatchSet: 2
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: Arlolra <[email protected]>
Gerrit-Reviewer: Cscott <[email protected]>
Gerrit-Reviewer: Marcoil <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to