{"version":3,"file":"index.js","mappings":"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","sources":["/w/extensions/Popups/./src/canSaveToUserPreferences.js","/w/extensions/Popups/./node_modules/redux-thunk/dist/redux-thunk.min.js","/w/extensions/Popups/./node_modules/redux/dist/redux.min.js","/w/extensions/Popups/./src/ui/pointer-mask.svg","/w/extensions/Popups/webpack/bootstrap","/w/extensions/Popups/webpack/runtime/compat get default export","/w/extensions/Popups/webpack/runtime/define property getters","/w/extensions/Popups/webpack/runtime/global","/w/extensions/Popups/webpack/runtime/hasOwnProperty shorthand","/w/extensions/Popups/webpack/runtime/make namespace object","/w/extensions/Popups/webpack/runtime/node module decorator","/w/extensions/Popups/./src/constants.js","/w/extensions/Popups/./src/bracketedPixelRatio.js","/w/extensions/Popups/./src/wait.js","/w/extensions/Popups/./src/ui/thumbnail.js","/w/extensions/Popups/./src/ui/templates/templateUtil.js","/w/extensions/Popups/./src/ui/templates/popup/popup.js","/w/extensions/Popups/./src/ui/templates/preview/preview.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","/w/extensions/Popups/./src/ui/templates/pagePreview/pagePreview.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","/w/extensions/Popups/./src/ui/renderer.js","/w/extensions/Popups/./src/preview/model.js","/w/extensions/Popups/./src/formatter.js","/w/extensions/Popups/./src/gateway/index.js","/w/extensions/Popups/./src/gateway/mediawiki.js","/w/extensions/Popups/./src/gateway/rest.js","/w/extensions/Popups/./src/gateway/restFormatters.js","/w/extensions/Popups/./src/gateway/page.js","/w/extensions/Popups/./src/userSettings.js","/w/extensions/Popups/./src/previewBehavior.js","/w/extensions/Popups/./src/ui/settingsDialogRenderer.js","/w/extensions/Popups/./src/ui/settingsDialog.js","/w/extensions/Popups/./src/ui/templates/settingsDialog/settingsDialog.js","/w/extensions/Popups/./src/changeListener.js","/w/extensions/Popups/./src/isPagePreviewsEnabled.js","/w/extensions/Popups/./src/changeListeners/syncUserSettings.js","/w/extensions/Popups/./src/changeListeners/index.js","/w/extensions/Popups/./src/changeListeners/footerLink.js","/w/extensions/Popups/./src/changeListeners/linkTitle.js","/w/extensions/Popups/./src/changeListeners/pageviews.js","/w/extensions/Popups/./src/changeListeners/render.js","/w/extensions/Popups/./src/changeListeners/settings.js","/w/extensions/Popups/./src/changeListeners/statsv.js","/w/extensions/Popups/./src/actionTypes.js","/w/extensions/Popups/./src/actions.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/slicedToArray.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/nonIterableRest.js","/w/extensions/Popups/./src/reducers/nextState.js","/w/extensions/Popups/./node_modules/@babel/runtime/helpers/esm/defineProperty.js","/w/extensions/Popups/./src/reducers/index.js","/w/extensions/Popups/./src/reducers/pageviews.js","/w/extensions/Popups/./src/reducers/preview.js","/w/extensions/Popups/./src/reducers/settings.js","/w/extensions/Popups/./src/reducers/statsv.js","/w/extensions/Popups/./src/index.js","/w/extensions/Popups/./src/title.js","/w/extensions/Popups/./src/setUserConfigFlags.js","/w/extensions/Popups/./src/experiments.js","/w/extensions/Popups/./src/instrumentation/statsv.js","/w/extensions/Popups/./src/integrations/mwpopups.js"],"sourcesContent":["/**\n * @module canSaveToUserPreferences\n */\n\n/**\n * Can the current user save to user preferences?\n *\n * @param {User} user\n * @return {boolean}\n */\nconst canSaveToUserPreferences = ( user ) => {\n\treturn !user.isAnon() && user.isNamed();\n};\n\nmodule.exports = canSaveToUserPreferences;\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports.ReduxThunk=e():t.ReduxThunk=e()}(this,function(){return function(t){function e(o){if(n[o])return n[o].exports;var r=n[o]={exports:{},id:o,loaded:!1};return t[o].call(r.exports,r,r.exports,e),r.loaded=!0,r.exports}var n={};return e.m=t,e.c=n,e.p=\"\",e(0)}([function(t,e,n){t.exports=n(1)},function(t,e){\"use strict\";function n(t){return function(e){var n=e.dispatch,o=e.getState;return function(e){return function(r){return\"function\"==typeof r?r(n,o,t):e(r)}}}}e.__esModule=!0;var o=n();o.withExtraArgument=n,e.default=o}])});","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?t(exports):\"function\"==typeof define&&define.amd?define([\"exports\"],t):t(e.Redux={})}(this,function(e){\"use strict\";var t=function(e){var t,r=e.Symbol;return\"function\"==typeof r?r.observable?t=r.observable:(t=r(\"observable\"),r.observable=t):t=\"@@observable\",t}(\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:\"undefined\"!=typeof global?global:\"undefined\"!=typeof module?module:Function(\"return this\")()),r=function(){return Math.random().toString(36).substring(7).split(\"\").join(\".\")},n={INIT:\"@@redux/INIT\"+r(),REPLACE:\"@@redux/REPLACE\"+r(),PROBE_UNKNOWN_ACTION:function(){return\"@@redux/PROBE_UNKNOWN_ACTION\"+r()}};function o(e,t){var r=t&&t.type;return\"Given \"+(r&&'action \"'+r+'\"'||\"an action\")+', reducer \"'+e+'\" returned undefined. To ignore an action, you must explicitly return the previous state. If you want this reducer to hold no value, you can return null instead of undefined.'}function i(e,t){return function(){return t(e.apply(this,arguments))}}function u(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function a(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];return 0===t.length?function(e){return e}:1===t.length?t[0]:t.reduce(function(e,t){return function(){return e(t.apply(void 0,arguments))}})}e.createStore=function e(r,o,i){var u;if(\"function\"==typeof o&&\"function\"==typeof i||\"function\"==typeof i&&\"function\"==typeof arguments[3])throw Error(\"It looks like you are passing several store enhancers to createStore(). This is not supported. Instead, compose them together to a single function\");if(\"function\"==typeof o&&void 0===i&&(i=o,o=void 0),void 0!==i){if(\"function\"!=typeof i)throw Error(\"Expected the enhancer to be a function.\");return i(e)(r,o)}if(\"function\"!=typeof r)throw Error(\"Expected the reducer to be a function.\");var a=r,c=o,f=[],s=f,d=!1;function l(){s===f&&(s=f.slice())}function p(){if(d)throw Error(\"You may not call store.getState() while the reducer is executing. The reducer has already received the state as an argument. Pass it down from the top reducer instead of reading it from the store.\");return c}function h(e){if(\"function\"!=typeof e)throw Error(\"Expected the listener to be a function.\");if(d)throw Error(\"You may not call store.subscribe() while the reducer is executing. If you would like to be notified after the store has been updated, subscribe from a component and invoke store.getState() in the callback to access the latest state. See https://redux.js.org/api-reference/store#subscribe(listener) for more details.\");var t=!0;return l(),s.push(e),function(){if(t){if(d)throw Error(\"You may not unsubscribe from a store listener while the reducer is executing. See https://redux.js.org/api-reference/store#subscribe(listener) for more details.\");t=!1,l();var r=s.indexOf(e);s.splice(r,1)}}}function y(e){if(!function(e){if(\"object\"!=typeof e||null===e)return!1;for(var t=e;null!==Object.getPrototypeOf(t);)t=Object.getPrototypeOf(t);return Object.getPrototypeOf(e)===t}(e))throw Error(\"Actions must be plain objects. Use custom middleware for async actions.\");if(void 0===e.type)throw Error('Actions may not have an undefined \"type\" property. Have you misspelled a constant?');if(d)throw Error(\"Reducers may not dispatch actions.\");try{d=!0,c=a(c,e)}finally{d=!1}for(var t=f=s,r=0;t.length>r;r++)(0,t[r])();return e}return y({type:n.INIT}),(u={dispatch:y,subscribe:h,getState:p,replaceReducer:function(e){if(\"function\"!=typeof e)throw Error(\"Expected the nextReducer to be a function.\");a=e,y({type:n.REPLACE})}})[t]=function(){var e,r=h;return(e={subscribe:function(e){if(\"object\"!=typeof e||null===e)throw new TypeError(\"Expected the observer to be an object.\");function t(){e.next&&e.next(p())}return t(),{unsubscribe:r(t)}}})[t]=function(){return this},e},u},e.combineReducers=function(e){for(var t=Object.keys(e),r={},i=0;t.length>i;i++){var u=t[i];\"function\"==typeof e[u]&&(r[u]=e[u])}var a,c=Object.keys(r);try{!function(e){Object.keys(e).forEach(function(t){var r=e[t];if(void 0===r(void 0,{type:n.INIT}))throw Error('Reducer \"'+t+\"\\\" returned undefined during initialization. If the state passed to the reducer is undefined, you must explicitly return the initial state. The initial state may not be undefined. If you don't want to set a value for this reducer, you can use null instead of undefined.\");if(void 0===r(void 0,{type:n.PROBE_UNKNOWN_ACTION()}))throw Error('Reducer \"'+t+\"\\\" returned undefined when probed with a random type. Don't try to handle \"+n.INIT+' or other actions in \"redux/*\" namespace. They are considered private. Instead, you must return the current state for any unknown actions, unless it is undefined, in which case you must return the initial state, regardless of the action type. The initial state may not be undefined, but can be null.')})}(r)}catch(e){a=e}return function(e,t){if(void 0===e&&(e={}),a)throw a;for(var n=!1,i={},u=0;c.length>u;u++){var f=c[u],s=e[f],d=(0,r[f])(s,t);if(void 0===d){var l=o(f,t);throw Error(l)}i[f]=d,n=n||d!==s}return n?i:e}},e.bindActionCreators=function(e,t){if(\"function\"==typeof e)return i(e,t);if(\"object\"!=typeof e||null===e)throw Error(\"bindActionCreators expected an object or a function, instead received \"+(null===e?\"null\":typeof e)+'. Did you write \"import ActionCreators from\" instead of \"import * as ActionCreators from\"?');for(var r=Object.keys(e),n={},o=0;r.length>o;o++){var u=r[o],a=e[u];\"function\"==typeof a&&(n[u]=i(a,t))}return n},e.applyMiddleware=function(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];return function(e){return function(){var r=e.apply(void 0,arguments),n=function(){throw Error(\"Dispatching while constructing your middleware is not allowed. Other middleware would not be applied to this dispatch.\")},o={getState:r.getState,dispatch:function(){return n.apply(void 0,arguments)}},i=t.map(function(e){return e(o)});return function(e){for(var t=1;arguments.length>t;t++){var r=null!=arguments[t]?arguments[t]:{},n=Object.keys(r);\"function\"==typeof Object.getOwnPropertySymbols&&(n=n.concat(Object.getOwnPropertySymbols(r).filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.forEach(function(t){u(e,t,r[t])})}return e}({},r,{dispatch:n=a.apply(void 0,i)(r.dispatch)})}}},e.compose=a,e.__DO_NOT_USE__ActionTypes=n,Object.defineProperty(e,\"__esModule\",{value:!0})});\n","module.exports = \"\"","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\tloaded: false,\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Flag the module as loaded\n\tmodule.loaded = true;\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n\tmodule.paths = [];\n\tif (!module.children) module.children = [];\n\treturn module;\n};","import bracketedPixelRatio from './bracketedPixelRatio';\n\nconst bpr = bracketedPixelRatio();\n\n// See the following for context around this value.\n//\n// * https://phabricator.wikimedia.org/T161284\n// * https://phabricator.wikimedia.org/T70861#3129780\nexport const FETCH_START_DELAY = 150; // ms.\n// The delay after which a FETCH_COMPLETE action should be dispatched.\n//\n// If the API endpoint responds faster than 350 ms (or, say, the API\n// response is served from the UA's cache), then we introduce a delay of\n// 350 ms - t to make the preview delay consistent to the user. The total\n// delay from start to finish is 500 ms.\nexport const FETCH_COMPLETE_TARGET_DELAY = 350 + FETCH_START_DELAY; // ms.\n// The minimum time a preview must be open before we judge it\n// has been seen.\n// See https://phabricator.wikimedia.org/T184793\nexport const PREVIEW_SEEN_DURATION = 1000; // ms\nexport const ABANDON_END_DELAY = 300;\n\nexport default {\n\tBRACKETED_DEVICE_PIXEL_RATIO: bpr,\n\t// See https://phabricator.wikimedia.org/T272169: requesting a larger thumbnail to avoid bluriness\n\tTHUMBNAIL_SIZE: 320 * Math.max( bpr, 1.5 ),\n\tEXTRACT_LENGTH: 525\n};\n","/**\n * @module bracketedPixelRatio\n */\n\n/**\n * Normalizes a user's device pixel ratio to either 1, 1.5, or 2.\n *\n * This is important when the server resizes images on the fly in order to\n * reduce the work it has to do for device pixel ratios that deviate from a\n * set of common ratios.\n *\n * Adapted from mediawiki/core /resources/src/jquery/jquery.hidpi.js\n *\n * @param {number} [dpr=window.devicePixelRatio]\n * @return {number} The bracketed device pixel ratio\n */\nexport default function ( dpr = window.devicePixelRatio ) {\n\tif ( !dpr ) {\n\t\t// Probably legacy browser so assume 1\n\t\treturn 1;\n\t}\n\n\tif ( dpr > 1.5 ) {\n\t\treturn 2;\n\t}\n\n\tif ( dpr > 1 ) {\n\t\treturn 1.5;\n\t}\n\n\treturn 1;\n}\n","/**\n * @module wait\n */\n\n/**\n * Sugar around `window.setTimeout`.\n *\n * @example\n * import wait from './wait';\n *\n * wait( 150 )\n * .then( () => {\n * // Continue processing...\n * } );\n *\n * @param {number} delay The number of milliseconds to wait\n * @return {Promise}\n */\nexport default function wait( delay ) {\n\treturn new Promise( ( resolve ) => {\n\t\tsetTimeout( () => {\n\t\t\tresolve();\n\t\t}, delay );\n\t} );\n}\n","/**\n * @module thumbnail\n */\n\nimport constants from '../constants';\n\nexport const SIZES = {\n\tportraitImage: {\n\t\th: 250, // Exact height\n\t\tw: 203 // Max width\n\t},\n\tlandscapeImage: {\n\t\th: 200, // Max height\n\t\tw: 320 // Exact Width\n\t}\n};\n\n/**\n * @typedef {Object} ext.popups.Thumbnail\n * @property {jQuery} el\n * @property {boolean} isTall Whether or not the thumbnail is portrait\n * @property {number} width\n * @property {number} height\n * @property {boolean} isNarrow whether the thumbnail is portrait and also\n * thinner than the default portrait thumbnail width\n * (as defined in SIZES.portraitImage.w)\n * @property {number} offset in pixels between the thumbnail width and the\n * standard portrait thumbnail width (as defined in SIZES.portraitImage.w)\n */\n\n/**\n * Creates a thumbnail from the representation of a thumbnail returned by the\n * PageImages MediaWiki API query module.\n *\n * If there's no thumbnail, the thumbnail is too small, or the thumbnail's URL\n * contains characters that could be used to perform an\n * [XSS attack via CSS](https://www.owasp.org/index.php/Testing_for_CSS_Injection_(OTG-CLIENT-005)),\n * then `null` is returned.\n *\n * Extracted from `mw.popups.renderer.article.createThumbnail`.\n *\n * @param {Object} rawThumbnail\n * @param {boolean} useCSSClipPath\n * @return {ext.popups.Thumbnail|null}\n */\nexport function createThumbnail( rawThumbnail, useCSSClipPath ) {\n\tconst devicePixelRatio = constants.BRACKETED_DEVICE_PIXEL_RATIO;\n\n\tif ( !rawThumbnail ) {\n\t\treturn null;\n\t}\n\n\tconst thumbWidth = rawThumbnail.width / devicePixelRatio;\n\tconst thumbHeight = rawThumbnail.height / devicePixelRatio;\n\t// For images less than 320 wide, try to display a 250 high vertical slice instead\n\tconst tall = rawThumbnail.height > rawThumbnail.width || thumbWidth < SIZES.landscapeImage.w;\n\n\tif (\n\t\t// Image too small for portrait display\n\t\t( tall && thumbHeight < SIZES.portraitImage.h &&\n\t\t\trawThumbnail.height < SIZES.portraitImage.h ) ||\n\t\t// These characters in URL that could inject CSS and thus JS\n\t\t(\n\t\t\trawThumbnail.source.indexOf( '\\\\' ) > -1 ||\n\t\t\trawThumbnail.source.indexOf( '\\'' ) > -1 ||\n\t\t\trawThumbnail.source.indexOf( '\"' ) > -1\n\t\t)\n\t) {\n\t\treturn null;\n\t}\n\n\tconst aspectRatio = thumbWidth / thumbHeight;\n\tconst isSquare = aspectRatio > 0.7 && aspectRatio < 1.3;\n\n\tlet x, y, width, height;\n\tif ( tall ) {\n\t\tx = ( thumbWidth > SIZES.portraitImage.w ) ?\n\t\t\t( ( thumbWidth - SIZES.portraitImage.w ) / -2 ) :\n\t\t\t( SIZES.portraitImage.w - thumbWidth );\n\t\ty = ( thumbHeight > SIZES.portraitImage.h ) ?\n\t\t\t( ( thumbHeight - SIZES.portraitImage.h ) / -2 ) : 0;\n\t\twidth = SIZES.portraitImage.w;\n\t\theight = SIZES.portraitImage.h;\n\n\t\t// Special handling for thin tall images\n\t\t// https://phabricator.wikimedia.org/T192928#4312088\n\t\tif ( thumbWidth < width ) {\n\t\t\tx = 0;\n\t\t\twidth = thumbWidth;\n\t\t}\n\t} else {\n\t\tx = 0;\n\t\ty = ( thumbHeight > SIZES.landscapeImage.h ) ?\n\t\t\t( ( thumbHeight - SIZES.landscapeImage.h ) / -2 ) : 0;\n\t\twidth = SIZES.landscapeImage.w;\n\t\theight = ( thumbHeight > SIZES.landscapeImage.h ) ?\n\t\t\tSIZES.landscapeImage.h : thumbHeight;\n\t}\n\n\tconst isNarrow = tall && thumbWidth < SIZES.portraitImage.w;\n\tconst el = useCSSClipPath ? createThumbnailImg( rawThumbnail.source ) : createThumbnailSVG(\n\t\ttall ? 'mwe-popups-is-tall' : 'mwe-popups-is-not-tall',\n\t\trawThumbnail.source,\n\t\tx,\n\t\ty,\n\t\tthumbWidth,\n\t\tthumbHeight,\n\t\twidth,\n\t\theight\n\t);\n\n\treturn {\n\t\tel,\n\t\tisTall: tall || isSquare,\n\t\tisNarrow,\n\t\toffset: isNarrow ? SIZES.portraitImage.w - thumbWidth : 0,\n\t\twidth: thumbWidth,\n\t\theight: thumbHeight\n\t};\n}\n\nfunction createThumbnailImg( url ) {\n\tconst img = document.createElement( 'img' );\n\timg.className = 'mwe-popups-thumbnail';\n\timg.src = url;\n\treturn img;\n}\n\n/**\n * Sets multiple attributes on a node.\n *\n * @param {HTMLElement} node\n * @param {Record} attrs\n */\nconst addAttributes = ( node, attrs ) => {\n\tObject.keys( attrs ).forEach( ( key ) => {\n\t\tnode.setAttribute( key, attrs[ key ] );\n\t} );\n};\n\n/**\n * Creates the SVG image element that represents the thumbnail.\n *\n * This function is distinct from `createThumbnail` as it abstracts away some\n * browser issues that are uncovered when manipulating elements across\n * namespaces.\n *\n * @param {string} className\n * @param {string} url\n * @param {number} x\n * @param {number} y\n * @param {number} thumbnailWidth\n * @param {number} thumbnailHeight\n * @param {number} width\n * @param {number} height\n * @return {HTMLElement}\n */\n\nexport function createThumbnailSVG(\n\tclassName, url, x, y, thumbnailWidth, thumbnailHeight, width, height\n) {\n\tconst nsSvg = 'http://www.w3.org/2000/svg',\n\t\tnsXlink = 'http://www.w3.org/1999/xlink';\n\n\t// We want to visually separate the image from the summary\n\t// Given we use an SVG mask, we cannot rely on border to do this\n\t// and instead must insert a polyline element to visually separate\n\tconst line = document.createElementNS( nsSvg, 'polyline' );\n\tconst isTall = className.indexOf( 'not-tall' ) === -1;\n\tconst points = isTall ? [ 0, 0, 0, height ] :\n\t\t[ 0, height - 1, width, height - 1 ];\n\n\tline.setAttribute( 'stroke', 'rgba(0,0,0,0.1)' );\n\tline.setAttribute( 'points', points.join( ' ' ) );\n\tline.setAttribute( 'stroke-width', 1 );\n\n\tconst thumbnailSVGImage = document.createElementNS( nsSvg, 'image' );\n\tthumbnailSVGImage.setAttributeNS( nsXlink, 'href', url );\n\t// The following classes are used here:\n\t// * mwe-popups-is-not-tall\n\t// * mwe-popups-is-tall\n\tthumbnailSVGImage.classList.add( className );\n\taddAttributes(\n\t\tthumbnailSVGImage,\n\t\t{\n\t\t\tx,\n\t\t\ty,\n\t\t\twidth: thumbnailWidth,\n\t\t\theight: thumbnailHeight\n\t\t}\n\t);\n\n\tconst thumbnail = document.createElementNS( nsSvg, 'svg' );\n\taddAttributes(\n\t\tthumbnail, {\n\t\t\txmlns: nsSvg,\n\t\t\twidth,\n\t\t\theight\n\t\t}\n\t);\n\tthumbnail.appendChild( thumbnailSVGImage );\n\tthumbnail.appendChild( line );\n\treturn thumbnail;\n}\n","/**\n * @module templateUtil\n */\n\n/**\n * @param {string} str\n * @return {string} The string with any HTML entities escaped.\n */\nexport function escapeHTML( str ) {\n\treturn mw.html.escape( str );\n}\n\nconst templates = {};\n/**\n * @param {string} html markup of the template\n * @return {HTMLElement} a cloned root element of the template\n */\nexport function createNodeFromTemplate( html ) {\n\tif ( !templates[ html ] ) {\n\t\t// TODO: use element when IE11 dies\n\t\tconst div = document.createElement( 'div' );\n\t\tdiv.innerHTML = html;\n\t\ttemplates[ html ] = div.firstElementChild;\n\t}\n\n\treturn templates[ html ].cloneNode( true );\n}\n","/**\n * @module popup\n */\n\nimport { createNodeFromTemplate } from '../templateUtil';\n\nconst templateHTML = `\n\t\n`;\n/**\n * @param {ext.popups.previewTypes} type\n * @param {HTMLElement} element The contents of the popup.\n * @return {HTMLElement}\n */\n\nexport function renderPopup( type, container ) {\n\tconst element = createNodeFromTemplate( templateHTML );\n\t// The following classes are used here:\n\t// * mwe-popups-type-reference\n\t// * mwe-popups-type-unknown\n\t// * mwe-popups-type-generic\n\t// * mwe-popups-type-disambiguation\n\telement.className = `mwe-popups mwe-popups-type-${ type }`;\n\tcontainer.className = 'mwe-popups-container';\n\telement.appendChild( container );\n\treturn element;\n}\n","/**\n * @module preview\n */\n\nimport { renderPopup } from '../popup/popup';\nimport { createNodeFromTemplate, escapeHTML } from '../templateUtil';\n\nconst templateHTML = `\n\t
\n`;\n\n/**\n * Render generic and disambiguation previews\n *\n * @param {ext.popups.PagePreviewModel} model\n * @param {string|null} message\n * @param {string} linkMsg\n * @return {jQuery}\n */\nexport function renderPreview(\n\tmodel, message, linkMsg\n) {\n\tconst popup = renderPopup( model.type, createNodeFromTemplate( templateHTML ) );\n\n\t// The following classes are used here:\n\t// * popups-icon--preview-unknown\n\t// * popups-icon--preview-generic\n\t// * popups-icon--preview-disambiguation\n\tpopup.querySelector( '.popups-icon' ).classList.add( `popups-icon--preview-${ model.type }` );\n\tpopup.querySelector( '.mwe-popups-extract' ).setAttribute( 'href', model.url );\n\tconst messageElement = popup.querySelector( '.mwe-popups-message' );\n\tif ( message ) {\n\t\tmessageElement.innerHTML = escapeHTML( message );\n\t} else {\n\t\tmessageElement.remove();\n\t}\n\tconst readLink = popup.querySelector( '.mwe-popups-read-link' );\n\treadLink.innerHTML = escapeHTML( linkMsg );\n\treadLink.setAttribute( 'href', model.url );\n\tconst title = popup.querySelector( '.mwe-popups-title' );\n\ttitle.innerHTML += escapeHTML( model.title );\n\treturn popup;\n}\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) {\n arr2[i] = arr[i];\n }\n\n return arr2;\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","/**\n * @module pagePreview\n */\n\nimport { renderPopup } from '../popup/popup';\nimport { escapeHTML, createNodeFromTemplate } from '../templateUtil';\n\nconst defaultExtractWidth = 215;\nconst templateHTML = `\n
\n \n \n \n
\n\t`;\n\n/**\n * @param {ext.popups.PagePreviewModel} model\n * @param {ext.popups.Thumbnail|null} thumbnail\n * @param {boolean} withCSSClipPath\n * @param {string} linkTitle\n * @return {HTMLElement}\n */\nexport function renderPagePreview(\n\tmodel, thumbnail, withCSSClipPath, linkTitle\n) {\n\tconst el = renderPopup( model.type, createNodeFromTemplate( templateHTML ) );\n\n\tconst linkDiscreet = el.querySelector( '.mwe-popups-discreet' );\n\tconst extract = el.querySelector( '.mwe-popups-extract' );\n\textract.setAttribute( 'href', model.url );\n\tlinkDiscreet.setAttribute( 'href', model.url );\n\textract.setAttribute( 'dir', model.languageDirection );\n\textract.setAttribute( 'lang', model.languageCode );\n\n\tel.querySelector( '.mwe-popups-settings-button' )\n\t\t.setAttribute( 'title', linkTitle );\n\n\t// Set label on settings icon button\n\tconst labelText = escapeHTML( mw.msg( 'popups-settings-icon-gear-title' ) );\n\tconst label = el.querySelector( '.mwe-popups-settings-button-label' );\n\tlabel.textContent = labelText;\n\n\tif ( thumbnail ) {\n\t\tel.querySelector( '.mwe-popups-discreet' ).appendChild( thumbnail.el );\n\t} else {\n\t\tlinkDiscreet.remove();\n\t}\n\n\tif ( model.extract ) {\n\t\tif ( typeof model.extract === 'string' ) {\n\t\t\textract.innerHTML = model.extract;\n\t\t} else {\n\t\t\textract.append( ...model.extract );\n\t\t}\n\t\tconst extractWidth = getExtractWidth( thumbnail );\n\t\tif ( !withCSSClipPath ) {\n\t\t\textract.style.width = extractWidth;\n\t\t\tel.querySelector( 'footer' ).style.width = extractWidth;\n\t\t}\n\t}\n\n\treturn el;\n}\n\nexport { defaultExtractWidth }; // for testing\n\n/**\n * Calculates width of extract based on the associated thumbnail\n *\n * @param {ext.popups.Thumbnail|null} thumbnail model\n * @return {string} representing the css width attribute to be\n * used for the extract\n */\nexport function getExtractWidth( thumbnail ) {\n\treturn thumbnail && thumbnail.isNarrow ? `${ defaultExtractWidth + thumbnail.offset }px` : '';\n}\n","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","/**\n * @module renderer\n */\n\nimport wait from '../wait';\nimport pointerMaskSVG from './pointer-mask.svg';\nimport { SIZES, createThumbnail } from './thumbnail';\nimport { renderPreview } from './templates/preview/preview';\nimport { renderPagePreview } from './templates/pagePreview/pagePreview';\n\nconst landscapePopupWidth = 450,\n\tportraitPopupWidth = 320,\n\tpointerSize = 8, // Height of the pointer.\n\tmaxLinkWidthForCenteredPointer = 28; // Link with roughly < 4 chars.\n\nexport { pointerSize, landscapePopupWidth, portraitPopupWidth }; // for use in storybook\n\n/**\n * @typedef {Object} ext.popups.Measures\n * @property {number} pageX\n * @property {number} pageY\n * @property {number} clientY\n * @property {ClientRectList} clientRects list of rectangles defined by\n * four edges\n * @property {Object} offset\n * @property {number} width\n * @property {number} height\n * @property {number} scrollTop\n * @property {number} windowWidth\n * @property {number} windowHeight\n */\n\n/**\n * Extracted from `mw.popups.createSVGMasks`. This is just an SVG mask to point\n * or \"point\" at the link that's hovered over. The \"pointer\" appears to be cut\n * out of the image itself:\n * _______ link\n * | | _/\\_____ _/\\____ <-- Pointer pointing at link\n * | :-] | + |xxxxxxx = | :-] |\n * |_______| |xxxxxxx |_______|\n * :\n * Thumbnail Pointer Page preview\n * image clip-path bubble w/ pointer\n *\n * SVG masks are used in place of CSS masks for browser support issues (see\n * https://caniuse.com/#feat=css-masks).\n *\n * @private\n * @param {Object} container DOM object to which pointer masks are appended\n */\nexport function createPointerMasks( container ) {\n\tconst node = document.createElement( 'div' );\n\tnode.setAttribute( 'id', 'mwe-popups-svg' );\n\tnode.innerHTML = pointerMaskSVG;\n\tcontainer.appendChild( node );\n}\n\n/**\n * Initializes the renderer.\n *\n */\nexport function init() {\n\tif ( !supportsCSSClipPath() ) {\n\t\tcreatePointerMasks( document.body );\n\t}\n}\n\n/**\n * The model of how a view is rendered, which is constructed from a response\n * from the gateway.\n *\n * TODO: Rename `isTall` to `isPortrait`.\n *\n * @typedef {Object} ext.popups.Preview\n * @property {jQuery} el\n * @property {boolean} hasThumbnail\n * @property {Object} thumbnail\n * @property {boolean} isTall Sugar around\n * `preview.hasThumbnail && thumbnail.isTall`\n */\n\n/**\n * Renders a preview given data from the {@link gateway Gateway}.\n * The preview is rendered and added to the DOM but will remain hidden until\n * the `show` method is called.\n *\n * Previews are rendered at:\n *\n * # The position of the mouse when the user dwells on the link with their\n * mouse.\n * # The centermost point of the link when the user dwells on the link with\n * their keyboard or other assistive device.\n *\n * Since the content of the preview doesn't change but its position might, we\n * distinguish between \"rendering\" - generating HTML from a MediaWiki API\n * response - and \"showing/hiding\" - positioning the layout and changing its\n * orientation, if necessary.\n *\n * @param {ext.popups.PreviewModel} model\n * @return {ext.popups.Preview}\n */\nexport function render( model ) {\n\tconst preview = createPreviewWithType( model );\n\n\treturn {\n\t\t/**\n\t\t * Shows the preview given an event representing the user's interaction\n\t\t * with the active link, e.g. an instance of\n\t\t * [MouseEvent](https://developer.mozilla.org/en/docs/Web/API/MouseEvent).\n\t\t *\n\t\t * See `show` for more detail.\n\t\t *\n\t\t * @param {Event} event\n\t\t * @param {Object} boundActions The\n\t\t * [bound action creators](http://redux.js.org/docs/api/bindActionCreators.html)\n\t\t * that were (likely) created in [boot.js](./boot.js).\n\t\t * @param {string} token The unique token representing the link interaction\n\t\t * that resulted in showing the preview\n\t\t * @return {jQuery.Promise}\n\t\t */\n\t\tshow( event, boundActions, token ) {\n\t\t\treturn show(\n\t\t\t\tpreview, event, event.target, boundActions, token,\n\t\t\t\tdocument.body, document.documentElement.getAttribute( 'dir' )\n\t\t\t);\n\t\t},\n\n\t\t/**\n\t\t * Hides the preview.\n\t\t *\n\t\t * See `hide` for more detail.\n\t\t *\n\t\t * @return {jQuery.Promise}\n\t\t */\n\t\thide() {\n\t\t\treturn hide( preview );\n\t\t}\n\t};\n}\n\nlet renderers = {};\nconst renderersMeta = {};\n\n/**\n * @param {string} type\n * @param {function( ext.popups.PreviewModel ): ext.popups.Preview} [previewFn]\n * @param {boolean} [doNotRequireSummary] does this type require a summary to be renderable?\n *\n */\nexport function registerPreviewUI( type, previewFn, doNotRequireSummary ) {\n\trenderers[ type ] = previewFn || createPagePreview;\n\trenderersMeta[ type ] = {\n\t\trequireSummary: !doNotRequireSummary\n\t};\n}\n\n/**\n * Check whether this render type requires a summary to be rendered.\n *\n * @param {string} type of preview\n * @return {boolean}\n */\nexport function requiresSummary( type ) {\n\tconst meta = renderersMeta[ type ] || { requireSummary: true };\n\treturn meta.requireSummary;\n}\n\n/**\n * Creates an instance of a Preview based on\n * the type property of the PreviewModel\n *\n * @param {ext.popups.PreviewModel} model\n * @return {ext.popups.Preview}\n */\nexport function createPreviewWithType( model ) {\n\tconst fn = renderers[ model.type ] || createEmptyPreview;\n\treturn fn( model );\n}\n\nfunction supportsCSSClipPath() {\n\treturn window.CSS &&\n\t\ttypeof CSS.supports === 'function' &&\n\t\tCSS.supports( 'clip-path', 'polygon(1px 1px)' );\n\n}\n\n/**\n * Creates an instance of the DTO backing a preview.\n *\n * @param {ext.popups.PagePreviewModel} model\n * @return {ext.popups.Preview}\n */\nexport function createPagePreview( model ) {\n\tconst thumbnail = createThumbnail( model.thumbnail, supportsCSSClipPath() ),\n\t\thasThumbnail = thumbnail !== null,\n\t\twithCSSClipPath = supportsCSSClipPath(),\n\t\tlinkTitle = mw.msg( 'popups-settings-icon-gear-title' );\n\n\treturn {\n\t\tel: renderPagePreview( model, thumbnail, withCSSClipPath, linkTitle ),\n\t\thasThumbnail,\n\t\tthumbnail,\n\t\tisTall: hasThumbnail && thumbnail.isTall\n\t};\n}\n\n/**\n * Creates an instance of the DTO backing a preview. In this case the DTO\n * represents a generic preview, which covers the following scenarios:\n *\n * * The page doesn't exist, i.e. the user hovered over a redlink or a\n * redirect to a page that doesn't exist.\n * * The page doesn't have a viable extract.\n *\n * @param {ext.popups.PagePreviewModel} model\n * @return {ext.popups.Preview}\n */\nexport function createEmptyPreview( model ) {\n\tmodel.title = mw.msg( 'popups-preview-no-preview' );\n\tconst linkMsg = mw.msg( 'popups-preview-footer-read' );\n\n\treturn {\n\t\tel: renderPreview( model, null, linkMsg ),\n\t\thasThumbnail: false,\n\t\tisTall: false\n\t};\n}\n\n/**\n * Creates an instance of the disambiguation preview.\n *\n * @param {ext.popups.PagePreviewModel} model\n * @return {ext.popups.Preview}\n */\nexport function createDisambiguationPreview( model ) {\n\tconst extractMsg = mw.msg( 'popups-preview-disambiguation' );\n\tconst linkMsg = mw.msg( 'popups-preview-disambiguation-link' );\n\n\treturn {\n\t\tel: renderPreview( model, extractMsg, linkMsg ),\n\t\thasThumbnail: false,\n\t\tisTall: false\n\t};\n}\n\n/**\n * Shows the preview.\n *\n * Extracted from `mw.popups.render.openPopup`.\n *\n * TODO: From the perspective of the client, there's no need to distinguish\n * between rendering and showing a preview. Merge #render and Preview#show.\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.Measures} measures\n * @param {HTMLElement} _link event target (unused)\n * @param {ext.popups.PreviewBehavior} behavior\n * @param {string} token\n * @param {Object} container DOM object to which pointer masks are appended\n * @param {string} dir 'ltr' if left-to-right, 'rtl' if right-to-left.\n * @return {jQuery.Promise} A promise that resolves when the promise has\n * faded in.\n */\nexport function show(\n\tpreview, measures, _link, behavior, token, container, dir\n) {\n\tconst layout = createLayout(\n\t\tpreview.isTall,\n\t\tmeasures,\n\t\tpointerSize,\n\t\tdir\n\t);\n\n\tcontainer.appendChild( preview.el );\n\n\tlayoutPreview(\n\t\tpreview, layout, getClasses( preview, layout ),\n\t\tSIZES.landscapeImage.h, pointerSize, measures.windowHeight\n\t);\n\n\tpreview.el.style.display = 'block';\n\n\t// Trigger fading effect for reference previews after the popup has been rendered\n\tif ( preview.el.classList.contains( 'mwe-popups-type-reference' ) ) {\n\t\tpreview.el.querySelector( '.mwe-popups-scroll' ).dispatchEvent( new Event( 'scroll' ) );\n\t}\n\n\treturn wait( 200 )\n\t\t.then( () => {\n\t\t\tbindBehavior( preview, behavior );\n\t\t\tbehavior.previewShow( token );\n\t\t} );\n}\n\n/**\n * Binds the behavior to the interactive elements of the preview.\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.PreviewBehavior} behavior\n */\nexport function bindBehavior( preview, behavior ) {\n\tpreview.el.addEventListener( 'mouseenter', behavior.previewDwell );\n\tpreview.el.addEventListener( 'mouseleave', behavior.previewAbandon );\n\n\tpreview.el.addEventListener( 'click', behavior.click );\n\n\tconst button = preview.el.querySelector( 'a.mwe-popups-settings-button' );\n\tif ( button ) {\n\t\tbutton.href = behavior.settingsUrl;\n\t\tbutton.addEventListener( 'click', ( event ) => {\n\t\t\tevent.stopPropagation();\n\n\t\t\tbehavior.showSettings( event );\n\t\t} );\n\t}\n}\n\n/**\n * Extracted from `mw.popups.render.closePopup`.\n *\n * @param {ext.popups.Preview} preview\n * @return {jQuery.Promise} A promise that resolves when the preview has\n * faded out.\n */\nexport function hide( preview ) {\n\t// FIXME: This method clearly needs access to the layout of the preview.\n\tconst fadeInClass = ( preview.el.classList.contains( 'mwe-popups-fade-in-up' ) ) ?\n\t\t'mwe-popups-fade-in-up' :\n\t\t'mwe-popups-fade-in-down';\n\n\tconst fadeOutClass = ( fadeInClass === 'mwe-popups-fade-in-up' ) ?\n\t\t'mwe-popups-fade-out-down' :\n\t\t'mwe-popups-fade-out-up';\n\n\t// Classes documented above\n\t// eslint-disable-next-line mediawiki/class-doc\n\tpreview.el.classList.remove( fadeInClass );\n\t// eslint-disable-next-line mediawiki/class-doc\n\tpreview.el.classList.add( fadeOutClass );\n\n\treturn wait( 150 ).then( () => {\n\t\tpreview.el.remove();\n\t} );\n}\n\n/**\n * Represents the layout of a preview, which consists of a position (`offset`)\n * and whether or not the preview should be flipped horizontally or\n * vertically (`flippedX` and `flippedY` respectively).\n *\n * @typedef {Object} ext.popups.PreviewLayout\n * @property {Object} offset\n * @property {number} offset.top\n * @property {number} offset.left\n * @property {boolean} flippedX\n * @property {boolean} flippedY\n * @property {string} dir 'ltr' if left-to-right, 'rtl' if right-to-left.\n */\n\n/**\n * @param {boolean} isPreviewTall\n * @param {ext.popups.Measures} measures\n * @param {number} pointerSpaceSize Space reserved for the pointer\n * @param {string} dir 'ltr' if left-to-right, 'rtl' if right-to-left.\n * @return {ext.popups.PreviewLayout}\n */\nexport function createLayout(\n\tisPreviewTall, measures, pointerSpaceSize, dir\n) {\n\tlet flippedX = false,\n\t\tflippedY = false,\n\t\toffsetTop = measures.pageY ?\n\t\t\t// If it was a mouse event, position according to mouse\n\t\t\t// Since client rectangles are relative to the viewport,\n\t\t\t// take scroll position into account.\n\t\t\tgetClosestYPosition(\n\t\t\t\tmeasures.pageY - measures.scrollTop,\n\t\t\t\tmeasures.clientRects,\n\t\t\t\tfalse\n\t\t\t) + measures.scrollTop + pointerSpaceSize :\n\t\t\t// Position according to link position or size\n\t\t\tmeasures.offset.top + measures.height + pointerSize,\n\t\toffsetLeft;\n\tconst clientTop = measures.clientY ? measures.clientY : offsetTop - measures.scrollTop;\n\n\tif ( measures.pageX ) {\n\t\tif ( measures.width > maxLinkWidthForCenteredPointer ) {\n\t\t\t// For wider links, position the popup's pointer at the\n\t\t\t// mouse pointer's location. (x-axis)\n\t\t\toffsetLeft = measures.pageX;\n\t\t} else {\n\t\t\t// For smaller links, position the popup's pointer at\n\t\t\t// the link's center. (x-axis)\n\t\t\toffsetLeft = measures.offset.left + measures.width / 2;\n\t\t}\n\t} else {\n\t\toffsetLeft = measures.offset.left;\n\t}\n\n\t// X Flip\n\tif ( offsetLeft > ( measures.windowWidth / 2 ) ) {\n\t\toffsetLeft += ( !measures.pageX ) ? measures.width : 0;\n\t\toffsetLeft -= !isPreviewTall ?\n\t\t\tportraitPopupWidth :\n\t\t\tlandscapePopupWidth;\n\t\tflippedX = true;\n\t}\n\n\tif ( measures.pageX ) {\n\t\toffsetLeft += ( flippedX ) ? 18 : -18;\n\t}\n\n\t// Y Flip\n\tif ( clientTop > ( measures.windowHeight / 2 ) ) {\n\t\tflippedY = true;\n\n\t\t// Mirror the positioning of the preview when there's no \"Y flip\": rest\n\t\t// the pointer on the edge of the link's bounding rectangle. In this case\n\t\t// the edge is the top-most.\n\t\toffsetTop = measures.offset.top;\n\n\t\t// Change the Y position to the top of the link\n\t\tif ( measures.pageY ) {\n\t\t\t// Since client rectangles are relative to the viewport,\n\t\t\t// take scroll position into account.\n\t\t\toffsetTop = getClosestYPosition(\n\t\t\t\tmeasures.pageY - measures.scrollTop,\n\t\t\t\tmeasures.clientRects,\n\t\t\t\ttrue\n\t\t\t) + measures.scrollTop;\n\t\t}\n\n\t\toffsetTop -= pointerSpaceSize;\n\t}\n\n\treturn {\n\t\toffset: {\n\t\t\ttop: offsetTop,\n\t\t\tleft: offsetLeft\n\t\t},\n\t\tflippedX: dir === 'rtl' ? !flippedX : flippedX,\n\t\tflippedY,\n\t\tdir\n\t};\n}\n\n/**\n * is there a pointer on the image of the preview?\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.PreviewLayout} layout\n * @return {boolean}\n */\nexport function hasPointerOnImage( preview, layout ) {\n\tif ( ( !preview.hasThumbnail || preview.isTall && !layout.flippedX ) &&\n\t\t!layout.flippedY ) {\n\t\treturn false;\n\t}\n\tif ( preview.hasThumbnail ) {\n\t\tif (\n\t\t\t( !preview.isTall && !layout.flippedY ) ||\n\t\t\t( preview.isTall && layout.flippedX )\n\t\t) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n/**\n * Generates a list of declarative CSS classes that represent the layout of\n * the preview.\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.PreviewLayout} layout\n * @return {string[]}\n */\nexport function getClasses( preview, layout ) {\n\tconst classes = [];\n\n\tif ( layout.flippedY ) {\n\t\tclasses.push( 'mwe-popups-fade-in-down' );\n\t} else {\n\t\tclasses.push( 'mwe-popups-fade-in-up' );\n\t}\n\n\tif ( layout.flippedY && layout.flippedX ) {\n\t\tclasses.push( 'flipped-x-y' );\n\t} else if ( layout.flippedY ) {\n\t\tclasses.push( 'flipped-y' );\n\t} else if ( layout.flippedX ) {\n\t\tclasses.push( 'flipped-x' );\n\t}\n\n\tclasses.push(\n\t\thasPointerOnImage( preview, layout ) ?\n\t\t\t'mwe-popups-image-pointer' : 'mwe-popups-no-image-pointer'\n\t);\n\n\tif ( preview.isTall ) {\n\t\tclasses.push( 'mwe-popups-is-tall' );\n\t} else {\n\t\tclasses.push( 'mwe-popups-is-not-tall' );\n\t}\n\n\treturn classes;\n}\n\n/**\n * Lays out the preview given the layout.\n *\n * If the thumbnail is landscape and isn't the full height of the thumbnail\n * container, then pull the extract up to keep whitespace consistent across\n * previews.\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.PreviewLayout} layout\n * @param {string[]} classes class names used for layout out the preview\n * @param {number} predefinedLandscapeImageHeight landscape image height\n * @param {number} pointerSpaceSize\n * @param {number} windowHeight\n */\nexport function layoutPreview(\n\tpreview, layout, classes, predefinedLandscapeImageHeight, pointerSpaceSize, windowHeight\n) {\n\tconst popup = preview.el,\n\t\tisTall = preview.isTall,\n\t\thasThumbnail = preview.hasThumbnail,\n\t\tthumbnail = preview.thumbnail,\n\t\tflippedY = layout.flippedY;\n\n\tif (\n\t\t!flippedY && !isTall && hasThumbnail &&\n\t\t\tthumbnail.height < predefinedLandscapeImageHeight && !supportsCSSClipPath()\n\t) {\n\t\tconst popupExtract = popup.querySelector( '.mwe-popups-extract' );\n\t\tpopupExtract.style.marginTop = `${ ( thumbnail.height - pointerSpaceSize ) }px`;\n\t}\n\n\t// The following classes are used here:\n\t// * flipped-x\n\t// * flipped-x-y\n\t// * flipped-y\n\t// * mwe-popups-fade-in-down\n\t// * mwe-popups-fade-in-up\n\t// * mwe-popups-image-pointer\n\t// * mwe-popups-is-not-tall\n\t// * mwe-popups-is-tall\n\t// * mwe-popups-no-image-pointer\n\tpopup.classList.add.apply( popup.classList, classes );\n\n\tpopup.style.left = `${ layout.offset.left }px`;\n\tpopup.style.top = flippedY ? 'auto' : `${ layout.offset.top }px`;\n\tpopup.style.bottom = flippedY ? `${ windowHeight - layout.offset.top }px` : 'auto';\n\n\tif ( hasThumbnail && !supportsCSSClipPath() ) {\n\t\tsetThumbnailClipPath( preview, layout );\n\t}\n}\n\n/**\n * Sets the thumbnail SVG clip-path.\n *\n * If the preview should be oriented differently, then the pointer is updated,\n * e.g. if the preview should be flipped vertically, then the pointer is\n * removed.\n *\n * Note: SVG clip-paths are supported everywhere but clip-paths as CSS\n * properties are not (https://caniuse.com/#feat=css-clip-path). For this\n * reason, RTL flipping is handled in JavaScript instead of CSS.\n *\n * @param {ext.popups.Preview} preview\n * @param {ext.popups.PreviewLayout} layout\n */\nexport function setThumbnailClipPath(\n\t{ el, isTall, thumbnail }, { flippedY, flippedX, dir }\n) {\n\tconst maskID = getThumbnailClipPathID( isTall, flippedY, flippedX );\n\tif ( maskID ) {\n\t\t// CSS matrix transform entries:\n\t\t// ⎡ sx c tx ⎤\n\t\t// ⎣ sy d ty ⎦\n\t\tconst matrix = {\n\t\t\tscaleX: 1,\n\t\t\t// moving the mask horizontally if the image is less than the maximum width\n\t\t\ttranslateX: isTall ? Math.min( thumbnail.width - SIZES.portraitImage.w, 0 ) : 0\n\t\t};\n\n\t\tif ( dir === 'rtl' ) {\n\t\t\t// flipping the mask horizontally\n\t\t\tmatrix.scaleX = -1;\n\t\t\t// moving the mask horizontally to the max width of the thumbnail\n\t\t\tmatrix.translateX = isTall ? SIZES.portraitImage.w : SIZES.landscapeImage.w;\n\t\t}\n\n\t\t// Transform the clip-path not the image it is applied to.\n\t\tconst mask = document.getElementById( maskID );\n\t\tmask.setAttribute(\n\t\t\t'transform',\n\t\t\t`matrix(${ matrix.scaleX } 0 0 1 ${ matrix.translateX } 0)`\n\t\t);\n\n\t\tel.querySelector( 'image' )\n\t\t\t.setAttribute( 'clip-path', `url(#${ maskID })` );\n\t}\n}\n\n/**\n * Gets the thumbnail SVG clip-path element ID as specified in pointer-mask.svg.\n *\n * @param {boolean} isTall Sugar around\n * `preview.hasThumbnail && thumbnail.isTall`\n * @param {boolean} flippedY\n * @param {boolean} flippedX\n * @return {string|undefined}\n */\nexport function getThumbnailClipPathID( isTall, flippedY, flippedX ) {\n\t// Clip-paths are only needed when the pointer is in a corner that is covered by the thumbnail.\n\t// This is only the case in 4 of 8 situations:\n\tif ( !isTall && !flippedY ) {\n\t\t// 1. Landscape thumbnails cover the upper half of the popup. This is only the case when the\n\t\t// pointer is not flipped to the bottom.\n\t\treturn flippedX ? 'mwe-popups-mask-flip' : 'mwe-popups-mask';\n\t} else if ( isTall && flippedX ) {\n\t\t// 2. Tall thumbnails cover the right half of the popup. This is only the case when the\n\t\t// pointer is flipped to the right.\n\t\treturn flippedY ? 'mwe-popups-landscape-mask-flip' : 'mwe-popups-landscape-mask';\n\t}\n\n\t// The 4 combinations not covered above don't need a clip-path.\n\treturn undefined;\n}\n\n/**\n * Given the rectangular box(es) find the 'y' boundary of the closest\n * rectangle to the point 'y'. The point 'y' is the location of the mouse\n * on the 'y' axis and the rectangular box(es) are the borders of the\n * element over which the mouse is located. There will be more than one\n * rectangle in case the element spans multiple lines.\n *\n * In the majority of cases the mouse pointer will be inside a rectangle.\n * However, some browsers (i.e. Chrome) trigger a hover action even when\n * the mouse pointer is just outside a bounding rectangle. That's why\n * we need to look at all rectangles and not just the rectangle that\n * encloses the point.\n *\n * @private\n * @param {number} y the point for which the closest location is being\n * looked for\n * @param {ClientRectList} rects list of rectangles defined by four edges\n * @param {boolean} [isTop] should the resulting rectangle's top 'y'\n * boundary be returned. By default the bottom 'y' value is returned.\n * @return {number}\n */\nexport function getClosestYPosition( y, rects, isTop ) {\n\tlet minY = null, result;\n\n\tArray.prototype.slice.call( rects ).forEach( ( rect ) => {\n\t\tconst deltaY = Math.abs( y - rect.top + y - rect.bottom );\n\n\t\tif ( minY === null || minY > deltaY ) {\n\t\t\tminY = deltaY;\n\t\t\t// Make sure the resulting point is at or outside the rectangle\n\t\t\t// boundaries.\n\t\t\tresult = ( isTop ) ? Math.floor( rect.top ) : Math.ceil( rect.bottom );\n\t\t}\n\t} );\n\n\treturn result;\n}\n\nexport const test = {\n\t/** For testing only */\n\treset: () => {\n\t\trenderers = {};\n\t}\n};\n","/**\n * @module preview/model\n */\n\nimport { requiresSummary } from '../ui/renderer';\n\nconst selectors = [];\n\n/**\n * Page Preview types as defined in Schema:Popups\n * https://meta.wikimedia.org/wiki/Schema:Popups\n *\n * @constant {Object}\n */\nconst previewTypes = {\n\t/** Empty preview used in error situations */\n\tTYPE_GENERIC: 'generic',\n\t/** Standard page preview with or without thumbnail */\n\tTYPE_PAGE: 'page',\n\t/** Disambiguation page preview */\n\tTYPE_DISAMBIGUATION: 'disambiguation'\n};\n\nexport { previewTypes };\n\n/**\n * Preview Model\n *\n * @typedef {Object} PreviewModel\n * @property {string} url The canonical URL of the page being previewed\n * @property {string} type One of the previewTypes.TYPE_… constants.\n */\n\n/**\n * @typedef {Object} PagePreviewModel\n * @extends PreviewModel\n * @property {string} title\n * @property {Array|undefined} extract `undefined` if the extract isn't\n * viable, e.g. if it's empty after having ellipsis and parentheticals\n * removed; this can be used to present default or error states\n * @property {string} languageCode\n * @property {string} languageDirection Either \"ltr\" or \"rtl\", or an empty string if undefined.\n * @property {{source: string, width: number, height: number}|undefined} thumbnail\n * @property {number} pageId Currently not used by any known popup type.\n */\n\n/**\n * @typedef {Object} ReferencePreviewModel\n * @extends PreviewModel\n * @property {string} extract An HTML snippet, not necessarily with a single top-level node\n * @property {string} referenceType A type identifier, e.g. \"web\"\n * @property {string} sourceElementId ID of the parent element that triggered the preview\n */\n\n/**\n * Creates a page preview model.\n *\n * @param {string} title\n * @param {string} url The canonical URL of the page being previewed\n * @param {string} languageCode\n * @param {string} languageDirection Either \"ltr\" or \"rtl\"\n * @param {Array|undefined|null} extract\n * @param {string} type\n * @param {{source: string, width: number, height: number}|undefined} [thumbnail]\n * @param {number} [pageId]\n * @return {PagePreviewModel}\n */\nexport function createModel(\n\ttitle,\n\turl,\n\tlanguageCode,\n\tlanguageDirection,\n\textract,\n\ttype,\n\tthumbnail,\n\tpageId\n) {\n\tconst processedExtract = processExtract( extract ),\n\t\tpreviewType = getPagePreviewType( type, processedExtract );\n\n\treturn {\n\t\ttitle,\n\t\turl,\n\t\tlanguageCode,\n\t\tlanguageDirection,\n\t\textract: processedExtract,\n\t\ttype: previewType,\n\t\tthumbnail,\n\t\tpageId\n\t};\n}\n\n/**\n * Creates an empty page preview model.\n *\n * @param {string} title\n * @param {string} url\n * @return {PagePreviewModel}\n */\nexport function createNullModel( title, url ) {\n\treturn createModel( title, url, '', '', [], '' );\n}\n\n/**\n * @param {HTMLElement} element\n * @param {string} selector\n * @return {boolean}\n */\nconst elementMatchesSelector = ( element, selector ) => {\n\treturn element.matches( selector );\n};\n\n/**\n * Recursively checks the element and its parents.\n *\n * @param {HTMLElement} element\n * @return {HTMLElement|null}\n */\nexport function findNearestEligibleTarget( element ) {\n\tif ( selectors.length ) {\n\t\tconst selector = selectors.join( ', ' );\n\t\treturn element.closest( selector );\n\t}\n\treturn null;\n}\n\n/**\n * @typedef {Object} PreviewType\n * @property {string} name identifier for preview type\n * @property {string} selector a CSS selector\n * @type {PreviewType[]}\n */\nconst registeredPreviewTypes = [];\n\n/**\n * Determines the applicable popup type based on title and link element.\n *\n * @param {HTMLAnchorElement} el\n * @return {string|null} One of the previewTypes.TYPE_… constants\n */\nexport function getPreviewType( el ) {\n\tconst candidates = registeredPreviewTypes.filter(\n\t\t( type ) => elementMatchesSelector( el, type.selector )\n\t);\n\n\t// If the filter returned some possibilities, use the last registered one.\n\tif ( candidates.length > 0 ) {\n\t\treturn candidates[ candidates.length - 1 ].name;\n\t}\n\n\treturn null;\n}\n\n/**\n * Processes the extract returned by the TextExtracts MediaWiki API query\n * module.\n *\n * If the extract is `undefined`, `null`, or empty, then `undefined` is\n * returned.\n *\n * @param {Array|undefined|null} extract\n * @return {Array|undefined} Array when extract is an not empty array, undefined\n * otherwise\n */\nfunction processExtract( extract ) {\n\tif ( extract === undefined || extract === null || extract.length === 0 ) {\n\t\treturn undefined;\n\t}\n\treturn extract;\n}\n\n/**\n * Determines the page preview type based on whether or not:\n * a. Is the preview empty.\n * b. The preview type matches one of previewTypes.\n * c. Assume standard page preview if both above are false\n *\n * @param {string} type\n * @param {Array|undefined} [processedExtract]\n * @return {string} One of the previewTypes.TYPE_… constants.\n */\n\nfunction getPagePreviewType( type, processedExtract ) {\n\t// If the preview type requires a summary to display and no extract was\n\t// found show the generic (error) preview.\n\tif ( processedExtract === undefined && requiresSummary( type ) ) {\n\t\treturn previewTypes.TYPE_GENERIC;\n\t}\n\n\tswitch ( type ) {\n\t\tcase previewTypes.TYPE_GENERIC:\n\t\tcase previewTypes.TYPE_DISAMBIGUATION:\n\t\tcase previewTypes.TYPE_PAGE:\n\t\t\treturn type;\n\t\tdefault:\n\t\t\t/**\n\t\t\t * Assume type=\"page\" if extract exists & not one of previewTypes.\n\t\t\t * Note:\n\t\t\t * - Restbase response includes \"type\" prop but other gateways don't.\n\t\t\t * - event-logging Schema:Popups requires type=\"page\" but restbase\n\t\t\t * provides type=\"standard\". Model must conform to event-logging schema.\n\t\t\t */\n\t\t\treturn previewTypes.TYPE_PAGE;\n\t}\n}\n\nconst dwellDelay = {};\n\n/**\n * Determines the delay before showing the preview when dwelling a link.\n *\n * @param {string} type\n * @return {number}\n */\nexport function getDwellDelay( type ) {\n\treturn dwellDelay[ type ] || 0;\n}\n\n/***\n * Set the delay before showing the preview when dwelling a link.\n *\n * @param {string} type\n * @param {number} delay\n */\nexport function setDwellTime( type, delay ) {\n\tdwellDelay[ type ] = delay;\n}\n\n/**\n * Allows extensions to register their own page previews.\n *\n * @stable\n * @param {string} type\n * @param {string} selector A valid CSS selector to associate preview with\n * @param {number} [delay] optional delay between hovering and displaying preview.\n * If not defined, delay will be zero.\n */\nexport function registerModel( type, selector, delay ) {\n\tselectors.push( selector );\n\tregisteredPreviewTypes.push( {\n\t\tname: type,\n\t\tselector\n\t} );\n\tif ( delay ) {\n\t\tsetDwellTime( type, delay );\n\t}\n}\n\nexport const test = {\n\t/** For testing only */\n\treset: () => {\n\t\twhile ( registeredPreviewTypes.length ) {\n\t\t\tregisteredPreviewTypes.pop();\n\t\t}\n\t}\n};\n","/**\n * @module formatter\n */\n\n/**\n * Improves the plain text extracts\n *\n * @param {string} plainTextExtract\n * @param {string} title\n * @return {Array}\n */\nexport function formatPlainTextExtract( plainTextExtract, title ) {\n\tlet extract = plainTextExtract;\n\tif ( plainTextExtract === undefined ) {\n\t\treturn [];\n\t}\n\n\t// After cleaning the extract it may have been blanked\n\tif ( extract.length === 0 ) {\n\t\treturn [];\n\t}\n\n\textract = makeTitleInExtractBold( extract, title );\n\treturn extract;\n}\n\n/**\n * Converts the extract into a list of elements, which correspond to fragments\n * of the extract. Fragments that match the title verbatim are wrapped in a\n * `` element.\n *\n * Using the bolded elements of the extract of the page directly is covered by\n * [T141651](https://phabricator.wikimedia.org/T141651).\n *\n * Extracted from `mw.popups.renderer.article.getProcessedElements`.\n *\n * @param {string} extract\n * @param {string} title\n * @return {Array} A set of HTML Elements\n */\nfunction makeTitleInExtractBold( extract, title ) {\n\tconst elements = [],\n\t\tboldIdentifier = ``,\n\t\tsnip = ``;\n\n\ttitle = title.replace( /\\s+/g, ' ' ).trim(); // Remove extra white spaces\n\tconst escapedTitle = mw.util.escapeRegExp( title );\n\t// eslint-disable-next-line security/detect-non-literal-regexp\n\tconst regExp = new RegExp( `(^|\\\\s)(${ escapedTitle })(|$)`, 'i' );\n\n\t// Remove text in parentheses along with the parentheses\n\textract = extract.replace( /\\s+/, ' ' ); // Remove extra white spaces\n\n\t// Make title bold in the extract text\n\t// As the extract is html escaped there can be no such string in it\n\t// Also, the title is escaped of RegExp elements thus can't have \"*\"\n\textract = extract.replace(\n\t\tregExp,\n\t\t`$1${ snip }${ boldIdentifier }$2${ snip }$3`\n\t);\n\textract = extract.split( snip );\n\n\textract.forEach( ( part ) => {\n\t\tif ( part.indexOf( boldIdentifier ) === 0 ) {\n\t\t\tconst highlightNode = document.createElement( 'b' );\n\t\t\thighlightNode.textContent = part.slice( boldIdentifier.length );\n\t\t\telements.push( highlightNode );\n\t\t} else {\n\t\t\telements.push( document.createTextNode( part ) );\n\t\t}\n\t} );\n\n\treturn elements;\n}\n","/**\n * @module gateway\n */\n\n/**\n * The interface implemented by all preview gateways.\n *\n * @typedef Gateway\n * @property {function(string): JQuery.jqXHR} fetch\n * @property {FetchPreviewForTitle} fetchPreviewForTitle\n * @property {ConvertPageToModel} convertPageToModel\n */\n\n/**\n * A Promise, usually for a long running or costly task such as an HTTP request,\n * that is abortable.\n *\n * @template T\n * @typedef {Promise} AbortPromise\n * @property {function(): void} abort\n */\n\n/**\n * @stable this function is available to 3rd parties. Any breaking changes must\n * go through the MediaWiki deprecation process.\n * @param {Promise|jQuery.Promise} promise\n * @param {function(): void} [abort]\n * @return {AbortPromise}\n */\nexport function abortablePromise( promise, abort = () => {} ) {\n\t// JQuery provided.\n\tif ( promise.promise ) {\n\t\treturn promise.promise( {\n\t\t\tabort\n\t\t} );\n\t}\n\tpromise.abort = abort;\n\treturn promise;\n}\n\n/**\n * Fetches a preview for a page or reference.\n *\n * If the underlying request is successful and contains data for the requested title,\n * then the resulting promise will resolve. If not, then it will reject.\n *\n * @typedef {function(mw.Title, HTMLAnchorElement): AbortPromise} FetchPreviewForTitle\n */\n\n/**\n * Converts the API response to a preview model. Exposed for testing only.\n *\n * @typedef {function(Object, ...any): PagePreviewModel} ConvertPageToModel\n */\n\nconst gatewayMap = {};\n\n/**\n * @param {string} type Type of preview we are handling\n * @return {Gateway|undefined}\n */\nexport function getGatewayForPreviewType( type ) {\n\treturn gatewayMap[ type ];\n}\n\n/**\n * Register a gateway for a given preview type.\n *\n * @param {string} type preview type\n * @param {Gateway} gateway\n */\nexport function registerGatewayForPreviewType( type, gateway ) {\n\tgatewayMap[ type ] = gateway;\n}\n","/**\n * @module gateway/mediawiki\n */\n\nimport { createModel } from '../preview/model';\nimport * as formatter from '../formatter';\nimport { abortablePromise } from './index.js';\n\n// Public and private cache lifetime (5 minutes)\n//\n// FIXME: Move this to src/constants.js.\nconst CACHE_LIFETIME = 300;\n\n/**\n * @typedef {Gateway} MediaWikiGateway\n * @property {function(Object): Object} extractPageFromResponse\n * @property {function(Object): Object} formatPlainTextExtract\n */\n\n/**\n * Creates an instance of the MediaWiki API gateway.\n *\n * @param {mw.Api} api\n * @param {Object} config Configuration that affects the major behavior of the\n * gateway.\n * @param {number} config.THUMBNAIL_SIZE The length of the major dimension of\n * the thumbnail.\n * @param {number} config.EXTRACT_LENGTH The maximum length, in characters,\n * of the extract.\n * @param {string} config.acceptLanguage The accepted language sent in the\n * header\n * @return {MediaWikiGateway}\n */\nexport default function createMediaWikiApiGateway( api, config ) {\n\tfunction fetch( title ) {\n\t\treturn api.get( {\n\t\t\taction: 'query',\n\t\t\tprop: 'info|extracts|pageimages|revisions|info',\n\t\t\tformatversion: 2,\n\t\t\tredirects: true,\n\t\t\texintro: mw.config.get( 'wgPopupsTextExtractsIntroOnly', true ),\n\t\t\texchars: config.EXTRACT_LENGTH,\n\n\t\t\t// There is an added geometric limit on .mwe-popups-extract\n\t\t\t// so that text does not overflow from the card.\n\t\t\texplaintext: true,\n\t\t\texsectionformat: 'plain',\n\n\t\t\tpiprop: 'thumbnail',\n\t\t\tpithumbsize: config.THUMBNAIL_SIZE,\n\t\t\tpilicense: 'any',\n\t\t\trvprop: 'timestamp',\n\t\t\tinprop: 'url',\n\t\t\ttitles: title,\n\t\t\tsmaxage: CACHE_LIFETIME,\n\t\t\tmaxage: CACHE_LIFETIME,\n\t\t\tuselang: 'content'\n\t\t}, {\n\t\t\theaders: {\n\t\t\t\t'X-Analytics': 'preview=1',\n\t\t\t\t'Accept-Language': config.acceptLanguage\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @param {mw.Title} title\n\t * @return {AbortPromise}\n\t */\n\tfunction fetchPreviewForTitle( title ) {\n\t\tconst xhr = fetch( title.getPrefixedDb() );\n\t\treturn abortablePromise( xhr.then( ( data ) => {\n\t\t\tconst page = extractPageFromResponse( data );\n\t\t\tconst plainTextExtract = formatPlainTextExtract( page );\n\t\t\treturn convertPageToModel( plainTextExtract );\n\t\t} ), () => xhr.abort() );\n\t}\n\n\treturn {\n\t\tfetch,\n\t\textractPageFromResponse,\n\t\tconvertPageToModel,\n\t\tfetchPreviewForTitle,\n\t\tformatPlainTextExtract\n\t};\n}\n\n/**\n * Extracts page data from the API response.\n *\n * @method\n * @name MediaWikiGateway#extractPageFromResponse\n * @param {Object} data The response\n * @throws {Error} If the response is empty or doesn't contain data about the\n * page\n * @return {Object}\n */\nfunction extractPageFromResponse( data ) {\n\tif (\n\t\tdata.query &&\n\t\tdata.query.pages &&\n\t\tdata.query.pages.length\n\t) {\n\t\treturn data.query.pages[ 0 ];\n\t}\n\n\tthrow new Error( 'API response `query.pages` is empty.' );\n}\n\n/**\n * Make plain text nicer by applying formatter.\n *\n * @method\n * @name MediaWikiGateway#formatPlainTextExtract\n * @param {Object} data The response\n * @return {Object}\n */\nfunction formatPlainTextExtract( data ) {\n\tconst result = Object.assign( {}, data );\n\tresult.extract = formatter.formatPlainTextExtract( data.extract, data.title );\n\treturn result;\n}\n\n/**\n * Converts the API response to a preview model.\n *\n * @method\n * @name MediaWikiGateway#convertPageToModel\n * @param {Object} page\n * @return {PagePreviewModel}\n */\nfunction convertPageToModel( page ) {\n\treturn createModel(\n\t\tpage.title,\n\t\tpage.canonicalurl,\n\t\tpage.pagelanguagehtmlcode,\n\t\tpage.pagelanguagedir,\n\t\tpage.extract,\n\t\tpage.type,\n\t\tpage.thumbnail,\n\t\tpage.pageid\n\t);\n}\n","/**\n * @module gateway/rest\n */\n\nimport { createModel } from '../preview/model';\nimport { abortablePromise } from './index.js';\n\nconst RESTBASE_PROFILE = 'https://www.mediawiki.org/wiki/Specs/Summary/1.2.0';\n\n/** @typedef {function(JQuery.AjaxSettings=): JQuery.jqXHR} Ajax */\n\n/**\n * Creates an instance of the RESTBase gateway.\n *\n * This gateway differs from the {@link MediaWikiGateway MediaWiki gateway} in\n * that it fetches page data from [the RESTBase page summary endpoint][0].\n *\n * [0]: https://en.wikipedia.org/api/rest_v1/#!/Page_content/get_page_summary_title\n *\n * @param {Ajax} ajax A function with the same signature as `jQuery.ajax`\n * @param {Object} config Configuration that affects the major behavior of the\n * gateway.\n * @param {Function} extractParser A function that takes response and returns\n * parsed extract\n * @return {Gateway}\n */\nexport default function createRESTBaseGateway( ajax, config, extractParser ) {\n\t/**\n\t * Fetches page data from [the RESTBase page summary endpoint][0].\n\t *\n\t * [0]: https://en.wikipedia.org/api/rest_v1/#!/Page_content/get_page_summary_title\n\t *\n\t * @method\n\t * @name RESTBaseGateway#fetch\n\t * @param {string} title\n\t * @return {jQuery.jqXHR}\n\t */\n\tfunction fetch( title ) {\n\t\tconst endpoint = config.endpoint;\n\n\t\treturn ajax( {\n\t\t\turl: endpoint + encodeURIComponent( title ),\n\t\t\theaders: {\n\t\t\t\tAccept: `application/json; charset=utf-8; profile=\"${ RESTBASE_PROFILE }\"`,\n\t\t\t\t'Accept-Language': config.acceptLanguage\n\t\t\t}\n\t\t} );\n\t}\n\n\t/**\n\t * @param {mw.Title} title\n\t * @return {AbortPromise}\n\t */\n\tfunction fetchPreviewForTitle( title ) {\n\t\tconst titleText = title.getPrefixedDb(),\n\t\t\txhr = fetch( titleText );\n\t\treturn abortablePromise( xhr.then( ( page ) => {\n\t\t\t// Endpoint response may be empty or simply missing a title.\n\t\t\tpage = page || {};\n\t\t\tpage.title = page.title || titleText;\n\t\t\t// And extract may be omitted if empty string\n\t\t\tpage.extract = page.extract || '';\n\t\t\treturn convertPageToModel(\n\t\t\t\tpage, config.THUMBNAIL_SIZE, extractParser\n\t\t\t);\n\t\t} ).catch( ( jqXHR, textStatus, errorThrown ) => {\n\t\t\t// The client will choose how to handle these errors which may include\n\t\t\t// those due to HTTP 4xx and 5xx status. The rejection typing matches\n\t\t\t// fetch failures.\n\t\t\treturn Promise.reject( 'http', {\n\t\t\t\txhr: jqXHR,\n\t\t\t\ttextStatus,\n\t\t\t\texception: errorThrown\n\t\t\t} );\n\t\t} ), () => xhr.abort() );\n\t}\n\n\treturn {\n\t\tfetch,\n\t\tconvertPageToModel,\n\t\tfetchPreviewForTitle\n\t};\n}\n\n/**\n * Checks whether the `originalImage` property contains an image\n * format that's safe to render.\n * https://www.mediawiki.org/wiki/Help:Images#Supported_media_types_for_images\n *\n * @param {string} filename\n *\n * @return {boolean}\n */\nfunction isSafeImgFormat( filename ) {\n\tconst safeImage = new RegExp( /\\.(jpg|jpeg|png|gif)$/i );\n\treturn safeImage.test( filename );\n}\n\n/**\n * Resizes the thumbnail to the requested width, preserving its aspect ratio.\n *\n * The requested width is limited to that of the original image unless the image\n * is an SVG, which can be scaled infinitely.\n *\n * This function is only intended to mangle the pretty thumbnail URLs used on\n * Wikimedia Commons. Once [an official thumb API](https://phabricator.wikimedia.org/T66214)\n * is fully specified and implemented, this function can be made more general.\n *\n * @param {Object} thumbnail The thumbnail image\n * @param {Object} original The original image\n * @param {number} thumbSize The requested size\n * @return {{source: string, width: number, height: number}|undefined}\n */\nfunction generateThumbnailData( thumbnail, original, thumbSize ) {\n\tconst parts = thumbnail.source.split( '/' ),\n\t\tlastPart = parts[ parts.length - 1 ],\n\t\toriginalIsSafe = isSafeImgFormat( original.source ) || undefined;\n\n\t// The last part, the thumbnail's full filename, is in the following form:\n\t// ${width}px-${filename}.${extension}. Splitting the thumbnail's filename\n\t// makes this function resilient to the thumbnail not having the same\n\t// extension as the original image, which is definitely the case for SVG's\n\t// where the thumbnail's extension is .svg.png.\n\tconst filenamePxIndex = lastPart.indexOf( 'px-' );\n\tif ( filenamePxIndex === -1 ) {\n\t\t// The thumbnail size is not customizable. Presumably, RESTBase requested a\n\t\t// width greater than the original and so MediaWiki returned the original's\n\t\t// URL instead of a thumbnail compatible URL. An original URL does not have\n\t\t// a \"thumb\" path, e.g.:\n\t\t//\n\t\t// https://upload.wikimedia.org/wikipedia/commons/a/aa/Red_Giant_Earth_warm.jpg\n\t\t//\n\t\t// Instead of:\n\t\t//\n\t\t// https://upload.wikimedia.org/wikipedia/commons/thumb/a/aa/Red_Giant_Earth_warm.jpg/512px-Red_Giant_Earth_warm.jpg\n\t\t//\n\t\t// Use the original if it's a supported image format.\n\t\treturn originalIsSafe && original;\n\t}\n\tconst filename = lastPart.slice( filenamePxIndex + 3 );\n\n\t// Scale the thumbnail's largest dimension.\n\tlet width, height;\n\tif ( thumbnail.width > thumbnail.height ) {\n\t\twidth = thumbSize;\n\t\theight = Math.floor( ( thumbSize / thumbnail.width ) * thumbnail.height );\n\t} else {\n\t\twidth = Math.floor( ( thumbSize / thumbnail.height ) * thumbnail.width );\n\t\theight = thumbSize;\n\t}\n\n\t// If the image isn't an SVG, then it shouldn't be scaled past its original\n\t// dimensions.\n\tif ( width >= original.width && filename.indexOf( '.svg' ) === -1 ) {\n\t\t// if the image format is not supported, it shouldn't be rendered.\n\t\treturn originalIsSafe && original;\n\t}\n\n\tparts[ parts.length - 1 ] = `${ width }px-${ filename }`;\n\n\treturn {\n\t\tsource: parts.join( '/' ),\n\t\twidth,\n\t\theight\n\t};\n}\n\n/**\n * Converts the API response to a preview model.\n *\n * @method\n * @name RESTBaseGateway#convertPageToModel\n * @param {Object} page\n * @param {number} thumbSize\n * @param {Function} extractParser\n * @return {PagePreviewModel}\n */\nexport function convertPageToModel( page, thumbSize, extractParser ) {\n\treturn createModel(\n\t\tpage.title,\n\t\tnew mw.Title( page.title ).getUrl(),\n\t\tpage.lang,\n\t\tpage.dir,\n\t\textractParser( page ),\n\t\tpage.type,\n\t\tpage.thumbnail ?\n\t\t\tgenerateThumbnailData(\n\t\t\t\tpage.thumbnail, page.originalimage, thumbSize\n\t\t\t) : undefined,\n\t\tpage.pageid\n\t);\n}\n","/**\n * @module restFormatters\n */\n\nimport * as formatter from '../formatter';\n\n/**\n * Prepare extract\n *\n * @param {Object} page Rest response\n * @return {Array} An array of DOM Elements\n */\nexport function parseHTMLResponse( page ) {\n\tconst extract = page.extract_html;\n\tconst extractNode = document.createElement( 'div' );\n\textractNode.innerHTML = extract;\n\treturn extract.length === 0 ? [] : extractNode.childNodes;\n}\n\n/**\n * Prepare extract\n *\n * @param {Object} page Rest response\n * @return {Array} An array of DOM Elements\n */\nexport function parsePlainTextResponse( page ) {\n\treturn formatter.formatPlainTextExtract( page.extract, page.title );\n}\n","/**\n * @module gateway/page\n */\n\nimport constants from '../constants';\nimport createMediaWikiApiGateway from './mediawiki';\nimport createRESTBaseGateway from './rest';\nimport * as formatters from './restFormatters';\nimport { abortablePromise } from './index.js';\n\n/**\n * @param {Object} options\n * @return {Promise}\n */\nfunction ajax( options ) {\n\tconst controller = new AbortController();\n\tconst signal = controller.signal;\n\n\treturn abortablePromise(\n\t\tfetch( options.url, {\n\t\t\theaders: options.headers,\n\t\t\tsignal\n\t\t} ).then( ( resp ) => resp.json() ),\n\t\t() => {\n\t\t\tcontroller.abort();\n\t\t}\n\t);\n}\n\n/**\n * Creates a page preview gateway with sensible values for the dependencies.\n *\n * @param {mw.Map} config\n * @return {Gateway}\n */\nexport default function createPagePreviewGateway( config ) {\n\tconst gatewayConfig = Object.assign( {}, constants, {\n\t\tacceptLanguage: config.get( 'wgPageContentLanguage' )\n\t} );\n\tconst restConfig = Object.assign( {}, gatewayConfig, {\n\t\tendpoint: config.get( 'wgPopupsRestGatewayEndpoint' )\n\t} );\n\tswitch ( config.get( 'wgPopupsGateway' ) ) {\n\t\tcase 'mwApiPlain':\n\t\t\treturn createMediaWikiApiGateway( new mw.Api(), gatewayConfig );\n\t\tcase 'restbasePlain':\n\t\t\treturn createRESTBaseGateway(\n\t\t\t\tajax, restConfig, formatters.parsePlainTextResponse );\n\t\tcase 'restbaseHTML':\n\t\t\treturn createRESTBaseGateway(\n\t\t\t\tajax, restConfig, formatters.parseHTMLResponse );\n\t\tdefault:\n\t\t\tthrow new Error( 'Unknown gateway' );\n\t}\n}\n","import { previewTypes } from './preview/model';\n\n/**\n * @module userSettings\n */\n\nconst PAGE_PREVIEWS_ENABLED_KEY = 'mwe-popups-enabled',\n\tREFERENCE_PREVIEWS_ENABLED_KEY = 'mwe-popups-referencePreviews-enabled',\n\tPAGE_PREVIEWS_CHANGE_SETTING_EVENT = 'Popups.SettingChange';\n\n/**\n * Creates an object whose methods encapsulate all interactions with the UA's\n * storage.\n *\n * @param {mw.storage} storage The `mw.storage` singleton instance\n *\n * @return {UserSettings}\n */\nexport default function createUserSettings( storage ) {\n\treturn {\n\t\tmigrateOldPreferences() {\n\t\t\tconst isDisabled = !!storage.get( PAGE_PREVIEWS_ENABLED_KEY );\n\t\t\tif ( isDisabled ) {\n\t\t\t\tstorage.remove( PAGE_PREVIEWS_ENABLED_KEY );\n\t\t\t\tthis.storePreviewTypeEnabled( previewTypes.TYPE_PAGE, false );\n\t\t\t}\n\t\t\tconst TYPE_REFERENCE = 'reference';\n\t\t\tconst isRefsDisabled = !!storage.get( REFERENCE_PREVIEWS_ENABLED_KEY );\n\t\t\tif ( isRefsDisabled ) {\n\t\t\t\tstorage.remove( REFERENCE_PREVIEWS_ENABLED_KEY );\n\t\t\t\tthis.storePreviewTypeEnabled( TYPE_REFERENCE, false );\n\t\t\t}\n\t\t},\n\t\t/**\n\t\t * Check whether the preview type is enabled.\n\t\t *\n\t\t * @method\n\t\t * @param {string} previewType\n\t\t *\n\t\t * @return {boolean}\n\t\t */\n\t\tisPreviewTypeEnabled( previewType ) {\n\t\t\tconst storageKey = `mwe-popups-${ previewType }-enabled`;\n\t\t\tconst value = storage.get( storageKey );\n\t\t\treturn value === null;\n\t\t},\n\n\t\t/**\n\t\t * Permanently persists (typically in localStorage) whether the user has enabled\n\t\t * the preview type.\n\t\t *\n\t\t * @method\n\t\t * @name UserSettings#storePreviewTypeEnabled\n\t\t * @param {string} previewType\n\t\t * @param {boolean} enabled\n\t\t */\n\t\tstorePreviewTypeEnabled( previewType, enabled ) {\n\t\t\tconst storageKey = `mwe-popups-${ previewType }-enabled`;\n\t\t\tif ( enabled ) {\n\t\t\t\tstorage.remove( storageKey );\n\t\t\t} else {\n\t\t\t\tstorage.set( storageKey, '0' );\n\t\t\t}\n\t\t\t/**\n\t\t\t * @stable for use in MediaWiki extensions.\n\t\t\t */\n\t\t\tmw.track( PAGE_PREVIEWS_CHANGE_SETTING_EVENT, {\n\t\t\t\tpreviewType,\n\t\t\t\taction: enabled ? 'anonymousEnabled' : 'anonymousDisabled'\n\t\t\t} );\n\t\t}\n\t};\n}\n","/**\n * @module previewBehaviour\n */\nconst canSaveToUserPreferences = require( './canSaveToUserPreferences.js' );\n\n/**\n * A collection of event handlers specific to how the user interacts with all\n * previews. The event handlers are are agnostic to how/when they are bound\n * //but not to what they are bound//, i.e. the showSettings event handler is\n * written to be bound to either an `` or `