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