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