Hallo Wissende,
ich möchte den Syntax Highlighter "codepress" dynamisch mit Javascript aufrufen. http://sourceforge.net/projects/codepress
Mit Codepress lässt sich der Quellcode diverser Beschreibungs- und Scriptsprachen in einem textarea Element über einem iFrame formatiert darstellen.
Mein Problem ist nun das ich das textarea Element über eine Funktion aufrufen und Codepress damit verknüpfen möchte.
Hier nun der Code der Javascript Datei von Codepress:
CodePress = function(obj) {
var self = document.createElement('iframe');
self.textarea = obj;
self.textarea.disabled = true;
self.textarea.style.overflow = 'hidden';
self.style.height = self.textarea.clientHeight +'px';
self.style.width = self.textarea.clientWidth +'px';
self.textarea.style.overflow = 'auto';
self.style.border = '1px solid gray';
self.frameBorder = 0; // remove IE internal iframe border
self.style.visibility = 'hidden';
self.style.position = 'absolute';
self.options = self.textarea.className;
self.initialize = function() {
self.editor = self.contentWindow.CodePress;
self.editor.body = self.contentWindow.document.getElementsByTagName('body')[0];
self.editor.setCode(self.textarea.value);
self.setOptions();
self.editor.syntaxHighlight('init');
self.textarea.style.display = 'none';
self.style.position = 'static';
self.style.visibility = 'visible';
self.style.display = 'inline';
}
// obj can by a textarea id or a string (code)
self.edit = function(obj,language) {
if(obj) self.textarea.value = document.getElementById(obj) ? document.getElementById(obj).value : obj;
if(!self.textarea.disabled) return;
self.language = language ? language : self.getLanguage();
self.src = CodePress.path+'codepress.html?language='+self.language+'&ts='+(new Date).getTime();
if(self.attachEvent) self.attachEvent('onload',self.initialize);
else self.addEventListener('load',self.initialize,false);
}
self.getLanguage = function() {
for (language in CodePress.languages)
if(self.options.match('\\b'+language+'\\b'))
return CodePress.languages[language] ? language : 'generic';
}
self.setOptions = function() {
if(self.options.match('autocomplete-off')) self.toggleAutoComplete();
if(self.options.match('readonly-on')) self.toggleReadOnly();
if(self.options.match('linenumbers-off')) self.toggleLineNumbers();
}
self.getCode = function() {
return self.textarea.disabled ? self.editor.getCode() : self.textarea.value;
}
self.setCode = function(code) {
self.textarea.disabled ? self.editor.setCode(code) : self.textarea.value = code;
}
self.toggleAutoComplete = function() {
self.editor.autocomplete = (self.editor.autocomplete) ? false : true;
}
self.toggleReadOnly = function() {
self.textarea.readOnly = (self.textarea.readOnly) ? false : true;
if(self.style.display != 'none') // prevent exception on FF + iframe with display:none
self.editor.readOnly(self.textarea.readOnly ? true : false);
}
self.toggleLineNumbers = function() {
var cn = self.editor.body.className;
self.editor.body.className = (cn==''||cn=='show-line-numbers') ? 'hide-line-numbers' : 'show-line-numbers';
}
self.toggleEditor = function() {
if(self.textarea.disabled) {
self.textarea.value = self.getCode();
self.textarea.disabled = false;
self.style.display = 'none';
self.textarea.style.display = 'inline';
}
else {
self.textarea.disabled = true;
self.setCode(self.textarea.value);
self.editor.syntaxHighlight('init');
self.style.display = 'inline';
self.textarea.style.display = 'none';
}
}
self.edit();
return self;
}
CodePress.languages = {
csharp : 'C#',
css : 'CSS',
generic : 'Generic',
html : 'HTML',
java : 'Java',
javascript : 'JavaScript',
perl : 'Perl',
ruby : 'Ruby',
php : 'PHP',
text : 'Text',
sql : 'SQL',
vbscript : 'VBScript'
}
CodePress.run = function() {
s = document.getElementsByTagName('script');
for(var i=0,n=s.length;i<n;i++) {
if(s[i].src.match('codepress.js')) {
CodePress.path = s[i].src.replace('codepress.js','');
}
}
t = document.getElementsByTagName('textarea');
for(var i=0,n=t.length;i<n;i++) {
if(t[i].className.match('codepress')) {
id = t[i].id;
t[i].id = id+'_cp';
eval(id+' = new CodePress(t[i])');
t[i].parentNode.insertBefore(eval(id), t[i]);
}
}
}
if(window.attachEvent) window.attachEvent('onload',CodePress.run);
else window.addEventListener('DOMContentLoaded',CodePress.run,false);
---------------------------------------------------------------
mein Versuch war folgender, der aber fehlschlug:
function structure() {
document.write("<textarea id=\"cp1\" class=\"codepress php\" style=\"width:700px;height:500px;\" wrap=\"off\"></textarea>");
var Codepress;
Codepress = new Codepress;
CodePress.run;
}
---------------------------------------------------------------
wobei dabei die 2 letzten Zeilen im ursprünglichen Code deaktiviert hatte...
Leider kenne ich mich mit objektorientierten Javascript nicht so gut aus, als das ich dieses Problem allein lösen kann. Das Textarea Element wird dargestellt, Codepress aber nicht aufgerufen (Konstruktor kann laut Firebug nicht aufgerufen werden) Das Textarea Element muss für dieses Problem so aufgerufen werden.
vielen Dank für jede mögliche Lösung
Flupdiwup