Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 1... Línea -...
1
{"version":3,"file":"loader.min.js","sources":["../src/loader.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/ //\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Mathjax JS Loader.\n *\n * @module filter_mathjaxloader/loader\n * @copyright 2014 Damyon Wiese  <damyon@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {\n    eventTypes,\n    notifyFilterContentRenderingComplete,\n} from 'core_filters/events';\n\n/**\n * The users current language - this can't be set until MathJax is loaded - so we need to store it.\n * @property {string} lang\n * @default ''\n * @private\n */\nlet lang = '';\n\n/**\n * Used to prevent configuring MathJax twice.\n * @property {boolean} configured\n * @default false\n * @private\n */\nlet configured = false;\n\n/**\n * Called by the filter when it is active on any page.\n * This does not load MathJAX yet - it addes the configuration to the head incase it gets loaded later.\n * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.\n *\n * @param {Object} params List of configuration params containing mathjaxconfig (text) and lang\n */\nexport const configure = (params) => {\n    // Add a js configuration object to the head.\n    // See \"https://docs.mathjax.org/en/v2.7-latest/advanced/dynamic.html\"\n    const script = document.createElement(\"script\");\n    script.type = \"text/x-mathjax-config\";\n    script[(window.opera ? \"innerHTML\" : \"text\")] = params.mathjaxconfig;\n    document.getElementsByTagName(\"head\")[0].appendChild(script);\n\n    // Save the lang config until MathJax is actually loaded.\n    lang = params.lang;\n\n    // Listen for events triggered when new text is added to a page that needs\n    // processing by a filter.\n    document.addEventListener(eventTypes.filterContentUpdated, contentUpdated);\n};\n\n/**\n * Set the correct language for the MathJax menus. Only do this once.\n *\n * @private\n */\nconst setLocale = () => {\n    if (!configured) {\n        if (typeof window.MathJax !== \"undefined\") {\n            window.MathJax.Hub.Queue(function() {\n                window.MathJax.Localization.setLocale(lang);\n            });\n            window.MathJax.Hub.Configured();\n            configured = true;\n        }\n    }\n};\n\n/**\n * Add the node to the typeset queue.\n *\n * @param {HTMLElement} node The Node to be processed by MathJax\n * @private\n */\nconst typesetNode = (node) => {\n    if (!(node instanceof HTMLElement)) {\n        // We may have been passed a #text node.\n        // These cannot be formatted.\n        return;\n    }\n\n    // MathJax 2.X does not notify when complete. The best we can do, according to their docs, is to queue a callback.\n    // See https://docs.mathjax.org/en/v2.7-latest/advanced/typeset.html\n    // Note that the MathJax.Hub.Queue() method will return immediately, regardless of whether the typesetting has taken place\n    // or not, so you can not assume that the mathematics is visible after you make this call.\n    // That means that things like the size of the container for the mathematics may not yet reflect the size of the\n    // typeset mathematics. If you need to perform actions that depend on the mathematics being typeset, you should push those\n    // actions onto the MathJax.Hub.queue as well.\n    window.MathJax.Hub.Queue([\"Typeset\", window.MathJax.Hub, node]);\n    window.MathJax.Hub.Queue([(node) => {\n        // The notifyFilterContentRenderingComplete event takes an Array of NodeElements or a NodeList.\n        // We cannot create a NodeList so we use an HTMLElement[].\n        notifyFilterContentRenderingComplete([node]);\n    }, node]);\n};\n\n/**\n * Called by the filter when an equation is found while rendering the page.\n */\nexport const typeset = () => {\n    if (!configured) {\n        setLocale();\n        const elements = document.getElementsByClassName('filter_mathjaxloader_equation');\n        for (const element of elements) {\n            if (typeof window.MathJax !== \"undefined\") {\n                typesetNode(element);\n            }\n        }\n    }\n};\n\n/**\n * Handle content updated events - typeset the new content.\n *\n * @param {CustomEvent} event - Custom event with \"nodes\" indicating the root of the updated nodes.\n */\nexport const contentUpdated = (event) => {\n    if (typeof window.MathJax === \"undefined\") {\n        return;\n    }\n\n    let listOfElementContainMathJax = [];\n    let hasMathJax = false;\n    // The list of HTMLElements in an Array.\n    event.detail.nodes.forEach((node) => {\n        if (!(node instanceof HTMLElement)) {\n            // We may have been passed a #text node.\n            return;\n        }\n        const mathjaxElements = node.querySelectorAll('.filter_mathjaxloader_equation');\n        if (mathjaxElements.length > 0) {\n            hasMathJax = true;\n        }\n        listOfElementContainMathJax.push(mathjaxElements);\n    });\n    if (!hasMathJax) {\n        return;\n    }\n    const processDelay = window.MathJax.Hub.processSectionDelay;\n    // Set the process section delay to 0 when updating the formula.\n    window.MathJax.Hub.processSectionDelay = 0;\n    // When content is updated never position to hash, it may cause unexpected document scrolling.\n    window.MathJax.Hub.Config({positionToHash: false});\n    setLocale();\n    listOfElementContainMathJax.forEach((mathjaxElements) => {\n        mathjaxElements.forEach((node) => typesetNode(node));\n    });\n    window.MathJax.Hub.processSectionDelay = processDelay;\n};\n"],"names":["lang","configured","params","script","document","createElement","type","window","opera","mathjaxconfig","getElementsByTagName","appendChild","addEventListener","eventTypes","filterContentUpdated","contentUpdated","setLocale","MathJax","Hub","Queue","Localization","Configured","typesetNode","node","HTMLElement","elements","getElementsByClassName","element","event","listOfElementContainMathJax","hasMathJax","detail","nodes","forEach","mathjaxElements","querySelectorAll","length","push","processDelay","processSectionDelay","Config","positionToHash"],"mappings":";;;;;;;;IAgCIA,KAAO,GAQPC,YAAa,qBASSC,eAGhBC,OAASC,SAASC,cAAc,UACtCF,OAAOG,KAAO,wBACdH,OAAQI,OAAOC,MAAQ,YAAc,QAAWN,OAAOO,cACvDL,SAASM,qBAAqB,QAAQ,GAAGC,YAAYR,QAGrDH,KAAOE,OAAOF,KAIdI,SAASQ,iBAAiBC,mBAAWC,qBAAsBC,uBAQzDC,UAAY,KACTf,iBAC6B,IAAnBM,OAAOU,UACdV,OAAOU,QAAQC,IAAIC,OAAM,WACrBZ,OAAOU,QAAQG,aAAaJ,UAAUhB,SAE1CO,OAAOU,QAAQC,IAAIG,aACnBpB,YAAa,IAWnBqB,YAAeC,OACXA,gBAAgBC,cAatBjB,OAAOU,QAAQC,IAAIC,MAAM,CAAC,UAAWZ,OAAOU,QAAQC,IAAKK,OACzDhB,OAAOU,QAAQC,IAAIC,MAAM,CAAEI,wDAGc,CAACA,QACvCA,0BAMgB,SACdtB,WAAY,CACbe,kBACMS,SAAWrB,SAASsB,uBAAuB,qCAC5C,MAAMC,WAAWF,cACY,IAAnBlB,OAAOU,SACdK,YAAYK,iBAWfZ,eAAkBa,gBACG,IAAnBrB,OAAOU,mBAIdY,4BAA8B,GAC9BC,YAAa,KAEjBF,MAAMG,OAAOC,MAAMC,SAASV,YAClBA,gBAAgBC,0BAIhBU,gBAAkBX,KAAKY,iBAAiB,kCAC1CD,gBAAgBE,OAAS,IACzBN,YAAa,GAEjBD,4BAA4BQ,KAAKH,qBAEhCJ,wBAGCQ,aAAe/B,OAAOU,QAAQC,IAAIqB,oBAExChC,OAAOU,QAAQC,IAAIqB,oBAAsB,EAEzChC,OAAOU,QAAQC,IAAIsB,OAAO,CAACC,gBAAgB,IAC3CzB,YACAa,4BAA4BI,SAASC,kBACjCA,gBAAgBD,SAASV,MAASD,YAAYC,WAElDhB,OAAOU,QAAQC,IAAIqB,oBAAsBD"}
-
 
