3063370895
Goto Top

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.

oux2hps068

-Thomas

Content-ID: 6895718524

Url: https://administrator.de/forum/syntax-highlighting-6895718524.html

Ausgedruckt am: 21.12.2024 um 17:12 Uhr

madnem
madnem 24.04.2023 um 12:39:14 Uhr
Goto Top
In der Überschrift steht nichts davon welchen Editor du verwenden willst?
Ich nehme notepad++ und da funktioniert das direkt nach der Installation.
3063370895
3063370895 24.04.2023 um 12:41:15 Uhr
Goto Top
Hi madnem,

es ist ein Feature-Vorschlag für die code-Tags im Forum

-Thomas
Frank
Frank 24.04.2023, aktualisiert am 25.04.2023 um 02:49:42 Uhr
Goto Top
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 face-smile

Gruß
Frank
3063370895
3063370895 24.04.2023 um 14:53:52 Uhr
Goto Top
Müsste z.B. jedes Powershell-CMDlet wie
Get-ChildItem
separat eingefügt werden? Das wären tausende..

-Thomas
em-pie
em-pie 24.04.2023 um 16:07:57 Uhr
Goto Top
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...
madnem
madnem 24.04.2023 um 16:09:59 Uhr
Goto Top
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:

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.
3063370895
3063370895 24.04.2023 aktualisiert um 16:15:33 Uhr
Goto Top
Es gibt auch ein PHP-Projekt, dass etwa 185 Sprachen unterstützt inkl. automatischer Spracherkennung (dann sollte man aber die Sprachen reduzieren)

https://github.com/scrivo/highlight.php

-Thomas
madnem
madnem 24.04.2023 um 16:13:52 Uhr
Goto Top
@em-pie
Das Skript ist für Powershell um Powershell zu highlight, siehe Header:
  1. 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?
madnem
madnem 24.04.2023 um 16:16:44 Uhr
Goto Top
@3063370895
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.
3063370895
3063370895 24.04.2023 um 16:29:44 Uhr
Goto Top
Wenn man betrachtet, dass dort für so viele Sprachen bereits ausgearbeitete Vorlagen vorliegen, könnte man überlegen einen eigenen Adapter für die Dateien zu bauen, oder alternativ das ganze Projekt zu nutzen

-Thomas
Frank
Lösung Frank 25.04.2023 aktualisiert um 11:18:50 Uhr
Goto Top
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.

'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
3063370895
3063370895 25.04.2023 aktualisiert um 05:57:14 Uhr
Goto Top
Oha das ging jetzt aber fix! Dankeschön!

$hosts = (Get-ADComputer -Filter 'enabled -eq $true').Name  

$tasks = @{}
foreach ($h in $hosts) { $tasks[$h] = [System.Net.NetworkInformation.Ping]::new().SendPingAsync($h) }
[Threading.Tasks.Task]::WaitAll($Task)

$result = foreach ($h in $hosts) {
    $res = $tasks[$h].Result
    [PSCustomObject]@{
        host   = $h
        Online = $res.Status -eq "Success"  
    }
}

$result 

-Thomas
3063370895
3063370895 25.04.2023 aktualisiert um 06:44:18 Uhr
Goto Top
Könnte man das ganze noch etwas kontrastreicher gestalten?
Ich sehe z.B. kaum den unterschied zwischen Variablen und CMDlets:
$hosts = Get-ADComputer
vgl. ISE:
ozepm4nmmn

VSCode:
noze9i6mnm

Powershell:
7afnov8tyz
-Thomas
Frank
Frank 25.04.2023 um 09:00:15 Uhr
Goto Top
Hallo zusammen,

ich habe das Theme der Codeblöcke etwas kontrastreicher gestaltet. Dabei habe ich mich am Dark-Theme von VS-Studio orientiert.

Was denk ihr, passt das?

Gruß
Frank
3063370895
3063370895 25.04.2023 um 09:00:45 Uhr
Goto Top
Perfekt, aus meiner Sicht 👍

-Thomas
colinardo
colinardo 25.04.2023 aktualisiert um 11:12:28 Uhr
Goto Top
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:

screenshot

Grüße Uwe
Frank
Frank 25.04.2023 aktualisiert um 11:45:50 Uhr
Goto Top
Hallo 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.

Klar, kein Problem. Ist erledigt face-wink

Gruß
Frank
colinardo
colinardo 25.04.2023 aktualisiert um 12:06:36 Uhr
Goto Top
Perfect 👌 Danke dir für deine Arbeit!
Frank
Frank 30.04.2023 um 10:11:12 Uhr
Goto Top
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
Frank
Frank 30.04.2023 um 20:37:52 Uhr
Goto Top
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  
        ];

    }
}