Syntax-Highlighting für XML

Schriftbild, Absätze und Auflistungen einstellen
Kaleun
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 15. Okt 2019, 20:54
Wohnort: Bochum

Syntax-Highlighting für XML

Beitrag von Kaleun »

Hallo,

ich habe eine Frage bzgl. selbstdefinierter Syntax-Highlighting Trennzeichner in Bezug auf XML. Mein Ziel ist es, dass alle Start- und Ende-Tags inkl. der Elementbezeichnungen in der Farbe maroon dargestellt werden. Die Attribute sollen in der Farbe red und die entsprechenden Werte in der Farbe blue sein. Inhalte von Elementen (z.B. cU2+NwsKcGNmkhfZGyh1Zv6Lq7yFmbYpskR2/4G4NZM= im ersten <DigestValue> Element) sollen in der Farbe black sein. Kommentare sollen in der Farbe darkolivegreen dargestellt werden.

Einiges habe ich schon hinbekommen, allerdings werden die Inhalte der Elemente noch falsch dargestellt.

Ich habe mir dazu mal die Dokumentation zu dem Paket listings angeschaut, allerdings wurde ich daraus nicht wirklich schlau und meine Fragen blieben unbeantwortet. Ich verstehe nicht ganz wie ich mit dem Befehl moredelim umgehen muss.
  • Was bedeutet der Parameter s?
    Was bedeutet der Parameter l?
    Welche Syntax muss ich beachten?
    Gibt es die Möglichkeit Reguläre Ausdrücke (regular expressions) zu verwenden? Wenn ja, wo finden ich eine gute Übersicht über diese zur Anwendung auf den moredelim Befehl.
    Ich habe irgendwo mal \ als Trennzeichen gesehen, was bedeutet das?
    Durch welches Argument schaffe ich es, dass die Farbe auch auf die Trennzeichen angewendet wird und wie ohne Anwendung auf die Trennzeichen?

Code: Alles auswählen

\RequirePackage{fix-cm,cmap}

\documentclass[
fontsize=11pt,
paper=a4,
abstract=true,
numbers=noenddot,
listof=totoc,
bibliography=totoc,
twoside,
open=right,
cleardoublepage=plain,
parskip=half+,
BCOR=1cm,
]{scrreprt}


\usepackage{color}
\definecolor{maroon}{rgb}{0.5, 0.0, 0.0}
\definecolor{darkolivegreen}{rgb}{0.33, 0.42, 0.18}
\usepackage{caption}
\usepackage{listings}
\lstdefinelanguage{XML}
{
   basicstyle=\ttfamily\footnotesize,
   morestring=[b]",
   moredelim=[s][\bfseries\color{maroon}]{<}{\ },
   moredelim=[s][\bfseries\color{maroon}]{</}{>},
   moredelim=[l][\bfseries\color{maroon}]{/>},
   moredelim=[l][\bfseries\color{maroon}]{>},
   morecomment=[s]{<?}{?>},
   morecomment=[s]{<!--}{-->},
   commentstyle=\color{darkolivegreen},
   stringstyle=\color{blue},
   identifierstyle=\color{red},
   numbers=left,
   tabsize=2,
   frame=single,
   rulecolor=\color{black},
   breaklines=true,
   captionpos=b
}
\begin{document}
\renewcommand{\lstlistingname}{XML-Fragment}
\begin{lstlisting}[language={XML}, caption={Inhalt der documentsignatures.xml}]
<?xml version="1.0" encoding="UTF-8"?>
<document-signatures xmlns="urn:oasis:names:tc:opendocument:xmlns:digitalsignature:1.0">
	<Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="ID_006900630020002d0084000e004a008b009b00a6006f004b007c007b002d007f">
		<SignedInfo>
			<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
			<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/>
			<Reference URI="mimetype">
				<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<DigestValue>cU2+NwsKcGNmkhfZGyh1Zv6Lq7yFmbYpskR2/4G4NZM=</DigestValue>
			</Reference>
			<Reference URI="styles.xml">
				<Transforms>
					<Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
				</Transforms>
				<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<DigestValue>jj4tjq2F2K2b0ytav0dZOqjwszvSlbERnRjYiBBfPDU=</DigestValue>
			</Reference>
			<Reference URI="manifest.rdf">
				<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
				<DigestValue>rrKXmEsmowvZom8wSzm8fZGiZFdJs1578/RMS5UR3HU=</DigestValue>
			</Reference>
		</SignedInfo>
		<SignatureValue>
			geVgO5aL1dtiJDMtQbUL8WxI+iNicTmLSmZP7bLNdUm3wyWfxAl9HPzGDjm56RS9
			uAXxEVhjNT6siKDuVja+/gUa5Kpd/J2L1ww47FSH1DYBJmdIxbP3S7Hb5yvPKGBO
			GjBFJ6/VHfcO1dgAirhNwbmavIE1gxa0nTTrWzv0U6PAJKFvyFyCHhFGHzbzrNta
			oZwQL7Y4h3w32rZ+LFmHLafGF+7+Fg8v/z7zsQW2kCHU/JTM0yWWsTspNvDakgMo
			SNpYs+Zm4Ma6o/d3tQN2WxodkVN92WJHzkXJDSbOi8H7de/NRTXSZUvoyf9azMbH
			Yg3FIGYJQH589yektZAW0A==
		</SignatureValue>
		<KeyInfo>
			<X509Data>
				<X509IssuerSerial>
					<X509IssuerName>E=vorname.nachnamejahreszahl@provider.com, CN=Vorname Nachname, OU=Management, O=Unternehmen, L=Stadt, ST=Bundesland, C=DE</X509IssuerName>
					<X509SerialNumber>13894744055819454397</X509SerialNumber>
				</X509IssuerSerial>
				<X509Certificate>
					Ich bin ein langer Inhalt
					ueber mehrere
					Zeilen
				</X509Certificate>
			</X509Data>
		</KeyInfo>
		<Object>
			<SignatureProperties>
				<SignatureProperty Id="ID_00dd00f400e600f400e700c1004e003b0081006400f800f5006c009a00630055" Target="#ID_006900630020002d0084000e004a008b009b00a6006f004b007c007b002d007f">
					<dc:date xmlns:dc="http://purl.org/dc/elements/1.1/">2020-01-07T17:07:45.717000000</dc:date>
				</SignatureProperty>
			</SignatureProperties>
		</Object>
		<Object xmlns:xd="http://uri.etsi.org/01903/v1.3.2#">
			<xd:QualifyingProperties Target="#ID_006900630020002d0084000e004a008b009b00a6006f004b007c007b002d007f">
				<xd:SignedProperties Id="idSignedProperties">
					<xd:SignedSignatureProperties>
						<xd:SigningTime>2020-01-07T17:07:45.717000000</xd:SigningTime>
						<xd:SigningCertificate>
							<xd:Cert>
								<xd:CertDigest>
									<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
									<DigestValue>DrwbD6rQTszEZxlSXSNDV7MdHnWi2K0XaT7Dwz5xnJ4=</DigestValue>
								</xd:CertDigest>
								<xd:IssuerSerial>
									<X509IssuerName>E=vorname.nachnamejahreszahl@provider.com, CN=Vorname Nachname, OU=Management, O=Unternehmen, L=Stadt, ST=Bundesland, C=DE</X509IssuerName>
									<X509SerialNumber>13894744055819454397</X509SerialNumber>
								</xd:IssuerSerial>
							</xd:Cert>
						</xd:SigningCertificate>
						<xd:SignaturePolicyIdentifier>
							<xd:SignaturePolicyImplied/>
						</xd:SignaturePolicyIdentifier>
					</xd:SignedSignatureProperties>
				</xd:SignedProperties>
				<xd:UnsignedProperties Id="idUnsignedProperties">
					<xd:UnsignedSignatureProperties>
						<xd:CertificateValues>
							<xd:EncapsulatedX509Certificate>
								Ich bin ein langer Inhalt.
							</xd:EncapsulatedX509Certificate>
						</xd:CertificateValues>
					</xd:UnsignedSignatureProperties>
				</xd:UnsignedProperties>
			</xd:QualifyingProperties>
		</Object>
	</Signature>
</document-signatures>
\end{lstlisting}
\end{document}
Folgendes wird in diesem Beispiel noch falsch dargestellt:
  • Der Inhalt des Elements <SignatureValue> sollte black sein (nur manche Zahlen und Sonderzeichen sind black).
    Der Inhalt des Elements <X509IssuerName> sollte black sein.
    Der Inhalt des Elements <X509Certificate> sollte black sein.
    Der Inhalt des Elements <X509SerialNumber> sollte black sein.
Es würde mir auch schon helfen, wenn mir einige der Fragen beantwortet werden :) Vielen Dank im Voraus.

Viele Grüße

Kaleun

Gast

Beitrag von Gast »

listings kennt übrigens bereits eine Sprache XML, deren Originaldefinition derzeit in lstlang1.sty zu finden ist. Bist du sicher, dass du eine Sprache XML definieren willst und nicht nur einen neuen Stil, also beispielsweise \tagstyle ändern, eventuell keywords erweitern etc.?

Der type-Parameter s steht jedenfalls für einen Kommentar und erwartet zwei obligatorische Argumente. Das erste ist der Anfang des Kommentars, das zweite das Ende. Solche Kommentare können nicht geschachtelt werden.

Der type-Parameter l steht dagegen für einen Kommentar, der mit dem als einziges obligatorisches Argument angegebenen String beginnt und am Ende der Zeile automatisch endet.

Der type-Parameter b gibt Anfang und Ende eines Strings an, bei den im Fall, dass dieses Zeichen selbst im String vorkommen soll, es mit einem Backslash eingeleitet werden muss. Es gibt auch d-Strings, bei denen das Zeichen verdoppelt wird, wenn es im String vorkommt.

Sorry, aber das mehr als längliche Beispiel habe ich mir nicht näher angeschaut.

Kaleun
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 15. Okt 2019, 20:54
Wohnort: Bochum

Beitrag von Kaleun »

listings kennt übrigens bereits eine Sprache XML, deren Originaldefinition derzeit in lstlang1.sty zu finden ist. Bist du sicher, dass du eine Sprache XML definieren willst und nicht nur einen neuen Stil, also beispielsweise \tagstyle ändern, eventuell keywords erweitern etc.?
Das hab ich mal versucht, allerdings erhielt ich hierbei die Fehlermeldung:
! TeX capacity exceeded, sorry [input stack size=5000].<to be read again>
Ich habe hierzu mal ein verkürztes Minimalbeispiel:

Code: Alles auswählen

\RequirePackage{fix-cm,cmap}

\documentclass[
fontsize=11pt,
paper=a4,
abstract=true,
numbers=noenddot,
listof=totoc,
bibliography=totoc,
twoside,
open=right,
cleardoublepage=plain,
parskip=half+,
BCOR=1cm,
]{scrreprt}


\usepackage{color}
\definecolor{maroon}{rgb}{0.5, 0.0, 0.0}
\definecolor{darkolivegreen}{rgb}{0.33, 0.42, 0.18}
\usepackage{caption}
\usepackage{listings}
\lstdefinelanguage{XML}
{
   language=xml,
   numbers=left,
   tabsize=2,
   frame=single,
   rulecolor=\color{black},
   breaklines=true,
   captionpos=b
}
\begin{document}
\renewcommand{\lstlistingname}{XML-Fragment}
\begin{lstlisting}[language={XML}, caption={Inhalt der documentsignatures.xml}]
<?xml version="1.0" encoding="UTF-8"?>
\end{lstlisting}
\end{document}
Das mit den Parametern muss ich mal praktisch testen, vielen Dank auf jeden Fall :)

Kaleun
Forum-Anfänger
Forum-Anfänger
Beiträge: 18
Registriert: Di 15. Okt 2019, 20:54
Wohnort: Bochum

Beitrag von Kaleun »

Hab jetzt was gefunden mit dem es fast perfekt ist:

Code: Alles auswählen

\lstset{
	basicstyle=\ttfamily,
	columns=fullflexible,
	showstringspaces=false,
	commentstyle=\color{darkolivegreen}\upshape
}

\lstdefinelanguage{XML}
{
	basicstyle=\ttfamily\footnotesize,
	morestring=[b]",
	morecomment=[s]{<?}{?>},
	morecomment=[s]{<!--}{-->},
	commentstyle=\color{darkolivegreen},
	moredelim=[s][\color{black}]{>}{<},
	stringstyle=\color{blue},
	identifierstyle=\color{maroon},
	keywordstyle=\color{red},
	numbers=left,
	tabsize=2,
	frame=single,
	rulecolor=\color{black},
	breaklines=true,
	captionpos=b,
	morekeywords={xmlns, version, type, Algorithm, URI, Id, Target}% list your attributes here
}
Das einzige was ich jetzt noch in einer anderen Farbe darstellen möchte, sind die Zeichen
  • <
    >
    </
    />
Weiß jemand wie ich das hinbekomme?

Antworten