Arlolra has uploaded a new change for review. https://gerrit.wikimedia.org/r/181680
Change subject: Stray </noinclude> should be parsed to meta ...................................................................... Stray </noinclude> should be parsed to meta Bug: T57531 Change-Id: I8081364f97df7ffb5fa8e70a2c72b9a132364def --- M lib/ext.core.NoIncludeOnly.js M lib/ext.util.TokenCollector.js M tests/parserTests-blacklist.js 3 files changed, 16 insertions(+), 5 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/parsoid refs/changes/80/181680/1 diff --git a/lib/ext.core.NoIncludeOnly.js b/lib/ext.core.NoIncludeOnly.js index fa6bc84..c91ac36 100644 --- a/lib/ext.core.NoIncludeOnly.js +++ b/lib/ext.core.NoIncludeOnly.js @@ -143,6 +143,12 @@ function noIncludeHandler(manager, options, collection) { var start = collection.shift(); + // A stray end tag. + if ( start.constructor === EndTagTk ) { + var meta = buildMetaToken( manager, 'mw:Includes/NoInclude', true, (start.dataAttribs || {}).tsr ); + return { tokens: [ meta ] }; + } + // Handle self-closing tag case specially! if (start.constructor === SelfclosingTagTk) { return (options.isInclude) ? @@ -186,7 +192,8 @@ true, // match the end-of-input if </noinclude> is missing 0.02, // very early in stage 1, to avoid any further processing. 'tag', - 'noinclude' + 'noinclude', + true ); } diff --git a/lib/ext.util.TokenCollector.js b/lib/ext.util.TokenCollector.js index c2fc582..27ec0a9 100644 --- a/lib/ext.util.TokenCollector.js +++ b/lib/ext.util.TokenCollector.js @@ -30,13 +30,14 @@ * @param {string} type Token type to register for ('tag', 'text' etc) * @param {string} name (optional, only for token type 'tag'): tag name. */ -function TokenCollector ( manager, transformation, toEnd, rank, type, name ) { +function TokenCollector( manager, transformation, toEnd, rank, type, name, ackEnd ) { this.transformation = transformation; this.manager = manager; this.rank = rank; this.type = type; this.name = name; this.toEnd = toEnd; + this.ackEnd = ackEnd; this.scopeStack = []; manager.addTransform( this._onDelimiterToken.bind( this ), "TokenCollector:_onDelimiterToken", rank, type, name ); } @@ -124,8 +125,12 @@ } } else { // EOFTk or EndTagTk - // EOFTk is okay, but EndTagTk is an error (ignoring error!) - return { tokens: [ token ] }; //this.transformation( [token, token] ); + if ( this.ackEnd ) { + return this.transformation([ token ]); + } else { + // EOFTk is okay, but EndTagTk is an error (ignoring error!) + return { tokens: [ token ] }; + } } }; diff --git a/tests/parserTests-blacklist.js b/tests/parserTests-blacklist.js index 87f3206..7a707ab 100644 --- a/tests/parserTests-blacklist.js +++ b/tests/parserTests-blacklist.js @@ -115,7 +115,6 @@ add("wt2html", "msgnw keyword", "<p data-parsoid='{\"dsr\":[0,20,0,0]}'><span typeof=\"mw:Transclusion mw:Placeholder\" about=\"#mwt1\" id=\"mwt1\" data-parsoid='{\"dsr\":[0,20,null,null],\"pi\":[[]]}' data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"msgnw:MSGNW test\",\"href\":\"./Msgnw:MSGNW_test\"},\"params\":{},\"i\":0}}]}'>Warning: Page/template fetching disabled, and no cache for Msgnw:MSGNW_test</span></p>"); add("wt2html", "int keyword", "<p about=\"#mwt1\" typeof=\"mw:Transclusion\" data-parsoid='{\"dsr\":[0,45,0,0],\"pi\":[[{\"k\":\"1\",\"spc\":[\"\",\"\",\"\",\"\"]},{\"k\":\"2\",\"spc\":[\"\",\"\",\"\",\"\"]}]]}' data-mw='{\"parts\":[{\"template\":{\"target\":{\"wt\":\"int:youhavenewmessages\",\"function\":\"int\"},\"params\":{\"1\":{\"wt\":\"lots of money\"},\"2\":{\"wt\":\"not!\"}},\"i\":0}}]}'>Parser function implementation for pf_int missing in Parsoid.</p>"); add("wt2html", "Self-closed noinclude, includeonly, onlyinclude tags", "<meta typeof=\"mw:Includes/NoInclude\" data-parsoid='{\"src\":\"<noinclude />\",\"dsr\":[0,13,null,null]}'/>\n<meta typeof=\"mw:Includes/IncludeOnly\" data-parsoid='{\"src\":\"<includeonly />\",\"dsr\":[14,29,null,null]}'/>\n<meta typeof=\"mw:Includes/OnlyInclude\" data-parsoid='{\"src\":\"<onlyinclude />\",\"dsr\":[30,45,null,null]}'/>"); -add("wt2html", "Unbalanced includeonly and noinclude tags", "<table data-parsoid='{\"dsr\":[0,107,2,2]}'>\n<tbody data-parsoid='{\"dsr\":[3,105,0,0]}'><tr data-parsoid='{\"autoInsertedEnd\":true,\"autoInsertedStart\":true,\"dsr\":[3,104,0,0]}'><td data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[3,17,1,0]}'>a</noinclude></td>\n<td data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[18,44,1,0]}'>b</noinclude></noinclude></td>\n<td data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[45,73,1,0]}'>c</noinclude></includeonly></td>\n<td data-parsoid='{\"autoInsertedEnd\":true,\"dsr\":[74,104,1,0]}'>d</includeonly></includeonly></td></tr>\n</tbody></table>"); add("wt2html", "Bug 6563: Section extraction for section shown by <includeonly>", "<meta typeof=\"mw:Includes/IncludeOnly\" data-parsoid='{\"src\":\"<includeonly>\\n==Includeonly section==\\n</includeonly>\",\"dsr\":[0,52,null,null]}'/><meta typeof=\"mw:Includes/IncludeOnly/End\" data-parsoid='{\"src\":\"\",\"dsr\":[52,52,null,null]}'/>\n<h2 data-parsoid='{\"dsr\":[53,68,2,2]}'>Section T-2</h2>"); add("wt2html", "Bug 6563: Section extraction for section suppressed by <includeonly>", "<meta typeof=\"mw:Includes/IncludeOnly\" data-parsoid='{\"src\":\"<includeonly>\\n==Includeonly section==\\n</includeonly>\",\"dsr\":[0,52,null,null]}'/><meta typeof=\"mw:Includes/IncludeOnly/End\" data-parsoid='{\"src\":\"\",\"dsr\":[52,52,null,null]}'/>\n<h2 data-parsoid='{\"dsr\":[53,66,2,2]}'>Section 1</h2>"); add("wt2html", "2. includeonly in html attr value", "<p data-parsoid='{\"dsr\":[0,155,0,0]}'><span id=\"v1\" about=\"#mwt1\" typeof=\"mw:ExpandedAttrs\" data-parsoid='{\"stx\":\"html\",\"a\":{\"id\":\"v1\"},\"sa\":{\"id\":\"<noinclude>v1</noinclude><includeonly>v2</includeonly>\"},\"dsr\":[0,76,66,7]}' data-mw='{\"attribs\":[[{\"txt\":\"id\"},{\"html\":\"<meta typeof=\\\"mw:Includes/NoInclude\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;<noinclude>&quot;,&quot;dsr&quot;:[10,21,null,null]}\\\">v1<meta typeof=\\\"mw:Includes/NoInclude/End\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;</noinclude>&quot;,&quot;dsr&quot;:[23,35,null,null]}\\\"><meta typeof=\\\"mw:Includes/IncludeOnly\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;<includeonly>v2</includeonly>&quot;,&quot;dsr&quot;:[35,64,null,null]}\\\"><meta typeof=\\\"mw:Includes/IncludeOnly/End\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;&quot;,&quot;dsr&quot;:[64,64,null,null]}\\\">\"}]]}'>bar</span>\n<span id='\"v1\"' about=\"#mwt2\" typeof=\"mw:ExpandedAttrs\" data-parsoid='{\"stx\":\"html\",\"a\":{\"id\":\"\\\"v1\\\"\"},\"sa\":{\"id\":\"<noinclude>\\\"v1\\\"</noinclude><includeonly>\\\"v2\\\"</includeonly>\"},\"dsr\":[77,155,68,7]}' data-mw='{\"attribs\":[[{\"txt\":\"id\"},{\"html\":\"<meta typeof=\\\"mw:Includes/NoInclude\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;<noinclude>&quot;,&quot;dsr&quot;:[86,97,null,null]}\\\">\\\"v1\\\"<meta typeof=\\\"mw:Includes/NoInclude/End\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;</noinclude>&quot;,&quot;dsr&quot;:[101,113,null,null]}\\\"><meta typeof=\\\"mw:Includes/IncludeOnly\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;<includeonly>\\\\&quot;v2\\\\&quot;</includeonly>&quot;,&quot;dsr&quot;:[113,144,null,null]}\\\"><meta typeof=\\\"mw:Includes/IncludeOnly/End\\\" data-parsoid=\\\"{&quot;src&quot;:&quot;&quot;,&quot;dsr&quot;:[144,144,null,null]}\\\">\"}]]}'>bar</span></p>"); -- To view, visit https://gerrit.wikimedia.org/r/181680 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I8081364f97df7ffb5fa8e70a2c72b9a132364def Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/services/parsoid Gerrit-Branch: master Gerrit-Owner: Arlolra <abrea...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits