12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- 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 = Buffer.from(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 = Buffer.from(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)
- }
|