You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
2.3 KiB
85 lines
2.3 KiB
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 |
|
} |