PageRenderTime 43ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/doc/js/jquery.beautyOfCode.js

https://bitbucket.org/aagraz/vrtoolkit
JavaScript | 247 lines | 180 code | 37 blank | 30 comment | 34 complexity | e7f8f6f5567f5dc95be1ab47694fb5e7 MD5 | raw file
  1. /*
  2. Licensed to the Apache Software Foundation (ASF) under one
  3. or more contributor license agreements.
  4. Copyright 2010 Lars Corneliussen,
  5. Site: http://startbigthinksmall.wordpress.com/2009/05/28/beautyofcode-jquery-plugin-for-syntax-highlighter-2-0-by-alex-gorbatchev/
  6. Source: https://bitbucket.org/larscorneliussen/beautyofcode/
  7. Version: 1.0-SNAPSHOT
  8. */
  9. jQuery.beautyOfCode = {
  10. settings: {
  11. // should the syntax highlighter and brushes
  12. // be loaded dynamically
  13. autoLoad: true,
  14. // the base url to alex' hosted sources
  15. // http://alexgorbatchev.com/wiki/SyntaxHighlighter:Hosting
  16. baseUrl: 'http://alexgorbatchev.com/pub/sh/2.1.364/',
  17. // the baseurl for the hosted scripts
  18. scripts: 'scripts/',
  19. // the baseurl for the hosted styles
  20. styles: 'styles/',
  21. // themes from http://alexgorbatchev.com/wiki/SyntaxHighlighter:Themes
  22. theme: 'Default',
  23. // the brushes that should be loaded - case sensitive!
  24. // http://alexgorbatchev.com/wiki/SyntaxHighlighter:Brushes
  25. brushes: ['Xml', 'JScript', 'CSharp', 'Plain'],
  26. // overrides for configurations and defaults
  27. // http://alexgorbatchev.com/wiki/SyntaxHighlighter:Configuration
  28. config: {},
  29. defaults: {},
  30. // function to be called, when all scripts are loaded
  31. ready: function() {
  32. jQuery.beautyOfCode.beautifyAll();
  33. }
  34. },
  35. init: function(settings) {
  36. settings = jQuery.extend({},
  37. jQuery.beautyOfCode.settings, settings);
  38. if (!settings.config.clipboardSwf)
  39. settings.config.clipboardSwf = settings.baseUrl + settings.scripts + 'clipboard.swf';
  40. jQuery(document).ready(function() {
  41. if (!settings.autoLoad) {
  42. settings.ready();
  43. }
  44. else {
  45. jQuery.beautyOfCode.utils.loadCss(settings.baseUrl + settings.styles + 'shCore.css');
  46. jQuery.beautyOfCode.utils.loadCss(settings.baseUrl + settings.styles + 'shTheme' + settings.theme + '.css', 'shTheme');
  47. var scripts = new Array();
  48. scripts.push(settings.baseUrl + settings.scripts + 'shCore.js');
  49. jQuery.each(settings.brushes,
  50. function(i, item) {
  51. scripts.push(settings.baseUrl + settings.scripts + 'shBrush' + item + ".js")
  52. });
  53. jQuery.beautyOfCode.utils.loadAllScripts(
  54. scripts,
  55. function() {
  56. if (settings && settings.config)
  57. jQuery.extend(SyntaxHighlighter.config, settings.config);
  58. if (settings && settings.defaults)
  59. jQuery.extend(SyntaxHighlighter.defaults, settings.defaults);
  60. settings.ready();
  61. });
  62. }
  63. });
  64. },
  65. beautifyAll: function() {
  66. jQuery("pre.code:has(code[class])").beautifyCode();
  67. },
  68. utils: {
  69. loadScript: function(url, complete) {
  70. jQuery.ajax({
  71. url: url,
  72. complete: function() {
  73. complete();
  74. },
  75. type: 'GET',
  76. dataType: 'script',
  77. cache: true
  78. });
  79. },
  80. loadAllScripts: function(urls, complete) {
  81. if (!urls || urls.length == 0)
  82. {
  83. complete();
  84. return;
  85. }
  86. var first = urls[0];
  87. jQuery.beautyOfCode.utils.loadScript(
  88. first,
  89. function() {
  90. jQuery.beautyOfCode.utils.loadAllScripts(
  91. urls.slice(1, urls.length),
  92. complete
  93. );
  94. }
  95. );
  96. },
  97. loadCss: function(url, id) {
  98. var headNode = jQuery("head")[0];
  99. if (url && headNode)
  100. {
  101. var styleNode = document.createElement('link');
  102. styleNode.setAttribute('rel', 'stylesheet');
  103. styleNode.setAttribute('href', url);
  104. if (id) styleNode.id = id;
  105. headNode.appendChild(styleNode);
  106. }
  107. },
  108. addCss: function(css, id) {
  109. var headNode = jQuery("head")[0];
  110. if (css && headNode)
  111. {
  112. var styleNode = document.createElement('style');
  113. styleNode.setAttribute('type', 'text/css');
  114. if (id) styleNode.id = id;
  115. if (styleNode.styleSheet) {
  116. // for IE
  117. styleNode.styleSheet.cssText = css;
  118. }
  119. else {
  120. jQuery(styleNode).text(css);
  121. }
  122. headNode.appendChild(styleNode);
  123. }
  124. },
  125. addCssForBrush: function(brush, highlighter) {
  126. if (brush.isCssInitialized)
  127. return;
  128. jQuery.beautyOfCode.utils.addCss(highlighter.Style);
  129. brush.isCssInitialized = true;
  130. },
  131. parseParams: function(params) {
  132. var trimmed = jQuery.map(params, jQuery.trim);
  133. var paramObject = {};
  134. var getOptionValue = function(name, list) {
  135. var regex = new RegExp('^' + name + '\\[([^\\]]+)\\]$', 'gi');
  136. var matches = null;
  137. for (var i = 0; i < list.length; i++)
  138. if ((matches = regex.exec(list[i])) != null)
  139. return matches[1];
  140. return null;
  141. }
  142. var handleValue = function(flag) {
  143. var flagValue = getOptionValue('boc-' + flag, trimmed);
  144. if (flagValue) paramObject[flag] = flagValue;
  145. };
  146. handleValue('class-name');
  147. handleValue('first-line');
  148. handleValue('tab-size');
  149. var highlight = getOptionValue('boc-highlight', trimmed);
  150. if (highlight) paramObject['highlight'] = jQuery.map(highlight.split(','), jQuery.trim);
  151. var handleFlag = function(flag) {
  152. if (jQuery.inArray('boc-' + flag, trimmed) != -1)
  153. paramObject[flag] = true;
  154. else if (jQuery.inArray('boc-no-' + flag, trimmed) != -1)
  155. paramObject[flag] = false;
  156. };
  157. handleFlag('smart-tabs');
  158. handleFlag('ruler');
  159. handleFlag('gutter');
  160. handleFlag('toolbar');
  161. handleFlag('collapse');
  162. handleFlag('auto-links');
  163. handleFlag('light');
  164. handleFlag('wrap-lines');
  165. handleFlag('html-script');
  166. return paramObject;
  167. }
  168. }
  169. };
  170. jQuery.fn.beautifyCode = function(brush, params) {
  171. var saveBrush = brush;
  172. var saveParams = params;
  173. // iterate all elements
  174. this.each(function(i, item) {
  175. var $item = jQuery(item);
  176. // for now, only supports <pre><code>...</code></pre>
  177. // support for only pre, or only code could be added
  178. var $code = $item.children("code");
  179. var code = $code[0];
  180. var classItems = code.className.split(" ");
  181. var brush = saveBrush ? saveBrush: classItems[0];
  182. var elementParams = jQuery.beautyOfCode.utils.parseParams(classItems);
  183. var params = jQuery.extend({},
  184. SyntaxHighlighter.defaults, saveParams, elementParams);
  185. // Instantiate a brush
  186. if (params['html-script'] == 'true')
  187. {
  188. highlighter = new SyntaxHighlighter.HtmlScript(brush);
  189. }
  190. else
  191. {
  192. var brush = SyntaxHighlighter.utils.findBrush(brush);
  193. if (brush)
  194. highlighter = new brush();
  195. else
  196. return;
  197. }
  198. // i'm not sure if this is still neccessary
  199. jQuery.beautyOfCode.utils.addCssForBrush(brush, highlighter);
  200. // IE Bug?: code in pre has to be skipped
  201. // in order to preserve line breaks.
  202. if ($item.is("pre") && ($code = $item.children("code")))
  203. $item.text($code.text());
  204. highlighter.highlight($item.html(), params);
  205. highlighter.source = item;
  206. $item.replaceWith(highlighter.div);
  207. });
  208. }