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