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

Change subject: (Bug 62341) WTS fix to use regular wikilinks if nowikis show up.
......................................................................


(Bug 62341) WTS fix to use regular wikilinks if nowikis show up.

* Dont wikitext escape the link target in simple-wikilink serialization
  scenarios since that modifies the link target (either generates an
  invalid wikilink target or a different target). But, entities are
  always escaped.

  For valid page names that have a wikitext representation, this ensures
  that they remain valid.

  For invalid page names that don't have a wikitext representation,
  this will change the page name to point to something that may or
  may not exist. For now, I am leaving this unchanged since VE itself
  doesn't provide hrefs that cannot be produced by a valid wikipage.

  The valid/invalid href detection relies on the same test that is used
  by the parse pipeline to render invalid wikilinks to text.

* Added a new parser test that verifies that wikilink hrefs are not
  subjected to nowiki escaping tests.

Change-Id: Ie661a586bb050171811db8d975c91e1a286b7aa3
---
M lib/ext.core.LinkHandler.js
M lib/mediawiki.parser.environment.js
M lib/wts.LinkHandler.js
M lib/wts.escapeWikitext.js
M tests/parserTests.txt
5 files changed, 40 insertions(+), 15 deletions(-)

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



diff --git a/lib/ext.core.LinkHandler.js b/lib/ext.core.LinkHandler.js
index dfd02bf..40cd947 100644
--- a/lib/ext.core.LinkHandler.js
+++ b/lib/ext.core.LinkHandler.js
@@ -187,7 +187,7 @@
                return;
        }
 
