pretty-print.js 1.45 KB
var sax = require("../lib/sax")
  , printer = sax.createStream(false, {lowercasetags:true, trim:true})
  , fs = require("fs")

function entity (str) {
  return str.replace('"', '"')
}

printer.tabstop = 2
printer.level = 0
printer.indent = function () {
  print("\n")
  for (var i = this.level; i > 0; i --) {
    for (var j = this.tabstop; j > 0; j --) {
      print(" ")
    }
  }
}
printer.on("opentag", function (tag) {
  this.indent()
  this.level ++
  print("<"+tag.name)
  for (var i in tag.attributes) {
    print(" "+i+"=\""+entity(tag.attributes[i])+"\"")
  }
  print(">")
})

printer.on("text", ontext)
printer.on("doctype", ontext)
function ontext (text) {
  this.indent()
  print(text)
}

printer.on("closetag", function (tag) {
  this.level --
  this.indent()
  print("</"+tag+">")
})

printer.on("cdata", function (data) {
  this.indent()
  print("<![CDATA["+data+"]]>")
})

printer.on("comment", function (comment) {
  this.indent()
  print("<!--"+comment+"-->")
})

printer.on("error", function (error) {
  console.error(error)
  throw error
})

if (!process.argv[2]) {
  throw new Error("Please provide an xml file to prettify\n"+
    "TODO: read from stdin or take a file")
}
var xmlfile = require("path").join(process.cwd(), process.argv[2])
var fstr = fs.createReadStream(xmlfile, { encoding: "utf8" })

function print (c) {
  if (!process.stdout.write(c)) {
    fstr.pause()
  }
}

process.stdout.on("drain", function () {
  fstr.resume()
})

fstr.pipe(printer)