Mholloway has uploaded a new change for review. ( 
https://gerrit.wikimedia.org/r/395056 )

Change subject: Hygiene: Consolidate media selectors
......................................................................

Hygiene: Consolidate media selectors

Share media selectors between the page transformations and the media
endpoint.  No output changes intended.

Change-Id: Icb881eb3d8663ed2d2723e4c03e68b3e8fd0aa82
---
M lib/media.js
A lib/selectors.js
M lib/transformations/anchorPopUpMediaTransforms.js
M lib/transforms.js
4 files changed, 38 insertions(+), 66 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/services/mobileapps 
refs/changes/56/395056/1

diff --git a/lib/media.js b/lib/media.js
index 0de4391..97d1b83 100644
--- a/lib/media.js
+++ b/lib/media.js
@@ -4,22 +4,11 @@
 const api = require('./api-util');
 const mUtil = require('./mobile-util');
 const Title = require('mediawiki-title').Title;
+const MediaSelectors = require('./selectors').MediaSelectors;
 
 const MIN_IMAGE_SIZE = 64;
 const MAX_IMAGE_WIDTH = 1280;
 
-const SELECTORS = [
-    'figure[typeof^=mw:Image]',
-    'figure[typeof^=mw:Video]',
-    'figure[typeof^=mw:Audio]',
-    'span[typeof^=mw:Image]',
-    'span[typeof^=mw:Video]',
-    'span[typeof^=mw:Audio]',
-    'figure-inline[typeof^=mw:Image]',
-    'figure-inline[typeof^=mw:Video]',
-    'figure-inline[typeof^=mw:Audio]',
-    'span.IPA+small a[rel=mw:MediaLink]'
-];
 
 /**
  * A MediaWiki media type as represented in Parsoid HTML.
@@ -65,7 +54,7 @@
 function getMediaItemInfoFromPage(html) {
     const doc = domino.createDocument(html);
     // todo: handle Mathoid-rendered math images
-    const selection = doc.querySelectorAll(SELECTORS.join(','));
+    const selection = doc.querySelectorAll(MediaSelectors.join(','));
     return [].map.call(selection, (elem) => {
         const mediaType = getMediaType(elem);
         const resource = mediaType.selector && 
elem.querySelector(mediaType.selector);
@@ -217,7 +206,6 @@
     getMediaItemInfoFromPage,
     getMetadataFromApi,
     filterResult,
-    SELECTORS,
     Image,
     Video,
     Audio
diff --git a/lib/selectors.js b/lib/selectors.js
new file mode 100644
index 0000000..b167c80
--- /dev/null
+++ b/lib/selectors.js
@@ -0,0 +1,25 @@
+'use strict';
+
+const MediaSelectors = [
+    'figure[typeof^=mw:Image]',
+    'figure[typeof^=mw:Video]',
+    'figure[typeof^=mw:Audio]',
+    'span[typeof^=mw:Image]',
+    'span[typeof^=mw:Video]',
+    'span[typeof^=mw:Audio]',
+    'figure-inline[typeof^=mw:Image]',
+    'figure-inline[typeof^=mw:Video]',
+    'figure-inline[typeof^=mw:Audio]',
+    'span.IPA+small a[rel=mw:MediaLink]'
+];
+
+const ImageSelectors = MediaSelectors.filter(selector => 
selector.includes('Image'));
+const VideoSelectors = MediaSelectors.filter(selector => 
selector.includes('Video'));
+const PronunciationSelector = MediaSelectors.filter(selector => 
selector.includes('IPA'));
+
+module.exports = {
+    MediaSelectors,
+    ImageSelectors,
+    VideoSelectors,
+    PronunciationSelector
+};
diff --git a/lib/transformations/anchorPopUpMediaTransforms.js 
b/lib/transformations/anchorPopUpMediaTransforms.js
index 89d3771..48fd92c 100644
--- a/lib/transformations/anchorPopUpMediaTransforms.js
+++ b/lib/transformations/anchorPopUpMediaTransforms.js
@@ -12,66 +12,24 @@
 
 'use strict';
 
-const NodeType = require('../nodeType');
-
-/**
- * Checks if a <video> element is an actual video.
- * Parsoid also uses <video> tags for audio files.
- * @return {boolean} true if real video
- */
-function isVideo(videoElem) {
-    const MAX_LEVEL = 3;
-    let node = videoElem.parentNode;
-    for (let level = 0; level < MAX_LEVEL; level++) {
-        if (!node) {
-            return false;
-        }
-
-        // Look for an ancestor element <figure typeof="mw:Video/Thumb">
-        // or <figure-inline typeof="mw:Video">.
-        if (node.nodeType === NodeType.ELEMENT_NODE
-                    && (node.nodeName === 'FIGURE' ||
-                        node.nodeName === 'FIGURE-INLINE' ||
-                        // TODO: <span> is here for backwards compatibility.
-                        // This is now generated as <figure-inline> and should
-                        // be safe to remove when verion 1.5 content is no
-                        // longer acceptable.
-                        node.nodeName === 'SPAN')) {
-            const typeOf = node.getAttribute('typeof');
-            if (typeOf && typeOf.includes('mw:Video')) {
-                return true;
-            }
-        }
-
-        node = node.parentNode;
-    }
-
-    return false;
-}
+const VideoSelectors = require('../selectors').VideoSelectors;
 
 function fixVideoAnchor(content) {
-    const videoElements = content.querySelectorAll('video');
-    for (let i = 0; i < videoElements.length; i++) {
-        const videoElem = videoElements[i];
-
-        // T167183: Only handle videos
-        if (!isVideo(videoElem)) {
-            continue;
-        }
-
+    const videos = content.querySelectorAll(VideoSelectors.map(sel => 
sel.concat(' video')).join());
+    videos.forEach((video) => {
         const containerLink = content.createElement('a');
         containerLink.setAttribute('href',
-            videoElem.getAttribute('resource').replace('./', '/wiki/'));
+            video.getAttribute('resource').replace('./', '/wiki/'));
         containerLink.classList.add('app_media');
 
         // wrap videoElem in anchor:
-        videoElem.parentNode.insertBefore(containerLink, videoElem);
-        videoElem.parentNode.removeChild(videoElem);
-        containerLink.appendChild(videoElem);
+        video.parentNode.insertBefore(containerLink, video);
+        video.parentNode.removeChild(video);
+        containerLink.appendChild(video);
 
         // remove controls
-        videoElem.removeAttribute('controls');
-    }
+        video.removeAttribute('controls');
+    });
 }
 
 module.exports = {
diff --git a/lib/transforms.js b/lib/transforms.js
index 341360f..9d9cf85 100644
--- a/lib/transforms.js
+++ b/lib/transforms.js
@@ -21,6 +21,7 @@
 const summarize = require('./transformations/summarize');
 const _rmAttributes = require('./transformations/removeAttributes');
 const NodeType = require('./nodeType');
+const ImageSelectors = require('./selectors').ImageSelectors;
 const transforms = {};
 
 
@@ -180,7 +181,7 @@
     // on all anchors around images
     // so the app knows to view these images in the gallery.
     // See also 
https://www.mediawiki.org/wiki/Parsoid/MediaWiki_DOM_spec#Images
-    _addClassTo(doc, 'figure > a, *[typeof^=mw:Image] > a', 'image');
+    _addClassTo(doc, ImageSelectors.map(selector => selector.concat(' > 
a')).join(), 'image');
 }
 
 function _applyOptionalParsoidSpecificTransformations(doc) {

-- 
To view, visit https://gerrit.wikimedia.org/r/395056
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Icb881eb3d8663ed2d2723e4c03e68b3e8fd0aa82
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/services/mobileapps
Gerrit-Branch: master
Gerrit-Owner: Mholloway <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to