![]() |
ENGLISH VERSION |
|
![]() |
Links | | | Forum | | | Kommentare | | | News melden |
![]() |
Chat | | | Umfragen | | | Newsticker | | | Archiv |
![]() |
amiga-news.de Forum > Forum und Interna > Syntax-Highlighing | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
-1- | [ - Beitrag schreiben - ] |
21.01.2006, 02:54 Uhr _PAB_ Posts: 3016 Nutzer |
Wir haben jetzt ein rudimentäres Syntax-Highlighting. Beispiel: C++ code:#include <iostream.h> int main(int argc, char *argv[]) { // Dies ist ein Hello-World Programm in C++ cout << "Hello, world !" << endl; int i; for (i = 0; i < argc; i++) { cout << i << ". Argument = " << argv[i] << endl; } } Dieses wird aufgerufen durch eine Erweiterung des bekannten [code]-Tags: [code language="..."] ... = C, C++, PHP, Perl, ASP, HSC, HTML, Java, JavaScript, XML, BASIC, Rebol, Shell, Unix-Shell Bisher ist das Ganze allerdings noch nicht sonderlich ausgeklügelt, vieles wird noch fehlen. Ich wäre euch dankbar, wenn Ihr Vorschläge und Hinweise hier posten könntet. Zum testen ist dieses Thema gut geeignet: http://www.amiga-news.de/forum/thread.php?id=20401&BoardID=2 [ - Antworten - Zitieren - Direktlink - ] |
23.01.2006, 18:04 Uhr Holger Posts: 8116 Nutzer |
Das scheint den Kontext nicht richtig zu berücksichtigen, also insb. innerhalb von Kommentaren und Strings werden offenbar trotzdem Operatoren hervorgehoben. Du kannst übrigens gerne meinen Code verwenden, wenn Du willst, der macht das schon korrekt. Falls das Konvertieren von JavaScript zu php Probleme bereitet, helfe ich gerne. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
23.01.2006, 18:06 Uhr _PAB_ Posts: 3016 Nutzer |
Das Problem (innerhalb von Kommentaren) ist, daß ich nicht den Kontext irgendwo speichere und die kursierenden Codes allesamt nur nach Schlüsselwörtern suchen, ich aber gerne auch die Sonderzeichen hervorheben möchte. Nachteil ist, daß in Kommentaren die Sonderzeichen auch hervorgehoben werden, aber das ist IMHO nicht schlimm. Bzw. mir kommt gerade eine Idee, wie ich das abstellen könnte... Sekunde... [ Dieser Beitrag wurde von _PAB_ am 23.01.2006 um 18:08 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
23.01.2006, 18:22 Uhr Holger Posts: 8116 Nutzer |
Na hauptsächlich liegt's wahrscheinlich daran, daß Du das Highlighting in mehreren Suchen/Ersetzen Durchläufen vornimmst... mfg [ Dieser Beitrag wurde von Holger am 23.01.2006 um 18:31 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
23.01.2006, 18:35 Uhr _PAB_ Posts: 3016 Nutzer |
@Holger: > wahrscheinlich daran, daß Du das Highlighting in mehreren Suchen/Ersetzen Durchläufen vornimmst. So ist es. Test C++ code:#include <iostream.h> int main(int argc, char *argv[]) { // Dies ist ein "Hello-World" Programm in C++ cout << "Hello, //world !" << endl; int i; for (i = 0; i < argc; i++) { cout << i << ". /*Argument = */" << argv[i] << endl; } } Habe ein wenig herumprobiert, und besser als obiges Beispiel geht es einfach nicht. Jedenfalls nicht, ohne daß ich meine GoldED-Syntaxparser nach PHP portiere... [ Dieser Beitrag wurde von _PAB_ am 23.01.2006 um 18:50 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
23.01.2006, 18:57 Uhr Holger Posts: 8116 Nutzer |
Mein Hilfeangebot steht noch. Immerhin habe ich ja schon einen regexp-basierten Parser, der das kann. Du mußt mir nur noch sagen, welche Sonderzeichen hervorgehoben werden sollen. preg_replace ist ja wohl perl-kompatibel, damit weiß ich schon mal, welche Ausdrücke unterstützt werden. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
24.01.2006, 00:58 Uhr _PAB_ Posts: 3016 Nutzer |
@Holger: Kannst Du mal Deinen Code hier posten oder mir übers Profil schicken ? Ich verwernde diesen Code hier: php code:while (preg_match ("/^(.*?)\s*[code language=(.*?)\]\s*(.*?)\s*\[\/code\]\r?\n?(.*?)$/is", $out, $matches)) { $lang = $matches[2]; $code = $matches[3]; $lang = preg_replace ("/(?:"|")/", "", $lang); $code = str_replace ("[", "[", $code); $code = html_entity_decode ($code); $code = preg_replace ("/([\[\]]+)/", '[black]${1}[/black]', $code); if (preg_match ("/^(C(\+\+)?|Java|Javascript|PHP|JSP)$/i", $lang)) { $code = preg_replace ("/(\/\/.*?)(r?n|$)/s", '[gray]${1}[/gray]${2}', $code); $code = preg_replace ("/(\/\*.*?\*\/)/s", '[gray]${1}[/gray]', $code); } if (preg_match ("/^(X?HTML|PHP|ASP|HSC|JSP)$/i", $lang)) { $code = preg_replace ("/(<!--.*?-->)/s", '[gray]${1}[/gray]', $code); $code = preg_replace ("/<(DOCTYPE.*?|\/?HTML|\/?HEAD|BODY.*?|\/BODY|FRAME.*?|\/FRAME|FRAMESET.*?|\/FRAMESET)>/is", '[blue]<${1}>[/blue]', $code); } if (preg_match ("/^(C(\+\+)?|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(\#include|\#define|\#ifdef|\#endif|\#else)(\W|$)/", '${1}[red]${2}[/red]${3}', $code); } $code = preg_replace ("/(".*?(?!\\)")/", '[green]${1}[/green]', $code); $code = preg_replace ("/('.*?')/", '[green]${1}[/green]', $code); $code = preg_replace ("/([^\s\w\d\[\]]+)/", '[black]${1}[/black]', $code); $code = preg_replace ("/\[\[black\]\/\[\/black\](black|gray|red|green|blue)\]/", '[/${1}]', $code); $code = preg_replace ("/(\d+)/", '[red]${1}[/red]', $code); if (preg_match ("/^(BASIC)$/i", $lang)) { $code = preg_replace ("/(^|\W)(if|do|else|elsif|end|for|next|repeat|until|wend|while)(\W|$)/i", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(PHP|Perl|C(\+\+)?|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(if|do|else|for|until|while)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(PHP|Perl|C(\+\+)?|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(case|default|switch)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(PHP|C(\+\+)?|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(elseif)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(PHP|Perl)$/i", $lang)) { $code = preg_replace ("/(^|\W)(elsif)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(C(\+\+)?|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(break|continue|inline)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); $code = preg_replace ("/(^|\W)(auto|char|const|double|enum|extern|float|int|long|short|signed|sizeof|static|struct|typedef|union|unsigned|void)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(C(\+\+)?)$/i", $lang)) { $code = preg_replace ("/(^|\W)(asm|goto|register)(\W|$)/", '${1}[red]${2}[/red]${3}', $code); } if (preg_match ("/^(C\+\+)$/i", $lang)) { $code = preg_replace ("/(^|\W)(cout|cin|endl)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); $code = preg_replace ("/(^|\W)(bool|catch|const_cast|delete|dynamic_cast|explicit|mutable|namespace|operator|reinterpret_cast|static_cast|typeid|typename|using|virtual|volatile|wchar_t)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(C\+\+|Java|Javascript)$/i", $lang)) { $code = preg_replace ("/(^|\W)(boolean|class|friend|new|private|protected|public|string|template|this|throw|try)(\W|$)/", '${1}[blue]${2}[/blue]${3}', $code); } if (preg_match ("/^(Rebol)$/i", $lang)) { $code = preg_replace ("/(^|\W)(any|binary|close|delete|dir|do|error|exists|foreach|forever|function|if|loop|make-dir|modified|not|print|quit|read|reduce|rename|save|send|size|until|wait|write)(\W|$)/i", '${1}[blue]${2}[/blue]${3}', $code); } $code = htmlentities ($code); $out = $matches[1].'</font><blockquote>'.get_last_font().$lang.' code:</font><hr><font face="Courier New, Courier, monospace" color="#400080"><pre>'.$code.'</pre></font><hr></blockquote>'.get_last_font().$matches[4]; } // ---- Ohne Syntax-Highlighting $out = preg_replace ("/[code\]\s*(.*?)\s*\[\/code\]\r?\n?/is", '</font><blockquote>'.get_last_font ().'code:</font><hr><font face="Courier New, Courier, monospace" color="#400080"><pre>${1}</pre></font><hr></blockquote>'.get_last_font(), $out); [ Dieser Beitrag wurde von _PAB_ am 11.04.2006 um 19:01 Uhr geändert. ] [ - Antworten - Zitieren - Direktlink - ] |
24.01.2006, 15:59 Uhr Holger Posts: 8116 Nutzer |
Die aktuelle Fassung liegt immer noch hier http://www.math.tu-berlin.de/~pietsch/test/AN_Hervorhebung.html d.h. in JavaScript. Ich kann auch versuchen, sie nach perl zu konvertieren, das würde mangels greifbarer Testumgebung etwas dauern. Ich habe auch schon überlegt, ob ich den code in eine multi-pass Variante umforme. Dann bräuchte er tendenziell weniger Speicher, wäre allerdings evtl. etwas langsamer. Zumind. war das meine Vermutung für JavaScript, wie es nach der perl Konvertierung aussieht, weiß ich nicht. Für Deinen jetzigen Code kann ich schon mal empfehlen, statt "W oder Zeilenanfang/Zeilenende" einfach "b" zu verwenden (Wortgrenze). Das macht den Code schon mal deutlich lesbarer (so lesbar wie regexp überhaupt werden können...) und die Keywords, genauso wie in meinem Code, zuerst in einem String zu sammenzustellen, bevor man den Ersetzungsvorgang durchführt. Das ist nicht nur effizienter, sondern macht den Code lesbarer, insb. wenn man die Erkennung auf alle gültigen Keywords der Sprachen ausweitet und vor allem, wenn die Anzahl der unterstützen Sprachen steigt. Andernfalls explodiert die Codemenge ziemlich bald. mfg -- Good coders do not comment. What was hard to write should be hard to read too. [ - Antworten - Zitieren - Direktlink - ] |
-1- | [ - Beitrag schreiben - ] |
amiga-news.de Forum > Forum und Interna > Syntax-Highlighing | [ - Suche - Neue Beiträge - Registrieren - Login - ] |
![]() |
Impressum |
Datenschutzerklärung |
Netiquette |
Werbung |
Kontakt
Copyright © 1998-2025 by amiga-news.de - alle Rechte vorbehalten. |
![]() |