2
1
{"version":3,"file":"loader.min.js","sources":["../src/loader.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/ //\n// Moodle is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// Moodle is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.\n\n/**\n * Mathjax JS Loader.\n *\n * @module filter_mathjaxloader/loader\n * @copyright 2014 Damyon Wiese  <damyon@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n */\nimport {\n    eventTypes,\n    notifyFilterContentRenderingComplete,\n} from 'core_filters/events';\n\n/**\n * URL to MathJax.\n * @type {string|null}\n */\nlet mathJaxUrl = null;\n\n/**\n * Promise that is resolved when MathJax was loaded.\n * @type {Promise|null}\n */\nlet mathJaxLoaded = null;\n\n/**\n * Called by the filter when it is active on any page.\n * This does not load MathJAX yet - it adds the configuration in case it gets loaded later.\n * It also subscribes to the filter-content-updated event so MathJax can respond to content loaded by Ajax.\n *\n * @param {Object} params List of configuration params containing mathjaxurl, mathjaxconfig (text) and lang\n */\nexport const configure = (params) => {\n    let config = {};\n    try {\n        if (params.mathjaxconfig !== '') {\n            config = JSON.parse(params.mathjaxconfig);\n        }\n    }\n    catch (e) {\n        window.console.error('Invalid JSON in mathjaxconfig.', e);\n    }\n    if (typeof config != 'object') {\n        config = {};\n    }\n    if (typeof config.loader !== 'object') {\n        config.loader = {};\n    }\n    if (!Array.isArray(config.loader.load)) {\n        config.loader.load = [];\n    }\n    if (typeof config.startup !== 'object') {\n        config.startup = {};\n    }\n\n    // Always ensure that ui/safe is in the list. Otherwise, there is a risk of XSS.\n    // https://docs.mathjax.org/en/v3.2-latest/options/safe.html.\n    if (!config.loader.load.includes('ui/safe')) {\n        config.loader.load.push('ui/safe');\n    }\n\n    // This filter controls what elements to typeset.\n    config.startup.typeset = false;\n\n    // Let's still set the locale even if the localization is not yet ported to version 3.2.2\n    // https://docs.mathjax.org/en/v3.2-latest/upgrading/v2.html#not-yet-ported-to-version-3.\n    config.locale = params.lang;\n\n    mathJaxUrl = params.mathjaxurl;\n    window.MathJax = config;\n\n    // Listen for events triggered when new text is added to a page that needs\n    // processing by a filter.\n    document.addEventListener(eventTypes.filterContentUpdated, contentUpdated);\n};\n\n/**\n * Add the node to the typeset queue.\n *\n * @param {HTMLElement} node The Node to be processed by MathJax\n * @private\n */\nconst typesetNode = (node) => {\n    if (!(node instanceof HTMLElement)) {\n        // We may have been passed a #text node.\n        // These cannot be formatted.\n        return;\n    }\n\n    loadMathJax().then(() => {\n        // Chain the calls to typesetPromise as it is recommended.\n        // https://docs.mathjax.org/en/v3.2-latest/web/typeset.html#handling-asynchronous-typesetting.\n        window.MathJax.startup.promise = window.MathJax.startup.promise\n            .then(() => window.MathJax.typesetPromise([node]))\n            .then(() => {\n                notifyFilterContentRenderingComplete([node]);\n            })\n            .catch(e => {\n                window.console.log(e);\n            });\n    });\n};\n\n/**\n * Called by the filter when an equation is found while rendering the page.\n */\nexport const typeset = () => {\n    const elements = document.getElementsByClassName('filter_mathjaxloader_equation');\n    for (const element of elements) {\n        typesetNode(element);\n    }\n};\n\n/**\n * Handle content updated events - typeset the new content.\n *\n * @param {CustomEvent} event - Custom event with \"nodes\" indicating the root of the updated nodes.\n */\nexport const contentUpdated = (event) => {\n    let listOfElementContainMathJax = [];\n    let hasMathJax = false;\n    // The list of HTMLElements in an Array.\n    event.detail.nodes.forEach((node) => {\n        if (!(node instanceof HTMLElement)) {\n            // We may have been passed a #text node.\n            return;\n        }\n        const mathjaxElements = node.querySelectorAll('.filter_mathjaxloader_equation');\n        if (mathjaxElements.length > 0) {\n            hasMathJax = true;\n        }\n        listOfElementContainMathJax.push(mathjaxElements);\n    });\n\n    if (!hasMathJax) {\n        return;\n    }\n\n    listOfElementContainMathJax.forEach((mathjaxElements) => {\n        mathjaxElements.forEach((node) => typesetNode(node));\n    });\n};\n\n/**\n * Load the MathJax script.\n *\n * @return Promise that is resolved when MathJax was loaded.\n */\nexport const loadMathJax = () => {\n    if (!mathJaxLoaded) {\n        if (!mathJaxUrl) {\n            return Promise.reject(new Error('URL to MathJax not set.'));\n        }\n\n        mathJaxLoaded = new Promise((resolve, reject) => {\n            const script = document.createElement('script');\n            script.type = 'text/javascript';\n            script.onload = resolve;\n            script.onerror = reject;\n            script.src = mathJaxUrl;\n            document.getElementsByTagName('head')[0].appendChild(script);\n        });\n    }\n    return mathJaxLoaded;\n};\n"],"names":["mathJaxUrl","mathJaxLoaded","params","config","mathjaxconfig","JSON","parse","e","window","console","error","loader","Array","isArray","load","startup","includes","push","typeset","locale","lang","mathjaxurl","MathJax","document","addEventListener","eventTypes","filterContentUpdated","contentUpdated","typesetNode","node","HTMLElement","loadMathJax","then","promise","typesetPromise","catch","log","elements","getElementsByClassName","element","event","listOfElementContainMathJax","hasMathJax","detail","nodes","forEach","mathjaxElements","querySelectorAll","length","Promise","reject","Error","resolve","script","createElement","type","onload","onerror","src","getElementsByTagName","appendChild"],"mappings":";;;;;;;;IA8BIA,WAAa,KAMbC,cAAgB,wBASMC,aAClBC,OAAS,OAEoB,KAAzBD,OAAOE,gBACPD,OAASE,KAAKC,MAAMJ,OAAOE,gBAGnC,MAAOG,GACHC,OAAOC,QAAQC,MAAM,iCAAkCH,GAEtC,iBAAVJ,SACPA,OAAS,IAEgB,iBAAlBA,OAAOQ,SACdR,OAAOQ,OAAS,IAEfC,MAAMC,QAAQV,OAAOQ,OAAOG,QAC7BX,OAAOQ,OAAOG,KAAO,IAEK,iBAAnBX,OAAOY,UACdZ,OAAOY,QAAU,IAKhBZ,OAAOQ,OAAOG,KAAKE,SAAS,YAC7Bb,OAAOQ,OAAOG,KAAKG,KAAK,WAI5Bd,OAAOY,QAAQG,SAAU,EAIzBf,OAAOgB,OAASjB,OAAOkB,KAEvBpB,WAAaE,OAAOmB,WACpBb,OAAOc,QAAUnB,OAIjBoB,SAASC,iBAAiBC,mBAAWC,qBAAsBC,uBASzDC,YAAeC,OACXA,gBAAgBC,aAMtBC,cAAcC,MAAK,KAGfxB,OAAOc,QAAQP,QAAQkB,QAAUzB,OAAOc,QAAQP,QAAQkB,QACnDD,MAAK,IAAMxB,OAAOc,QAAQY,eAAe,CAACL,SAC1CG,MAAK,sDACmC,CAACH,UAEzCM,OAAM5B,IACHC,OAAOC,QAAQ2B,IAAI7B,2BAQZ,WACb8B,SAAWd,SAASe,uBAAuB,qCAC5C,MAAMC,WAAWF,SAClBT,YAAYW,gBASPZ,eAAkBa,YACvBC,4BAA8B,GAC9BC,YAAa,EAEjBF,MAAMG,OAAOC,MAAMC,SAAShB,YAClBA,gBAAgBC,0BAIhBgB,gBAAkBjB,KAAKkB,iBAAiB,kCAC1CD,gBAAgBE,OAAS,IACzBN,YAAa,GAEjBD,4BAA4BxB,KAAK6B,oBAGhCJ,YAILD,4BAA4BI,SAASC,kBACjCA,gBAAgBD,SAAShB,MAASD,YAAYC,yDASzCE,YAAc,SAClB9B,cAAe,KACXD,kBACMiD,QAAQC,OAAO,IAAIC,MAAM,4BAGpClD,cAAgB,IAAIgD,SAAQ,CAACG,QAASF,gBAC5BG,OAAS9B,SAAS+B,cAAc,UACtCD,OAAOE,KAAO,kBACdF,OAAOG,OAASJ,QAChBC,OAAOI,QAAUP,OACjBG,OAAOK,IAAM1D,WACbuB,SAASoC,qBAAqB,QAAQ,GAAGC,YAAYP,kBAGtDpD"}
-
 
2
3
3