shAutoloader.js 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. (function() {
  2. var sh = SyntaxHighlighter;
  3. /**
  4. * Provides functionality to dynamically load only the brushes that a needed to render the current page.
  5. *
  6. * There are two syntaxes that autoload understands. For example:
  7. *
  8. * SyntaxHighlighter.autoloader(
  9. * [ 'applescript', 'Scripts/shBrushAppleScript.js' ],
  10. * [ 'actionscript3', 'as3', 'Scripts/shBrushAS3.js' ]
  11. * );
  12. *
  13. * or a more easily comprehendable one:
  14. *
  15. * SyntaxHighlighter.autoloader(
  16. * 'applescript Scripts/shBrushAppleScript.js',
  17. * 'actionscript3 as3 Scripts/shBrushAS3.js'
  18. * );
  19. */
  20. sh.autoloader = function()
  21. {
  22. var list = arguments,
  23. elements = sh.findElements(),
  24. brushes = {},
  25. scripts = {},
  26. all = SyntaxHighlighter.all,
  27. allCalled = false,
  28. allParams = null,
  29. i
  30. ;
  31. SyntaxHighlighter.all = function(params)
  32. {
  33. allParams = params;
  34. allCalled = true;
  35. };
  36. function addBrush(aliases, url)
  37. {
  38. for (var i = 0; i < aliases.length; i++)
  39. brushes[aliases[i]] = url;
  40. };
  41. function getAliases(item)
  42. {
  43. return item.pop
  44. ? item
  45. : item.split(/\s+/)
  46. ;
  47. }
  48. // create table of aliases and script urls
  49. for (i = 0; i < list.length; i++)
  50. {
  51. var aliases = getAliases(list[i]),
  52. url = aliases.pop()
  53. ;
  54. addBrush(aliases, url);
  55. }
  56. // dynamically add <script /> tags to the document body
  57. for (i = 0; i < elements.length; i++)
  58. {
  59. var url = brushes[elements[i].params.brush];
  60. if(url && scripts[url] === undefined)
  61. {
  62. if(elements[i].params['html-script'] === 'true')
  63. {
  64. if(scripts[brushes['xml']] === undefined) {
  65. loadScript(brushes['xml']);
  66. scripts[url] = false;
  67. }
  68. }
  69. scripts[url] = false;
  70. loadScript(url);
  71. }
  72. }
  73. function loadScript(url)
  74. {
  75. var script = document.createElement('script'),
  76. done = false
  77. ;
  78. script.src = url;
  79. script.type = 'text/javascript';
  80. script.language = 'javascript';
  81. script.onload = script.onreadystatechange = function()
  82. {
  83. if (!done && (!this.readyState || this.readyState == 'loaded' || this.readyState == 'complete'))
  84. {
  85. done = true;
  86. scripts[url] = true;
  87. checkAll();
  88. // Handle memory leak in IE
  89. script.onload = script.onreadystatechange = null;
  90. script.parentNode.removeChild(script);
  91. }
  92. };
  93. // sync way of adding script tags to the page
  94. document.body.appendChild(script);
  95. };
  96. function checkAll()
  97. {
  98. for(var url in scripts)
  99. if (scripts[url] == false)
  100. return;
  101. if (allCalled)
  102. SyntaxHighlighter.highlight(allParams);
  103. };
  104. };
  105. })();