browser.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. var parseAttributes = require('./parse-attribs')
  2. var parseFromString = require('xml-parse-from-string')
  3. //In some cases element.attribute.nodeName can return
  4. //all lowercase values.. so we need to map them to the correct
  5. //case
  6. var NAME_MAP = {
  7. scaleh: 'scaleH',
  8. scalew: 'scaleW',
  9. stretchh: 'stretchH',
  10. lineheight: 'lineHeight',
  11. alphachnl: 'alphaChnl',
  12. redchnl: 'redChnl',
  13. greenchnl: 'greenChnl',
  14. bluechnl: 'blueChnl'
  15. }
  16. module.exports = function parse(data) {
  17. data = data.toString()
  18. var xmlRoot = parseFromString(data)
  19. var output = {
  20. pages: [],
  21. chars: [],
  22. kernings: []
  23. }
  24. //get config settings
  25. ;['info', 'common'].forEach(function(key) {
  26. var element = xmlRoot.getElementsByTagName(key)[0]
  27. if (element)
  28. output[key] = parseAttributes(getAttribs(element))
  29. })
  30. //get page info
  31. var pageRoot = xmlRoot.getElementsByTagName('pages')[0]
  32. if (!pageRoot)
  33. throw new Error('malformed file -- no <pages> element')
  34. var pages = pageRoot.getElementsByTagName('page')
  35. for (var i=0; i<pages.length; i++) {
  36. var p = pages[i]
  37. var id = parseInt(p.getAttribute('id'), 10)
  38. var file = p.getAttribute('file')
  39. if (isNaN(id))
  40. throw new Error('malformed file -- page "id" attribute is NaN')
  41. if (!file)
  42. throw new Error('malformed file -- needs page "file" attribute')
  43. output.pages[parseInt(id, 10)] = file
  44. }
  45. //get kernings / chars
  46. ;['chars', 'kernings'].forEach(function(key) {
  47. var element = xmlRoot.getElementsByTagName(key)[0]
  48. if (!element)
  49. return
  50. var childTag = key.substring(0, key.length-1)
  51. var children = element.getElementsByTagName(childTag)
  52. for (var i=0; i<children.length; i++) {
  53. var child = children[i]
  54. output[key].push(parseAttributes(getAttribs(child)))
  55. }
  56. })
  57. return output
  58. }
  59. function getAttribs(element) {
  60. var attribs = getAttribList(element)
  61. return attribs.reduce(function(dict, attrib) {
  62. var key = mapName(attrib.nodeName)
  63. dict[key] = attrib.nodeValue
  64. return dict
  65. }, {})
  66. }
  67. function getAttribList(element) {
  68. //IE8+ and modern browsers
  69. var attribs = []
  70. for (var i=0; i<element.attributes.length; i++)
  71. attribs.push(element.attributes[i])
  72. return attribs
  73. }
  74. function mapName(nodeName) {
  75. return NAME_MAP[nodeName.toLowerCase()] || nodeName
  76. }