index.js 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. var fs = require('fs')
  2. var url = require('url')
  3. var path = require('path')
  4. var request = require('phin')
  5. var parseASCII = require('parse-bmfont-ascii')
  6. var parseXML = require('parse-bmfont-xml')
  7. var readBinary = require('parse-bmfont-binary')
  8. var mime = require('mime')
  9. var noop = function() {}
  10. var isBinary = require('./lib/is-binary')
  11. function parseFont(file, data, cb) {
  12. var result, binary
  13. if (isBinary(data)) {
  14. if (typeof data === 'string') data = Buffer.from(data, 'binary')
  15. binary = true
  16. } else data = data.toString().trim()
  17. try {
  18. if (binary) result = readBinary(data)
  19. else if (/json/.test(mime.lookup(file)) || data.charAt(0) === '{')
  20. result = JSON.parse(data)
  21. else if (/xml/.test(mime.lookup(file)) || data.charAt(0) === '<')
  22. result = parseXML(data)
  23. else result = parseASCII(data)
  24. } catch (e) {
  25. cb(e)
  26. cb = noop
  27. }
  28. cb(null, result)
  29. }
  30. module.exports = function loadFont(opt, cb) {
  31. cb = typeof cb === 'function' ? cb : noop
  32. if (typeof opt === 'string') opt = { uri: opt, url: opt }
  33. else if (!opt) opt = {}
  34. var file = opt.uri || opt.url
  35. function handleData(err, data) {
  36. if (err) return cb(err)
  37. parseFont(file, data.body || data, cb)
  38. }
  39. if (url.parse(file).host) {
  40. request(opt).then(function (res) {
  41. handleData(null, res)
  42. }).catch(function (err) {
  43. handleData(err)
  44. })
  45. } else {
  46. fs.readFile(file, opt, handleData)
  47. }
  48. }