-       if (!env.isValidLinkTarget(token)) {
+       if (!env.isValidLinkTarget(token.getAttribute("href"))) {
                var tokens = ["[["];
                if (/mw:ExpandedAttrs/.test(token.getAttribute("typeof"))) {
                        var dataMW = 
JSON.parse(token.getAttribute("data-mw")).attribs;
diff --git a/lib/mediawiki.parser.environment.js 
b/lib/mediawiki.parser.environment.js
index c795b76..47c8cff 100644
--- a/lib/mediawiki.parser.environment.js
+++ b/lib/mediawiki.parser.environment.js
@@ -433,9 +433,8 @@
        return name;
 };
 
-MWParserEnvironment.prototype.isValidLinkTarget = function(linkToken) {
-    var tattr = linkToken.getAttribute("href"),
-               hrefToken = Util.tokensToString(tattr),
+MWParserEnvironment.prototype.isValidLinkTarget = function(href) {
+    var hrefToken = Util.tokensToString(href),
         subpageEnabled = false;
 
     // For links starting with ../ and pointing to subpages
diff --git a/lib/wts.LinkHandler.js b/lib/wts.LinkHandler.js
index f50184c..2513bea 100644
--- a/lib/wts.LinkHandler.js
+++ b/lib/wts.LinkHandler.js
@@ -97,9 +97,9 @@
        return rtData;
 };
 
-var escapeWikiLinkContentString = function(contentString, state, contentNode) {
+var escapeWikiLinkContentString = function(linkTarget, state, contentNode) {
        // First, entity-escape the content.
-       contentString = Util.escapeEntities(contentString);
+       linkTarget = Util.escapeEntities(linkTarget);
 
        // Wikitext-escape content.
        //
@@ -109,10 +109,25 @@
        
state.wteHandlerStack.push(state.serializer.wteHandlers.wikilinkHandler);
        state.inLink = true;
        state.inTable = DU.inTable(contentNode);
-       var res = state.serializer.escapeWikiText(state, contentString, { node: 
contentNode });
+       var res = state.serializer.escapeWikiText(state, linkTarget, { node: 
contentNode });
        state.inLink = false;
        state.wteHandlerStack.pop();
-       return res;
+
+       // env.isValidLinkTarget doesn't check for anything that the tokenizer
+       // already handles. So, handle those here.
+       //
+       // FIXME: Should we make env.isValidLinkTarget self-contained so that
+       // it can be used in other contexts without relying on tokenizer fixups?
+       if (!state.env.isValidLinkTarget(linkTarget) || 
/[\|]/.test(linkTarget)) {
+               // linkTarget = <point-to-some-error-page?>
+               // What would this be?
+               // FIXME: VE doesn't provide invalid link targets, so there is 
no
+               // real WYSIWYG concern here. It should be fine to just leave 
this
+               // pointing to a broken page.
+               linkTarget = linkTarget;
+       }
+
+       return { contentSrc: res, linkTarget: linkTarget };
 };
 
 /**
@@ -335,14 +350,15 @@
                        }
 
                        // The string value of the content, if it is plain text.
-                       var linkTarget;
+                       var linkTarget, escapedRes;
 
                        if ( linkData.isRedirect ) {
                                linkTarget = target.value;
                                if (target.modified || !target.fromsrc) {
                                        linkTarget = 
linkTarget.replace(/^(\.\.?\/)*/, '').replace(/_/g, ' ');
-                                       linkTarget = 
escapeWikiLinkContentString(linkTarget,
+                                       escapedRes = 
escapeWikiLinkContentString(linkTarget,
                                                state, linkData.contentNode);
+                                       linkTarget = escapedRes.linkTarget;
                                }
                                cb( linkData.prefix + '[[' + linkTarget + ']]', 
node );
                                return;
@@ -351,11 +367,10 @@
                                if (!target.modified && 
!linkData.contentModified) {
                                        linkTarget = target.value;
                                } else {
-                                       linkTarget = 
escapeWikiLinkContentString(linkData.content.string,
+                                       escapedRes = 
escapeWikiLinkContentString(linkData.content.string,
                                                        state, 
linkData.contentNode);
-                                       linkTarget = addColonEscape(this.env, 
linkTarget, linkData);
+                                       linkTarget = addColonEscape(this.env, 
escapedRes.linkTarget, linkData);
                                }
-
                                cb( linkData.prefix + '[[' + linkTarget + ']]' 
+ linkData.tail, node );
                                return;
                        } else {
@@ -377,8 +392,9 @@
                                        if (linkData.content.fromsrc) {
                                                contentSrc = 
linkData.content.string;
                                        } else {
-                                               contentSrc = 
escapeWikiLinkContentString(linkData.content.string || '',
+                                               escapedRes = 
escapeWikiLinkContentString(linkData.content.string || '',
                                                                state, 
linkData.contentNode);
+                                               contentSrc = 
escapedRes.contentSrc;
                                        }
                                }
 
diff --git a/lib/wts.escapeWikitext.js b/lib/wts.escapeWikitext.js
index e8ef4b1..9790f8e 100644
--- a/lib/wts.escapeWikitext.js
+++ b/lib/wts.escapeWikitext.js
@@ -193,7 +193,7 @@
                        }
 
                        if (t.name === 'wikilink') {
-                               if (state.env.isValidLinkTarget(t)) {
+                               if 
(state.env.isValidLinkTarget(t.getAttribute("href"))) {
                                        return true;
                                } else {
                                        continue;
diff --git a/tests/parserTests.txt b/tests/parserTests.txt
index e2bf9f6..938ff9b 100644
--- a/tests/parserTests.txt
+++ b/tests/parserTests.txt
@@ -20322,6 +20322,16 @@
 <p>b</p></div>
 !! end
 
+!! test
+Substrings resembeling wikitext in hrefs should not get nowiki escapes
+!! options
+parsoid=html2wt
+!! wikitext
+[[Foo''bar''baz]]
+!! html
+<a rel="mw:WikiLink" href="./Foo''bar''baz">Foo''bar''baz</a>
+!! end
+
 #-----------------------------
 # I/B quote minimization tests
 #-----------------------------

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

Gerrit-MessageType: merged
Gerrit-Change-Id: Ie661a586bb050171811db8d975c91e1a286b7aa3
Gerrit-PatchSet: 13
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <ssas...@wikimedia.org>
Gerrit-Reviewer: GWicke <gwi...@wikimedia.org>
Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to