85 lines
2.3 KiB
JavaScript
85 lines
2.3 KiB
JavaScript
|
var parseAttributes = require('./parse-attribs')
|
||
|
var parseFromString = require('xml-parse-from-string')
|
||
|
|
||
|
//In some cases element.attribute.nodeName can return
|
||
|
//all lowercase values.. so we need to map them to the correct
|
||
|
//case
|
||
|
var NAME_MAP = {
|
||
|
scaleh: 'scaleH',
|
||
|
scalew: 'scaleW',
|
||
|
stretchh: 'stretchH',
|
||
|
lineheight: 'lineHeight',
|
||
|
alphachnl: 'alphaChnl',
|
||
|
redchnl: 'redChnl',
|
||
|
greenchnl: 'greenChnl',
|
||
|
bluechnl: 'blueChnl'
|
||
|
}
|
||
|
|
||
|
module.exports = function parse(data) {
|
||
|
data = data.toString()
|
||
|
|
||
|
var xmlRoot = parseFromString(data)
|
||
|
var output = {
|
||
|
pages: [],
|
||
|
chars: [],
|
||
|
kernings: []
|
||
|
}
|
||
|
|
||
|
//get config settings
|
||
|
;['info', 'common'].forEach(function(key) {
|
||
|
var element = xmlRoot.getElementsByTagName(key)[0]
|
||
|
if (element)
|
||
|
output[key] = parseAttributes(getAttribs(element))
|
||
|
})
|
||
|
|
||
|
//get page info
|
||
|
var pageRoot = xmlRoot.getElementsByTagName('pages')[0]
|
||
|
if (!pageRoot)
|
||
|
throw new Error('malformed file -- no <pages> element')
|
||
|
var pages = pageRoot.getElementsByTagName('page')
|
||
|
for (var i=0; i<pages.length; i++) {
|
||
|
var p = pages[i]
|
||
|
var id = parseInt(p.getAttribute('id'), 10)
|
||
|
var file = p.getAttribute('file')
|
||
|
if (isNaN(id))
|
||
|
throw new Error('malformed file -- page "id" attribute is NaN')
|
||
|
if (!file)
|
||
|
throw new Error('malformed file -- needs page "file" attribute')
|
||
|
output.pages[parseInt(id, 10)] = file
|
||
|
}
|
||
|
|
||
|
//get kernings / chars
|
||
|
;['chars', 'kernings'].forEach(function(key) {
|
||
|
var element = xmlRoot.getElementsByTagName(key)[0]
|
||
|
if (!element)
|
||
|
return
|
||
|
var childTag = key.substring(0, key.length-1)
|
||
|
var children = element.getElementsByTagName(childTag)
|
||
|
for (var i=0; i<children.length; i++) {
|
||
|
var child = children[i]
|
||
|
output[key].push(parseAttributes(getAttribs(child)))
|
||
|
}
|
||
|
})
|
||
|
return output
|
||
|
}
|
||
|
|
||
|
function getAttribs(element) {
|
||
|
var attribs = getAttribList(element)
|
||
|
return attribs.reduce(function(dict, attrib) {
|
||
|
var key = mapName(attrib.nodeName)
|
||
|
dict[key] = attrib.nodeValue
|
||
|
return dict
|
||
|
}, {})
|
||
|
}
|
||
|
|
||
|
function getAttribList(element) {
|
||
|
//IE8+ and modern browsers
|
||
|
var attribs = []
|
||
|
for (var i=0; i<element.attributes.length; i++)
|
||
|
attribs.push(element.attributes[i])
|
||
|
return attribs
|
||
|
}
|
||
|
|
||
|
function mapName(nodeName) {
|
||
|
return NAME_MAP[nodeName.toLowerCase()] || nodeName
|
||
|
}
|