amiga-news 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 ("&#91;", "[", $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-2024 by amiga-news.de - alle Rechte vorbehalten.
.