BearND has uploaded a new change for review. (
https://gerrit.wikimedia.org/r/405317 )
Change subject: WIP: Get ready for Parsoid change of references wrappers
......................................................................
WIP: Get ready for Parsoid change of references wrappers
Parsoid's I2b5c7ff55 moves the typeof="mw:Extension/references"
attribute from the <ol> to the parent <div>.
TODO: probably need some auto-detection, potentially similar to what we
did for section parsing.
Change-Id: Ie9cfd8969f571a8a13f0338a71b3118c0420e40a
---
M lib/references/extractReferenceLists.js
M lib/references/stripReferenceListContent.js
M lib/references/structureReferenceListContent.js
M test/lib/references/extractReferenceLists.test.js
M test/lib/references/stripReferenceListContent-test.js
M test/lib/references/structureReferenceListContent.test.js
6 files changed, 61 insertions(+), 29 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/mobileapps
refs/changes/17/405317/1
diff --git a/lib/references/extractReferenceLists.js
b/lib/references/extractReferenceLists.js
index 04a8546..10fa537 100644
--- a/lib/references/extractReferenceLists.js
+++ b/lib/references/extractReferenceLists.js
@@ -11,7 +11,7 @@
function extractReferenceLists(document, logger) {
const structure = [];
let references = {};
- const refListElements =
document.querySelectorAll('ol[typeof=\'mw:Extension/references\']');
+ const refListElements =
document.querySelectorAll('div[typeof=\'mw:Extension/references\']');
refListElements.forEach((refListElement) => {
const result =
structureReferenceSections.buildReferenceList(refListElement, logger);
structure.push({
diff --git a/lib/references/stripReferenceListContent.js
b/lib/references/stripReferenceListContent.js
index b5442b1..b7e9e97 100644
--- a/lib/references/stripReferenceListContent.js
+++ b/lib/references/stripReferenceListContent.js
@@ -5,7 +5,7 @@
* @param {!Document} doc to scan for references
*/
function stripReferenceListContent(doc) {
- const refLists =
doc.querySelectorAll('ol[typeof=\'mw:Extension/references\']');
+ const refLists =
doc.querySelectorAll('div[typeof=\'mw:Extension/references\']');
for (const refList of refLists) {
const placeholder = doc.createElement('DIV');
placeholder.classList.add('mw-references-placeholder');
diff --git a/lib/references/structureReferenceListContent.js
b/lib/references/structureReferenceListContent.js
index e3c6de6..731b5b7 100644
--- a/lib/references/structureReferenceListContent.js
+++ b/lib/references/structureReferenceListContent.js
@@ -138,27 +138,32 @@
/**
* Builds an object structure for a single reference list.
- * @param {!Element} refListElement a DOM element with content for one
reference list
+ * @param {!Element} refListDivWrapperElement a DOM element with content for
one reference list
* @param {!Logger} logger a logger instance associated with the request
* @return {Object} an object with order (an array of reference ids) and
references
*/
-const buildReferenceList = (refListElement, logger) => {
+const buildReferenceList = (refListDivWrapperElement, logger) => {
const orderArray = [];
const references = {};
- const children = refListElement.children;
- for (let i = 0; i < children.length; i++) {
- const node = children[i];
- if (node.tagName === 'LI') {
- const referenceItem = buildOneReferenceItem(node, logger);
- orderArray.push(referenceItem.id);
- references[referenceItem.id] = referenceItem;
- delete referenceItem.id;
- } else if (hasOnlyWhitespace(node)) {
- // ignore white space
- logger.log('warn', `ignore white space: ${node.outerHTML}`);
- } else {
- logger.log('warn', `unexpected child tag: ${node.tagName}`);
+ const olElement = refListDivWrapperElement.firstElementChild;
+ if (olElement.tagName === 'OL') {
+ const children = olElement.children;
+ for (let i = 0; i < children.length; i++) {
+ const node = children[i];
+ if (node.tagName === 'LI') {
+ const referenceItem = buildOneReferenceItem(node, logger);
+ orderArray.push(referenceItem.id);
+ references[referenceItem.id] = referenceItem;
+ delete referenceItem.id;
+ } else if (hasOnlyWhitespace(node)) {
+ // ignore white space
+ logger.log('warn', `ignore white space: ${node.outerHTML}`);
+ } else {
+ logger.log('warn', `unexpected child tag: ${node.tagName}`);
+ }
}
+ } else {
+ logger.log('warn', `expected ol element but got ${olElement.tagName}`);
}
return { order: orderArray, references };
};
diff --git a/test/lib/references/extractReferenceLists.test.js
b/test/lib/references/extractReferenceLists.test.js
index b7e2ec9..5d647bd 100644
--- a/test/lib/references/extractReferenceLists.test.js
+++ b/test/lib/references/extractReferenceLists.test.js
@@ -23,10 +23,12 @@
it('one list', () => {
const doc = domino.createDocument('<body>'
- + '<ol typeof="mw:Extension/references">'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '<li><span>foo A1</span></li>'
+ '<li><span>foo A2</span></li>'
+ '</ol>'
+ + '</div>'
+ '</body>');
const refLists = extractReferenceLists(doc, logger);
@@ -35,11 +37,15 @@
it('two lists', () => {
const doc = domino.createDocument('<body>'
- + '<ol typeof="mw:Extension/references">'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '<li><span>foo B</span></li>'
+ '</ol>'
- + '<ol typeof="mw:Extension/references">'
+ + '</div>'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '</ol>'
+ + '</div>'
+ '</body>');
const refLists = extractReferenceLists(doc, logger);
diff --git a/test/lib/references/stripReferenceListContent-test.js
b/test/lib/references/stripReferenceListContent-test.js
index 4d82d76..4fe25b0 100644
--- a/test/lib/references/stripReferenceListContent-test.js
+++ b/test/lib/references/stripReferenceListContent-test.js
@@ -7,20 +7,28 @@
describe('lib:strip reference list transform', () => {
it('reference list contents should be replaced by placeholders', () => {
const doc = domino.createDocument('<body>'
- + '<ol typeof="mw:Extension/references">'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '<li><span>foo A1</span></li>'
+ '<li><span>foo A2</span></li>'
+ '</ol>'
- + '<ol typeof="mw:Extension/references">'
+ + '</div>'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '<li><span>foo B</span></li>'
+ '</ol>'
- + '<ol typeof="mw:Extension/references">'
+ + '</div>'
+ + '<div typeof="mw:Extension/references">'
+ + '<ol>'
+ '</ol>'
+ + '</div>'
+ '</body>');
stripReferenceListContent(doc);
+ assert.selectorExistsNTimes(doc,
'div[typeof=mw:Extension/references]', 0,
+ `expected <div> tags to be removed`);
assert.selectorExistsNTimes(doc, 'ol', 0, `expected <ol> tags to be
removed`);
assert.selectorExistsNTimes(doc, 'li', 0, `expected <li> tags to be
removed`);
- assert.selectorExistsNTimes(doc, 'div', 3, `expected 3 <div> tags to
be found`);
+ assert.selectorExistsNTimes(doc, 'div', 3, `expected 3 replacement
<div> tags to be found`);
});
});
diff --git a/test/lib/references/structureReferenceListContent.test.js
b/test/lib/references/structureReferenceListContent.test.js
index 027a9d1..ed4b25d 100644
--- a/test/lib/references/structureReferenceListContent.test.js
+++ b/test/lib/references/structureReferenceListContent.test.js
@@ -47,13 +47,18 @@
<span class="mw-linkback-text">↑ </span></a> <span
id="mw-reference-text-cite_note-Awaara-157" class="mw-reference-text">
${indianFilmsRefContent}</span></li>`;
-const oneRefInList = `<ol typeof="mw:Extension/references"
class="mw-references" about="#mwt1678">
+const oneRefInList = `<div class="mw-references-wrap"
typeof="mw:Extension/references" about="#mwt1678"><ol>
${simpleDogRef}
-</ol>`;
+</ol></div>`;
+
+const noOrderedListInWrapperDiv = `<div class="mw-references-wrap"
typeof="mw:Extension/references" about="#mwt1678">
+${simpleDogRef}
+</div>`;
// List_of_most_viewed_YouTube_videos
const mostViewedYoutubeVideosContent = `Some videos may not be available
worldwide due to <a href="./Geolocation_software#Regional_licensing"
title="Geolocation software">regional restrictions</a> in certain countries.`;
-const mostViewedYoutubeVideos = `<ol class="mw-references"
typeof="mw:Extension/references" about="#mwt571"><li about="#cite_note-4"
id="cite_note-4"><a href="./List_of_most_viewed_YouTube_videos#cite_ref-4"
data-mw-group="upper-alpha" rel="mw:referencedBy"><span
class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-4"
class="mw-reference-text">${mostViewedYoutubeVideosContent}</span></li>`;
+const mostViewedYoutubeVideos = `<div class="mw-references-wrap"
typeof="mw:Extension/references" about="#mwt571"><ol><li about="#cite_note-4"
id="cite_note-4"><a href="./List_of_most_viewed_YouTube_videos#cite_ref-4"
+data-mw-group="upper-alpha" rel="mw:referencedBy"><span
class="mw-linkback-text">↑ </span></a> <span id="mw-reference-text-cite_note-4"
class="mw-reference-text">${mostViewedYoutubeVideosContent}</span></li>`;
describe('lib:structureReferenceListContent', () => {
let logger;
@@ -186,7 +191,7 @@
describe('.buildReferenceList', () => {
it('one simple reference in list', () => {
const doc = createDocument(oneRefInList);
- const result = mut.buildReferenceList(doc.querySelector('ol'),
logger);
+ const result =
mut.buildReferenceList(doc.querySelector('div.mw-references-wrap'), logger);
assert.deepEqual(result.references, {
'101': {
back_links: [{
@@ -203,7 +208,7 @@
it('one reference in list', () => {
const doc = createDocument(mostViewedYoutubeVideos);
- const result = mut.buildReferenceList(doc.querySelector('ol'),
logger);
+ const result =
mut.buildReferenceList(doc.querySelector('div.mw-references-wrap'), logger);
assert.deepEqual(result.references, {
'4': {
back_links: [{
@@ -217,5 +222,13 @@
assert.deepEqual(result.order, [ '4' ]);
assert.ok(logger.log.notCalled);
});
+
+ it('no <ol> in wrapper <div>', () => {
+ const doc = createDocument(noOrderedListInWrapperDiv);
+ const result =
mut.buildReferenceList(doc.querySelector('div.mw-references-wrap'), logger);
+ assert.deepEqual(result.references, {});
+ assert.deepEqual(result.order, []);
+ assert.ok(logger.log.calledOnce);
+ });
});
});
--
To view, visit https://gerrit.wikimedia.org/r/405317
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie9cfd8969f571a8a13f0338a71b3118c0420e40a
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/mobileapps
Gerrit-Branch: master
Gerrit-Owner: BearND <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits