From 0212d859364a31928548c820a502038f69c27b4c Mon Sep 17 00:00:00 2001 From: Nick Sabalausky Date: Thu, 1 Aug 2013 23:08:12 -0400 Subject: [PATCH] highlighter takes optional output range. --- highlighter.d | 57 ++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 16 deletions(-) diff --git a/highlighter.d b/highlighter.d index 9a11096..5182822 100644 --- a/highlighter.d +++ b/highlighter.d @@ -8,24 +8,48 @@ module highlighter; import std.stdio; import std.array; +import std.range; import std.d.lexer; -void writeSpan(string cssClass, string value) +void writeSpan(Sink)(ref Sink sink, string cssClass, string value) + if(isOutputRange!(Sink, string)) { - stdout.write(``, value.replace("&", "&").replace("<", "<"), ``); + sink.put(``); + sink.put(value.replace("&", "&").replace("<", "<")); + sink.put(``); } -// http://ethanschoonover.com/solarized void highlight(R)(TokenRange!R tokens, string fileName) { - stdout.writeln(q"[ + struct StdoutSink + { + void put(string data) + { + stdout.write(data); + } + } + + StdoutSink sink; + highlight(tokens, sink, fileName); +} + +// http://ethanschoonover.com/solarized +void highlight(R, Sink)(TokenRange!R tokens, ref Sink sink, string fileName) + if(isOutputRange!(Sink, string)) +{ + sink.put(q"[ -]"); - stdout.writeln("", fileName, ""); - stdout.writeln(q"[ + +]"); + sink.put(""); + sink.put(fileName); + sink.put("\n"); + sink.put(q"[ -
]");
+
+]");
 
 	foreach (Token t; tokens)
 	{
 		if (isBasicType(t.type))
-			writeSpan("type", t.value);
+			writeSpan(sink, "type", t.value);
 		else if (isKeyword(t.type))
-			writeSpan("kwrd", t.value);
+			writeSpan(sink, "kwrd", t.value);
 		else if (t.type == TokenType.comment)
-			writeSpan("com", t.value);
+			writeSpan(sink, "com", t.value);
 		else if (isStringLiteral(t.type) || t.type == TokenType.characterLiteral)
-			writeSpan("str", t.value);
+			writeSpan(sink, "str", t.value);
 		else if (isNumberLiteral(t.type))
-			writeSpan("num", t.value);
+			writeSpan(sink, "num", t.value);
 		else if (isOperator(t.type))
-			writeSpan("op", t.value);
+			writeSpan(sink, "op", t.value);
 		else
-			stdout.write(t.value.replace("<", "<"));
+			sink.put(t.value.replace("<", "<"));
 	}
-	stdout.writeln("
\n"); + sink.put("
\n\n"); } /+void main(string[] args)