98 lines
2.6 KiB
JavaScript
98 lines
2.6 KiB
JavaScript
|
var xhr = require('xhr')
|
||
|
var noop = function(){}
|
||
|
var parseASCII = require('parse-bmfont-ascii')
|
||
|
var parseXML = require('parse-bmfont-xml')
|
||
|
var readBinary = require('parse-bmfont-binary')
|
||
|
var isBinaryFormat = require('./lib/is-binary')
|
||
|
var xtend = require('xtend')
|
||
|
|
||
|
var xml2 = (function hasXML2() {
|
||
|
return self.XMLHttpRequest && "withCredentials" in new XMLHttpRequest
|
||
|
})()
|
||
|
|
||
|
module.exports = function(opt, cb) {
|
||
|
cb = typeof cb === 'function' ? cb : noop
|
||
|
|
||
|
if (typeof opt === 'string')
|
||
|
opt = { uri: opt }
|
||
|
else if (!opt)
|
||
|
opt = {}
|
||
|
|
||
|
var expectBinary = opt.binary
|
||
|
if (expectBinary)
|
||
|
opt = getBinaryOpts(opt)
|
||
|
|
||
|
xhr(opt, function(err, res, body) {
|
||
|
if (err)
|
||
|
return cb(err)
|
||
|
if (!/^2/.test(res.statusCode))
|
||
|
return cb(new Error('http status code: '+res.statusCode))
|
||
|
if (!body)
|
||
|
return cb(new Error('no body result'))
|
||
|
|
||
|
var binary = false
|
||
|
|
||
|
//if the response type is an array buffer,
|
||
|
//we need to convert it into a regular Buffer object
|
||
|
if (isArrayBuffer(body)) {
|
||
|
var array = new Uint8Array(body)
|
||
|
body = new Buffer(array, 'binary')
|
||
|
}
|
||
|
|
||
|
//now check the string/Buffer response
|
||
|
//and see if it has a binary BMF header
|
||
|
if (isBinaryFormat(body)) {
|
||
|
binary = true
|
||
|
//if we have a string, turn it into a Buffer
|
||
|
if (typeof body === 'string')
|
||
|
body = new Buffer(body, 'binary')
|
||
|
}
|
||
|
|
||
|
//we are not parsing a binary format, just ASCII/XML/etc
|
||
|
if (!binary) {
|
||
|
//might still be a buffer if responseType is 'arraybuffer'
|
||
|
if (Buffer.isBuffer(body))
|
||
|
body = body.toString(opt.encoding)
|
||
|
body = body.trim()
|
||
|
}
|
||
|
|
||
|
var result
|
||
|
try {
|
||
|
var type = res.headers['content-type']
|
||
|
if (binary)
|
||
|
result = readBinary(body)
|
||
|
else if (/json/.test(type) || body.charAt(0) === '{')
|
||
|
result = JSON.parse(body)
|
||
|
else if (/xml/.test(type) || body.charAt(0) === '<')
|
||
|
result = parseXML(body)
|
||
|
else
|
||
|
result = parseASCII(body)
|
||
|
} catch (e) {
|
||
|
cb(new Error('error parsing font '+e.message))
|
||
|
cb = noop
|
||
|
}
|
||
|
cb(null, result)
|
||
|
})
|
||
|
}
|
||
|
|
||
|
function isArrayBuffer(arr) {
|
||
|
var str = Object.prototype.toString
|
||
|
return str.call(arr) === '[object ArrayBuffer]'
|
||
|
}
|
||
|
|
||
|
function getBinaryOpts(opt) {
|
||
|
//IE10+ and other modern browsers support array buffers
|
||
|
if (xml2)
|
||
|
return xtend(opt, { responseType: 'arraybuffer' })
|
||
|
|
||
|
if (typeof self.XMLHttpRequest === 'undefined')
|
||
|
throw new Error('your browser does not support XHR loading')
|
||
|
|
||
|
//IE9 and XML1 browsers could still use an override
|
||
|
var req = new self.XMLHttpRequest()
|
||
|
req.overrideMimeType('text/plain; charset=x-user-defined')
|
||
|
return xtend({
|
||
|
xhr: req
|
||
|
}, opt)
|
||
|
}
|