Lokales Syntax Highlighting


  • Mod

    Dann nimm GeSHi: http://qbnz.com/highlighter/

    Und schreib dir die HTML Dateien selber raus. Du kannst PHP ja auch über die Commandozeile ausführen. Und Syntaxhighlight ist nicht so trivial wie du vielleicht denkst. Nimm eine bestehende Lösung: es gibt massig.

    Ich würde wie gesagt GeSHi nehmen. nmans Lösung läuft nur im Browser, das passt hier wohl eher nicht. Ich hätte aber auch ehrlich gesagt von deinem 1. Post aus etwas komplett anderes verstanden.

    Deshalb nochmal langsam zum mitschreiben:

    Du hast irgendwo Quellcode liegen. Diesen willst du jetzt in eine HTML Datei mit Syntax Highlight umwandeln. Und dafür willst du jetzt ein Tool haben.

    GeSHi kann das zB. Oder aber Tools wie Doxygen, etc. die eben Dokumentationen des Codes erstellen - da sind dann auch Hyperlinks zwischen Funktionen möglich. Die meisten IDEs haben auch eine Möglichkeit des Syntaxgehighlighteten exportes...



  • Shade Of Mine schrieb:

    Du hast irgendwo Quellcode liegen. Diesen willst du jetzt in eine HTML Datei mit Syntax Highlight umwandeln. Und dafür willst du jetzt ein Tool haben.

    Ne, da könnte ich mir ja einfach ein Programm für schreiben. Ich habe einmal eine HTML-Datei und einmal Quellcode in einer separaten Datei. Wenn ich diese HTML-Datei jetzt mit dem Browser öffne (lokal), dann soll unter anderem der Quellcode farbig dargestellt werden. Also ganz einfach, so wie:

    <html>
      <head>
        <title> Test </title>
        <link rel="stylesheet" type="text/css" href="style/style.css">
        <script language="JavaScript" src="script/highlight.js"></script>
      </head>
      <body>
        <iframe name="c-code" src="code/test.c"></iframe>
        <script> highlight_code("c-code"); </script>
      </body>
    </html>
    

    Shade Of Mine schrieb:

    Und Syntaxhighlight ist nicht so trivial wie du vielleicht denkst.

    Also in C++ schon, ich bin jetzt nicht davon ausgegangen, dass es in einer Scriptsprache wesentlich schlechter aussieht. 🙂



  • Edit: kleinere Korrekturen vorgenommen 😃

    cooky451 schrieb:

    ShadowTurtle schrieb:

    Ich gehe nun davon langsam aus, dass du einen Zentralen Synthax-Highlighter einrichten möchtest und die Quelle dezentral (Quellcode) irgendwo liegen kann.

    Ja, was denn sonst?

    ShadowTurtle schrieb:

    So gesehen bringt es nicht wirklich etwas, den gesamten Quellcode in die HTML-File einzubinden.

    ?

    Herje.. Halt so wie du es schon beschrieben hast:

    cooky451 schrieb:

    ShadowTurtle schrieb:

    So gesehen würde ich doch die einfachere Variante nehmen, die du selbst bereits vorgeschlagen hast. Komische Hacks.. tseee...

    Es ist nur etwas nervig, statt dem normalen Code

    var xy = 
      "int main()\r\n"
      "{\r\n"
      "  printf(\"blubb.\");\r\n"
      "}\r\n";
    

    so was schreiben zu müssen.
    ...

    cooky451 schrieb:

    ShadowTurtle schrieb:

    Jemand der so etwas nicht weiss, der hätte deine Anforderung vom ersten Post weg als eine bescheuerte Frage betrachtet, cooky451.

    Ja.. was genau war an

    cooky451 schrieb:

    Ich will in einer .html Datei, die Lokal zu öffnen ist, (also php/ähnliche Scripte die nur auf Servern laufen gehen nicht) Code Stellen einbauen, die z.B. so aussehen wie die hier im Forum.
    Und das am besten einfach nur mit der Angabe auf eine Datei, in der nichts als der Quelltext selbst steht.

    nicht zu verstehen? 😞

    Eigentlich alles. Ich habe das aber nur nochmal angespro..geschrieben, weil Shade Of Mine mal folgendes meinte und da habe ich auf nette art und weise einfach Bezug genommen:

    Shade Of Mine schrieb:

    wo kommt der Code denn her?
    Du brauchst den nur in einer HTML Datei drinnen zu haben die du mit dem Browser öffnest, den Rest kannst du über javascript machen.

    cooky451 schrieb:

    ShadowTurtle schrieb:

    Den Inhalt eines IFrames kannst du wie folgt auslesen. Aber aufpassen, weil folgender Snippsel nicht mit jeden Browser funktioniert:

    Hatte ich auch schon gefunden, geht aber unter Firefox leider nicht.

    Also bei mir funktioniert das mit Firefox 3.6.13. Das heißt also, dass die neuere Versionen bei behandlung von Lokalen Dateien sicherer geworden sind.

    Ich habe darauf hin mal mit dem IETester Tests in folgende Internet Explorer Versionen durchgeführt:

    • Internet Explorer 5.5
    • Internet Explorer 6
    • Internet Explorer 7
    • und Internet Explorer 8

    Im Ergebniss haben die Snippselteile allesamt bis zu IE 8 funktioniert. IE 9 kann ich am Testsystem noch nicht testen. Jetzt bitte nicht fragen weshalb ich noch Firefox 3.6.13 und nur bis zu IE8 alles auf den Testrechner habe... 😃

    Es kann aber nicht sein das ältere Firefox-Versionen einen Propitären DOM-Aufbau haben. Zur Sicherheit habe ich folgenden Snippet zur Inhaltsgewinnung des Frames ausprobiert:

    frames[iFrameName].document.body.innerHTML
    

    Bis auf den Internet Explorer 5.5 arbeiten alle Webbrowser mit dieser Variante. Außer mal wieder der Chrome Webbrowser.

    cooky451 schrieb:

    Oh man.. Javascript wird mir immer unsympathischer, was ein Gefrickel. 🙂

    Dann lies mal das ein paar Zeilen weiter ... 😃

    cooky451 schrieb:

    ShadowTurtle schrieb:

    Für das anschließende Synthax-Highlighting solltest du wirklich ein bereits fertiges Framework oder Lib. verwenden.

    Na die ~5 Zeilen Code sind ja jetzt nicht so das Problem, wenn ich an den Text des iframes kommen würde.

    Ich hoffe du hast in den ~5 Zeilen Code mit einberechnet, dass "plaaa".replace('a', 'b') das Zeichen 'a' nur einmal ersetzt wird und die restlichen bleiben. Wie das aktuell implementiert ist, dass weiss ich nicht, weil ich eine kleine Standardbibliothek zur Arbeitserleichterung verwende *man möge mich nicht schlagen, dass ich das deswegen nicht mehr so genau weiß 😃 *

    cooky451 schrieb:

    ShadowTurtle schrieb:

    Wie willst du z.B. PHP- & HTML-Quellcode oder C++ & ASM-Quellcode parsen, wenn du einfach nur einfärbst statt richtig zu parsen? Also lass das mit der Eigenprogrammierung in diesen Fall und verwende etwas etabliertes.

    Wer redet denn jetzt auf einmal von Parsen? Einfärben ist wie bereits erwähnt trivial und ich brauche definitiv nur eine Sprache in einem Feld.

    Ok das hat sich dann. Kannst aber trotzdem noch den Highlighter ausprobieren. Ich bin nur davon ausgegangen, dass in deinen C++ Sources auch extern "c" sources und so drin vorkommen kann. Da gibt es (wenn auch eigentlich minimalistische) kleine Unterschiede, die ich (zugegebenermaße) nun nicht spontan beschreiben kann. Aber eben jene müssen auch beachtet werden und das geht nur via Parsing am besten. Die hier vorgestellten Bibliotheken können das sehr gut.

    OnLoad statt setTimeout

    Bevor ich es vergesse: Statt setTimeout kannst du auch onload als Attribut im body-tag verwenden. Als Wert muss der Funktionsaufruf einer vorhandenen Javascript-Funktion angegeben werden.

    Jedoch verhalten sich hier die Webbrowser wieder unterschiedlich: Einmal gilt eine Webseite schon als geladen sobald die Hauptseite geladen ist, aber der andere Browser triggert OnLoad erst, wenn auch das letzte IFrame komplett geladen ist.

    Kompatiblität zum Chrome-Webbrowser

    Ich habe soeben festgestellt, dass das Auslesen von IFrames in Chrome bei lokal geladenen Dateien nicht funktioniert. Das liegt höchstwahrscheinlich an einer Sicherheitseinstellung. In Firefox funktionierts. Aber ich glaube dass die Regelung genau so auch für verschiedene Ajax-Techniken gelten würde. Von daher gehe ich mal aus, dass wegen dem Sicherheitsaspekt ein Hinweis zur unbedingten Verwendung einer Ajax-Technik hier falsch am Platz wäre.

    Testcode

    Nachfolgend noch kurz der Testcode:

    <html>
    	<head>
    		<script type="text/javascript">
    			function getContentFromIframe(iFrameName)
    			{
    				return( frames[iFrameName].document.body.innerHTML );
    
    				/*
    				var myIFrame = document.getElementById(iFrameName);
    				var content = myIFrame.contentWindow.document.body.innerHTML;
    
    				return( content );
    				*/
    			}
    
    			setTimeout( function() {
    				document.getElementById("my_container").innerHTML = getContentFromIframe("code_frame");
    			}, 2000 );
    		</script>
    	</head>
    	<body>
    		<div id="my_container"></div>
    
    		<iframe src="blob.txt" width="90%" height="400" name="code_frame" id="code_frame">
    			<p>Ihr Browser kann leider keine eingebetteten Frames anzeigen:
    			Sie k&ouml;nnen die eingebettete Seite &uuml;ber den folgenden Verweis
    			aufrufen: ...</p>
    		</iframe>
    	</body>
    </html>
    


  • cooky451 schrieb:

    Shade Of Mine schrieb:

    Du hast irgendwo Quellcode liegen. Diesen willst du jetzt in eine HTML Datei mit Syntax Highlight umwandeln. Und dafür willst du jetzt ein Tool haben.

    Ne, da könnte ich mir ja einfach ein Programm für schreiben. Ich habe einmal eine HTML-Datei und einmal Quellcode in einer separaten Datei. Wenn ich diese HTML-Datei jetzt mit dem Browser öffne (lokal), dann soll unter anderem der Quellcode farbig dargestellt werden.

    Wenn man sich das aber mal genauer überlegt, dann ist die Lösung von Shade Of Mine doch die nützlichere Variante. Ich dachte das hättest du verstanden, nachdem du bereits schon festgestellt hast, dass meine Lösung aus irgendwelchen Gründen nicht so funktioniert wie es soll.

    Was willst du mit einen System welches aus Sicherheitsrelevanten gründen (siehe mein letztes Posting) bald (eig. schon jetzt) wirklich abgedankt hat?
    Besser vorführen/zeigen/verdeutlichen kann ich das nicht mehr _und_ trotzdem habe ich versucht auf deinen Wunsch einzugehen (um auch selbst mal zu sehen ob die IFrame-Technik auch heute noch "Ok" ist).

    Es kann auch es auch nicht sein, dass man wegen eines Codebetrachters tatsächlich die lokalen Sicherheitseinstellungen runter schrauben muss. Im Privateinsatz, innerhalb einer Virtual Machine ist das etwas anderes. Aber auf der Arbeit?? 😮

    Also mach lieber ein Programm, denn da dürfte der Synthax-Highlighter wohl genau so trivial ausfallen. Oder verwende doch ein Code-Documentation System!

    Wieso schlägst du cooky451 nicht so ein System vor, Shade Of Mine ?



  • ShadowTurtle schrieb:

    Also mach lieber ein Programm

    Nein, das ist nervig, genau das will ich ja vermeiden. Das muss doch auch dynamisch möglich sein. 🙂
    Dein Testcode funktioniert sogar bei mir, vielleicht habe ich vorher einfach kein Delay eingebaut. Ich versuche mich gerade mit onLoad, aber leider kann ich der Funktion kein Argument übergeben?
    http://www.w3schools.com/jsref/event_frame_onload.asp
    Die Beispiele hier sind alle Parameterlos. Versucht habe ich schon:

    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight("c-code")"></iframe>
    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight(c-code)"></iframe>
    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight(\"c-code\")"></iframe>
    

    Die Funktion wird leider nie aufgerufen. Wie geht das richtig?



  • OnLoad geht nur im Body-Tag, dass hatte ich vergessen zu erwähnen, sollte auch nur im Hauptquellcode verwendet werden. Möchtest du ein Crossbrowser-Kompatibles OnLoad empfiehlt sich tatsächlich ein ausgereiftest Framework wie jQuery zu verwenden.

    Ansonsten denke ich immer noch, dass die Lösung von Shade Of Mine ist richtiger ist.

    Was mir gerade einfällt und eventuell extrem wichtig ist:

    Es könnte Unterschiede geben, sobald der Webbrowser aus irgendeinem Grund im Quirksmodus läuft. Vielleicht ist das ja der Fall und das dürfte der Unterschied zwischen meinen Snippsel sein und.. naja.. kA.

    Und Funktionsaufrufe (mit einem String) werden immer noch so gemacht:
    highlight("c-code")
    !



  • ShadowTurtle schrieb:

    OnLoad geht nur im Body-Tag, dass hatte ich vergessen zu erwähnen, sollte auch nur im Hauptquellcode verwendet werden.

    Im Hauptquellcode?
    Wie auch immer, wenn ich eine Testfunktion ohne Parameter nehme funktioniert es ja einwandfrei..

    ShadowTurtle schrieb:

    Und Funktionsaufrufe (mit einem String) werden immer noch so gemacht:
    highlight("c-code")
    !

    Das wiederrum funktioniert leider nicht. (Also in Verbindung mit onLoad.)

    Edit:
    Nachdem ich das Ganze einfach mal mit einem Delay getestet habe, musste ich feststellen, dass man auch nicht den sauberen Text bekommt, sondern von HTML-Codes kaputt gemacht Zeichen. (&xy, etc.)

    So langsam wird mir ein einfaches C++ Programm doch schmackhaft, oh man, was ein Gefrickel..

    Da ich jetzt aber den Text habe wäre erst mal alles geklärt, nur das onLoad() wäre halt noch schön.



  • Was ist überhaupt dein Hauptziel? Beschreibe das doch mal näher, als bis zu der Geschichte mit den Dateizugriff und lokalem Syntax Highlighting.

    Es wäre eventuell doch ratsam ein bereits fertiges System für deine Sache einzusetzen, sollte anderweitiger Anspruch für die Umsetzung zu lange benötigen.

    Ansonsten ....

    cooky451 schrieb:

    ShadowTurtle schrieb:

    OnLoad geht nur im Body-Tag, dass hatte ich vergessen zu erwähnen, sollte auch nur im Hauptquellcode verwendet werden.

    Im Hauptquellcode?
    Wie auch immer, wenn ich eine Testfunktion ohne Parameter nehme funktioniert es ja einwandfrei..

    ShadowTurtle schrieb:

    Und Funktionsaufrufe (mit einem String) werden immer noch so gemacht:
    highlight("c-code")
    !

    Das wiederrum funktioniert leider nicht. (Also in Verbindung mit onLoad.)

    Ich deute jetzt einfach mal auf die Stückchen highlight(c-code) und highlight(\"c-code\") hin, wie du sie hier angewendet hast: 🙂

    cooky451 schrieb:

    Die Beispiele hier sind alle Parameterlos. Versucht habe ich schon:

    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight("c-code")"></iframe>
    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight(c-code)"></iframe>
    <iframe name="c-code" src="code/test.c" width="800" onLoad="highlight(\"c-code\")"></iframe>
    

    Ok wobei c-code nur ein indirekter Fehler sein dürfte wenn ein schlechter Javascript-Debugger am start ist. Aber das ist doch eigentlich wurst.

    cooky451 schrieb:

    Nachdem ich das Ganze einfach mal mit einem Delay getestet habe, musste ich feststellen, dass man auch nicht den sauberen Text bekommt, sondern von HTML-Codes kaputt gemacht Zeichen. (&xy, etc.)

    Diese komischen HTML-Codes sind sogenannte HTML-Entities und auch sehr sinnvoll. Du bräuchstest einen HTML-Entitie decoder in Javascript programmiert. Also ein Ding welches die Zeichen selbst nochmals umkonvertiert.

    Sollten die Quellcode Dateien jedoch auf einen Linux/Unix-Server liegen, dann brauchst du solch einen decoder nicht einmal.
    Gehe hin und mache eine Einstellung, dass ein bestimmter Content-Type + Mime gesendet wird sobald eine File aus dem Quellcode-Ordner gelesen werden soll. Dafür müsstest du dann auch via SSH (oder ähnlichem) an den Sources arbeitest von der du eine Darstellung möchtest. Wie das genau geht kA. aber entsprechende Tools gibt es, soweit weiss ich noch. 😞

    Ansonsten musst du halt ein komplettes Code-Controlling-System verwenden (siehe Rat zur Verwendung eines bereits fertigen Systems).

    cooky451 schrieb:

    So langsam wird mir ein einfaches C++ Programm doch schmackhaft, oh man, was ein Gefrickel..

    Das Programm muss nicht unbedingt in C++ geschrieben sein. Es kann auch in PHP geschrieben sein. Für die Ausführung von PHP benötigst du kein Apache, XAMPP oder ähnliches. Das ist meistens ein großer Irrtum dem die meisten unterliegen.

    Mit PHP kannst du also auch gleich, wie bereits von Shade Of Mine empfohlen GeSHi verwenden.

    cooky451 schrieb:

    Da ich jetzt aber den Text habe wäre erst mal alles geklärt, nur das onLoad() wäre halt noch schön.

    <body onload="funktion();">
    

  • Mod

    cooky451 schrieb:

    So langsam wird mir ein einfaches C++ Programm doch schmackhaft, oh man, was ein Gefrickel..

    Weil das was du willst Bloedsinn ist. Die korrekte Loesung habe ich dir schon gesagt. Sind vielleicht 4 Zeilen PHP Code.

    HTML und JavaScript sind fuer das was du machen willst halt einfach die falsche Technologie.



  • Shade Of Mine schrieb:

    cooky451 schrieb:

    So langsam wird mir ein einfaches C++ Programm doch schmackhaft, oh man, was ein Gefrickel..

    Weil das was du willst Bloedsinn ist. Die korrekte Loesung habe ich dir schon gesagt. Sind vielleicht 4 Zeilen PHP Code.

    HTML und JavaScript sind fuer das was du machen willst halt einfach die falsche Technologie.

    Du wusstest doch aber vorher nicht genau ob er überhaupt die Möglichkeit hat PHP einzusetzen. Schließlich gibt es auch Dinge die nur Clientseitig funktionieren sollen.
    Da kann man zwar auch PHP empfehlen (habe ich doch auch getan!), aber nicht wirklich ist jemand darauf eingegangen. Kein Wunder, schließlich wurde die Idee (für ein externes Programm) auch schon im vorfeld ausgeschlossen.

    Ich denke hier lag einfach ein Kommunikationsproblem und gleichzeitiger Hilfsbedarf vor. Wohlgleich meine Hilfe zwar da war, aber im grunde obsolet ist/war, weil (und da muss ich zweifelsohne zustimmen):

    Shade Of Mine schrieb:

    HTML und JavaScript sind fuer das was du machen willst halt einfach die falsche Technologie.

    und folgendes die ganze Zeit hinweg im Raum stand:

    cooky451 schrieb:

    Shade Of Mine schrieb:

    Du hast irgendwo Quellcode liegen. Diesen willst du jetzt in eine HTML Datei mit Syntax Highlight umwandeln. Und dafür willst du jetzt ein Tool haben.

    Ne, da könnte ich mir ja einfach ein Programm für schreiben. Ich habe einmal eine HTML-Datei und einmal Quel....


Anmelden zum Antworten