{"version":3,"sources":["jsdelivr-header.js","/npm/text2svg@1.0.1/index.js"],"names":[],"mappings":"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","file":"/npm/text2svg@1.0.1/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/text2svg@1.0.1/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","var fs       = require('fs');\nvar path     = require('path');\nvar opentype = require('opentype.js');\n\n\nvar cache = {};\n\nfunction Text2svg(font) {\n\n  if (!font) {\n    throw new Error('Bad font');\n  }\n\n  if (typeof font === 'string') {\n    if (cache[font]) {\n      font = cache[font];\n    } else {\n      return Text2svg.loadSync(font);\n    }\n  }\n\n  this.font = font;\n}\n\nText2svg.load = function (url, callback) {\n\n  if (cache[url]) {\n\n    callback(new Text2svg(cache[url]));\n\n  } else {\n\n    opentype.load(url, function (err, font) {\n\n      if (err) {\n        throw err;\n      } else {\n\n        // cache for speed up\n        cache[url] = font;\n\n        if (callback && typeof callback === 'function') {\n          callback(new Text2svg(font));\n        }\n      }\n    });\n  }\n};\n\nText2svg.loadSync = function (file) {\n\n  if (!file) {\n    throw new Error('The path of font must be specified.');\n  }\n\n  if (cache[file]) {\n    return new Text2svg(cache[file]);\n  }\n\n  var uri  = path.isAbsolute(file) ? file : path.resolve(process.cwd(), file);\n  var font = opentype.loadSync(uri);\n\n  // cache for speed up\n  cache[file] = font;\n\n  return new Text2svg(font);\n};\n\nText2svg.prototype.toPathData = function (text, options) {\n\n  options = options || {};\n\n  var kerning   = options.kerning !== false;\n  var divided   = options.divided === true;\n  var spacing   = options.spacing || 0;\n  var fontSize  = options.fontSize || 72;\n  var fontScale = 1 / this.font.unitsPerEm * fontSize;\n\n  var padding     = parsePadding(options);\n  var strokeWidth = getMaxStrokeWidth(options);\n\n  var ascender  = this.font.ascender * fontScale;\n  var descender = this.font.descender * fontScale;\n  var baseline  = ascender + padding.top + strokeWidth * 2;\n\n  var x = (options.x || 0) + padding.left + strokeWidth;\n  var y = (options.y || 0) + baseline;\n\n  // auto spacing when stroke-width > 1\n  if (strokeWidth > 1 && options.autoSpacing) {\n    spacing += strokeWidth;\n  }\n\n  var paths  = [];\n  var glyphs = this.font.stringToGlyphs(text);\n\n  for (var i = 0, l = glyphs.length; i < l; i++) {\n\n    var glyph = glyphs[i];\n    var path  = glyph.getPath(x, y, fontSize);\n\n    paths.push(path);\n\n    // update x position\n    if (kerning && i < l - 1) {\n      var kerningValue = this.font.getKerningValue(glyph, glyphs[i + 1]);\n      x += kerningValue * fontScale;\n      x += spacing;\n    }\n\n    if (glyph.advanceWidth) {\n      x += glyph.advanceWidth * fontScale;\n    }\n  }\n\n  var width  = fixToInt(x + padding.right + strokeWidth);\n  var height = fixToInt(ascender - descender + padding.top + padding.bottom + strokeWidth * 2);\n  var result = {\n    glyphs: glyphs,\n    width: width,\n    height: height\n  };\n\n\n  if (divided) {\n    result.pathData = paths.map(function (path) {\n      return path.toPathData();\n    });\n  } else {\n\n    var full = new opentype.Path();\n\n    paths.forEach(function (path) {\n      full.extend(path);\n    });\n\n    result.pathData = full.toPathData();\n  }\n\n  return result;\n};\n\nText2svg.prototype.toPath = function (text, options) {\n\n  options = options || {};\n\n  var attr     = options.path;\n  var result   = this.toPathData(text, options);\n  var pathData = result.pathData;\n\n  if (Array.isArray(pathData)) {\n    result.path = pathData.map(function (data, index) {\n\n      if (!data) {\n        return '';\n      }\n\n      var attrX = options['path' + index];\n\n      return buildElement('path', mergeAttr(attr, attrX, { d: data }));\n    });\n  } else {\n    result.path = buildElement('path', mergeAttr(attr, { d: pathData }));\n  }\n\n  return result;\n};\n\nText2svg.prototype.toSVG = function (text, options) {\n\n  options = options || {};\n\n  var content = '';\n  var title   = options.title || text;\n  var desc    = options.desc;\n\n  if (title) {\n    content += buildElement('title', null, title);\n  }\n\n  if (desc) {\n    content += buildElement('desc', null, desc);\n  }\n\n  // path\n  var result = this.toPath(text, options);\n  var path   = result.path;\n  var inner  = path;\n\n  if (Array.isArray(path)) {\n    if (options.grouped !== false) {\n      inner = buildElement('g', options.g, path.join(''));\n    } else {\n      inner = path.join('');\n    }\n  }\n\n  content += inner;\n\n  var x      = options.x || 0;\n  var y      = options.y || 0;\n  var width  = result.width;\n  var height = result.height;\n\n  var attr = {\n    'version': '1.1',\n    'xmlns': 'http://www.w3.org/2000/svg',\n    'xmlns:xlink': 'http://www.w3.org/1999/xlink',\n    'role': 'img',\n    'width': width,\n    'height': height,\n    'viewBox': [x, y, width, height].join(' ')\n  };\n\n  if (options.svg) {\n    attr = mergeAttr(attr, options.svg);\n  }\n\n  result.svg = buildElement('svg', attr, content);\n\n  return result;\n};\n\n\n// helpers\n// -------\n\nfunction fixToInt(val, precision) {\n\n  precision = precision || 2;\n\n  var rounded = Math.round(val);\n  if (rounded === val) {\n    return '' + rounded;\n  } else {\n\n    var fixed = val.toFixed(precision);\n\n    rounded = Math.round(fixed);\n\n    if (rounded === +fixed) {\n      return '' + rounded;\n    }\n\n    return Math.ceil(fixed);\n  }\n}\n\nfunction parseAttr(attr) {\n\n  var result = '';\n\n  if (attr) {\n    for (var name in attr) {\n      if ({}.hasOwnProperty.call(attr, name) && typeof attr[name] !== 'undefined') {\n\n        var val = attr[name];\n\n        if (typeof val === 'undefined' || (typeof val === 'string' && !val)) {\n          continue;\n        }\n\n        result += ' ' + name + '=\"' + val + '\"';\n      }\n    }\n  }\n\n  return result;\n}\n\nfunction mergeAttr() {\n\n  var sources = [].slice.call(arguments);\n  var result  = {};\n\n  sources.forEach(function (attr) {\n\n    if (attr) {\n      for (var name in attr) {\n        if ({}.hasOwnProperty.call(attr, name)) {\n          result[name] = attr[name];\n        }\n      }\n    }\n\n  });\n\n  return result;\n}\n\nfunction getMaxStrokeWidth(options) {\n  var max = 1;\n\n  if (options) {\n    for (var key in options) {\n      if (key.match(/path(\\d+)?/)) {\n        var attr  = options[key];\n        var width = attr['stroke-width'];\n        if (width) {\n          max = Math.max(max, width);\n        }\n      }\n    }\n  }\n\n  return max;\n}\n\nfunction parsePadding(options) {\n\n  var raw = options.padding;\n\n  var padding = {\n    top: 0,\n    left: 0,\n    right: 0,\n    bottom: 0\n  };\n\n  if (raw) {\n    if (typeof raw === 'object') {\n      padding = mergeAttr(padding, raw);\n    } else {\n      raw = parseFloat(raw);\n      if (!isNaN(raw)) {\n        padding = {\n          top: raw,\n          left: raw,\n          right: raw,\n          bottom: raw\n        }\n      }\n    }\n  }\n\n  padding.top    = options.paddingTop || options['padding-top'] || padding.top;\n  padding.left   = options.paddingLeft || options['padding-left'] || padding.left;\n  padding.right  = options.paddingRight || options['padding-right'] || padding.right;\n  padding.bottom = options.paddingBottom || options['padding-bottom'] || padding.bottom;\n\n  return padding;\n}\n\nfunction buildElement(tagName, attr, content) {\n  return '<' + tagName + parseAttr(attr) + '>'\n    + (content || '')\n    + '</' + tagName + '>';\n}\n\n\n// exports\n// -------\n\nmodule.exports = Text2svg;\n"]}