jenkins-bot has submitted this change and it was merged. (
https://gerrit.wikimedia.org/r/384198 )
Change subject: Linter: Provide accurate DSR offsets for issues in extension
content
......................................................................
Linter: Provide accurate DSR offsets for issues in extension content
* DSR info was being blindly updated to entire extension range
instead of looking inside the extension content.
* If looking inside the extension content doesn't yield a valid dsr,
it falls back to the currently existing mode of returning DSR for
the extension use.
* Simplified some code structure as well.
* Updated mocha test that now has updated DSR offsets.
Bug: T178217
Change-Id: I7d99c1771fb4d55866d296ecd283202bfc62a8ed
---
M lib/wt2html/pp/handlers/linter.js
M tests/mocha/linter.js
2 files changed, 66 insertions(+), 97 deletions(-)
Approvals:
jenkins-bot: Verified
Arlolra: Looks good to me, approved
diff --git a/lib/wt2html/pp/handlers/linter.js
b/lib/wt2html/pp/handlers/linter.js
index fbd4d24..87d1ba0 100644
--- a/lib/wt2html/pp/handlers/linter.js
+++ b/lib/wt2html/pp/handlers/linter.js
@@ -145,6 +145,10 @@
* @return {string}
*/
function findEnclosingTemplateName(env, tplInfo) {
+ if (!tplInfo) {
+ return undefined;
+ }
+
var typeOf = tplInfo.first.getAttribute('typeof');
if (!/(?:^|\s)mw:Transclusion(?=$|\s)/.test(typeOf)) {
return undefined;
@@ -161,6 +165,14 @@
return { name: name };
} else {
return { multiPartTemplateBlock: true };
+ }
+}
+
+function findLintDSR(tplLintInfo, tplInfo, nodeDSR, updateNodeDSR) {
+ if (tplLintInfo || (tplInfo && !Util.isValidDSR(nodeDSR))) {
+ return tplInfo.dsr;
+ } else {
+ return updateNodeDSR ? updateNodeDSR(nodeDSR) : nodeDSR;
}
}
@@ -223,22 +235,13 @@
return;
}
- var cNodeName = c.nodeName.toLowerCase();
- var dsr = dp.dsr;
+ var templateInfo = findEnclosingTemplateName(env, tplInfo);
+ // During DSR computation, stripped meta tags
+ // surrender their width to its previous sibling.
+ // We record the original DSR in the tmp attribute
+ // for that reason.
+ var dsr = findLintDSR(templateInfo, tplInfo, dp.tmp.origDSR || dp.dsr);
var lintObj;
- var templateInfo;
-
- if (tplInfo) {
- dsr = tplInfo.dsr;
- templateInfo = findEnclosingTemplateName(env, tplInfo);
- } else if (dp.tmp.origDSR) {
- // During DSR computation, stripped meta tags
- // surrender their width to its previous sibling.
- // We record the original DSR in the tmp attribute
- // for that reason.
- dsr = dp.tmp.origDSR;
- }
-
if (DU.isMarkerMeta(c, 'mw:Placeholder/StrippedTag')) {
lintObj = { dsr: dsr, templateInfo: templateInfo, params: {
name: dp.name } };
env.log('lint/stripped-tag', lintObj);
@@ -254,6 +257,7 @@
// 3. c is not a HTML element (unless they are i/b quotes)
//
// 4. c doesn't have DSR info and doesn't come from a template either
+ var cNodeName = c.nodeName.toLowerCase();
if (!Util.isVoidElement(cNodeName) &&
cNodeName !== 'tbody' &&
(DU.hasLiteralHTMLMarker(dp) || DU.isQuoteElt(c)) &&
@@ -347,8 +351,6 @@
* Comment out this whole thing to satisfy eslint
*
function logIgnoredTableAttr(env, node, dp, tplInfo) {
- var dsr;
- var templateInfo;
if (!node.nodeName === 'TABLE') {
return;
}
@@ -365,13 +367,8 @@
if (!re.test(key) ||
!re.test(dp.sa[key])) {
// FIXME: This is incorrect.
// We need to check if the key
is absent in dp.a / in the node's attribute
- if (tplInfo) {
- dsr = tplInfo.dsr;
- templateInfo =
findEnclosingTemplateName(env, tplInfo);
- } else {
- dsr = dp.dsr;
- }
- var lintObj = { dsr: dsr,
templateInfo: templateInfo };
+ var templateInfo =
findEnclosingTemplateName(env, tplInfo);
+ var lintObj = { dsr:
findLintDSR(templateInfo, tplInfo, dp.dsr), templateInfo: templateInfo };
env.log('lint/ignored-table-attr', lintObj);
}
}
@@ -420,15 +417,11 @@
// Let us carry on with regularly scheduled programming.
}
- var dsr;
- var templateInfo;
- if (tplInfo) {
- dsr = tplInfo.dsr;
- templateInfo = findEnclosingTemplateName(env, tplInfo);
- } else {
- dsr = DU.getDataParsoid(maybeTable).dsr;
- }
- var lintObj = { dsr: dsr, templateInfo: templateInfo };
+ var templateInfo = findEnclosingTemplateName(env, tplInfo);
+ var lintObj = {
+ dsr: findLintDSR(templateInfo, tplInfo,
DU.getDataParsoid(maybeTable).dsr),
+ templateInfo: templateInfo
+ };
env.log('lint/fostered', lintObj);
return maybeTable;
@@ -451,12 +444,9 @@
}
if (!(dp.autoInsertedStart && dp.autoInsertedEnd) &&
obsoleteTagsRE.test(c.nodeName)) {
- var templateInfo;
- if (tplInfo) {
- templateInfo = findEnclosingTemplateName(env, tplInfo);
- }
+ var templateInfo = findEnclosingTemplateName(env, tplInfo);
var lintObj = {
- dsr: tplInfo ? tplInfo.dsr : dp.dsr,
+ dsr: findLintDSR(templateInfo, tplInfo, dp.dsr),
templateInfo: templateInfo,
params: { name: c.nodeName.toLowerCase() },
};
@@ -477,12 +467,9 @@
}
});
if (items.length) {
- var templateInfo;
- if (tplInfo) {
- templateInfo = findEnclosingTemplateName(env,
tplInfo);
- }
+ var templateInfo = findEnclosingTemplateName(env,
tplInfo);
env.log('lint/bogus-image-options', {
- dsr: tplInfo ? tplInfo.dsr : dp.dsr,
+ dsr: findLintDSR(templateInfo, tplInfo, dp.dsr),
templateInfo: templateInfo,
params: { items: items },
});
@@ -509,24 +496,23 @@
* |}
*/
function logDeletableTables(env, c, dp, tplInfo) {
- var templateInfo;
if (c.nodeName === 'TABLE') {
var prev = DU.previousNonSepSibling(c);
if (prev && prev.nodeName === 'TABLE' &&
DU.getDataParsoid(prev).autoInsertedEnd) {
- var dsr;
- if (tplInfo) {
- templateInfo = findEnclosingTemplateName(env,
tplInfo);
- dsr = tplInfo.dsr;
- } else {
- // Identify the dsr-span of the opening tag
- // of the table that needs to be deleted
- dsr = Util.clone(dp.dsr);
- if (dsr[2]) {
- dsr[1] = dsr[0] + dsr[2];
- dsr[2] = 0;
- dsr[3] = 0;
+ var templateInfo = findEnclosingTemplateName(env,
tplInfo);
+ var dsr = findLintDSR(templateInfo, tplInfo, dp.dsr,
+ function(nodeDSR) {
+ // Identify the dsr-span of the opening
tag
+ // of the table that needs to be deleted
+ var x = Util.clone(nodeDSR);
+ if (x[2]) {
+ x[1] = x[0] + x[2];
+ x[2] = 0;
+ x[3] = 0;
+ }
+ return x;
}
- }
+ );
var lintObj = {
dsr: dsr,
templateInfo: templateInfo,
@@ -561,25 +547,17 @@
}
function logBadPWrapping(env, node, dp, tplInfo) {
- var findP = function(e) { return e.nodeName === 'P'; };
- if (!DU.isBlockNode(node) && DU.isBlockNode(node.parentNode)) {
- if (hasNoWrapCSS(node)) {
- var p = findMatchingChild(node, findP);
- if (p) {
- var dsr, templateInfo;
- if (tplInfo) {
- templateInfo =
findEnclosingTemplateName(env, tplInfo);
- dsr = tplInfo.dsr;
- } else {
- dsr = dp.dsr;
- }
- var lintObj = {
- dsr: dsr,
- templateInfo: templateInfo,
- params: { root:
node.parentNode.nodeName, child: node.nodeName },
- };
- env.log('lint/pwrap-bug-workaround', lintObj);
- }
+ if (!DU.isBlockNode(node) && DU.isBlockNode(node.parentNode) &&
hasNoWrapCSS(node)) {
+ var findP = function(e) { return e.nodeName === 'P'; };
+ var p = findMatchingChild(node, findP);
+ if (p) {
+ var templateInfo = findEnclosingTemplateName(env,
tplInfo);
+ var lintObj = {
+ dsr: findLintDSR(templateInfo, tplInfo, dp.dsr),
+ templateInfo: templateInfo,
+ params: { root: node.parentNode.nodeName,
child: node.nodeName },
+ };
+ env.log('lint/pwrap-bug-workaround', lintObj);
}
}
}
@@ -698,29 +676,20 @@
// For every node where Tidy hoists whitespace,
// emit an event to flag a whitespace fixup opportunity.
- var dsr, templateInfo;
- if (tplInfo) {
- templateInfo = findEnclosingTemplateName(env, tplInfo);
- dsr = tplInfo.dsr;
- }
+ var templateInfo = findEnclosingTemplateName(env, tplInfo);
var n = nowrapNodes.length - 1;
nowrapNodes.forEach(function(o, i) {
- if (o.tidybug && i < n) {
- if (!tplInfo) {
- dsr = DU.getDataParsoid(o.node).dsr;
- }
- if (!nowrapNodes[i + 1].hasLeadingWS) {
- var lintObj = {
- dsr: dsr,
- templateInfo: templateInfo,
- params: {
- node: o.node.nodeName,
- sibling:
o.node.nextSibling.nodeName,
- },
- };
+ if (o.tidybug && i < n && !nowrapNodes[i + 1].hasLeadingWS) {
+ var lintObj = {
+ dsr: findLintDSR(templateInfo, tplInfo,
DU.getDataParsoid(o.node).dsr),
+ templateInfo: templateInfo,
+ params: {
+ node: o.node.nodeName,
+ sibling: o.node.nextSibling.nodeName,
+ },
+ };
- env.log('lint/tidy-whitespace-bug', lintObj);
- }
+ env.log('lint/tidy-whitespace-bug', lintObj);
}
});
diff --git a/tests/mocha/linter.js b/tests/mocha/linter.js
index 29d360f..33d68df 100644
--- a/tests/mocha/linter.js
+++ b/tests/mocha/linter.js
@@ -180,7 +180,7 @@
result.should.have.length(1);
result[0].should.have.a.property('type',
'obsolete-tag');
result[0].should.not.have.a.property('templateInfo');
- result[0].dsr.should.deep.equal([ 0, 47, 2, 2
]);
+ result[0].dsr.should.deep.equal([ 24, 36, 4, 5
]);
});
});
});
--
To view, visit https://gerrit.wikimedia.org/r/384198
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I7d99c1771fb4d55866d296ecd283202bfc62a8ed
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/services/parsoid
Gerrit-Branch: master
Gerrit-Owner: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: Arlolra <[email protected]>
Gerrit-Reviewer: C. Scott Ananian <[email protected]>
Gerrit-Reviewer: Legoktm <[email protected]>
Gerrit-Reviewer: Sbailey <[email protected]>
Gerrit-Reviewer: Subramanya Sastry <[email protected]>
Gerrit-Reviewer: jenkins-bot <>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits