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-Key: 6895718524

Url: https://administrator.de/contentid/6895718524

Printed on: April 19, 2024 at 20:04 o'clock

Member: madnem
madnem Apr 24, 2023 at 10:39:14 (UTC)
Goto Top
In der Überschrift steht nichts davon welchen Editor du verwenden willst?
Ich nehme notepad++ und da funktioniert das direkt nach der Installation.
Mitglied: 3063370895
3063370895 Apr 24, 2023 at 10:41:15 (UTC)
Goto Top
Hi madnem,

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

-Thomas
Member: Frank
Frank Apr 24, 2023, updated at Apr 25, 2023 at 00:49:42 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 24, 2023 at 12:53:52 (UTC)
Goto Top
Müsste z.B. jedes Powershell-CMDlet wie
Get-ChildItem
separat eingefügt werden? Das wären tausende..

-Thomas
Member: em-pie
em-pie Apr 24, 2023 at 14:07:57 (UTC)
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...
Member: madnem
madnem Apr 24, 2023 at 14:09:59 (UTC)
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.
Mitglied: 3063370895
3063370895 Apr 24, 2023 updated at 14:15:33 (UTC)
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
Member: madnem
madnem Apr 24, 2023 at 14:13:52 (UTC)
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?
Member: madnem
madnem Apr 24, 2023 at 14:16:44 (UTC)
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.
Mitglied: 3063370895
3063370895 Apr 24, 2023 at 14:29:44 (UTC)
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
Member: Frank
Solution Frank Apr 25, 2023 updated at 09:18:50 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 25, 2023 updated at 03:57:14 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 25, 2023 updated at 04:44:18 (UTC)
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
Member: Frank
Frank Apr 25, 2023 at 07:00:15 (UTC)
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
Mitglied: 3063370895
3063370895 Apr 25, 2023 at 07:00:45 (UTC)
Goto Top
Perfekt, aus meiner Sicht 👍

-Thomas
Member: colinardo
colinardo Apr 25, 2023 updated at 09:12:28 (UTC)
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
Member: Frank
Frank Apr 25, 2023 updated at 09:45:50 (UTC)
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
Member: colinardo
colinardo Apr 25, 2023 updated at 10:06:36 (UTC)
Goto Top
Perfect 👌 Danke dir für deine Arbeit!
Member: Frank
Frank Apr 30, 2023 at 08:11:12 (UTC)
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
Member: Frank
Frank Apr 30, 2023 at 18:37:52 (UTC)
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  
        ];

    }
}