Syntax-Highlighting-Algorithmus
-
Hallo.
Nein, dies ist keine Anfrage, ob ich den SH-Mod haben kann!
Ich brauch bloß mal eure Hilfe. Ich hab für www.programmers-united.com (genauer, für's Board) ein SH geschrieben, das beliebig viele Sprachen unterstützt. Leider ist dieser extrem langsam
, da die Beiträge Zeichen für Zeichen durchgegangen werden (eine genauere Beschreibung des Vorgehens gibt's hier)
Daher habe ich mich ein wenig umgesehen, ob es da nicht schnellere Algorithmen gibt.
Der PHP-Source konnte mir nicht weiterhlfen, da er selbst in C geschrieben wurde. auf codeproject und codeguru hab ich auch bloß Javascript, C++ und C# Lösungen gefunden, die ich aber nicht in PHP portieren kann.
Kennt jemand von euch gute Seiten, in denen solche Algorithmen allgemeine genug beschrieben werden, damit ich einen entsrepchenden PHP-Algorithmus selbst aufsetzen kann?
Bye.
-
- Warum machst du immer $syntax['cpp']['blablabla_begin'] und ['blablabla_end']? Mach doch ein einziges Array und wenn das Zeichen nicht in dem Array vorkommt, ist das Keyword, etc. einfach zu Ende. Dürfte weniger umständlich sein. Evtl. wäre noch eine Unterscheidung erstes Zeichen - restliche Zeichen sinnvoll, denn wenn das 1. Zeichen eine Zahl ist, dann kann es kein Keyword sein.
- Wieso array("+","-","","/","(",")","[","]","{","}"," ",";",",","\n",":",".","&","'",'"');
Nimm doch einen großen String "+-/()[]{}[usw.]" und prüfe mit strchr, ob das Zeichen darun vorhanden ist.
- Schau dir mal strspn/strcspn an, die dürften schneller sein, als immer alle Zeichen einzeln zu testenWenn du jeweils mit strchr prüfst, zu welcher Kategorie (Operator, Keyword, ...) ein unbekanntes Zeichen gehört, dann mit strspn feststellst, wie lang dieser Teil ist, und dann immer so weiter, musst du eigentlich viel weniger einzelne Zeichen vergleichen
-
Hallo.
Danke für deine Hiwneise, ich werd's mal probieren.
Bye.
-
also du brauchs ein booster, ein cache system hatt mir auch schon bei den last-topic-on-index geholfen
pseudo code
$cpp_code = 'int main(){}'; $csumm = crc32($cpp_code); //$cache ist ein static variable if(isset($cache[$csumm])) { return $cache[$csumm]; } else { $code_bunt = cpp_syntax_coloring($cpp_code); $cache[$csumm] = $code_bunt; if(size($cache) > 20) //pope ein element weg, sonst wird das array zu groß return $cache[$csumm]; }
-
Dimah schrieb:
also du brauchs ein booster, ein cache system hatt mir auch schon bei den last-topic-on-index geholfen
Was genau bewirkt dieser Booster? Allein vom Code den Sinn ableiten kann ich um diese Uhrzeit nicht mehr
Find ich klasse von dir, dass du mich so unterstützt, Dimah *respekt*
Bye.
-
Ich würde sagen, er speichert die letzten n Quelltextformatierungen zwischen, damit ein Text, der zweimal kurz hintereinander verarbeitet werden soll, nur einmal verarbeitet werden muss; beim zweiten mal kann das gespeicherte Ergebnis vom ersten mal verwendet werden.
Ich finde, das ist zwar eine gute Idee, aber so eine crc32/fingerprint/hash/... ist nicht eindeutig; bei zwei unterschiedlichen Inhalten kann immer noch eine gleiche CRC rauskommen, auch wenn's unwahrscheinlich ist. Da muss irgendwas eindeutiges her...
-
tag schrieb:
Ich finde, das ist zwar eine gute Idee, aber so eine crc32/fingerprint/hash/... ist nicht eindeutig; bei zwei unterschiedlichen Inhalten kann immer noch eine gleiche CRC rauskommen, auch wenn's unwahrscheinlich ist. Da muss irgendwas eindeutiges her...
Das meinst du nicht im Ernst, oder?
Der Login des phpbb arbeitet auch mit Session-IDs, wenn Cookies nicht gehen. Wenn ich eine zufällige ID generiere und in die URL setze, wie hoch ist dann die Wahrscheinlichkeit, dass ich als Admin eingeloggt bin? Oder auch nur als irgendein anderer User? Ist das nicht ein gewaltiges Sicherheitsloch?Glaub mir, eine Checksumme reicht zur Unterscheidung völlig aus, die ist eindeutig genug.
Selbst bei nur 32Bit gibt es ja schon über 4 Milliarden Checksummen. Wenn der Cache die letzten 20 Einträge speichert, ist die Wahrscheinlichkeit dermaßen gering, dass zwei Postings dieselbe Checksumme haben, die kann man fast als 0 ansehen.Wenn du dir da so unsicher bist, muss man halt eine Hashtabelle anlegen und zusätzlich zur ID noch den ganzen Code vergleichen.
-
Es ist dieses fast, das mich stört... Aber denkt an meine Worte, wenn alles den Bach runter geht *Muahahaha* *gespenstisches-Lachen-aus-dem-Hintergrund* *Umhang-umschwing* *Rauchwolke* *Abgang*
Aber warum nicht eine Kombination aus Beitragsnummer/Nummer des Code-tags im Beitrag? Dann sind's halt 40 Bit... Pffft... Egal, is nich mein Bier :p
P.S. Nein, dieses miese Wortspiel war unbeabsichtigt
-
na, hast du den cache eingebaut, oder soll ich dir helfen?
-
Hallo.
ich bin für jede HIlfe dankbar. Bis jetzt konnte ich noch nicht am Mod weiterarbeiten, da ich zuviel um ie Ohren hatte
Bye.
-
was ist woll schneller, ein parser lauf der SH funktion oder ein SELECT und ein UPDATE?