{
  "version": 3,
  "sources": ["../src/WebFontsAddon.ts"],
  "sourcesContent": ["/**\n * Copyright (c) 2024 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { Terminal, ITerminalAddon } from '@xterm/xterm';\nimport type { WebFontsAddon as IWebFontsApi } from '@xterm/addon-web-fonts';\n\n\n/**\n * Unquote a font family name.\n */\nfunction unquote(s: string): string {\n  if (s[0] === '\"' && s[s.length - 1] === '\"') return s.slice(1, -1);\n  if (s[0] === '\\'' && s[s.length - 1] === '\\'') return s.slice(1, -1);\n  return s;\n}\n\n\n/**\n * Quote a font family name conditionally.\n * @see https://mathiasbynens.be/notes/unquoted-font-family\n */\nfunction quote(s: string): string {\n  const pos = s.match(/([-_a-zA-Z0-9\\xA0-\\u{10FFFF}]+)/u);\n  const neg = s.match(/^(-?\\d|--)/m);\n  if (!neg && pos && pos[1] === s) return s;\n  return `\"${s.replace(/\"/g, '\\\\\"')}\"`;\n}\n\n\nfunction splitFamily(family: string | undefined): string[] {\n  if (!family) return [];\n  return family.split(',').map(e => unquote(e.trim()));\n}\n\n\nfunction createFamily(families: string[]): string {\n  return families.map(quote).join(', ');\n}\n\n\n/**\n * Hash a font face from it properties.\n * Used in `loadFonts` to avoid bloating\n * `document.fonts` from multiple calls.\n */\nfunction hashFontFace(ff: FontFace): string {\n  return JSON.stringify([\n    unquote(ff.family),\n    ff.stretch,\n    ff.style,\n    ff.unicodeRange,\n    ff.weight\n  ]);\n}\n\n\n/**\n * Wait for webfont resources to be loaded.\n *\n * Without any argument, all fonts currently listed in\n * `document.fonts` will be loaded.\n * For a more fine-grained loading strategy you can populate\n * the `fonts` argument with:\n * - font families      :   loads all fontfaces in `document.fonts`\n *                          matching the family names\n * - fontface objects   :   loads given fontfaces and adds them to\n *                          `document.fonts`\n *\n * The returned promise will resolve, when all loading is done.\n */\nfunction _loadFonts(fonts?: (string | FontFace)[]): Promise<FontFace[]> {\n  const ffs = Array.from(document.fonts);\n  if (!fonts || !fonts.length) {\n    return Promise.all(ffs.map(ff => ff.load()));\n  }\n  let toLoad: FontFace[] = [];\n  const ffsHashed = ffs.map(ff => hashFontFace(ff));\n  for (const font of fonts) {\n    if (font instanceof FontFace) {\n      const fontHashed = hashFontFace(font);\n      const idx = ffsHashed.indexOf(fontHashed);\n      if (idx === -1) {\n        document.fonts.add(font);\n        ffs.push(font);\n        ffsHashed.push(fontHashed);\n        toLoad.push(font);\n      } else {\n        toLoad.push(ffs[idx]);\n      }\n    } else {\n      // string as font\n      const familyFiltered = ffs.filter(ff => font === unquote(ff.family));\n      toLoad = toLoad.concat(familyFiltered);\n      if (!familyFiltered.length) {\n        return Promise.reject(`font family \"${font}\" not registered in document.fonts`);\n      }\n    }\n  }\n  return Promise.all(toLoad.map(ff => ff.load()));\n}\n\n\nexport function loadFonts(fonts?: (string | FontFace)[]): Promise<FontFace[]> {\n  return document.fonts.ready.then(() => _loadFonts(fonts));\n}\n\n\nexport class WebFontsAddon implements ITerminalAddon, IWebFontsApi {\n  private _term: Terminal | undefined;\n\n  constructor(public initialRelayout: boolean = true) { }\n\n  public dispose(): void {\n    this._term = undefined;\n  }\n\n  public activate(term: Terminal): void {\n    this._term = term;\n    if (this.initialRelayout) {\n      document.fonts.ready.then(() => this.relayout());\n    }\n  }\n\n  public loadFonts(fonts?: (string | FontFace)[]): Promise<FontFace[]> {\n    return loadFonts(fonts);\n  }\n\n  public async relayout(): Promise<void> {\n    if (!this._term) {\n      return;\n    }\n    await document.fonts.ready;\n    const family = this._term.options.fontFamily;\n    const families = splitFamily(family);\n    const webFamilies = Array.from(new Set(Array.from(document.fonts).map(e => unquote(e.family))));\n    const dirty: string[] = [];\n    const clean: string[] = [];\n    for (const fam of families) {\n      (webFamilies.indexOf(fam) !== -1 ? dirty : clean).push(fam);\n    }\n    if (!dirty.length) {\n      return;\n    }\n    await _loadFonts(dirty);\n    if (this._term) {\n      this._term.options.fontFamily = clean.length ? createFamily(clean) : 'monospace';\n      this._term.options.fontFamily = family;\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": ["unquote", "s", "quote", "pos", "splitFamily", "family", "e", "createFamily", "families", "hashFontFace", "ff", "_loadFonts", "fonts", "ffs", "toLoad", "ffsHashed", "font", "fontHashed", "idx", "familyFiltered", "loadFonts", "WebFontsAddon", "initialRelayout", "term", "webFamilies", "dirty", "clean", "fam"]
}
