mirror of
https://github.com/renbaoshuo/S2OJ.git
synced 2024-12-27 05:31:52 +00:00
123 lines
2.4 KiB
JavaScript
123 lines
2.4 KiB
JavaScript
|
(function() {
|
||
|
|
||
|
var sh = SyntaxHighlighter;
|
||
|
|
||
|
/**
|
||
|
* Provides functionality to dynamically load only the brushes that a needed to render the current page.
|
||
|
*
|
||
|
* There are two syntaxes that autoload understands. For example:
|
||
|
*
|
||
|
* SyntaxHighlighter.autoloader(
|
||
|
* [ 'applescript', 'Scripts/shBrushAppleScript.js' ],
|
||
|
* [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ]
|
||
|
* );
|
||
|
*
|
||
|
* or a more easily comprehendable one:
|
||
|
*
|
||
|
* SyntaxHighlighter.autoloader(
|
||
|
* 'applescript Scripts/shBrushAppleScript.js',
|
||
|
* 'actionscript3 as3 Scripts/shBrushAS3.js'
|
||
|
* );
|
||
|
*/
|
||
|
sh.autoloader = function()
|
||
|
{
|
||
|
var list = arguments,
|
||
|
elements = sh.findElements(),
|
||
|
brushes = {},
|
||
|
scripts = {},
|
||
|
all = SyntaxHighlighter.all,
|
||
|
allCalled = false,
|
||
|
allParams = null,
|
||
|
i
|
||
|
;
|
||
|
|
||
|
SyntaxHighlighter.all = function(params)
|
||
|
{
|
||
|
allParams = params;
|
||
|
allCalled = true;
|
||
|
};
|
||
|
|
||
|
function addBrush(aliases, url)
|
||
|
{
|
||
|
for (var i = 0; i < aliases.length; i++)
|
||
|
brushes[aliases[i]] = url;
|
||
|
};
|
||
|
|
||
|
function getAliases(item)
|
||
|
{
|
||
|
return item.pop
|
||
|
? item
|
||
|
: item.split(/\s+/)
|
||
|
;
|
||
|
}
|
||
|
|
||
|
// create table of aliases and script urls
|
||
|
for (i = 0; i < list.length; i++)
|
||
|
{
|
||
|
var aliases = getAliases(list[i]),
|
||
|
url = aliases.pop()
|
||
|
;
|
||
|
|
||
|
addBrush(aliases, url);
|
||
|
}
|
||
|
|
||
|
// dynamically add <script /> tags to the document body
|
||
|
for (i = 0; i < elements.length; i++)
|
||
|
{
|
||
|
var url = brushes[elements[i].params.brush];
|
||
|
|
||
|
if(url && scripts[url] === undefined)
|
||
|
{
|
||
|
if(elements[i].params['html-script'] === 'true')
|
||
|
{
|
||
|
if(scripts[brushes['xml']] === undefined) {
|
||
|
loadScript(brushes['xml']);
|
||
|
scripts[url] = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
scripts[url] = false;
|
||
|
loadScript(url);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function loadScript(url)
|
||
|
{
|
||
|
var script = document.createElement('script'),
|
||
|
done = false
|
||
|
;
|
||
|
|
||
|
script.src = url;
|
||
|
script.type = 'text/javascript';
|
||
|
script.language = 'javascript';
|
||
|
script.onload = script.onreadystatechange = function()
|
||
|
{
|
||
|
if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))
|
||
|
{
|
||
|
done = true;
|
||
|
scripts[url] = true;
|
||
|
checkAll();
|
||
|
|
||
|
// Handle memory leak in IE
|
||
|
script.onload = script.onreadystatechange = null;
|
||
|
script.parentNode.removeChild(script);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
// sync way of adding script tags to the page
|
||
|
document.body.appendChild(script);
|
||
|
};
|
||
|
|
||
|
function checkAll()
|
||
|
{
|
||
|
for(var url in scripts)
|
||
|
if (scripts[url] == false)
|
||
|
return;
|
||
|
|
||
|
if (allCalled)
|
||
|
SyntaxHighlighter.highlight(allParams);
|
||
|
};
|
||
|
};
|
||
|
|
||
|
})();
|