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

Reply via email to