Skip to content

Commit

Permalink
Added the option to add a space before closing tags. Fixes #157
Browse files Browse the repository at this point in the history
  • Loading branch information
oozcitak committed Aug 15, 2017
1 parent 326684d commit d509566
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 16 deletions.
18 changes: 10 additions & 8 deletions src/XMLStreamWriter.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
# `options.newline` newline sequence
# `options.offset` a fixed number of indentations to add to every line
# `options.allowEmpty` do not self close empty element tags
# `options.spacebeforeslash` add a space before the closing slash of empty elements
constructor: (stream, options) ->
@stream = stream
super options
Expand Down Expand Up @@ -60,7 +61,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
@stream.write '<?xml version="' + node.version + '"'
@stream.write ' encoding="' + node.encoding + '"' if node.encoding?
@stream.write ' standalone="' + node.standalone + '"' if node.standalone?
@stream.write '?>'
@stream.write @spacebeforeslash + '?>'
@stream.write @endline(node)

docType: (node, level) ->
Expand Down Expand Up @@ -92,7 +93,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
@stream.write ']'

# close tag
@stream.write '>'
@stream.write @spacebeforeslash + '>'
@stream.write @endline(node)

element: (node, level) ->
Expand All @@ -112,7 +113,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
if @allowEmpty
@stream.write '></' + node.name + '>'
else
@stream.write '/>'
@stream.write @spacebeforeslash + '/>'
else if @pretty and node.children.length == 1 and node.children[0].value?
# do not indent text-only nodes
@stream.write '>'
Expand All @@ -138,7 +139,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
processingInstruction: (node, level) ->
@stream.write @space(level) + '<?' + node.target
@stream.write ' ' + node.value if node.value
@stream.write '?>' + @endline(node)
@stream.write @spacebeforeslash + '?>' + @endline(node)

raw: (node, level) ->
@stream.write @space(level) + node.value + @endline(node)
Expand All @@ -150,10 +151,11 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
@stream.write @space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType
@stream.write ' ' + node.defaultValueType if node.defaultValueType != '#DEFAULT'
@stream.write ' "' + node.defaultValue + '"' if node.defaultValue
@stream.write '>' + @endline(node)
@stream.write @spacebeforeslash + '>' + @endline(node)

dtdElement: (node, level) ->
@stream.write @space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + '>' + @endline(node)
@stream.write @space(level) + '<!ELEMENT ' + node.name + ' ' + node.value
@stream.write @spacebeforeslash + '>' + @endline(node)

dtdEntity: (node, level) ->
@stream.write @space(level) + '<!ENTITY'
Expand All @@ -167,7 +169,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
else if node.sysID
@stream.write ' SYSTEM "' + node.sysID + '"'
@stream.write ' NDATA ' + node.nData if node.nData
@stream.write '>' + @endline(node)
@stream.write @spacebeforeslash + '>' + @endline(node)

dtdNotation: (node, level) ->
@stream.write @space(level) + '<!NOTATION ' + node.name
Expand All @@ -177,7 +179,7 @@ module.exports = class XMLStreamWriter extends XMLWriterBase
@stream.write ' PUBLIC "' + node.pubID + '"'
else if node.sysID
@stream.write ' SYSTEM "' + node.sysID + '"'
@stream.write '>' + @endline(node)
@stream.write @spacebeforeslash + '>' + @endline(node)

endline: (node) ->
unless node.isLastRootNode
Expand Down
17 changes: 9 additions & 8 deletions src/XMLStringWriter.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
# `options.offset` a fixed number of indentations to add to every line
# `options.allowEmpty` do not self close empty element tags
# 'options.dontprettytextnodes' if any text is present in node, don't indent or LF
# `options.spacebeforeslash` add a space before the closing slash of empty elements
constructor: (options) ->
super options

Expand Down Expand Up @@ -61,7 +62,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
r += '<?xml version="' + node.version + '"'
r += ' encoding="' + node.encoding + '"' if node.encoding?
r += ' standalone="' + node.standalone + '"' if node.standalone?
r += '?>'
r += @spacebeforeslash + '?>'
r += @newline

return r
Expand Down Expand Up @@ -95,7 +96,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
r += ']'

# close tag
r += '>'
r += @spacebeforeslash + '>'
r += @newline

