codepress.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /*
  2. * CodePress - Real Time Syntax Highlighting Editor written in JavaScript - http://codepress.org/
  3. *
  4. * Copyright (C) 2006 Fernando M.A.d.S. <[email protected]>
  5. *
  6. * This program is free software; you can redistribute it and/or modify it under the terms of the
  7. * GNU Lesser General Public License as published by the Free Software Foundation.
  8. *
  9. * Read the full licence: http://www.opensource.org/licenses/lgpl-license.php
  10. */
  11. CodePress = function(obj) {
  12. var self = document.createElement('iframe');
  13. self.textarea = obj;
  14. self.textarea.disabled = true;
  15. self.textarea.style.overflow = 'hidden';
  16. self.style.height = self.textarea.clientHeight +'px';
  17. self.style.width = self.textarea.clientWidth +'px';
  18. self.textarea.style.overflow = 'auto';
  19. self.style.border = '1px solid gray';
  20. self.frameBorder = 0; // remove IE internal iframe border
  21. self.style.visibility = 'hidden';
  22. self.style.position = 'absolute';
  23. self.options = self.textarea.className;
  24. self.initialize = function() {
  25. self.editor = self.contentWindow.CodePress;
  26. self.editor.body = self.contentWindow.document.getElementsByTagName('body')[0];
  27. self.editor.setCode(self.textarea.value);
  28. self.setOptions();
  29. self.editor.syntaxHighlight('init');
  30. self.textarea.style.display = 'none';
  31. self.style.position = 'static';
  32. self.style.visibility = 'visible';
  33. self.style.display = 'inline';
  34. }
  35. // obj can by a textarea id or a string (code)
  36. self.edit = function(obj,language) {
  37. if(obj) self.textarea.value = document.getElementById(obj) ? document.getElementById(obj).value : obj;
  38. if(!self.textarea.disabled) return;
  39. self.language = language ? language : self.getLanguage();
  40. self.src = CodePress.path+'codepress.html?language='+self.language+'&ts='+(new Date).getTime();
  41. if(self.attachEvent) self.attachEvent('onload',self.initialize);
  42. else self.addEventListener('load',self.initialize,false);
  43. }
  44. self.getLanguage = function() {
  45. for (language in CodePress.languages)
  46. if(self.options.match('\\b'+language+'\\b'))
  47. return CodePress.languages[language] ? language : 'generic';
  48. }
  49. self.setOptions = function() {
  50. if(self.options.match('autocomplete-off')) self.toggleAutoComplete();
  51. if(self.options.match('readonly-on')) self.toggleReadOnly();
  52. if(self.options.match('linenumbers-off')) self.toggleLineNumbers();
  53. }
  54. self.getCode = function() {
  55. return self.textarea.disabled ? self.editor.getCode() : self.textarea.value;
  56. }
  57. self.setCode = function(code) {
  58. self.textarea.disabled ? self.editor.setCode(code) : self.textarea.value = code;
  59. }
  60. self.toggleAutoComplete = function() {
  61. self.editor.autocomplete = (self.editor.autocomplete) ? false : true;
  62. }
  63. self.toggleReadOnly = function() {
  64. self.textarea.readOnly = (self.textarea.readOnly) ? false : true;
  65. if(self.style.display != 'none') // prevent exception on FF + iframe with display:none
  66. self.editor.readOnly(self.textarea.readOnly ? true : false);
  67. }
  68. self.toggleLineNumbers = function() {
  69. var cn = self.editor.body.className;
  70. self.editor.body.className = (cn==''||cn=='show-line-numbers') ? 'hide-line-numbers' : 'show-line-numbers';
  71. }
  72. self.toggleEditor = function() {
  73. if(self.textarea.disabled) {
  74. self.textarea.value = self.getCode();
  75. self.textarea.disabled = false;
  76. self.style.display = 'none';
  77. self.textarea.style.display = 'inline';
  78. }
  79. else {
  80. self.textarea.disabled = true;
  81. self.setCode(self.textarea.value);
  82. self.editor.syntaxHighlight('init');
  83. self.style.display = 'inline';
  84. self.textarea.style.display = 'none';
  85. }
  86. }
  87. self.edit();
  88. return self;
  89. }
  90. CodePress.languages = {
  91. csharp : 'C#',
  92. css : 'CSS',
  93. generic : 'Generic',
  94. html : 'HTML',
  95. java : 'Java',
  96. javascript : 'JavaScript',
  97. perl : 'Perl',
  98. ruby : 'Ruby',
  99. php : 'PHP',
  100. text : 'Text',
  101. sql : 'SQL',
  102. vbscript : 'VBScript'
  103. }
  104. CodePress.run = function() {
  105. s = document.getElementsByTagName('script');
  106. for(var i=0,n=s.length;i<n;i++) {
  107. if(s[i].src.match('codepress.js')) {
  108. CodePress.path = s[i].src.replace('codepress.js','');
  109. }
  110. }
  111. t = document.getElementsByTagName('textarea');
  112. for(var i=0,n=t.length;i<n;i++) {
  113. if(t[i].className.match('codepress')) {
  114. id = t[i].id;
  115. t[i].id = id+'_cp';
  116. eval(id+' = new CodePress(t[i])');
  117. t[i].parentNode.insertBefore(eval(id), t[i]);
  118. }
  119. }
  120. }
  121. if(window.attachEvent) window.attachEvent('onload',CodePress.run);
  122. else window.addEventListener('DOMContentLoaded',CodePress.run,false);