Add 'highlightBare' function which only outputs the span-highlighted code, without any wrapper HTML.

This commit is contained in:
Nick Sabalausky 2013-08-01 23:18:44 -04:00
parent 0212d85936
commit 901c777862
1 changed files with 37 additions and 13 deletions

View File

@ -21,26 +21,47 @@ void writeSpan(Sink)(ref Sink sink, string cssClass, string value)
sink.put(`</span>`); sink.put(`</span>`);
} }
private struct StdoutSink
{
void put(string data)
{
stdout.write(data);
}
}
// http://ethanschoonover.com/solarized
void highlight(R)(TokenRange!R tokens, string fileName) void highlight(R)(TokenRange!R tokens, string fileName)
{ {
struct StdoutSink
{
void put(string data)
{
stdout.write(data);
}
}
StdoutSink sink; StdoutSink sink;
highlight(tokens, sink, fileName); highlight(tokens, sink, fileName);
} }
// http://ethanschoonover.com/solarized /// Outputs span-highlighted code only, no wrapper HTML
void highlight(R, Sink)(TokenRange!R tokens, ref Sink sink, string fileName) void highlightBare(R)(TokenRange!R tokens)
if(isOutputRange!(Sink, string))
{ {
sink.put(q"[ StdoutSink sink;
highlightBare(tokens, sink);
}
void highlight(R, Sink)(TokenRange!R tokens, ref Sink sink, string fileName)
if (isOutputRange!(Sink, string))
{
highlightImpl(tokens, sink, fileName, false);
}
/// Outputs span-highlighted code only, no wrapper HTML
void highlightBare(R, Sink)(TokenRange!R tokens, ref Sink sink)
if (isOutputRange!(Sink, string))
{
highlightImpl(tokens, sink, null, true);
}
private void highlightImpl(R, Sink)(TokenRange!R tokens, ref Sink sink, string fileName, bool bare)
if (isOutputRange!(Sink, string))
{
if (!bare)
{
sink.put(q"[
<!DOCTYPE html> <!DOCTYPE html>
<html> <html>
<head> <head>
@ -63,6 +84,7 @@ html { background-color: #fdf6e3; color: #002b36; }
</style> </style>
<pre> <pre>
]"); ]");
}
foreach (Token t; tokens) foreach (Token t; tokens)
{ {
@ -81,7 +103,9 @@ html { background-color: #fdf6e3; color: #002b36; }
else else
sink.put(t.value.replace("<", "&lt;")); sink.put(t.value.replace("<", "&lt;"));
} }
sink.put("</pre>\n</body></html>\n");
if (!bare)
sink.put("</pre>\n</body></html>\n");
} }
/+void main(string[] args) /+void main(string[] args)