return r
Expand Down Expand Up @@ -127,7 +128,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
if @allowEmpty
r += '></' + node.name + '>' + @newline
else
r += '/>' + @newline
r += @spacebeforeslash + '/>' + @newline
else if @pretty and node.children.length == 1 and node.children[0].value?
# do not indent text-only nodes
r += '>'
Expand Down Expand Up @@ -176,7 +177,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
processingInstruction: (node, level) ->
r = @space(level) + '<?' + node.target
r += ' ' + node.value if node.value
r += '?>' + @newline
r += @spacebeforeslash + '?>' + @newline

return r

Expand All @@ -190,12 +191,12 @@ module.exports = class XMLStringWriter extends XMLWriterBase
r = @space(level) + '<!ATTLIST ' + node.elementName + ' ' + node.attributeName + ' ' + node.attributeType
r += ' ' + node.defaultValueType if node.defaultValueType != '#DEFAULT'
r += ' "' + node.defaultValue + '"' if node.defaultValue
r += '>' + @newline
r += @spacebeforeslash + '>' + @newline

return r

dtdElement: (node, level) ->
@space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + '>' + @newline
@space(level) + '<!ELEMENT ' + node.name + ' ' + node.value + @spacebeforeslash + '>' + @newline

dtdEntity: (node, level) ->
r = @space(level) + '<!ENTITY'
Expand All @@ -209,7 +210,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
else if node.sysID
r += ' SYSTEM "' + node.sysID + '"'
r += ' NDATA ' + node.nData if node.nData
r += '>' + @newline
r += @spacebeforeslash + '>' + @newline

return r

Expand All @@ -221,7 +222,7 @@ module.exports = class XMLStringWriter extends XMLWriterBase
r += ' PUBLIC "' + node.pubID + '"'
else if node.sysID
r += ' SYSTEM "' + node.sysID + '"'
r += '>' + @newline
r += @spacebeforeslash + '>' + @newline

return r

Expand Down
5 changes: 5 additions & 0 deletions src/XMLWriterBase.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ module.exports = class XMLWriterBase
# `options.offset` a fixed number of indentations to add to every line
# `options.allowEmpty` do not self close empty element tags
# 'options.dontprettytextnodes' if any text is present in node, don't indent or LF
# `options.spacebeforeslash` add a space before the closing slash of empty elements
constructor: (options) ->
options or= {}
@pretty = options.pretty or false
Expand All @@ -19,11 +20,13 @@ module.exports = class XMLWriterBase
@newline = options.newline ? '\n'
@offset = options.offset ? 0
@dontprettytextnodes = options.dontprettytextnodes ? 0
@spacebeforeslash = options.spacebeforeslash ? ''
else
@indent = ''
@newline = ''
@offset = 0
@dontprettytextnodes = 0
@spacebeforeslash = ''

# create local copies of these two for later
@newlinedefault = @newline
Expand All @@ -43,11 +46,13 @@ module.exports = class XMLWriterBase
@newline = if "newline" of options then options.newline else '\n'
@offset = if "offset" of options then options.offset else 0
@dontprettytextnodes = if "dontprettytextnodes" of options then options.dontprettytextnodes else 0
@spacebeforeslash = if "spacebeforeslash" of options then options.spacebeforeslash else ''
else
@indent = ''
@newline = ''
@offset = 0
@dontprettytextnodes = 0
@spacebeforeslash = ''

# create local copies of these two for later
@newlinedefault = @newline
Expand Down
33 changes: 33 additions & 0 deletions test/issues/157.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
suite 'Creating XML with string writer:', ->
test 'Plain text writer', ->
eq(
xml('root')
.dtd('hello.dtd')
.ins('pub_border', 'thin')
.ele('img', 'EMPTY')
.att('img', 'height', 'CDATA', '#REQUIRED')
.not('fs', { sysID: 'http://my.fs.com/reader' })
.ent('ent', 'my val')
.pent('ent', 'my val')
.root()
.ins('a', 'b')
.ele('xmlbuilder')
.end({ pretty: true, spacebeforeslash: ' ' })

"""
<?xml version="1.0" ?>
<!DOCTYPE root SYSTEM "hello.dtd" [
<?pub_border thin ?>
<!ELEMENT img EMPTY >
<!ATTLIST img height CDATA #REQUIRED >
<!NOTATION fs SYSTEM "http://my.fs.com/reader" >
<!ENTITY ent "my val" >
<!ENTITY % ent "my val" >
] >
<root>
<?a b ?>
<xmlbuilder />
</root>
"""
)

0 comments on commit d509566

Please sign in to comment.