jsonml2html
v0.0.6
Published
Microlibrary that converts jsonml into html strings
Downloads
5
Readme
jsonml2html 0.0.6
Microlibrary that converts jsonml into html strings
Install
bower install jsonml2html
npm install jsonml2html
Simple conversion of jsonml to html
> jsonml2html.toString(["div", "hello world", ["img", {src: "smiley.png"}]]);
'<div>hello world<img src="smiley"></div>'
Implicit class and id
> jsonml2html.toString(["div#root.red", "hello world", ["img.cool.im", {src: "smiley.png"}]]);
'<div id="root" class="red">hello world<img class="cool im" src="smiley"></div>'
Inline style
> jsonml2html.toString(["div", {style: {background: "blue", fontSize: 16}}, "hello world"]);
'<div style="background:blue;font-size:16px">hello world</div>'
Automatic escaping
> jsonml2html.toString(["div", "<blåbærgrød>"]);
'<div><blåbærgrød></div>'
Raw html passthrough
> jsonml2html.toString(["script", ["rawhtml", "a<b"]]);
'<script>a<b</script>'
Notics empty tags must have empty string content to emit endtag:
> jsonml2html.toString(["i.fa.fa-book"]); // WRONG
<i class="fa fa-book">
> jsonml2html.toString(["i.fa.fa-book",""]); // RIGHT
<i class="fa fa-book"></i>
Literate source code
Globals
Define isNodeJs
and runTest
in such a way that they will be fully removed by uglifyjs -mc -d isNodeJs=false -d runTest=false
if typeof isNodeJs == "undefined" or typeof runTest == "undefined" then do ->
root = if typeof global == "undefined" then window else global
root.isNodeJs = (typeof window == "undefined") if typeof isNodeJs == "undefined"
root.runTest = isNodeJs and process.argv[2] == "test" if typeof runTest == "undefined"
jsonml2html = if isNodeJs then exports else window.jsonml2html = {}
xmlEscape
xmlEscape = (str) -> String(str).replace RegExp("[\x00-\x1f\x80-\uffff&<>\"']", "g"), (c) -> "&##{c.charCodeAt 0};"
jsonml2html.xmlEscape = xmlEscape
obj2style
obj2style = (obj) ->
(for key, val of obj
key = key.replace /[A-Z]/g, (c) -> "-" + c.toLowerCase()
val = "#{val}px" if typeof val == "number"
"#{key}:#{val}"
).join ";"
jsonml2html.obj2style = obj2style
toString
toString = (arr) ->
return "#{xmlEscape arr}" if !Array.isArray(arr)
raw html, useful for stuff which shouldn't be xmlescaped etc.
return arr[1] if arr[0] == "rawhtml"
normalise jsonml, make sure it contains attributes
arr = [arr[0], {}].concat arr.slice(1) if arr[1]?.constructor != Object
attr = {}
attr[key] = val for key, val of arr[1]
convert style objects to strings
attr.style = obj2style attr.style if attr.style?.constructor == Object
shorthand for classes and ids
tag = arr[0].replace /#([^.#]*)/, ((_, id) -> attr.id = id; "")
tag = tag.replace /\.([^.#]*)/g, (_, cls) ->
attr["class"] = if attr["class"] == undefined then cls else "#{attr["class"]} #{cls}"
""
create actual tag string
result = "<#{tag}#{(" #{key}=\"#{xmlEscape val}\"" for key, val of attr).join ""}>"
add children and endtag, if there are children. <foo></foo>
is done with ["foo", ""]
result += "#{arr.slice(2).map(toString).join ""}</#{tag}>" if arr.length > 2
return result
jsonml2html.toString = toString
Test / examples
if runTest then process.nextTick ->
assert = require "assert"
jsonml = ["div.main",
style:
background: "red"
textSize: 12
["h1#theHead.foo.bar", "Blåbærgrød"],
["img",
src: "foo"
alt: 'the "quoted"'],
["script", ["rawhtml", "console.log(foo<bar)"]]]
assert.equal jsonml2html.toString(jsonml),
"""<div style="background:red;text-size:12px" class="main"><h1 id="theHead" class="foo bar">Blåbærgrød</h1><img src="foo" alt="the "quoted""><script>console.log(foo<bar)</script></div>"""
README.md autogenerated from jsonml2html.coffee