aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2014-04-10 14:22:21 +0100
committerMichael Williamson <mike@zwobble.org>2014-04-10 14:22:21 +0100
commitdee75b1261646edb99ae01a231036fd9c468fe83 (patch)
treef340ce912a525fc5408da7da8c9997c863f8e501 /lib
parent7e49d52fb9501a1bdd85d6c9d35d09d50aabb569 (diff)
Add basic indentation of HTML
Diffstat (limited to 'lib')
-rw-r--r--lib/html-writer.js72
1 files changed, 71 insertions, 1 deletions
diff --git a/lib/html-writer.js b/lib/html-writer.js
index d329438..233e5dd 100644
--- a/lib/html-writer.js
+++ b/lib/html-writer.js
@@ -3,7 +3,77 @@ var _ = require("underscore");
exports.writer = writer;
-function writer() {
+function writer(options) {
+ options = options || {};
+ if (options.prettyPrint) {
+ return prettyWriter();
+ } else {
+ return simpleWriter();
+ }
+}
+
+
+var indentedElements = {
+ div: true,
+ p: true,
+ ul: true
+};
+
+
+function prettyWriter() {
+ var indentationLevel = 0;
+ var stack = [];
+
+ var writer = simpleWriter();
+
+ function open(tagName, attributes) {
+ indent();
+ stack.push(tagName);
+ writer.open(tagName, attributes);
+ if (indentedElements[tagName]) {
+ indentationLevel++;
+ }
+ }
+
+ function close(tagName) {
+ if (indentedElements[tagName]) {
+ indentationLevel--;
+ }
+ indent();
+ stack.pop();
+ writer.close(tagName);
+ }
+
+ function text(value) {
+ indent();
+ writer.text(value);
+ }
+
+ function insideIndentedElement() {
+ return stack.length > 0 && indentedElements[stack[stack.length - 1]];
+ }
+
+ function indent() {
+ if (insideIndentedElement()) {
+ writer.append("\n");
+ for (var i = 0; i < indentationLevel; i++) {
+ writer.append(" ");
+ }
+ }
+ }
+
+ return {
+ asString: writer.asString,
+ open: open,
+ close: close,
+ text: text,
+ selfClosing: writer.selfClosing,
+ append: writer.append
+ };
+}
+
+
+function simpleWriter() {
var fragments = [];
function open(tagName, attributes) {