Linux aries.aptans.com 4.18.0-348.20.1.lve.1.el8.x86_64 #1 SMP Wed Mar 16 08:45:39 EDT 2022 x86_64
Apache
: 135.181.142.107 | : 172.70.130.44
Cant Read [ /etc/named.conf ]
7.4.33
aja
www.github.com/MadExploits
Terminal
AUTO ROOT
Adminer
Backdoor Destroyer
Linux Exploit
Lock Shell
Lock File
Create User
CREATE RDP
PHP Mailer
BACKCONNECT
UNLOCK SHELL
HASH IDENTIFIER
CPANEL RESET
CREATE WP USER
README
+ Create Folder
+ Create File
/
home /
aja /
public_html /
ead /
lib /
amd /
build /
[ HOME SHELL ]
Name
Size
Permission
Action
emoji
[ DIR ]
drwxr-xr-x
local
[ DIR ]
drwxr-xr-x
adapter.min.js
119.54
KB
-rw-r--r--
adapter.min.js.map
288.7
KB
-rw-r--r--
addblockmodal.min.js
1.05
KB
-rw-r--r--
addblockmodal.min.js.map
3.5
KB
-rw-r--r--
ajax.min.js
3.14
KB
-rw-r--r--
ajax.min.js.map
15.12
KB
-rw-r--r--
aria.min.js
607
B
-rw-r--r--
aria.min.js.map
92
B
-rw-r--r--
auto_rows.min.js
1.23
KB
-rw-r--r--
auto_rows.min.js.map
4.64
KB
-rw-r--r--
autoscroll.min.js
2.38
KB
-rw-r--r--
autoscroll.min.js.map
8.51
KB
-rw-r--r--
backoff_timer.min.js
1.47
KB
-rw-r--r--
backoff_timer.min.js.map
6.21
KB
-rw-r--r--
chart_axis.min.js
2
KB
-rw-r--r--
chart_axis.min.js.map
9.56
KB
-rw-r--r--
chart_bar.min.js
1.12
KB
-rw-r--r--
chart_bar.min.js.map
4.28
KB
-rw-r--r--
chart_base.min.js
4.25
KB
-rw-r--r--
chart_base.min.js.map
15.29
KB
-rw-r--r--
chart_builder.min.js
465
B
-rw-r--r--
chart_builder.min.js.map
2.13
KB
-rw-r--r--
chart_line.min.js
733
B
-rw-r--r--
chart_line.min.js.map
2.81
KB
-rw-r--r--
chart_output.min.js
332
B
-rw-r--r--
chart_output.min.js.map
1.3
KB
-rw-r--r--
chart_output_base.min.js
494
B
-rw-r--r--
chart_output_base.min.js.map
2.43
KB
-rw-r--r--
chart_output_chartjs.min.js
5.01
KB
-rw-r--r--
chart_output_chartjs.min.js.ma...
16.25
KB
-rw-r--r--
chart_output_htmltable.min.js
1.45
KB
-rw-r--r--
chart_output_htmltable.min.js....
4.84
KB
-rw-r--r--
chart_pie.min.js
1.21
KB
-rw-r--r--
chart_pie.min.js.map
4.3
KB
-rw-r--r--
chart_series.min.js
3.2
KB
-rw-r--r--
chart_series.min.js.map
11.35
KB
-rw-r--r--
chartjs-lazy.min.js
295.92
KB
-rw-r--r--
chartjs-lazy.min.js.map
989.07
KB
-rw-r--r--
chartjs.min.js
277
B
-rw-r--r--
chartjs.min.js.map
1.09
KB
-rw-r--r--
checkbox-toggleall.min.js
4.68
KB
-rw-r--r--
checkbox-toggleall.min.js.map
16.67
KB
-rw-r--r--
config.min.js
308
B
-rw-r--r--
config.min.js.map
1.17
KB
-rw-r--r--
custom_interaction_events.min....
6.95
KB
-rw-r--r--
custom_interaction_events.min....
28.74
KB
-rw-r--r--
dragdrop.min.js
4.15
KB
-rw-r--r--
dragdrop.min.js.map
16.81
KB
-rw-r--r--
drawer.min.js
3.07
KB
-rw-r--r--
drawer.min.js.map
4.83
KB
-rw-r--r--
drawer_events.min.js
291
B
-rw-r--r--
drawer_events.min.js.map
1.15
KB
-rw-r--r--
event.min.js
1.39
KB
-rw-r--r--
event.min.js.map
5.42
KB
-rw-r--r--
first.min.js
722
B
-rw-r--r--
first.min.js.map
1.71
KB
-rw-r--r--
form-autocomplete.min.js
19.33
KB
-rw-r--r--
form-autocomplete.min.js.map
67.31
KB
-rw-r--r--
form-cohort-selector.min.js
1.03
KB
-rw-r--r--
form-cohort-selector.min.js.ma...
3.61
KB
-rw-r--r--
form-course-selector.min.js
1.73
KB
-rw-r--r--
form-course-selector.min.js.ma...
5.6
KB
-rw-r--r--
fragment.min.js
1.55
KB
-rw-r--r--
fragment.min.js.map
6.04
KB
-rw-r--r--
fullscreen.min.js
524
B
-rw-r--r--
fullscreen.min.js.map
2.05
KB
-rw-r--r--
icon_system.min.js
603
B
-rw-r--r--
icon_system.min.js.map
3.1
KB
-rw-r--r--
icon_system_fontawesome.min.js
1.81
KB
-rw-r--r--
icon_system_fontawesome.min.js...
5.88
KB
-rw-r--r--
icon_system_standard.min.js
944
B
-rw-r--r--
icon_system_standard.min.js.ma...
3.23
KB
-rw-r--r--
inplace_editable.min.js
6.75
KB
-rw-r--r--
inplace_editable.min.js.map
19.32
KB
-rw-r--r--
key_codes.min.js
487
B
-rw-r--r--
key_codes.min.js.map
1.62
KB
-rw-r--r--
loadingicon.min.js
1.29
KB
-rw-r--r--
loadingicon.min.js.map
4.9
KB
-rw-r--r--
localstorage.min.js
590
B
-rw-r--r--
localstorage.min.js.map
2.52
KB
-rw-r--r--
log.min.js
773
B
-rw-r--r--
log.min.js.map
2.29
KB
-rw-r--r--
loglevel.min.js
4.7
KB
-rw-r--r--
loglevel.min.js.map
13.69
KB
-rw-r--r--
modal.min.js
11.49
KB
-rw-r--r--
modal.min.js.map
39.01
KB
-rw-r--r--
modal_backdrop.min.js
1.83
KB
-rw-r--r--
modal_backdrop.min.js.map
6.09
KB
-rw-r--r--
modal_cancel.min.js
3.76
KB
-rw-r--r--
modal_cancel.min.js.map
1.83
KB
-rw-r--r--
modal_events.min.js
535
B
-rw-r--r--
modal_events.min.js.map
1.62
KB
-rw-r--r--
modal_factory.min.js
4.74
KB
-rw-r--r--
modal_factory.min.js.map
11.92
KB
-rw-r--r--
modal_registry.min.js
875
B
-rw-r--r--
modal_registry.min.js.map
3.05
KB
-rw-r--r--
modal_save_cancel.min.js
4.12
KB
-rw-r--r--
modal_save_cancel.min.js.map
2.78
KB
-rw-r--r--
mustache.min.js
11.31
KB
-rw-r--r--
mustache.min.js.map
37.6
KB
-rw-r--r--
network.min.js
3.09
KB
-rw-r--r--
network.min.js.map
10.77
KB
-rw-r--r--
normalise.min.js
684
B
-rw-r--r--
normalise.min.js.map
1.97
KB
-rw-r--r--
notification.min.js
13.07
KB
-rw-r--r--
notification.min.js.map
12.85
KB
-rw-r--r--
page_global.min.js
1.66
KB
-rw-r--r--
page_global.min.js.map
6.81
KB
-rw-r--r--
paged_content.min.js
1.21
KB
-rw-r--r--
paged_content.min.js.map
3.81
KB
-rw-r--r--
paged_content_events.min.js
544
B
-rw-r--r--
paged_content_events.min.js.ma...
1.5
KB
-rw-r--r--
paged_content_factory.min.js
5.5
KB
-rw-r--r--
paged_content_factory.min.js.m...
26.16
KB
-rw-r--r--
paged_content_pages.min.js
3.47
KB
-rw-r--r--
paged_content_pages.min.js.map
15.14
KB
-rw-r--r--
paged_content_paging_bar.min.j...
8.3
KB
-rw-r--r--
paged_content_paging_bar.min.j...
27.47
KB
-rw-r--r--
paged_content_paging_bar_limit...
1.04
KB
-rw-r--r--
paged_content_paging_bar_limit...
3.28
KB
-rw-r--r--
paged_content_paging_dropdown....
2.5
KB
-rw-r--r--
paged_content_paging_dropdown....
9.79
KB
-rw-r--r--
pending.min.js
594
B
-rw-r--r--
pending.min.js.map
2.07
KB
-rw-r--r--
permissionmanager.min.js
4.72
KB
-rw-r--r--
permissionmanager.min.js.map
14.11
KB
-rw-r--r--
popover_region_controller.min....
5.97
KB
-rw-r--r--
popover_region_controller.min....
17.26
KB
-rw-r--r--
popper.min.js
32.51
KB
-rw-r--r--
popper.min.js.map
108.7
KB
-rw-r--r--
prefetch.min.js
4.92
KB
-rw-r--r--
prefetch.min.js.map
7.69
KB
-rw-r--r--
pubsub.min.js
1.04
KB
-rw-r--r--
pubsub.min.js.map
2.81
KB
-rw-r--r--
sessionstorage.min.js
724
B
-rw-r--r--
sessionstorage.min.js.map
2.67
KB
-rw-r--r--
showhidesettings.min.js
3.88
KB
-rw-r--r--
showhidesettings.min.js.map
15.57
KB
-rw-r--r--
sortable_list.min.js
14.2
KB
-rw-r--r--
sortable_list.min.js.map
41.31
KB
-rw-r--r--
storagewrapper.min.js
1.71
KB
-rw-r--r--
storagewrapper.min.js.map
6.75
KB
-rw-r--r--
str.min.js
4.05
KB
-rw-r--r--
str.min.js.map
10.31
KB
-rw-r--r--
tag.min.js
9.37
KB
-rw-r--r--
tag.min.js.map
28.03
KB
-rw-r--r--
templates.min.js
14.98
KB
-rw-r--r--
templates.min.js.map
63.95
KB
-rw-r--r--
toast.min.js
4.51
KB
-rw-r--r--
toast.min.js.map
4.05
KB
-rw-r--r--
tooltip.min.js
1.9
KB
-rw-r--r--
tooltip.min.js.map
6.09
KB
-rw-r--r--
tree.min.js
7
KB
-rw-r--r--
tree.min.js.map
24.27
KB
-rw-r--r--
truncate.min.js
2.65
KB
-rw-r--r--
truncate.min.js.map
9.42
KB
-rw-r--r--
url.min.js
1.27
KB
-rw-r--r--
url.min.js.map
4.9
KB
-rw-r--r--
user_date.min.js
2.2
KB
-rw-r--r--
user_date.min.js.map
11.94
KB
-rw-r--r--
userfeedback.min.js
1.79
KB
-rw-r--r--
userfeedback.min.js.map
4.19
KB
-rw-r--r--
utils.min.js
843
B
-rw-r--r--
utils.min.js.map
3.35
KB
-rw-r--r--
yui.min.js
405
B
-rw-r--r--
yui.min.js.map
1.3
KB
-rw-r--r--
Delete
Unzip
Zip
${this.title}
Close
Code Editor : templates.min.js.map
{"version":3,"file":"templates.min.js","sources":["../src/templates.js"],"sourcesContent":["// This file is part of Moodle - http://moodle.org/\n//\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 * Template renderer for Moodle. Load and render Moodle templates with Mustache.\n *\n * @module core/templates\n * @copyright 2015 Damyon Wiese <damyon@moodle.com>\n * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later\n * @since 2.9\n */\ndefine([\n 'core/mustache',\n 'jquery',\n 'core/ajax',\n 'core/str',\n 'core/notification',\n 'core/url',\n 'core/config',\n 'core/localstorage',\n 'core/icon_system',\n 'core/event',\n 'core/yui',\n 'core/log',\n 'core/truncate',\n 'core/user_date',\n 'core/pending',\n ],\n function(mustache, $, ajax, str, notification, coreurl, config, storage, IconSystem, event, Y, Log, Truncate, UserDate,\n Pending) {\n\n // Module variables.\n /** @var {Number} uniqInstances Count of times this constructor has been called. */\n var uniqInstances = 0;\n\n /** @var {String[]} templateCache - Cache of already loaded template strings */\n var templateCache = {};\n\n /** @var {Promise[]} templatePromises - Cache of already loaded template promises */\n var templatePromises = {};\n\n /** @var {Promise[]} cachePartialPromises - Cache of already loaded template partial promises */\n var cachePartialPromises = {};\n\n /** @var {Object} iconSystem - Object extending core/iconsystem */\n var iconSystem = {};\n\n /** @var {Object[]} loadTemplateBuffer - List of templates to be loaded */\n var loadTemplateBuffer = [];\n\n /** @var {Bool} isLoadingTemplates - Whether templates are currently being loaded */\n var isLoadingTemplates = false;\n\n /** @var {Array} disallowedNestedHelpers - List of helpers that can't be called within other helpers */\n var disallowedNestedHelpers = ['js'];\n\n /**\n * Normalise the provided component such that '', 'moodle', and 'core' are treated consistently.\n *\n * @param {String} component\n * @returns {String}\n */\n var getNormalisedComponent = function(component) {\n if (component) {\n if (component !== 'moodle' && component !== 'core') {\n return component;\n }\n }\n\n return 'core';\n };\n\n /**\n * Search the various caches for a template promise for the given search key.\n * The search key should be in the format <theme>/<component>/<template> e.g. boost/core/modal.\n *\n * If the template is found in any of the caches it will populate the other caches with\n * the same data as well.\n *\n * @param {String} searchKey The template search key in the format <theme>/<component>/<template> e.g. boost/core/modal\n * @return {Object} jQuery promise resolved with the template source\n */\n var getTemplatePromiseFromCache = function(searchKey) {\n // First try the cache of promises.\n if (searchKey in templatePromises) {\n return templatePromises[searchKey];\n }\n\n // Check the module cache.\n if (searchKey in templateCache) {\n // Add this to the promises cache for future.\n templatePromises[searchKey] = $.Deferred().resolve(templateCache[searchKey]).promise();\n return templatePromises[searchKey];\n }\n\n if (M.cfg.templaterev <= 0) {\n // Template caching is disabled. Do not store in persistent storage.\n return null;\n }\n\n // Now try local storage.\n var cached = storage.get('core_template/' + M.cfg.templaterev + ':' + searchKey);\n if (cached) {\n // Add this to the module cache for future.\n templateCache[searchKey] = cached;\n // Add this to the promises cache for future.\n templatePromises[searchKey] = $.Deferred().resolve(cached).promise();\n return templatePromises[searchKey];\n }\n\n return null;\n };\n\n /**\n * Take all of the templates waiting in the buffer and load them from the server\n * or from the cache.\n *\n * All of the templates that need to be loaded from the server will be batched up\n * and sent in a single network request.\n */\n var processLoadTemplateBuffer = function() {\n if (!loadTemplateBuffer.length) {\n return;\n }\n\n if (isLoadingTemplates) {\n return;\n }\n\n isLoadingTemplates = true;\n // Grab any templates waiting in the buffer.\n var templatesToLoad = loadTemplateBuffer.slice();\n // This will be resolved with the list of promises for the server request.\n var serverRequestsDeferred = $.Deferred();\n var requests = [];\n // Get a list of promises for each of the templates we need to load.\n var templatePromises = templatesToLoad.map(function(templateData) {\n var component = getNormalisedComponent(templateData.component);\n var name = templateData.name;\n var searchKey = templateData.searchKey;\n var theme = templateData.theme;\n var templateDeferred = templateData.deferred;\n var promise = null;\n\n // Double check to see if this template happened to have landed in the\n // cache as a dependency of an earlier template.\n var cachedPromise = getTemplatePromiseFromCache(searchKey);\n if (cachedPromise) {\n // We've seen this template so immediately resolve the existing promise.\n promise = cachedPromise;\n } else {\n // We haven't seen this template yet so we need to request it from\n // the server.\n requests.push({\n methodname: 'core_output_load_template_with_dependencies',\n args: {\n component: component,\n template: name,\n themename: theme,\n lang: $('html').attr('lang').replace(/-/g, '_')\n }\n });\n // Remember the index in the requests list for this template so that\n // we can get the appropriate promise back.\n var index = requests.length - 1;\n\n // The server deferred will be resolved with a list of all of the promises\n // that were sent in the order that they were added to the requests array.\n promise = serverRequestsDeferred.promise()\n .then(function(promises) {\n // The promise for this template will be the one that matches the index\n // for it's entry in the requests array.\n //\n // Make sure the promise is added to the promises cache for this template\n // search key so that we don't request it again.\n templatePromises[searchKey] = promises[index].then(function(response) {\n var templateSource = null;\n\n // Process all of the template dependencies for this template and add\n // them to the caches so that we don't request them again later.\n response.templates.forEach(function(data) {\n data.component = getNormalisedComponent(data.component);\n // Generate the search key for this template in the response so that we\n // can add it to the caches.\n var tempSearchKey = [theme, data.component, data.name].join('/');\n // Cache all of the dependent templates because we'll need them to render\n // the requested template.\n templateCache[tempSearchKey] = data.value;\n\n if (M.cfg.templaterev > 0) {\n // The template cache is enabled - set the value there.\n storage.set('core_template/' + M.cfg.templaterev + ':' + tempSearchKey, data.value);\n }\n\n if (data.component == component && data.name == name) {\n // This is the original template that was requested so remember it to return.\n templateSource = data.value;\n }\n });\n\n if (response.strings.length) {\n // If we have strings that the template needs then warm the string cache\n // with them now so that we don't need to re-fetch them.\n str.cache_strings(response.strings.map(function(data) {\n return {\n component: getNormalisedComponent(data.component),\n key: data.name,\n value: data.value\n };\n }));\n }\n\n // Return the original template source that the user requested.\n return templateSource;\n });\n\n return templatePromises[searchKey];\n });\n }\n\n return promise\n .then(function(source) {\n // When we've successfully loaded the template then resolve the deferred\n // in the buffer so that all of the calling code can proceed.\n return templateDeferred.resolve(source);\n })\n .catch(function(error) {\n // If there was an error loading the template then reject the deferred\n // in the buffer so that all of the calling code can proceed.\n templateDeferred.reject(error);\n // Rethrow for anyone else listening.\n throw error;\n });\n });\n\n if (requests.length) {\n // We have requests to send so resolve the deferred with the promises.\n serverRequestsDeferred.resolve(ajax.call(requests, true, false, false, 0, M.cfg.templaterev));\n } else {\n // Nothing to load so we can resolve our deferred.\n serverRequestsDeferred.resolve();\n }\n\n // Once we've finished loading all of the templates then recurse to process\n // any templates that may have been added to the buffer in the time that we\n // were fetching.\n $.when.apply(null, templatePromises)\n .then(function() {\n // Remove the templates we've loaded from the buffer.\n loadTemplateBuffer.splice(0, templatesToLoad.length);\n isLoadingTemplates = false;\n processLoadTemplateBuffer();\n return;\n })\n .catch(function() {\n // Remove the templates we've loaded from the buffer.\n loadTemplateBuffer.splice(0, templatesToLoad.length);\n isLoadingTemplates = false;\n processLoadTemplateBuffer();\n });\n };\n\n /**\n * Constructor\n *\n * Each call to templates.render gets it's own instance of this class.\n */\n var Renderer = function() {\n this.requiredStrings = [];\n this.requiredJS = [];\n this.requiredDates = [];\n this.currentThemeName = '';\n };\n // Class variables and functions.\n\n /** @var {string[]} requiredStrings - Collection of strings found during the rendering of one template */\n Renderer.prototype.requiredStrings = null;\n\n /** @var {object[]} requiredDates - Collection of dates found during the rendering of one template */\n Renderer.prototype.requiredDates = [];\n\n /** @var {string[]} requiredJS - Collection of js blocks found during the rendering of one template */\n Renderer.prototype.requiredJS = null;\n\n /** @var {String} themeName for the current render */\n Renderer.prototype.currentThemeName = '';\n\n /**\n * Load a template.\n *\n * @method getTemplate\n * @private\n * @param {string} templateName - should consist of the component and the name of the template like this:\n * core/menu (lib/templates/menu.mustache) or\n * tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)\n * @return {Promise} JQuery promise object resolved when the template has been fetched.\n */\n Renderer.prototype.getTemplate = function(templateName) {\n var currentTheme = this.currentThemeName;\n var searchKey = currentTheme + '/' + templateName;\n\n // If we haven't already seen this template then buffer it.\n var cachedPromise = getTemplatePromiseFromCache(searchKey);\n if (cachedPromise) {\n return cachedPromise;\n }\n\n // Check the buffer to see if this template has already been added.\n var existingBufferRecords = loadTemplateBuffer.filter(function(record) {\n return record.searchKey == searchKey;\n });\n if (existingBufferRecords.length) {\n // This template is already in the buffer so just return the existing\n // promise. No need to add it to the buffer again.\n return existingBufferRecords[0].deferred.promise();\n }\n\n // This is the first time this has been requested so let's add it to the buffer\n // to be loaded.\n var parts = templateName.split('/');\n var component = getNormalisedComponent(parts.shift());\n var name = parts.join('/');\n var deferred = $.Deferred();\n\n // Add this template to the buffer to be loaded.\n loadTemplateBuffer.push({\n component: component,\n name: name,\n theme: currentTheme,\n searchKey: searchKey,\n deferred: deferred\n });\n\n // We know there is at least one thing in the buffer so kick off a processing run.\n processLoadTemplateBuffer();\n return deferred.promise();\n };\n\n /**\n * Prefetch a set of templates without rendering them.\n *\n * @param {Array} templateNames The list of templates to fetch\n * @param {String} currentTheme\n */\n Renderer.prototype.prefetchTemplates = function(templateNames, currentTheme) {\n templateNames.forEach(function(templateName) {\n var searchKey = currentTheme + '/' + templateName;\n\n // If we haven't already seen this template then buffer it.\n if (getTemplatePromiseFromCache(searchKey)) {\n return;\n }\n\n // Check the buffer to see if this template has already been added.\n var existingBufferRecords = loadTemplateBuffer.filter(function(record) {\n return record.searchKey == searchKey;\n });\n\n if (existingBufferRecords.length) {\n // This template is already in the buffer so just return the existing promise.\n // No need to add it to the buffer again.\n return;\n }\n\n // This is the first time this has been requested so let's add it to the buffer to be loaded.\n var parts = templateName.split('/');\n var component = getNormalisedComponent(parts.shift());\n var name = parts.join('/');\n\n // Add this template to the buffer to be loaded.\n loadTemplateBuffer.push({\n component: component,\n name: name,\n theme: currentTheme,\n searchKey: searchKey,\n deferred: $.Deferred(),\n });\n });\n\n processLoadTemplateBuffer();\n };\n\n /**\n * Load a partial from the cache or ajax.\n *\n * @method partialHelper\n * @private\n * @param {string} name The partial name to load.\n * @return {string}\n */\n Renderer.prototype.partialHelper = function(name) {\n\n var searchKey = this.currentThemeName + '/' + name;\n\n if (!(searchKey in templateCache)) {\n notification.exception(new Error('Failed to pre-fetch the template: ' + name));\n }\n\n return templateCache[searchKey];\n };\n\n /**\n * Render a single image icon.\n *\n * @method renderIcon\n * @private\n * @param {string} key The icon key.\n * @param {string} component The component name.\n * @param {string} title The icon title\n * @return {Promise}\n */\n Renderer.prototype.renderIcon = function(key, component, title) {\n // Preload the module to do the icon rendering based on the theme iconsystem.\n var modulename = config.iconsystemmodule;\n component = getNormalisedComponent(component);\n\n // RequireJS does not return a promise.\n var ready = $.Deferred();\n require([modulename], function(System) {\n var system = new System();\n if (!(system instanceof IconSystem)) {\n ready.reject('Invalid icon system specified' + config.iconsystemmodule);\n } else {\n iconSystem = system;\n system.init().then(ready.resolve).catch(notification.exception);\n }\n });\n\n return ready.then(function(iconSystem) {\n return this.getTemplate(iconSystem.getTemplateName());\n }.bind(this)).then(function(template) {\n return iconSystem.renderIcon(\n key,\n component,\n title,\n template\n );\n });\n };\n\n /**\n * Render image icons.\n *\n * @method pixHelper\n * @private\n * @param {object} context The mustache context\n * @param {string} sectionText The text to parse arguments from.\n * @param {function} helper Used to render the alt attribute of the text.\n * @return {string}\n */\n Renderer.prototype.pixHelper = function(context, sectionText, helper) {\n var parts = sectionText.split(',');\n var key = '';\n var component = '';\n var text = '';\n\n if (parts.length > 0) {\n key = helper(parts.shift().trim(), context);\n }\n if (parts.length > 0) {\n component = helper(parts.shift().trim(), context);\n }\n if (parts.length > 0) {\n text = helper(parts.join(',').trim(), context);\n }\n\n var templateName = iconSystem.getTemplateName();\n var searchKey = this.currentThemeName + '/' + templateName;\n var template = templateCache[searchKey];\n\n component = getNormalisedComponent(component);\n\n // The key might have been escaped by the JS Mustache engine which\n // converts forward slashes to HTML entities. Let us undo that here.\n key = key.replace(///gi, '/');\n\n return iconSystem.renderIcon(\n key,\n component,\n text,\n template\n );\n };\n\n /**\n * Render blocks of javascript and save them in an array.\n *\n * @method jsHelper\n * @private\n * @param {object} context The current mustache context.\n * @param {string} sectionText The text to save as a js block.\n * @param {function} helper Used to render the block.\n * @return {string}\n */\n Renderer.prototype.jsHelper = function(context, sectionText, helper) {\n this.requiredJS.push(helper(sectionText, context));\n return '';\n };\n\n /**\n * String helper used to render {{#str}}abd component { a : 'fish'}{{/str}}\n * into a get_string call.\n *\n * @method stringHelper\n * @private\n * @param {object} context The current mustache context.\n * @param {string} sectionText The text to parse the arguments from.\n * @param {function} helper Used to render subsections of the text.\n * @return {string}\n */\n Renderer.prototype.stringHelper = function(context, sectionText, helper) {\n var parts = sectionText.split(',');\n var key = '';\n var component = '';\n var param = '';\n if (parts.length > 0) {\n key = parts.shift().trim();\n }\n if (parts.length > 0) {\n component = parts.shift().trim();\n }\n if (parts.length > 0) {\n param = parts.join(',').trim();\n }\n\n component = getNormalisedComponent(component);\n\n if (param !== '') {\n // Allow variable expansion in the param part only.\n param = helper(param, context);\n }\n // Allow json formatted $a arguments.\n if ((param.indexOf('{') === 0) && (param.indexOf('{{') !== 0)) {\n param = JSON.parse(param);\n }\n\n var index = this.requiredStrings.length;\n this.requiredStrings.push({\n key: key,\n component: component,\n param: param\n });\n\n // The placeholder must not use {{}} as those can be misinterpreted by the engine.\n return '[[_s' + index + ']]';\n };\n\n /**\n * Quote helper used to wrap content in quotes, and escape all quotes present in the content.\n *\n * @method quoteHelper\n * @private\n * @param {object} context The current mustache context.\n * @param {string} sectionText The text to parse the arguments from.\n * @param {function} helper Used to render subsections of the text.\n * @return {string}\n */\n Renderer.prototype.quoteHelper = function(context, sectionText, helper) {\n var content = helper(sectionText.trim(), context);\n\n // Escape the {{ and the \".\n // This involves wrapping {{, and }} in change delimeter tags.\n content = content\n .replace(/\"/g, '\\\\\"')\n .replace(/\\t/g, '	')\n .replace(/([{}]{2,3})/g, '{{=<% %>=}}$1<%={{ }}=%>')\n .replace(/(\\r\\n|\\r|\\n)/g, '
')\n ;\n return '\"' + content + '\"';\n };\n\n /**\n * Shorten text helper to truncate text and append a trailing ellipsis.\n *\n * @method shortenTextHelper\n * @private\n * @param {object} context The current mustache context.\n * @param {string} sectionText The text to parse the arguments from.\n * @param {function} helper Used to render subsections of the text.\n * @return {string}\n */\n Renderer.prototype.shortenTextHelper = function(context, sectionText, helper) {\n // Non-greedy split on comma to grab section text into the length and\n // text parts.\n var regex = /(.*?),(.*)/;\n var parts = sectionText.match(regex);\n // The length is the part matched in the first set of parethesis.\n var length = parts[1].trim();\n // The length is the part matched in the second set of parethesis.\n var text = parts[2].trim();\n var content = helper(text, context);\n return Truncate.truncate(content, {\n length: length,\n words: true,\n ellipsis: '...'\n });\n };\n\n /**\n * User date helper to render user dates from timestamps.\n *\n * @method userDateHelper\n * @private\n * @param {object} context The current mustache context.\n * @param {string} sectionText The text to parse the arguments from.\n * @param {function} helper Used to render subsections of the text.\n * @return {string}\n */\n Renderer.prototype.userDateHelper = function(context, sectionText, helper) {\n // Non-greedy split on comma to grab the timestamp and format.\n var regex = /(.*?),(.*)/;\n var parts = sectionText.match(regex);\n var timestamp = helper(parts[1].trim(), context);\n var format = helper(parts[2].trim(), context);\n var index = this.requiredDates.length;\n\n this.requiredDates.push({\n timestamp: timestamp,\n format: format\n });\n\n return '[[_t_' + index + ']]';\n };\n\n /**\n * Return a helper function to be added to the context for rendering the a\n * template.\n *\n * This will parse the provided text before giving it to the helper function\n * in order to remove any disallowed nested helpers to prevent one helper\n * from calling another.\n *\n * In particular to prevent the JS helper from being called from within another\n * helper because it can lead to security issues when the JS portion is user\n * provided.\n *\n * @param {function} helperFunction The helper function to add\n * @param {object} context The template context for the helper function\n * @return {Function} To be set in the context\n */\n Renderer.prototype.addHelperFunction = function(helperFunction, context) {\n return function() {\n return function(sectionText, helper) {\n // Override the disallowed helpers in the template context with\n // a function that returns an empty string for use when executing\n // other helpers. This is to prevent these helpers from being\n // executed as part of the rendering of another helper in order to\n // prevent any potential security issues.\n var originalHelpers = disallowedNestedHelpers.reduce(function(carry, name) {\n if (context.hasOwnProperty(name)) {\n carry[name] = context[name];\n }\n\n return carry;\n }, {});\n\n disallowedNestedHelpers.forEach(function(helperName) {\n context[helperName] = function() {\n return '';\n };\n });\n\n // Execute the helper with the modified context that doesn't include\n // the disallowed nested helpers. This prevents the disallowed\n // helpers from being called from within other helpers.\n var result = helperFunction.apply(this, [context, sectionText, helper]);\n\n // Restore the original helper implementation in the context so that\n // any further rendering has access to them again.\n for (var name in originalHelpers) {\n context[name] = originalHelpers[name];\n }\n\n return result;\n }.bind(this);\n }.bind(this);\n };\n\n /**\n * Add some common helper functions to all context objects passed to templates.\n * These helpers match exactly the helpers available in php.\n *\n * @method addHelpers\n * @private\n * @param {Object} context Simple types used as the context for the template.\n * @param {String} themeName We set this multiple times, because there are async calls.\n */\n Renderer.prototype.addHelpers = function(context, themeName) {\n this.currentThemeName = themeName;\n this.requiredStrings = [];\n this.requiredJS = [];\n context.uniqid = (uniqInstances++);\n context.str = this.addHelperFunction(this.stringHelper, context);\n context.pix = this.addHelperFunction(this.pixHelper, context);\n context.js = this.addHelperFunction(this.jsHelper, context);\n context.quote = this.addHelperFunction(this.quoteHelper, context);\n context.shortentext = this.addHelperFunction(this.shortenTextHelper, context);\n context.userdate = this.addHelperFunction(this.userDateHelper, context);\n context.globals = {config: config};\n context.currentTheme = themeName;\n };\n\n /**\n * Get all the JS blocks from the last rendered template.\n *\n * @method getJS\n * @private\n * @return {string}\n */\n Renderer.prototype.getJS = function() {\n var js = '';\n if (this.requiredJS.length > 0) {\n js = this.requiredJS.join(\";\\n\");\n }\n\n return js;\n };\n\n /**\n * Treat strings in content.\n *\n * The purpose of this method is to replace the placeholders found in a string\n * with the their respective translated strings.\n *\n * Previously we were relying on String.replace() but the complexity increased with\n * the numbers of strings to replace. Now we manually walk the string and stop at each\n * placeholder we find, only then we replace it. Most of the time we will\n * replace all the placeholders in a single run, at times we will need a few\n * more runs when placeholders are replaced with strings that contain placeholders\n * themselves.\n *\n * @param {String} content The content in which string placeholders are to be found.\n * @param {Array} strings The strings to replace with.\n * @return {String} The treated content.\n */\n Renderer.prototype.treatStringsInContent = function(content, strings) {\n var pattern = /\\[\\[_s\\d+\\]\\]/,\n treated,\n index,\n strIndex,\n walker,\n char,\n strFinal;\n\n do {\n treated = '';\n index = content.search(pattern);\n while (index > -1) {\n\n // Copy the part prior to the placeholder to the treated string.\n treated += content.substring(0, index);\n content = content.substr(index);\n strIndex = '';\n walker = 4; // 4 is the length of '[[_s'.\n\n // Walk the characters to manually extract the index of the string from the placeholder.\n char = content.substr(walker, 1);\n do {\n strIndex += char;\n walker++;\n char = content.substr(walker, 1);\n } while (char != ']');\n\n // Get the string, add it to the treated result, and remove the placeholder from the content to treat.\n strFinal = strings[parseInt(strIndex, 10)];\n if (typeof strFinal === 'undefined') {\n Log.debug('Could not find string for pattern [[_s' + strIndex + ']].');\n strFinal = '';\n }\n treated += strFinal;\n content = content.substr(6 + strIndex.length); // 6 is the length of the placeholder without the index: '[[_s]]'.\n\n // Find the next placeholder.\n index = content.search(pattern);\n }\n\n // The content becomes the treated part with the rest of the content.\n content = treated + content;\n\n // Check if we need to walk the content again, in case strings contained placeholders.\n index = content.search(pattern);\n\n } while (index > -1);\n\n return content;\n };\n\n /**\n * Treat strings in content.\n *\n * The purpose of this method is to replace the date placeholders found in the\n * content with the their respective translated dates.\n *\n * @param {String} content The content in which string placeholders are to be found.\n * @param {Array} dates The dates to replace with.\n * @return {String} The treated content.\n */\n Renderer.prototype.treatDatesInContent = function(content, dates) {\n dates.forEach(function(date, index) {\n var key = '\\\\[\\\\[_t_' + index + '\\\\]\\\\]';\n var re = new RegExp(key, 'g');\n content = content.replace(re, date);\n });\n\n return content;\n };\n\n /**\n * Render a template and then call the callback with the result.\n *\n * @method doRender\n * @private\n * @param {string} templateSource The mustache template to render.\n * @param {Object} context Simple types used as the context for the template.\n * @param {String} themeName Name of the current theme.\n * @return {Promise} object\n */\n Renderer.prototype.doRender = function(templateSource, context, themeName) {\n this.currentThemeName = themeName;\n var iconTemplate = iconSystem.getTemplateName();\n\n var pendingPromise = new Pending('core/templates:doRender');\n return this.getTemplate(iconTemplate).then(function() {\n this.addHelpers(context, themeName);\n var result = mustache.render(templateSource, context, this.partialHelper.bind(this));\n return $.Deferred().resolve(result.trim(), this.getJS()).promise();\n }.bind(this))\n .then(function(html, js) {\n if (this.requiredStrings.length > 0) {\n return str.get_strings(this.requiredStrings).then(function(strings) {\n\n // Make sure string substitutions are done for the userdate\n // values as well.\n this.requiredDates = this.requiredDates.map(function(date) {\n return {\n timestamp: this.treatStringsInContent(date.timestamp, strings),\n format: this.treatStringsInContent(date.format, strings)\n };\n }.bind(this));\n\n // Why do we not do another call the render here?\n //\n // Because that would expose DOS holes. E.g.\n // I create an assignment called \"{{fish\" which\n // would get inserted in the template in the first pass\n // and cause the template to die on the second pass (unbalanced).\n html = this.treatStringsInContent(html, strings);\n js = this.treatStringsInContent(js, strings);\n return $.Deferred().resolve(html, js).promise();\n }.bind(this));\n }\n\n return $.Deferred().resolve(html, js).promise();\n }.bind(this))\n .then(function(html, js) {\n // This has to happen after the strings replacement because you can\n // use the string helper in content for the user date helper.\n if (this.requiredDates.length > 0) {\n return UserDate.get(this.requiredDates).then(function(dates) {\n html = this.treatDatesInContent(html, dates);\n js = this.treatDatesInContent(js, dates);\n return $.Deferred().resolve(html, js).promise();\n }.bind(this));\n }\n\n return $.Deferred().resolve(html, js).promise();\n }.bind(this))\n .then(function(html, js) {\n pendingPromise.resolve();\n return $.Deferred().resolve(html, js).promise();\n });\n };\n\n /**\n * Execute a block of JS returned from a template.\n * Call this AFTER adding the template HTML into the DOM so the nodes can be found.\n *\n * @method runTemplateJS\n * @param {string} source - A block of javascript.\n */\n var runTemplateJS = function(source) {\n if (source.trim() !== '') {\n var newscript = $('<script>').attr('type', 'text/javascript').html(source);\n $('head').append(newscript);\n }\n };\n\n /**\n * Do some DOM replacement and trigger correct events and fire javascript.\n *\n * @method domReplace\n * @private\n * @param {JQuery} element - Element or selector to replace.\n * @param {String} newHTML - HTML to insert / replace.\n * @param {String} newJS - Javascript to run after the insertion.\n * @param {Boolean} replaceChildNodes - Replace only the childnodes, alternative is to replace the entire node.\n * @return {Array} The list of new DOM Nodes\n */\n var domReplace = function(element, newHTML, newJS, replaceChildNodes) {\n var replaceNode = $(element);\n if (replaceNode.length) {\n // First create the dom nodes so we have a reference to them.\n var newNodes = $(newHTML);\n var yuiNodes = null;\n // Do the replacement in the page.\n if (replaceChildNodes) {\n // Cleanup any YUI event listeners attached to any of these nodes.\n yuiNodes = new Y.NodeList(replaceNode.children().get());\n yuiNodes.destroy(true);\n\n // JQuery will cleanup after itself.\n replaceNode.empty();\n replaceNode.append(newNodes);\n } else {\n // Cleanup any YUI event listeners attached to any of these nodes.\n yuiNodes = new Y.NodeList(replaceNode.get());\n yuiNodes.destroy(true);\n\n // JQuery will cleanup after itself.\n replaceNode.replaceWith(newNodes);\n }\n // Run any javascript associated with the new HTML.\n runTemplateJS(newJS);\n // Notify all filters about the new content.\n event.notifyFilterContentUpdated(newNodes);\n\n return newNodes.get();\n }\n\n return [];\n };\n\n /**\n * Scan a template source for partial tags and return a list of the found partials.\n *\n * @method scanForPartials\n * @private\n * @param {string} templateSource - source template to scan.\n * @return {Array} List of partials.\n */\n Renderer.prototype.scanForPartials = function(templateSource) {\n var tokens = mustache.parse(templateSource),\n partials = [];\n\n var findPartial = function(tokens, partials) {\n var i, token;\n for (i = 0; i < tokens.length; i++) {\n token = tokens[i];\n if (token[0] == '>' || token[0] == '<') {\n partials.push(token[1]);\n }\n if (token.length > 4) {\n findPartial(token[4], partials);\n }\n }\n };\n\n findPartial(tokens, partials);\n\n return partials;\n };\n\n /**\n * Load a template and scan it for partials. Recursively fetch the partials.\n *\n * @method cachePartials\n * @private\n * @param {string} templateName - should consist of the component and the name of the template like this:\n * core/menu (lib/templates/menu.mustache) or\n * tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)\n * @param {Array} parentage - A list of requested partials in this render chain.\n * @return {Promise} JQuery promise object resolved when all partials are in the cache.\n */\n Renderer.prototype.cachePartials = function(templateName, parentage) {\n var searchKey = this.currentThemeName + '/' + templateName;\n\n if (searchKey in cachePartialPromises) {\n return cachePartialPromises[searchKey];\n }\n\n // This promise will not be resolved until all child partials are also resolved and ready.\n // We create it here to allow us to check for recursive inclusion of templates.\n // Keep track of the requested partials in this chain.\n parentage = parentage || [searchKey];\n\n cachePartialPromises[searchKey] = $.Deferred();\n\n this.getTemplate(templateName)\n .then(function(templateSource) {\n var partials = this.scanForPartials(templateSource);\n var uniquePartials = partials.filter(function(partialName) {\n // Check for recursion.\n\n if (parentage.indexOf(this.currentThemeName + '/' + partialName) >= 0) {\n // Ignore templates which include a parent template already requested in the current chain.\n return false;\n }\n\n // Ignore templates that include themselves.\n return partialName != templateName;\n }.bind(this));\n\n // Fetch any partial which has not already been fetched.\n var fetchThemAll = uniquePartials.map(function(partialName) {\n parentage.push(this.currentThemeName + '/' + partialName);\n return this.cachePartials(partialName, parentage);\n }.bind(this));\n\n // Resolve the templateName promise when all of the children are resolved.\n return $.when.apply($, fetchThemAll)\n .then(function() {\n return cachePartialPromises[searchKey].resolve(templateSource);\n });\n }.bind(this))\n .catch(cachePartialPromises[searchKey].reject);\n\n return cachePartialPromises[searchKey];\n };\n\n /**\n * Load a template and call doRender on it.\n *\n * @method render\n * @private\n * @param {string} templateName - should consist of the component and the name of the template like this:\n * core/menu (lib/templates/menu.mustache) or\n * tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)\n * @param {Object} context - Could be array, string or simple value for the context of the template.\n * @param {string} themeName - Name of the current theme.\n * @return {Promise} JQuery promise object resolved when the template has been rendered.\n */\n Renderer.prototype.render = function(templateName, context, themeName) {\n if (typeof (themeName) === \"undefined\") {\n // System context by default.\n themeName = config.theme;\n }\n\n this.currentThemeName = themeName;\n\n // Preload the module to do the icon rendering based on the theme iconsystem.\n var modulename = config.iconsystemmodule;\n\n var ready = $.Deferred();\n require([modulename], function(System) {\n var system = new System();\n if (!(system instanceof IconSystem)) {\n ready.reject('Invalid icon system specified' + config.iconsystem);\n } else {\n iconSystem = system;\n system.init().then(ready.resolve).catch(notification.exception);\n }\n });\n\n return ready.then(function() {\n return this.cachePartials(templateName);\n }.bind(this)).then(function(templateSource) {\n return this.doRender(templateSource, context, themeName);\n }.bind(this));\n };\n\n /**\n * Prepend some HTML to a node and trigger events and fire javascript.\n *\n * @method domPrepend\n * @private\n * @param {jQuery|String} element - Element or selector to prepend HTML to\n * @param {String} html - HTML to prepend\n * @param {String} js - Javascript to run after we prepend the html\n * @return {Array} The list of new DOM Nodes\n */\n var domPrepend = function(element, html, js) {\n var node = $(element);\n if (node.length) {\n // Prepend the html.\n var newContent = $(html);\n node.prepend(newContent);\n // Run any javascript associated with the new HTML.\n runTemplateJS(js);\n // Notify all filters about the new content.\n event.notifyFilterContentUpdated(node);\n\n return newContent.get();\n }\n\n return [];\n };\n\n /**\n * Append some HTML to a node and trigger events and fire javascript.\n *\n * @method domAppend\n * @private\n * @param {jQuery|String} element - Element or selector to append HTML to\n * @param {String} html - HTML to append\n * @param {String} js - Javascript to run after we append the html\n * @return {Array} The list of new DOM Nodes\n */\n var domAppend = function(element, html, js) {\n var node = $(element);\n if (node.length) {\n // Append the html.\n var newContent = $(html);\n node.append(newContent);\n // Run any javascript associated with the new HTML.\n runTemplateJS(js);\n // Notify all filters about the new content.\n event.notifyFilterContentUpdated(node);\n\n return newContent.get();\n }\n\n return [];\n };\n\n return /** @alias module:core/templates */ {\n // Public variables and functions.\n /**\n * Every call to render creates a new instance of the class and calls render on it. This\n * means each render call has it's own class variables.\n *\n * @method render\n * @private\n * @param {string} templateName - should consist of the component and the name of the template like this:\n * core/menu (lib/templates/menu.mustache) or\n * tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)\n * @param {Object} context - Could be array, string or simple value for the context of the template.\n * @param {string} themeName - Name of the current theme.\n * @return {Promise} JQuery promise object resolved when the template has been rendered.\n */\n render: function(templateName, context, themeName) {\n var renderer = new Renderer();\n return renderer.render(templateName, context, themeName);\n },\n\n /**\n * Prefetch a set of templates without rendering them.\n *\n * @method getTemplate\n * @param {Array} templateNames The list of templates to fetch\n * @param {String} themeName\n * @returns {Promise}\n */\n prefetchTemplates: function(templateNames, themeName) {\n var renderer = new Renderer();\n\n if (typeof themeName === \"undefined\") {\n // System context by default.\n themeName = config.theme;\n }\n\n return renderer.prefetchTemplates(templateNames, themeName);\n },\n\n /**\n * Every call to render creates a new instance of the class and calls render on it. This\n * means each render call has it's own class variables.\n *\n * This alernate to the standard .render() function returns the html and js in a single object suitable for a\n * native Promise.\n *\n * @method renderForPromise\n * @private\n * @param {string} templateName - should consist of the component and the name of the template like this:\n * core/menu (lib/templates/menu.mustache) or\n * tool_bananas/yellow (admin/tool/bananas/templates/yellow.mustache)\n * @param {Object} context - Could be array, string or simple value for the context of the template.\n * @param {string} themeName - Name of the current theme.\n * @return {Promise} JQuery promise object resolved when the template has been rendered.\n */\n renderForPromise: function(templateName, context, themeName) {\n var renderer = new Renderer();\n return renderer.render(templateName, context, themeName)\n .then(function(html, js) {\n return {\n html: html,\n js: js,\n };\n });\n },\n\n /**\n * Every call to renderIcon creates a new instance of the class and calls renderIcon on it. This\n * means each render call has it's own class variables.\n *\n * @method renderIcon\n * @public\n * @param {string} key - Icon key.\n * @param {string} component - Icon component\n * @param {string} title - Icon title\n * @return {Promise} JQuery promise object resolved when the pix has been rendered.\n */\n renderPix: function(key, component, title) {\n var renderer = new Renderer();\n return renderer.renderIcon(\n key,\n getNormalisedComponent(component),\n title\n );\n },\n\n /**\n * Execute a block of JS returned from a template.\n * Call this AFTER adding the template HTML into the DOM so the nodes can be found.\n *\n * @method runTemplateJS\n * @param {string} source - A block of javascript.\n */\n runTemplateJS: runTemplateJS,\n\n /**\n * Replace a node in the page with some new HTML and run the JS.\n *\n * @method replaceNodeContents\n * @param {JQuery} element - Element or selector to replace.\n * @param {String} newHTML - HTML to insert / replace.\n * @param {String} newJS - Javascript to run after the insertion.\n * @return {Array} The list of new DOM Nodes\n */\n replaceNodeContents: function(element, newHTML, newJS) {\n return domReplace(element, newHTML, newJS, true);\n },\n\n /**\n * Insert a node in the page with some new HTML and run the JS.\n *\n * @method replaceNode\n * @param {JQuery} element - Element or selector to replace.\n * @param {String} newHTML - HTML to insert / replace.\n * @param {String} newJS - Javascript to run after the insertion.\n * @return {Array} The list of new DOM Nodes\n */\n replaceNode: function(element, newHTML, newJS) {\n return domReplace(element, newHTML, newJS, false);\n },\n\n /**\n * Prepend some HTML to a node and trigger events and fire javascript.\n *\n * @method prependNodeContents\n * @param {jQuery|String} element - Element or selector to prepend HTML to\n * @param {String} html - HTML to prepend\n * @param {String} js - Javascript to run after we prepend the html\n * @return {Array} The list of new DOM Nodes\n */\n prependNodeContents: function(element, html, js) {\n return domPrepend(element, html, js);\n },\n\n /**\n * Append some HTML to a node and trigger events and fire javascript.\n *\n * @method appendNodeContents\n * @param {jQuery|String} element - Element or selector to append HTML to\n * @param {String} html - HTML to append\n * @param {String} js - Javascript to run after we append the html\n * @return {Array} The list of new DOM Nodes\n */\n appendNodeContents: function(element, html, js) {\n return domAppend(element, html, js);\n },\n };\n});\n"],"names":["define","mustache","$","ajax","str","notification","coreurl","config","storage","IconSystem","event","Y","Log","Truncate","UserDate","Pending","uniqInstances","templateCache","templatePromises","cachePartialPromises","iconSystem","loadTemplateBuffer","isLoadingTemplates","disallowedNestedHelpers","getNormalisedComponent","component","getTemplatePromiseFromCache","searchKey","Deferred","resolve","promise","M","cfg","templaterev","cached","get","processLoadTemplateBuffer","length","templatesToLoad","slice","serverRequestsDeferred","requests","map","templateData","name","theme","templateDeferred","deferred","cachedPromise","push","methodname","args","template","themename","lang","attr","replace","index","then","promises","response","templateSource","templates","forEach","data","tempSearchKey","join","value","set","strings","cache_strings","key","source","catch","error","reject","call","when","apply","splice","Renderer","requiredStrings","requiredJS","requiredDates","currentThemeName","prototype","getTemplate","templateName","currentTheme","this","existingBufferRecords","filter","record","parts","split","shift","prefetchTemplates","templateNames","partialHelper","exception","Error","renderIcon","title","modulename","iconsystemmodule","ready","require","System","system","init","getTemplateName","bind","pixHelper","context","sectionText","helper","text","trim","jsHelper","stringHelper","param","indexOf","JSON","parse","quoteHelper","content","shortenTextHelper","match","truncate","words","ellipsis","userDateHelper","timestamp","format","addHelperFunction","helperFunction","originalHelpers","reduce","carry","hasOwnProperty","helperName","result","addHelpers","themeName","uniqid","pix","js","quote","shortentext","userdate","globals","getJS","treatStringsInContent","treated","strIndex","walker","char","strFinal","pattern","search","substring","substr","parseInt","debug","treatDatesInContent","dates","date","re","RegExp","doRender","iconTemplate","pendingPromise","render","html","get_strings","runTemplateJS","newscript","append","domReplace","element","newHTML","newJS","replaceChildNodes","replaceNode","newNodes","NodeList","children","destroy","empty","replaceWith","notifyFilterContentUpdated","scanForPartials","partials","findPartial","tokens","i","token","cachePartials","parentage","fetchThemAll","partialName","iconsystem","renderer","renderForPromise","renderPix","replaceNodeContents","prependNodeContents","node","newContent","prepend","domPrepend","appendNodeContents","domAppend"],"mappings":"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"}
Close