1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
|
/**
* HTML export.
*
* Wraps a StrBuf, and automatically escapes HTML characters as necessary.
*/
class Html {
// Output buffer.
private StrBuf out;
// Characters we need to escape.
private Char->Str escape;
// Indentation level.
private Nat indentLevel;
// Create.
init() {
init { indentLevel = 0; }
// For text:
escape.put('&', "&");
escape.put('<', "<");
escape.put('>', ">");
// Inside string attributes:
escape.put('"', """);
escape.put('\'', "'");
}
// To string.
Str toS() {
out.toS;
}
// Indent output.
void indent() {
indentLevel++;
out.indent();
}
void dedent() {
if (indentLevel > 0)
indentLevel--;
out.dedent();
}
// Temporarily set indent to 0.
void pauseIndent() {
for (Nat i = 0; i < indentLevel; i++)
out.dedent();
}
// Restore indentation.
void restoreIndent() {
for (Nat i = 0; i < indentLevel; i++)
out.indent();
}
// Append text. Escapes HTML characters.
Html text(Str text) {
for (ch in text) {
if (replace = escape.at(ch))
out << replace;
else
out << ch;
}
this;
}
// Append plain HTML. No escapes.
Html html(Str html) {
out << html;
this;
}
}
|