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("]");
+
+]");
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