| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 | 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 //casevar 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}
 |