3063370895
24.04.2023, aktualisiert um 14:22:52 Uhr
2588
20
1
Syntax-Highlighting
Hi,
Ich glaube der Titel sagt alles. Ich weiß nicht wie aufwendig/realistisch es ist das umzusetzen, aber ein Syntax-Highlighting für die meistgenutzten (Skript-)Sprachen (Powershell? ❤️) wäre ein absolutes Traumfeature.
Vielleicht gibt es da ja was fertiges, ohne das Rad neu zu erfinden.
-Thomas
Ich glaube der Titel sagt alles. Ich weiß nicht wie aufwendig/realistisch es ist das umzusetzen, aber ein Syntax-Highlighting für die meistgenutzten (Skript-)Sprachen (Powershell? ❤️) wäre ein absolutes Traumfeature.
Vielleicht gibt es da ja was fertiges, ohne das Rad neu zu erfinden.
-Thomas
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 6895718524
Url: https://administrator.de/forum/syntax-highlighting-6895718524.html
Ausgedruckt am: 21.12.2024 um 17:12 Uhr
20 Kommentare
Neuester Kommentar
Hi,
für PHP und HTML haben wir es bereits. Für Bash und Powershell haben wir noch kein Syntax-Highlighting. Leider fehlt mir dafür fast immer die Zeit. Vielleicht kann mir jemand helfen.
Update: Ich habe mir endlich die Zeit genommen, dies neu zu implementieren. Siehe Kommentar unter. Der hier veröffentlichte Quellcode ist daher nicht mehr aktuell und wurde gelöscht.
Viel Erfolg
Gruß
Frank
für PHP und HTML haben wir es bereits. Für Bash und Powershell haben wir noch kein Syntax-Highlighting. Leider fehlt mir dafür fast immer die Zeit. Vielleicht kann mir jemand helfen.
Update: Ich habe mir endlich die Zeit genommen, dies neu zu implementieren. Siehe Kommentar unter. Der hier veröffentlichte Quellcode ist daher nicht mehr aktuell und wurde gelöscht.
Viel Erfolg
Gruß
Frank
Moin,
ich gehe mal davon aus, dass wir hier nicht die ersten mit solch einem Anliegen sind.
Ggf. kann man ja dieses einbinden/ adaptieren:
https://helgeklein.com/blog/syntax-highlighting-powershell-code-in-html- ...
Wobei dort ja ein bestehendes Script analysiert und dann individuell in eine HTML-Variante konvertiert wird...
ich gehe mal davon aus, dass wir hier nicht die ersten mit solch einem Anliegen sind.
Ggf. kann man ja dieses einbinden/ adaptieren:
https://helgeklein.com/blog/syntax-highlighting-powershell-code-in-html- ...
Wobei dort ja ein bestehendes Script analysiert und dann individuell in eine HTML-Variante konvertiert wird...
Gibts evtl. Wildcards? So könnte man mit Get-* oder Set-* schon einiges erschlagen.
Ich denke man müsste hier diesen Teil anpassen, damit das geht:
Es müsste ja auch nicht alles funktionieren oder?
Hab nicht viel Zeit aber wäre gerne bereit hier etwas mitzuhelfen wenn ich kann.
Ich denke man müsste hier diesen Teil anpassen, damit das geht:
for ($i = 0; $i <= count($funcs) - 1; $i++) {
>> $search_pattern = "/\b$funcs[$i]\b/i";
$replacement = '<span class="keyword">${0}</span>';
$code = preg_replace($search_pattern, $replacement, $code);
}
Es müsste ja auch nicht alles funktionieren oder?
Hab nicht viel Zeit aber wäre gerne bereit hier etwas mitzuhelfen wenn ich kann.
@em-pie
Das Skript ist für Powershell um Powershell zu highlight, siehe Header:
Das kann man schlecht 1 zu 1 auf PHP umbauen, da dort Windows Powershell Funktionen verwendet werden, die nicht so ohne weiteres in PHP laufen. Ich geh mal stark davon aus, dass der Websever hier auf Linux läuft oder?
Das Skript ist für Powershell um Powershell zu highlight, siehe Header:
- Example: .\Highlight-Syntax.ps1 .\Get-AppVPackageDependencies.ps1
Das kann man schlecht 1 zu 1 auf PHP umbauen, da dort Windows Powershell Funktionen verwendet werden, die nicht so ohne weiteres in PHP laufen. Ich geh mal stark davon aus, dass der Websever hier auf Linux läuft oder?
@3063370895
in der Datei https://github.com/scrivo/highlight.php/blob/master/src/Highlight/langua ...
findet sich eine Zeile:
Die genau das macht, was ich meinte mit den Wildcards für z.B. Get-
daran könnte man sich anlehnen oder das JSON komplett übernehmen wenn das hier eine beherscht.
in der Datei https://github.com/scrivo/highlight.php/blob/master/src/Highlight/langua ...
findet sich eine Zeile:
122 "begin": "(Add|Clear|Close|Copy|Enter|Exit|Find|Format|Get|H......
Die genau das macht, was ich meinte mit den Wildcards für z.B. Get-
daran könnte man sich anlehnen oder das JSON komplett übernehmen wenn das hier eine beherscht.
Hi,
Ich habe das schon eine Weile vor mir hergeschoben. Also danke für den Anstoß @3063370895 .
Der Hinweis auf die Bibliothek "https://github.com/scrivo/highlight.php" war gut. So gut, dass ich sie jetzt für die Syntaxhervorhebung eingebaut habe. Mit ein paar Anpassungen funktioniert es einwandfrei.
Zusätzlich habe ich die Struktur und die Zeilennummern in unserer Codeausgabe geändert (das war für die Bibliothek notwendig). Die Zeilennummern sind nicht mehr Teil des eigentlichen Quellcodes und werden jetzt per Javascript erzeugt.
Außerdem gibt es endlich einen Button zum Kopieren des Quellcodes. Einfach mit der Maus über den Quellcode fahren und der "Kopieren"-Button erscheint.
Unsere Seite unterstützt nun folgende Sprachen und erkennt diese, wenn möglich, automatisch.
Die bisherigen Angaben des Typs werden weiterhin berücksichtigt und type=plain bleibt unverändert.
Ich hoffe, es gefällt euch. Sollte sich ein Fehler eingeschlichen haben, schickt mir bitte eine interne Nachricht.
Gruß
Frank
Ich habe das schon eine Weile vor mir hergeschoben. Also danke für den Anstoß @3063370895 .
Der Hinweis auf die Bibliothek "https://github.com/scrivo/highlight.php" war gut. So gut, dass ich sie jetzt für die Syntaxhervorhebung eingebaut habe. Mit ein paar Anpassungen funktioniert es einwandfrei.
Zusätzlich habe ich die Struktur und die Zeilennummern in unserer Codeausgabe geändert (das war für die Bibliothek notwendig). Die Zeilennummern sind nicht mehr Teil des eigentlichen Quellcodes und werden jetzt per Javascript erzeugt.
Außerdem gibt es endlich einen Button zum Kopieren des Quellcodes. Einfach mit der Maus über den Quellcode fahren und der "Kopieren"-Button erscheint.
Unsere Seite unterstützt nun folgende Sprachen und erkennt diese, wenn möglich, automatisch.
'accesslog', 'php', 'powershell', 'html', 'css', 'ini', 'javascript', 'json', 'basic', 'bash', 'cmd', 'apache', 'ruby', 'python', 'perl', 'yaml', 'vim', 'dockerfile', 'http', 'shell', 'typescript', 'vbnet', 'xml'
Die bisherigen Angaben des Typs werden weiterhin berücksichtigt und type=plain bleibt unverändert.
Ich hoffe, es gefällt euch. Sollte sich ein Fehler eingeschlichen haben, schickt mir bitte eine interne Nachricht.
Gruß
Frank
Find ich ebenfalls super 👍 . Vor allem erleichtert das auf einem Androiden das Kopieren, wo man vorher leicht die ganze Seite ausgewählt hat.
Ich würde das "Kopieren" noch durch ein entsprechendes SVG Symbol ersetzen und eventuell vielleicht halbtransparent, sonst verdeckt der "große Button" manchmal aus versehen Code-Bestandteile wenn die Maus drüber verweilt.
Vorschlag:
Grüße Uwe
Ich würde das "Kopieren" noch durch ein entsprechendes SVG Symbol ersetzen und eventuell vielleicht halbtransparent, sonst verdeckt der "große Button" manchmal aus versehen Code-Bestandteile wenn die Maus drüber verweilt.
Vorschlag:
Grüße Uwe
Update:
Die Syntax Highlighting Bibliothek https://github.com/scrivo/highlight.php ist generell gut, aber leider auch sehr ressourcenhungrig. Zu viel für den Dauerbetrieb. Es gab Detailseiten, die mehrere Sekunden brauchten, um angezeigt zu werden. Da es immer mein Ziel war und ist, die Seiten sehr performant auszuliefern, musste ich mich wieder von der Bibliothek trennen. Das hat mich leider auch daran erinnert, dass man eben nicht auf große fertige Libraries setzen sollte, wenn man es performant haben will.
Wie dem auch sei, ich habe mir eine eigene Syntax Highlighting Bibliothek geschrieben, die meinen Ansprüchen an die Geschwindigkeit nun wieder gerecht wird. Ich habe auch eine eigene Erkennung für die verwendete Sprache/Protokoll geschrieben. Momentan erkennt sie folgende Codeblöcke:
'php', 'powershell', 'bash', 'xml', 'css', 'html', 'javascript', 'logfile', 'yaml', 'ini', 'cmd', 'json', 'python', 'accesslog', 'perl', 'dockerfile'.
Natürlich ist die Erkennung nicht fehlerfrei, aber das war die Erkennung der Bibliothek auch nicht.
Die eigene Syntax Highlighting Bibliothek kann derzeit folgende Codeblöcke hervorheben:
'php', 'powershell', 'bash', 'html'
Die fehlenden Sprachen/Protokolle (die ich bereits in der Erkennung habe) werde ich nächste Woche nachliefern. Es ist nicht schwer eigene Sprachen zu integrieren.
Sollte aus eurer Sicht noch eine Sprache / ein Protokoll fehlen, dann teilt mir das bitte hier mit einer kurzen Begründung mit.
Ich hoffe meine eigene Lösung gefällt euch auch. Wer Fehler findet meldet diese bitte über das interne Nachrichtensystem.
Gruß
Frank
Die Syntax Highlighting Bibliothek https://github.com/scrivo/highlight.php ist generell gut, aber leider auch sehr ressourcenhungrig. Zu viel für den Dauerbetrieb. Es gab Detailseiten, die mehrere Sekunden brauchten, um angezeigt zu werden. Da es immer mein Ziel war und ist, die Seiten sehr performant auszuliefern, musste ich mich wieder von der Bibliothek trennen. Das hat mich leider auch daran erinnert, dass man eben nicht auf große fertige Libraries setzen sollte, wenn man es performant haben will.
Wie dem auch sei, ich habe mir eine eigene Syntax Highlighting Bibliothek geschrieben, die meinen Ansprüchen an die Geschwindigkeit nun wieder gerecht wird. Ich habe auch eine eigene Erkennung für die verwendete Sprache/Protokoll geschrieben. Momentan erkennt sie folgende Codeblöcke:
'php', 'powershell', 'bash', 'xml', 'css', 'html', 'javascript', 'logfile', 'yaml', 'ini', 'cmd', 'json', 'python', 'accesslog', 'perl', 'dockerfile'.
Natürlich ist die Erkennung nicht fehlerfrei, aber das war die Erkennung der Bibliothek auch nicht.
Die eigene Syntax Highlighting Bibliothek kann derzeit folgende Codeblöcke hervorheben:
'php', 'powershell', 'bash', 'html'
Die fehlenden Sprachen/Protokolle (die ich bereits in der Erkennung habe) werde ich nächste Woche nachliefern. Es ist nicht schwer eigene Sprachen zu integrieren.
Sollte aus eurer Sicht noch eine Sprache / ein Protokoll fehlen, dann teilt mir das bitte hier mit einer kurzen Begründung mit.
Ich hoffe meine eigene Lösung gefällt euch auch. Wer Fehler findet meldet diese bitte über das interne Nachrichtensystem.
Gruß
Frank
Hier ist die Klasse für PHP Syntax Highlighting als Vorlage. Wer eine Sprache (außer den oben aufgeführten) vermisst, kann gerne eine eigene Klasse schreiben:
<?php
namespace parser\codeblock;
class phpHighlighter extends languageHighlighter {
public function getCommentTypes(): array {
return [
'multi_line' => '/\/\*[\s\S]*?\*\//',
'single_line_double_slash' => '/\/\/[^\n]*/',
'single_line_hash' => '/#[^\n]*/',
];
}
public function syntaxHighlighting(): void {
$this->syntax = [
"funcs" => [
"list" => [
"array",
"abs",
"acos",
"acosh",
"addcslashes",
"addslashes",
"array_change_key_case",
"array_chunk",
"array_combine array_count_values array_diff",
"array_diff_assoc",
"array_diff_key",
"array_diff_uassoc",
"array_diff_ukey",
"array_fill",
"array_filter",
"array_flip",
"array_intersect",
"array_intersect_assoc",
"array_intersect_key",
"array_intersect_uassoc",
"array_intersect_ukey",
"array_key_exists",
"array_keys",
"array_map",
"array_merge",
"array_merge_recursive",
"array_multisort",
"array_pad",
"array_pop",
"array_product",
"array_push",
"array_rand",
"array_reduce",
"array_reverse",
"array_search",
"array_shift",
"array_slice",
"array_splice",
"array_sum",
"array_udiff",
"array_udiff_assoc",
"array_udiff_uassoc",
"array_uintersect",
"array_uintersect_assoc",
"array_uintersect_uassoc",
"array_unique",
"array_unshift",
"array_values",
"array_walk",
"array_walk_recursive",
"atan",
"atan2",
"atanh",
"base64_decode",
"base64_encode",
"base_convert",
"basename",
"bcadd",
"bccomp",
"bcdiv",
"bcmod",
"bcmul",
"bindec",
"bindtextdomain",
"bzclose",
"bzcompress",
"bzdecompress",
"bzerrno",
"bzerror",
"bzerrstr",
"bzflush",
"bzopen",
"bzread",
"bzwrite",
"ceil",
"chdir",
"checkdate",
"checkdnsrr",
"chgrp",
"chmod",
"chop",
"chown",
"chr",
"chroot",
"chunk_split",
"class_exists",
"closedir",
"closelog",
"copy",
"cos",
"cosh",
"count",
"count_chars",
"date",
"decbin",
"dechex",
"decoct",
"deg2rad",
"delete",
"ebcdic2ascii",
"echo",
"empty",
"end",
"ereg",
"ereg_replace",
"eregi",
"eregi_replace",
"error_log",
"error_reporting",
"escapeshellarg",
"escapeshellcmd",
"eval",
"exec",
"exit",
"exp",
"explode",
"extension_loaded",
"feof",
"fflush",
"fgetc",
"fgetcsv",
"fgets",
"fgetss",
"file_exists",
"file_get_contents",
"file_put_contents",
"fileatime",
"filectime",
"filegroup",
"fileinode",
"filemtime",
"fileowner",
"fileperms",
"filesize",
"filetype",
"floatval",
"flock",
"floor",
"flush",
"fmod",
"fnmatch",
"fopen",
"fpassthru",
"fprintf",
"printf",
"fputcsv",
"fputs",
"fread",
"fscanf",
"fseek",
"fsockopen",
"fstat",
"ftell",
"ftok",
"getallheaders",
"getcwd",
"getdate",
"getenv",
"gethostbyaddr",
"gethostbyname",
"gethostbynamel",
"getimagesize",
"getlastmod",
"getmxrr",
"getmygid",
"getmyinode",
"getmypid",
"getmyuid",
"getopt",
"getprotobyname",
"getprotobynumber",
"getrandmax",
"getrusage",
"getservbyname",
"getservbyport",
"gettext",
"gettimeofday",
"gettype",
"glob",
"gmdate",
"gmmktime",
"ini_alter",
"ini_get",
"ini_get_all",
"ini_restore",
"ini_set",
"interface_exists",
"intval",
"ip2long",
"is_a",
"is_array",
"is_bool",
"is_callable",
"is_dir",
"is_double",
"is_executable",
"is_file",
"is_finite",
"is_float",
"is_infinite",
"is_int",
"is_integer",
"is_link",
"is_long",
"is_nan",
"is_null",
"is_numeric",
"is_object",
"is_readable",
"is_real",
"is_resource",
"is_scalar",
"is_soap_fault",
"is_string",
"is_subclass_of",
"is_uploaded_file",
"is_writable",
"is_writeable",
"mkdir",
"mktime",
"nl2br",
"preg_grep",
"preg_filter",
"preg_last_error_msg",
"preg_last_error",
"preg_match_all",
"preg_match",
"preg_quote",
"preg_replace_callback_array",
"preg_replace_callback",
"preg_replace",
"preg_split",
"parse_str",
"parse_url",
"passthru",
"pathinfo",
"readlink",
"realpath",
"rewind",
"rewinddir",
"rmdir",
"round",
"str_ireplace",
"str_pad",
"str_repeat",
"str_replace",
"str_rot13",
"str_shuffle",
"str_split",
"str_word_count",
"strcasecmp",
"strchr",
"strcmp",
"strcoll",
"strcspn",
"strftime",
"strip_tags",
"stripcslashes",
"stripos",
"stripslashes",
"stristr",
"strlen",
"strnatcasecmp",
"strnatcmp",
"strncasecmp",
"strncmp",
"strpbrk",
"strpos",
"strptime",
"strrchr",
"strrev",
"strripos",
"strrpos",
"strspn",
"strstr",
"strtok",
"strtolower",
"strtotime",
"strtoupper",
"strtr",
"strval",
"substr",
"substr_compare",
"define",
"hash_hmac_algos",
"isset",
"date_default_timezone_set",
"json_decode",
"json_encode",
'curl_init',
'curl_setopt',
'curl_setopt_array',
'curl_exec',
'curl_getinfo',
'curl_errno',
'curl_error',
'curl_close',
'curl_multi_init',
'curl_multi_add_handle',
'curl_multi_remove_handle',
'curl_multi_select',
'curl_multi_exec',
'curl_multi_getcontent',
'curl_multi_info_read',
'curl_multi_close',
'curl_version',
]
],
"keywords" => [
"list" => [
"and",
"or",
"xor",
"__FILE__",
"__LINE__",
"array",
"as",
"break",
"case",
"cfunction",
"const",
"continue",
"declare",
"default",
"die",
"do",
"else",
"elseif",
"empty",
"enddeclare",
"endfor",
"endforeach",
"endif",
"endswitch",
"endwhile",
"extends",
"for",
"foreach",
"function",
"include",
"include_once",
"global",
"if",
"new",
"old_function",
"return",
"static",
"switch",
"use",
"try",
"trait",
"unset",
"require",
"require_once",
"var",
"while",
"__FUNCTION__",
"__CLASS__",
"__METHOD__",
"__NAMESPACE__",
"__TRAIT__",
"abstract",
"interface",
"public",
"implements",
"extends",
"private",
"protected",
"throw",
"__halt_compiler"
]
],
"vars" => true
];
}
}