jenkins-bot has submitted this change and it was merged. ( https://gerrit.wikimedia.org/r/395689 )
Change subject: T182170: Linter: Detect multiple-unclosed-formatting-tags lint errors ...................................................................... T182170: Linter: Detect multiple-unclosed-formatting-tags lint errors * Works on itwiki:Hubert_H._Humphrey_Metrodome * Added mocha tests to verify expectations. --- [info/lint/multiple-unclosed-formatting-tag][itwiki/Hubert_H._Humphrey_Metrodome?oldid=93017491] {"type":"multiple-unclosed-formatting-tag","params":{"name":"small"},"dsr":[4999,5046,7,0]} --- Change-Id: I334738c77b3677b59c91792b9dc2e7ec8fa829e5 --- M lib/wt2html/DOMPostProcessor.js M lib/wt2html/pp/handlers/linter.js M tests/mocha/linter.js 3 files changed, 74 insertions(+), 2 deletions(-) Approvals: C. Scott Ananian: Looks good to me, approved jenkins-bot: Verified diff --git a/lib/wt2html/DOMPostProcessor.js b/lib/wt2html/DOMPostProcessor.js index b291406..e2d3840 100644 --- a/lib/wt2html/DOMPostProcessor.js +++ b/lib/wt2html/DOMPostProcessor.js @@ -33,7 +33,7 @@ return require('./pp/handlers/' + file + '.js'); }; -var logWikitextFixup = requireHandlers('linter').logWikitextFixups; +var linter = requireHandlers('linter'); var CleanUp = requireHandlers('cleanup'); var headings = requireHandlers('headings'); var unpackDOMFragments = requireHandlers('unpackDOMFragments').unpackDOMFragments; @@ -179,7 +179,7 @@ if (env.conf.parsoid.linting) { domVisitor = new DOMTraverser(env); - domVisitor.addHandler(null, logWikitextFixup); + domVisitor.addHandler(null, linter.logWikitextFixups); addPP('linter', domVisitor.traverse.bind(domVisitor)); } @@ -536,6 +536,9 @@ if (psd.dumpFlags && psd.dumpFlags.indexOf('wt2html:limits') !== -1) { env.printParserResourceUsage({ 'HTML Size': document.outerHTML.length }); } + if (env.conf.parsoid.linting) { + linter.postProcessLints(env.lintLogger.buffer); + } } this.emit('document', document); diff --git a/lib/wt2html/pp/handlers/linter.js b/lib/wt2html/pp/handlers/linter.js index aa20ff9..aa38650 100644 --- a/lib/wt2html/pp/handlers/linter.js +++ b/lib/wt2html/pp/handlers/linter.js @@ -778,6 +778,50 @@ markProcessedNodes(); } +function detectMultipleUnclosedFormattingTags(lints) { + // Detect multiple-unclosed-formatting-tags errors. + // + // Since unclosed <small> and <big> tags accumulate their effects + // in HTML5 parsers (unlike in Tidy where it seems to suppress + // multiple unclosed elements of the same name), such pages will + // break pretty spectacularly with Remex. + // + // Ex: https://it.wikipedia.org/wiki/Hubert_H._Humphrey_Metrodome?oldid=93017491#Note + var firstUnclosedTag = { + small: null, + big: null, + }; + var multiUnclosedTagName = null; + lints.find(function(item) { + if (item.type === 'missing-end-tag') { + if (item.params.name === 'small' || item.params.name === 'big') { + var tagName = item.params.name; + if (!firstUnclosedTag[tagName]) { + firstUnclosedTag[tagName] = item; + } else { + multiUnclosedTagName = tagName; + return true; + } + } + } + return false; + }); + + if (multiUnclosedTagName) { + var item = firstUnclosedTag[multiUnclosedTagName]; + lints.push({ + type: 'multiple-unclosed-formatting-tags', + params: item.params, + dsr: item.dsr, + templateInfo: item.templateInfo, + }); + } +} + +function postProcessLints(lints) { + detectMultipleUnclosedFormattingTags(lints); +} + function logWikitextFixups(node, env, atTopLevel, tplInfo) { // For now, don't run linter in subpipelines. // Only on the final DOM for the top-level page. @@ -826,4 +870,5 @@ if (typeof module === "object") { module.exports.logWikitextFixups = logWikitextFixups; + module.exports.postProcessLints = postProcessLints; } diff --git a/tests/mocha/linter.js b/tests/mocha/linter.js index ab8bb5b..45f36b5 100644 --- a/tests/mocha/linter.js +++ b/tests/mocha/linter.js @@ -801,4 +801,28 @@ }); }); }); + + describe('MULTIPLE UNCLOSED FORMATTING TAGS', function() { + it('should detect multiple unclosed small tags', function() { + return parseWT('<div><small>x</div><div><small>y</div>').then(function(result) { + result.should.have.length(3); + result[2].should.have.a.property("type", "multiple-unclosed-formatting-tags"); + result[2].params.should.have.a.property("name", "small"); + }); + }); + it('should detect multiple unclosed big tags', function() { + return parseWT('<div><big>x</div><div><big>y</div>').then(function(result) { + result.should.have.length(3); + result[2].should.have.a.property("type", "multiple-unclosed-formatting-tags"); + result[2].params.should.have.a.property("name", "big"); + }); + }); + it('should detect multiple unclosed big tags', function() { + return parseWT('<div><small><big><small><big>y</div>').then(function(result) { + result.should.have.length(5); + result[4].should.have.a.property("type", "multiple-unclosed-formatting-tags"); + result[4].params.should.have.a.property("name", "small"); + }); + }); + }); }); -- To view, visit https://gerrit.wikimedia.org/r/395689 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: merged Gerrit-Change-Id: I334738c77b3677b59c91792b9dc2e7ec8fa829e5 Gerrit-PatchSet: 4 Gerrit-Project: mediawiki/services/parsoid Gerrit-Branch: master Gerrit-Owner: Subramanya Sastry <ssas...@wikimedia.org> Gerrit-Reviewer: Arlolra <abrea...@wikimedia.org> Gerrit-Reviewer: C. Scott Ananian <canan...@wikimedia.org> Gerrit-Reviewer: Legoktm <lego...@member.fsf.org> Gerrit-Reviewer: Sbailey <sbai...@wikimedia.org> Gerrit-Reviewer: Subramanya Sastry <ssas...@wikimedia.org> Gerrit-Reviewer: Tim Starling <tstarl...@wikimedia.org> Gerrit-Reviewer: jenkins-bot <> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits