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 <bsitzm...@wikimedia.org>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to