text processing utilities

Highlight Dokumentation

Highlight Service-Modus

Seit Version 4.6 kann Highlight als lang laufender Prozess aufgerufen werden, um Dateien über stdin und stdout zu verarbeiten. Dies kann zu einer besseren Leistung führen, z.B. wenn es in einer Dateiansichtsanwendung verwendet wird.

Der Service-Modus (--service-mode) ist so konzipiert, dass mehrere Eingaben von einer externen Anwendung auf Anfrage verarbeitet werden können, ohne Highlight jedes Mal neu zu starten. Der Service-Modus läuft kontinuierlich, bis ein Beendigungssignal gesendet wird, EOF von STDIN gelesen wird oder der Befehl "exit" anstelle einer unten angegebenen Moduszeile gesendet wird. Der Service-Modus erwartet, dass jede Eingabe durch ein EOF-Zeichen in einer eigenen Zeile getrennt ist (wenn EOF auf '\0' gesetzt war, dann "\n\0\n"). Vor jeder Datei (einschließlich der ersten Datei) muss eine neue Moduszeile mit allen gewünschten Modusänderungen gesendet werden (auch wenn keine Änderungen gewünscht sind, muss eine neue Zeile gesendet werden).

Modusoptionen werden als Schlüssel-Wert-Paare wie option=Wert geändert, getrennt durch ein Semikolon (kein abschließendes Semikolon für das letzte Element erforderlich). Alle nicht geänderten Optionen behalten ihren vorherigen Wert bei.

Folgende Optionen werden unterstützt:

syntax=Dateiendung ::: um die Syntax anhand der Dateiendung zu ändern oder
syntax= um die Syntax direkt festzulegen (z.B. csharp).

tag=### ::: falls angegeben und nicht leer, wird es nach der Verarbeitung
einer Datei allein in einer neuen Zeile auf stdout ausgegeben.

eof=## ::: Ein einzelnes Zeichen (0x00-0xFE), das in stdin vorhanden ist,
um eine Datei von der nächsten zu trennen. Empfohlen wird 0x00, falls möglich,
ansonsten sind 0x01-0x07 in der Regel für die meisten Clients einfach zu
senden, z.B. 0x07 ('\a') für den Glockenton. Es ist nahezu unmöglich, mehrere
Zeichen über 128 in Windows über die meisten Terminal-Emulatoren zu senden.

Beachten Sie, dass das EOF-Zeichen auf einer eigenen neuen Zeile stehen muss und nicht mitten in einer Zeile gefunden werden kann. Zwischen dem vorherigen EOF und der nächsten Modusoptionen-Zeile ist keine neue Zeile erforderlich. Sie können das EOF-Zeichen auch nicht an eine neue Zeile senden, da es bereits als Trennzeichen verwendet wird, wie beschrieben.

Schließlich können beliebige Dateiinhalte gesendet werden, jedoch darf die Datei das EOF-Zeichen nicht enthalten. Die Anforderung, dass das EOF-Zeichen auf einer eigenen Zeile stehen muss, könnte geändert werden.

Python Besispielskript

#!/usr/bin/env python
import sys
from subprocess import Popen, PIPE

# Script to show the new service mode based on stdin/stdout
# requires highlight 4.6

# Add for custom paths: '-D', '/usr/share/highlight/'
p = Popen( ["highlight",'--service-mode', '--out-format', 'xterm256', '-f'],
		  stdin=PIPE, stdout=PIPE, stderr=PIPE, bufsize=1, universal_newlines=True )

endtag = '<endtag/>'

while True:
    filename = input("\nPlease enter the filename (or exit): ")

    if filename=='exit':
        break

    p.stdin.write(str('eof=\x01;tag='+endtag+';syntax='+filename+'\n'))
    p.stdin.flush()

    # write file
    with open(filename) as file:
        while line := file.readline():
            p.stdin.write(line)

    # send end of file delimiter and flush
    p.stdin.write(str('\n\x01\n'))
    p.stdin.flush()

    # read highlight output
    while True:
        result = p.stdout.readline().strip()

        if result==endtag:
            break

        print(result)


for pipe in [p.stdin, p.stdout]:
    try:
        pipe.close()
    except OSError:
        pass

sys.exit(p.wait())
Tupel7