{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/fontStringParser.ts","../src/fontToString.ts","../src/measureText.ts","../src/parser/tokens.ts","../src/linebreak.ts","../src/round.ts","../src/renderSVG.ts","../src/renderCanvas.ts","../src/createElement.ts","../src/parser/textparser.ts","../src/parser/htmlentities.ts","../src/parser/constants.ts","../src/parser/ParserContext.ts","../src/parser/htmlparser.ts","../src/parser/latexentities.ts","../src/parser/latexparser.ts","../src/Textbox.ts","../src/Rotator.ts"],"sourcesContent":["import { Textbox } from './Textbox.ts';\n\nexport { Textbox } from './Textbox.ts';\nexport { Rotator } from './Rotator.ts';\nexport { measureText } from './measureText.ts';\nexport { setMeasureCanvas } from './measureText.ts';\n\nexport { textparser } from './parser/textparser.ts';\nexport { htmlparser } from './parser/htmlparser.ts';\nexport { latexparser } from './parser/latexparser.ts';\n\n// export const Textbox = _Textbox;\nexport default Textbox;\n\nexport type { Break, LineBreak, SoftHyphen, Token } from './parser/tokens.ts';\n\nexport type {\n  LayoutOptions,\n  LinesProps,\n  FontProps,\n  FontStyle,\n  FontVariant,\n  Alignment,\n  HAlignment,\n  VAlignment,\n  Overflow,\n  OverflowWrap,\n  NumberFunc,\n  NumberLineFunc,\n  RotatorOptions,\n  MeasureOptions,\n  Line,\n  Lines,\n  MinimalCanvasContext,\n  MinimalCanvas\n} from './types.ts';\n","export const WHITESPACE = {\n  '\\u000A': 0.28, //\n  '\\u000D': 0.28, //\n  '\\u0020': 0.28, // SPACE\n  '\\u00A0': 0.28, // NO-BREAK SPACE\n  '\\u1680': 0.28, // OGHAM SPACE MARK\n  '\\u180E': 0.00, // MONGOLIAN VOWEL SEPARATOR\n  '\\u2000': 0.50, // EN QUAD\n  '\\u2001': 1.00, // EM QUAD\n  '\\u2002': 0.50, // EN SPACE\n  '\\u2003': 1.00, // EM SPACE\n  '\\u2004': 0.33, // THREE-PER-EM SPACE\n  '\\u2005': 0.25, // FOUR-PER-EM SPACE\n  '\\u2006': 0.16, // SIX-PER-EM SPACE\n  '\\u2007': 0.56, // FIGURE SPACE\n  '\\u2008': 0.28, // PUNCTUATION SPACE\n  '\\u2009': 0.20, // THIN SPACE\n  '\\u200A': 0.15, // HAIR SPACE\n  '\\u200B': 0.00, // ZERO WIDTH SPACE\n  '\\u202F': 0.16, // NARROW NO-BREAK SPACE\n  '\\u205F': 0.22, // MEDIUM MATHEMATICAL SPACE\n  '\\u3000': 1.00, // IDEOGRAPHIC SPACE\n  '\\uFEFF': 0.00 // ZERO WIDTH NO-BREAK SPACE\n};\n","import type { FontProps } from './types.js';\n\nconst re_fontstring = /^((?:[a-z\\d-]+\\s+)*)([\\d.]+(%|em|px)|(?:x+-)?large|(?:x+-)?small|medium)(?:\\s*\\/\\s*(normal|[\\d.]+(%|px|em)?))?(\\s.+)?$/;\nconst re_small_caps = /\\bsmall-caps\\b/;\nconst re_italics = /\\b(?:italic|oblique)\\b/;\nconst re_bold = /\\bbold(?:er)?\\b/;\n\nconst emSize = 16;\nconst ptSize = 13.3333333;\nconst percentSize = 0.01 * emSize;\n\nconst absSide = {\n  'xx-small': 9,\n  'x-small': 10,\n  'smaller': 13.3333,\n  'small': 13,\n  'medium': 16,\n  'large': 18,\n  'larger': 19.2,\n  'x-large': 24,\n  'xx-large': 32\n};\n\nconst fontCache = new Map<string, FontProps>();\n\nexport function fontStringParser (str: string): FontProps {\n  if (fontCache.has(str)) {\n    return fontCache.get(str)!;\n  }\n\n  const m = re_fontstring.exec(str);\n  if (!m) {\n    // FIXME: throw?\n    return {};\n  }\n\n  const family = (m[6] || '').trim();\n\n  // font size\n  let size = absSide[m[2]] || parseFloat(m[2]);\n  if (m[3] === '%') {\n    size *= percentSize;\n  }\n  else if (m[3] === 'em') {\n    size *= emSize;\n  }\n  else if (m[3] === 'pt') {\n    size *= ptSize;\n  }\n\n  // line height\n  let height: number | undefined;\n  if (m[4] === 'normal' || m[4] === 'inherit' || !m[4]) {\n    // no height defined\n    height = Math.round(size * (7 / 6));\n  }\n  else if (!m[5] || m[5] === 'em') {\n    // height is unitless or in ems\n    height = parseFloat(m[4] || '') * size;\n  }\n  else if (m[5] === 'pt') {\n    height = parseFloat(m[4] || '') * ptSize;\n  }\n  else if (m[5] === '%') {\n    height = size * 0.01;\n  }\n  else {\n    height = parseFloat(m[4] || '');\n  }\n\n  const variant = re_small_caps.test(m[1]) ? 'small-caps' : 'normal';\n  const style = re_italics.test(m[1]) ? 'italic' : 'normal';\n\n  // bold\n  let weight = 400;\n  if (re_bold.test(m[1])) {\n    weight = 700;\n  }\n  // (numberic tokens 550+ = bold)\n  else {\n    const mx = /\\b(\\d+)\\b/.exec(m[1]);\n    const w = mx ? parseInt(mx[1], 10) : 400;\n    weight = (w >= 100 && w !== 400) ? w : 400;\n  }\n\n  const out: FontProps = {\n    family,\n    size,\n    height: height ?? size * (7 / 6),\n    weight,\n    variant,\n    style\n  };\n\n  fontCache.set(str, out);\n  return out;\n}\n","import type { FontProps } from './types.ts';\n\nexport function fontToString (font: FontProps, _full?: boolean) {\n  let s = '';\n  if (font.style && font.style !== 'normal') {\n    s += font.style;\n  }\n  if (font.variant && font.variant !== 'normal') {\n    s += (s ? ' ' : '') + font.variant;\n  }\n  if (font.weight && font.weight !== 400) {\n    s += (s ? ' ' : '');\n    if (font.weight === 700) {\n      s += 'bold';\n    }\n    else {\n      s += font.weight;\n    }\n  }\n  if (font.size) {\n    let fs = font.size;\n    if (!_full && font.sizeAdjust && font.sizeAdjust !== 1) {\n      fs *= font.sizeAdjust;\n    }\n    s += (s ? ' ' : '') + fs + 'px';\n    if (font.height !== font.size) {\n      s += '/' + font.height + 'px';\n    }\n  }\n  if (font.family) {\n    s += (s ? ' ' : '') + font.family;\n  }\n  if (_full) {\n    s += '::' + font.baseline;\n  }\n  if (_full) {\n    s += '::' + font.color;\n  }\n  if (_full) {\n    s += '::' + font.tracking;\n  }\n  if (_full) {\n    s += '::' + (font.sizeAdjust ?? '');\n  }\n  return s;\n}\n","/* globals document OffscreenCanvas HTMLCanvasElement */\nimport { WHITESPACE } from './constants.ts';\nimport { fontStringParser } from './fontStringParser.ts';\nimport { fontToString } from './fontToString.ts';\nimport type { Token } from './parser/tokens.ts';\nimport type { MinimalCanvas, FontProps, MeasureOptions } from './types.ts';\n\nconst defaultFont = fontStringParser('12px/14px sans-serif');\n\nconst defaultOptions = {\n  trim: true,\n  collapse: true\n};\n\nconst wCache = {};\n\ntype MeasureFn = (text: string, font: string | FontProps) => number;\n\n// This is just guesswork but works surprisingly well.\n// Intended to be used to renderer for tests, or as a last\n// resort in a server env.\nexport function getDumbHandler (): MeasureFn {\n  return (text: string, font: string | FontProps) => {\n    const f = typeof font === 'string' ? fontStringParser(font) : font;\n    let size = f.size ?? 12;\n    if (f.family && /\\bmonospace\\b/.test(f.family)) {\n      size *= 0.6;\n    }\n    else {\n      size *= 0.45;\n      if (f.weight && f.weight > 400) {\n        size *= 1.18;\n      }\n    }\n    return text.length * size;\n  };\n}\n\nfunction getMeasureFromCanvas (canvas?: MinimalCanvas | null): MeasureFn | void {\n  if (canvas && canvas.getContext) {\n    const context = canvas.getContext('2d');\n    if (context && typeof context.measureText === 'function') {\n      return (text, font) => {\n        context.font = String(font);\n        return context.measureText(text).width;\n      };\n    }\n  }\n}\n\nexport function getBrowserCanvas () {\n  const doc = typeof document !== 'undefined' ? document : null;\n  return (\n    (typeof OffscreenCanvas !== 'undefined' && new OffscreenCanvas(100, 100)) ||\n    (doc && doc.createElement && doc.createElement('canvas')) ||\n    null\n  );\n}\n\nlet measure: MeasureFn = getMeasureFromCanvas(getBrowserCanvas()) || getDumbHandler();\n/**\n * Set the canvas to use when measuring text. This will be needed when using {@link measureText}\n * in a non-browser environment.\n * @param canvas The canvas interface to use.\n */\nexport function setMeasureCanvas (canvas: MinimalCanvas | null) {\n  if (canvas == null) {\n    measure = getMeasureFromCanvas(getBrowserCanvas()) || getDumbHandler();\n  }\n  else if (canvas) {\n    measure = getMeasureFromCanvas(canvas) || getDumbHandler();\n  }\n  else {\n    throw new Error('setMeasureCanvas argument is not a canvas or null');\n  }\n}\n\n/**\n * Measure a string of text as printed with a specified font and return its width.\n *\n * Be careful that in non-browser environments you may want to supply an alternative\n * canvas using {@link setMeasureCanvas} or this method will default to a crude\n * \"best guess\" method.\n *\n * @param token A string or token of text to measure.\n * @param font A CSS font shorthand string or a collection of font properties.\n * @param options Text handling options.\n */\nexport function measureText (\n  token: string | Token,\n  font: string | FontProps,\n  options: MeasureOptions = defaultOptions\n): number {\n  if (typeof font === 'string') {\n    font = fontStringParser(font);\n  }\n  else {\n    font = { ...defaultFont, ...font };\n  }\n\n  const opts = Object.assign({}, defaultOptions, options);\n  let s = String(token);\n  // empty\n  if (!s) {\n    return 0;\n  }\n  // whitespace\n  if (s in WHITESPACE) {\n    const cacheId = fontToString(font, true) + '/' + s;\n    if (!(cacheId in wCache)) {\n      wCache[cacheId] = measure(`_${s}_`, fontToString(font)) - measure('__', fontToString(font));\n    }\n    return wCache[cacheId];\n  }\n  // When there are line breaks in the string but we're either not trimming\n  // whitespace or not collapsing whitespace, do what the input element does\n  // and convert all \"\\n\" to \" \".\n  if (!opts.trim || !opts.collapse) {\n    s = s.replace(/\\n/g, ' ');\n  }\n  else if (opts.trim) {\n    s = s.replace(/\\n/g, ' ').trim();\n  }\n  else if (opts.collapse) {\n    s = s.replace(/\\s+/g, ' ');\n  }\n  const tracking = typeof token === 'string' ? 0 : token.font.tracking || 0;\n  return measure(s, fontToString(font)) + (font.size ?? 12) * tracking;\n}\n","import type { FontProps } from '../types.ts';\n\n/**\n * Represents a unit of text, typically a single word.\n */\nexport class Token {\n  value: string;\n  width: number;\n  whitespace: boolean | undefined; // FIXME? Is this ever used?\n  font: FontProps;\n  line?: number;\n\n  constructor (value = '', font = {}) {\n    this.value = value;\n    this.font = font;\n    this.width = 0;\n  }\n\n  /** @internal */\n  valueOf () {\n    return this.value;\n  }\n\n  /** @internal */\n  toString () {\n    return this.value;\n  }\n\n  toJSON () {\n    const t = this;\n    const r: any = { type: 'TK', val: t.value ?? '' };\n    if (t.font.style === 'italic') {\n      r.style = t.font.style;\n    }\n    if (t.font.family && t.font.family !== 'sans-serif') {\n      r.font = t.font.family;\n    }\n    if (t.font.weight && t.font.weight !== 400) {\n      r.weight = t.font.weight;\n    }\n    if (t.font.baseline) {\n      r[t.font.baseline < 0 ? 'sub' : 'sup'] = true;\n    }\n    [ 'href', 'color', 'class', 'target', 'rel' ].forEach(key => {\n      if (t.font[key]) {\n        r[key] = t.font[key];\n      }\n    });\n    return r;\n  }\n}\n\nexport class Break extends Token {\n  toJSON () {\n    const r = super.toJSON();\n    r.type = 'BR';\n    delete r.val;\n    return r;\n  }\n}\nexport class LineBreak extends Token {\n  toJSON () {\n    const r = super.toJSON();\n    r.type = 'NL';\n    delete r.val;\n    return r;\n  }\n}\nexport class SoftHyphen extends Token {\n  toJSON () {\n    const r = super.toJSON();\n    r.type = 'SH';\n    delete r.val;\n    return r;\n  }\n}\n","import { WHITESPACE } from './constants.ts';\nimport { fontStringParser } from './fontStringParser.ts';\nimport { measureText } from './measureText.ts';\nimport { Token, Break, LineBreak, SoftHyphen } from './parser/tokens.ts';\nimport type { FontProps, LayoutOptions, Line, Lines, NumberFunc, NumberLineFunc } from './types.ts';\n\nconst re_whitespace = /[\\r\\n\\xA0]+/g;\n\nfunction mergeFont (baseFont: FontProps, currentFont: FontProps): FontProps {\n  return {\n    family: currentFont.family ?? baseFont.family ?? 'sans-serif',\n    style: currentFont.style ?? baseFont.style ?? 'normal',\n    variant: currentFont.variant ?? baseFont.variant ?? 'normal',\n    weight: currentFont.weight ?? baseFont.weight ?? 400,\n    height: currentFont.height ?? baseFont.height ?? 14,\n    size: currentFont.size ?? baseFont.size ?? 12,\n    sizeAdjust: currentFont.sizeAdjust ?? baseFont.sizeAdjust ?? undefined,\n    baseline: currentFont.baseline ?? baseFont.baseline ?? 0,\n    tracking: currentFont.tracking ?? baseFont.tracking ?? 0,\n    href: currentFont.href ?? baseFont.href ?? '',\n    color: currentFont.color ?? baseFont.color ?? '',\n    rel: currentFont.rel ?? baseFont.rel ?? '',\n    target: currentFont.target ?? baseFont.target ?? '',\n    class: currentFont.class ?? baseFont.class ?? ''\n  };\n}\n\nfunction overflow_line (target_line: Line, target_width: number, token: Token) {\n  let line_width = target_line.width;\n  let last: Token | undefined;\n  let temp: number;\n  while (line_width + token.width > target_width && target_line.length) {\n    last = target_line[target_line.length - 1];\n    temp = last.width ?? 0;\n    if (last.width && last.width > token.width) {\n      // reduce the token while possible\n      last.value = last.value.slice(0, -1);\n      last.width = measureText(last, last.font);\n      line_width += last.width;\n    }\n    else {\n      // otherwise remove the token\n      target_line.pop();\n    }\n    line_width -= temp;\n  }\n  if (target_line[target_line.length - 1] instanceof SoftHyphen) {\n    // don't add ellipsis directly after hyphen, it is gross\n    target_line.pop();\n  }\n\n  if (last) {\n    // it is possible that the last line is empty, because of LineBreaks\n    last = target_line[target_line.length - 1] || last || {};\n    token.font = Object.create(last.font);\n    token.font.href = target_line.length ? last.font.href : undefined;\n    token.font.rel = target_line.length ? last.font.rel : undefined;\n    token.font.target = target_line.length ? last.font.target : undefined;\n    target_line.push(token);\n  }\n}\n\nfunction getEmptyLines (f_base: FontProps): Lines {\n  return Object.assign([], {\n    height: 0,\n    font: f_base,\n    width: 0,\n    hasOverflow: false,\n    hasLineOverflow: false\n  });\n}\n\nfunction cloneToken (src: Token): Token {\n  const t = new Token(src.value);\n  t.width = src.width ?? 0;\n  t.whitespace = src.whitespace;\n  t.font = src.font;\n  return t;\n}\n\ntype BreakPoint = {\n  index: number;\n  width: number;\n};\n\n/**\n * WARNING: this method is destructive to the tokens\n */\nexport function linebreak (tokens: Token[], opts: LayoutOptions): Lines {\n  const f_base = fontStringParser(opts.font);\n  if (!tokens.length) {\n    return getEmptyLines(f_base);\n  }\n\n  const height: NumberFunc = typeof opts.height === 'function'\n    ? opts.height\n    : () => opts.height as number;\n  const width: NumberLineFunc = typeof opts.width === 'function'\n    ? opts.width\n    : () => opts.width as number;\n  const lineclamp = opts.overflowLine;\n  const wrapMode = opts.overflowWrap;\n\n  // fonts\n  const f_bold = { ...f_base, weight: 700 };\n  const fHeight = f_base.height ?? f_base.size ?? 12;\n\n  const max_lines = isFinite(height())\n    ? Math.floor(height() / fHeight)\n    : Infinity;\n\n  // skip the work for things what will never show anyway\n  if ((!height() && !width(0)) || !max_lines) {\n    return getEmptyLines(f_base);\n  }\n\n  let index = 0;\n  let line_index = 0;\n  let line_width = 0;\n  const final_breaks: number[] = [];\n  let possible_breaks: BreakPoint[] = [];\n  let last_was_whitespace = false;\n\n  while (index < tokens.length && line_index < max_lines) {\n    const token = tokens[index];\n    const font_inst = mergeFont(f_base, token.font); // XXX: don't need this for Break or LineBreak\n\n    token.width = measureText(token, font_inst);\n    token.font = font_inst;\n    token.line = line_index;\n    token.whitespace = token.value in WHITESPACE;\n\n    if (token.value) {\n      // normalize whitespace (SVG doesn't \"space\" \\n like HTML does)\n      token.value = token.value.replace(re_whitespace, ' ');\n    }\n\n    if (!line_width && token.whitespace ||\n         last_was_whitespace && token.whitespace) {\n      // ignore whitespace at the start of a line\n      // ignore repeat whitespace\n    }\n    else if (token instanceof LineBreak) {\n      line_width = 0;\n      possible_breaks = [];\n      final_breaks.push(index + 1);\n      line_index++;\n    }\n    else if (token instanceof Break || token instanceof SoftHyphen) {\n      possible_breaks.push({\n        index: index,\n        width: line_width\n      });\n    }\n    // have space to add things or this is whitespace\n    else if (token.whitespace || line_width + token.width < width(line_index)) {\n      line_width += token.width;\n    }\n    // out of space in the line, need to perform a break\n    else if (!possible_breaks.length) {\n      // if there are no possible breaks we diverge:\n      // - break-word: inject a break and continue\n      // - else: add the token which overflows\n      if (wrapMode === 'break-word') {\n        const lw = width(line_index);\n        if ((line_width + token.width) > lw) {\n          // split the token into two halves\n          const post = cloneToken(token);\n          // reduce the token to fit the line\n          do {\n            token.value = token.value.slice(0, -1);\n            token.width = measureText(token, token.font || f_base);\n            line_width += token.width;\n          }\n          while (token.value && token.width > lw);\n          // add the remainder and a breakpoint to the stream\n          post.value = post.value.slice(token.value.length);\n          tokens.splice(index + 1, 0, new Break(), post);\n        }\n        final_breaks.push(index + 1);\n        line_width = 0;\n        line_index++;\n      }\n      else {\n        line_width += token.width;\n      }\n    }\n    else {\n      let break_rep: BreakPoint;\n      let break_accepted: boolean;\n      // seek backwards through the breakpoints in the line\n      // and determine if any of them are suitable\n      do {\n        break_accepted = true;\n        break_rep = possible_breaks.pop()!;\n        const break_token: Token = tokens[break_rep.index];\n        let hyp_width: number;\n        if (break_token instanceof SoftHyphen) {\n          hyp_width = measureText('-', break_token.font || f_base);\n          if (break_rep.width + hyp_width > width(line_index)) {\n            // won't fit so we'll try again if we have more breaks\n            break_accepted = !possible_breaks.length;\n          }\n        }\n      }\n      while (!break_accepted);\n\n      // remember this break's index in the tokenstream\n      final_breaks.push(break_rep.index + 1);\n      line_width = 0;\n      line_index++;\n\n      index = break_rep.index;\n      possible_breaks = [];\n    }\n\n    index++;\n    last_was_whitespace = token.whitespace;\n  }\n  // cut remainder of last line if needed\n  if (index !== final_breaks[final_breaks.length - 1]) {\n    final_breaks.push(index);\n  }\n\n  // convert breakpoints to lines\n  let last_break = 0;\n  let widest = 0;\n  const lines = final_breaks.map(p => {\n    // find first token that is not \"junk\"\n    let s = last_break;\n    let t: Token;\n    while ((t = tokens[s]) && (t.whitespace || !t.value)) {\n      // this trims breaks and whitespace from the start of the line\n      s++;\n    }\n    // find last token that is not \"junk\"\n    let e = p;\n    let hardbreak: Token | null = null;\n    while ((e > s) && (t = tokens[e - 1]) &&\n      (t.whitespace || !(t.value || t instanceof SoftHyphen))) {\n      // this trims breaks and whitespace from the end of the line\n      if (t instanceof LineBreak) {\n        // preserve hard breaks so we can justify text later\n        hardbreak = t;\n      }\n      e--;\n    }\n    // last token in line is a soft-hyphen, which expands to a dash\n    if (t instanceof SoftHyphen) {\n      t.value = '-';\n      t.width = measureText('-', t.font || f_base);\n    }\n    // next start pos\n    last_break = p;\n    // cut and clean the line\n    const line = Object.assign(\n      tokens.slice(s, e).filter(d => d.value),\n      { width: 0 }\n    );\n    if (hardbreak) {\n      line.push(hardbreak);\n    }\n    // keep track of line widths\n    line.width = line.reduce((a, d) => a + (d.width || 0), 0);\n    if (line.width > widest) {\n      widest = line.width;\n    }\n    return line;\n  });\n\n  // per-line overflow\n  let hasLineOverflow = false;\n  if (lineclamp) {\n    const overflow = (lineclamp === 'ellipsis') ? '…' : lineclamp;\n    lines.forEach((line, line_index) => {\n      const w = width(line_index);\n      if (line.width > w) {\n        const o_token = new Token(overflow);\n        o_token.font = f_base;\n        o_token.width = measureText(overflow, f_bold);\n        overflow_line(line, w, o_token);\n        hasLineOverflow = true;\n      }\n    });\n  }\n\n  // overflow needed?\n  let hasOverflow = false;\n  const overflow = (opts.overflow === 'ellipsis') ? '…' : opts.overflow;\n  if (overflow && index !== tokens.length) {\n    const line_width = width(lines.length - 1);\n    const last_line = lines[lines.length - 1];\n    const o_token = new Token(overflow);\n    o_token.font = f_base;\n    o_token.width = measureText(overflow, f_bold);\n    overflow_line(last_line, line_width, o_token);\n    hasOverflow = true;\n  }\n  else {\n    hasOverflow = false;\n  }\n\n  return Object.assign(lines, {\n    height: lines.length * fHeight,\n    font: f_base,\n    width: widest,\n    hasOverflow,\n    hasLineOverflow\n  });\n}\n","// This simple round function is here to reduce floating\n// point garbage in SVG attributes\nexport function round (n: number): number {\n  return Math.round(n * 1e6) / 1e6;\n}\n","import { fontStringParser } from './fontStringParser.ts';\nimport { fontToString } from './fontToString.ts';\nimport { LineBreak } from './parser/tokens.ts';\nimport { round } from './round.ts';\nimport type { FontStyle, FontVariant, LayoutOptions, Lines } from './types.ts';\n\nconst alignMap = {\n  center: 'middle',\n  right: 'end'\n};\n\nconst valignMult = {\n  middle: 0.5,\n  center: 0.5,\n  bottom: 1,\n  end: 1\n};\n\ntype SegmentProps = Partial<{\n  fontFamily: string | null,\n  fontSize: number | null,\n  fontWeight: number | null,\n  fontStyle: FontStyle | null,\n  fontVariant: FontVariant | null,\n  fill: string | null,\n  baselineShift: string | null,\n  className: string | null,\n  dx: number,\n  href: string | null,\n  rel: string | null,\n  target: string | null\n}>;\n\nconst eqVal = (a: unknown, b: unknown): boolean => (!a && !b) || a === b;\n\nexport function renderSVG (lines: Lines, opt: LayoutOptions) {\n  const root: SVGElement[] = [];\n  const _font = fontStringParser(opt.font);\n  const fs = _font.size ?? 12;\n  const ff = _font.family ?? 'sans-serif';\n  const align = opt.align ?? 'left';\n  const createElement = opt.createElement;\n\n  if (lines.length) {\n    const lh: number = _font.height ?? fs * (7 / 6);\n\n    // layout dimensions\n    const valign = opt.valign;\n    const height: number = typeof opt.height === 'function' ? opt.height() : opt.height;\n    const width: number = typeof opt.width === 'function' ? opt.width(0) : opt.width;\n    const xFn = typeof opt.x === 'function' ? opt.x : () => opt.x as number;\n\n    // if width is infinite and this is a single line (no linebreaks used)\n    // it should get treated like any other svg text\n    const is_common_label = !isFinite(width) && lines.length === 1;\n\n    // leading step size in EMs\n    const dy = round(lh / fs) ?? 0;\n\n    // baseline adjustment for first line\n    let adj = is_common_label ? 0 : round(lh / ((fs * 1.15) + (lh - fs) / 2));\n    const m = valignMult[valign];\n    if (m && isFinite(height)) {\n      const m = valign === 'bottom' ? 1 : 0.5;\n      adj = (adj || 0) + (height * m - lh * lines.length * m) / fs;\n    }\n\n    const justify = align === 'justify';\n    let xAlignAdjust = 0;\n    if (align === 'right') {\n      xAlignAdjust = width;\n    }\n    else if (align === 'center') {\n      xAlignAdjust = width / 2;\n    }\n\n    let children: SVGElement[] = [];\n    let segmentType = 'tspan';\n    let segmentProps: SegmentProps | null = null;\n    let segmentText = '';\n\n    const flushSegment = () => {\n      if (segmentText) {\n        const segmentElement = createElement(segmentType, segmentProps, segmentText);\n        children.push(segmentElement);\n      }\n      segmentType = 'tspan';\n      segmentProps = null;\n      segmentText = '';\n    };\n\n    for (let li = 0, ll = lines.length; li < ll; li++) {\n      let last_font_id = '';\n      let last_class = '';\n      let dx = 0;\n      const line = lines[li];\n      if (!line.length) {\n        // empty lines don't trigger dy shifting so they need to\n        // be filled with something that gives them substance\n        // --- lineElement.textContent = '\\u00A0';\n        root.push(\n          createElement('tspan', {\n            x: xFn(li),\n            dy: round(li ? dy : adj) + 'em'\n          }, '\\u00A0')\n        );\n        continue;\n      }\n\n      children = [];\n\n      let wsCount = 0;\n      let lineWidth = 0;\n\n      let href = '';\n      for (let wi = 0, wl = line.length; wi < wl; wi++) {\n        const token = line[wi];\n        const sfont = token.font;\n        const sfontId = fontToString(sfont, true);\n\n        if (token.whitespace) { // token.value.split(/\\s+/g).length ?\n          wsCount++;\n        }\n        lineWidth += token.width;\n\n        // re-use segment because it is the same and we can reduce element count\n        // we also need this for underlines to be sequential across multiple\n        // words although this does break when justifying the text\n        if (wi && !token.font.tracking && !dx &&\n            eqVal(sfontId, last_font_id) &&\n            eqVal(token.font.class, last_class) &&\n            eqVal(href, token.font.href)) {\n          segmentText += token.value;\n        }\n        // new segment\n        else {\n          flushSegment();\n\n          const fontSize = (sfont.size ?? fs) * (sfont.sizeAdjust ?? 1);\n          segmentText = token.value;\n          segmentProps = {\n            fontFamily: (sfont.family !== ff && sfont.family) || null,\n            fontSize: fontSize !== fs ? fontSize : null,\n            fontWeight: sfont.weight !== 400 ? sfont.weight || null : null,\n            fontStyle: sfont.style !== 'normal' ? sfont.style || null : null,\n            fontVariant: sfont.variant !== 'normal' ? sfont.variant || null : null,\n            fill: sfont.color || null,\n            baselineShift: sfont.baseline ? (sfont.baseline * 100) + '%' : null,\n            className: token.font.class || null,\n            dx: 0,\n            href: null,\n            rel: null,\n            target: null\n          };\n\n          // tracking\n          if (dx) {\n            segmentProps.dx = round(dx);\n            dx = 0;\n          }\n          if (token.font.tracking) {\n            // next token will be tracked by this segments value\n            dx = fontSize * token.font.tracking;\n          }\n\n          // create the segment\n          if (token.font.href && !href) {\n            href = token.font.href;\n            segmentType = 'a';\n            segmentProps.href = href;\n            segmentProps.rel = token.font.rel;\n            segmentProps.target = token.font.target;\n          }\n          else {\n            href = '';\n          }\n\n          last_font_id = sfontId;\n          last_class = token.font.class ?? '';\n        }\n      }\n      flushSegment();\n\n      if (is_common_label) {\n        root.push(...children);\n      }\n      else {\n        let ws: number | null = null;\n        const last_line = li === ll - 1 || line[line.length - 1] instanceof LineBreak;\n        if (justify && line.length > 1 && !last_line) {\n          // don't do this if line was \\n terminated\n          const missing = width - lineWidth;\n          ws = round(missing / wsCount);\n        }\n        root.push(\n          createElement('tspan', {\n            wordSpacing: ws,\n            x: xFn(li) + xAlignAdjust,\n            dy: round(li ? dy : adj) + 'em'\n          }, ...children)\n        );\n      }\n    }\n  }\n\n  return createElement('text', {\n    fontFamily: ff,\n    fontSize: fs,\n    textAnchor: alignMap[align] || 'start'\n  }, ...root);\n}\n","import { fontStringParser } from './fontStringParser.ts';\nimport { fontToString } from './fontToString.ts';\nimport { LineBreak } from './parser/tokens.ts';\nimport type { FontProps, LayoutOptions, Lines, VAlignment } from './types.ts';\n\nconst valignMult = {\n  middle: 0.5,\n  center: 0.5,\n  bottom: 1,\n  end: 1\n};\n\nfunction getColor (font: FontProps) {\n  return font.color || (font.href ? '#00C' : '#000');\n}\n\nexport function renderCanvas (lines: Lines, opt: LayoutOptions, ctx: CanvasRenderingContext2D) {\n  if (!lines.length) {\n    return;\n  }\n\n  ctx.textBaseline = 'middle';\n\n  const _font = fontStringParser(opt.font);\n  const fs: number = _font.size ?? 12;\n  const lh: number = _font.height ?? fs * (7 / 6);\n\n  const gravity: VAlignment = opt.valign;\n\n  const height: number = typeof opt.height === 'function' ? opt.height() : opt.height;\n  const width: number = typeof opt.width === 'function' ? opt.width(0) : opt.width;\n  const xFn = typeof opt.x === 'function' ? opt.x : () => opt.x as number;\n\n  const align = opt.align;\n  const justify = align === 'justify';\n\n  // baseline adjustment for first line\n  let adj = lh * 0.5;\n  const m = valignMult[gravity];\n  if (m && isFinite(height)) {\n    const th = lines.length * lh;\n    adj += (height * m) - (th * m);\n  }\n\n  let underlineLast: null | [ number, number ];\n\n  lines.forEach((line, line_nr) => {\n    underlineLast = null;\n    let x = xFn(line_nr);\n    const y = line_nr * lh + adj;\n\n    // compute the line's width and count number of whitespace gaps\n    let wsCount = 0;\n    let lineWidthAll = 0;\n    line.forEach(token => {\n      if (token.whitespace) {\n        wsCount++;\n      }\n      lineWidthAll += token.width;\n    });\n\n    // does line need wordspacing (last line or ends in a linebreak)\n    let ws = 0;\n    const last_line = line_nr === lines.length - 1 || line[line.length - 1] instanceof LineBreak;\n    if (justify && line.length > 1 && !last_line) {\n      // don't do this if line was \\n terminated\n      const missing = width - lineWidthAll;\n      ws = missing / wsCount;\n    }\n\n    for (const token of line) {\n      // font and baseline\n      ctx.font = fontToString(token.font);\n      const font = token.font;\n      const dy = font.baseline ? (fs * -(font.baseline)) + (fs * 0.15) : 0;\n      ctx.fillStyle = getColor(font);\n\n      let ax = 0;\n      if (align === 'right') {\n        ax += width - lineWidthAll;\n      }\n      else if (align === 'center') {\n        ax += width / 2 - lineWidthAll / 2;\n      }\n      else if (align === 'justify') {\n        if (token.whitespace || token instanceof LineBreak) {\n          x += ws;\n        }\n      }\n\n      // render token\n      ctx.fillText(token.value, x + ax, y + dy);\n\n      // render underline\n      if (token.font.href) {\n        ctx.beginPath();\n        ctx.strokeStyle = ctx.fillStyle;\n        const uy = Math.floor(y + fs * 0.45) + 0.5;\n        if (!underlineLast) {\n          // we track the last underline end pos so that we draw an unbroken\n          // line even if extra word spacing is used (as with justified text)\n          underlineLast = [ x + ax, uy ];\n        }\n        ctx.moveTo(...underlineLast);\n        ctx.lineTo(x + ax + token.width, uy);\n        ctx.stroke();\n      }\n      else {\n        underlineLast = null;\n      }\n\n      // advance x position\n      x += token.width;\n    }\n  });\n}\n","/* globals document SVGElement */\n\n// eslint-disable-next-line @typescript-eslint/unbound-method\nconst hasOwnProp = Object.prototype.hasOwnProperty;\n\nconst _mem = {};\nfunction unCamel (name: string): string {\n  if (!_mem[name]) {\n    _mem[name] = name.replace(/([a-z])([A-Z])/g, (_, a, b) => {\n      return a + '-' + b.toLowerCase();\n    });\n  }\n  return _mem[name];\n}\n\nfunction append (parent: SVGElement, child: string | SVGElement | SVGElement[]): void {\n  if (Array.isArray(child)) {\n    child.forEach(c => append(parent, c));\n  }\n  else if (typeof child === 'string') {\n    const ch = document.createTextNode(child);\n    parent.appendChild(ch);\n  }\n  else {\n    parent.appendChild(child);\n  }\n}\n\nexport function createElement (\n  name: string,\n  props?: Record<string, string | number | null | boolean> | null,\n  ...children: (SVGElement | string | undefined | null)[]\n): SVGElement {\n  if (typeof document === 'undefined') {\n    throw new Error('No document found, cannot create elements');\n  }\n  const elm = (typeof name === 'string')\n    ? document.createElementNS('http://www.w3.org/2000/svg', name)\n    : name;\n  if (props && elm.setAttribute) {\n    for (const key in props) {\n      if (hasOwnProp.call(props, key) && props[key] != null) {\n        // \"style\" is handled specially\n        // \"key\" is handled specially\n        // segmentElement.setAttributeNS('http://www.w3.org/1999/xlink', 'href', segment.href);\n        elm.setAttribute(\n          key === 'className' ? 'class' : unCamel(key),\n          String(props[key])\n        );\n      }\n    }\n  }\n  if (children != null && children.length) {\n    children.forEach(child => {\n      if (child) {\n        append(elm, child);\n      }\n    });\n  }\n  return elm;\n}\n","import { Token, Break, SoftHyphen } from './tokens.ts';\n\nconst re_whitespace = /^[\\n\\r\\t\\x20\\xA0\\u2000-\\u200B\\u205F\\u3000]/;\nconst re_chars2n = /^[^\\n\\r\\t\\u0020\\u2000-\\u200B\\u205F\\u3000]{2,}/;\nconst re_nobreak = /^[\\xA0\\u2011\\u202F\\u2060\\uFEFF]/;\nconst re_break_after = /^(?:[;\\xAD%?…]|,(?!\\d))/;\nconst re_break_before = /^[´±°¢£¤$¥\\u2212]/;\n\nconst left_symbols = \"'“‘[「【﹝〔<‹«{『（(<《\".split('');\nconst right_symbols = \"',，,！!?？”]」】》>’»﹞〕〗〉})）』。\".split('');\n\nconst isCJKCommon = (char: string): boolean => {\n  const code = char.charCodeAt(0);\n  return code >= 0x4E00 && code <= 0x9FFF;\n};\n\n/**\n * A basic text parser that sections texts into words but also\n * deals with inserting appropriate breaks at correct points.\n */\nexport function textparser (text?: string | null): Token[] {\n  text = text || '';\n  const tokens: Token[] = [];\n  let last_ch = text.charAt(0);\n  let curr_ch: string = '';\n  let next_ch: string = '';\n  let p = 0;\n  for (let i = 1, l = text.length; i < l; i++) {\n    curr_ch = text.charAt(i);\n    next_ch = text.charAt(i + 1);\n\n    const last_is_ws = re_whitespace.test(last_ch);\n    const curr_is_ws = re_whitespace.test(curr_ch);\n    // Chinese text can be wrapped at any point between letter characters.\n    let allow_break = curr_is_ws || last_is_ws || isCJKCommon(last_ch) || isCJKCommon(curr_ch);\n\n    if ((re_break_before.test(curr_ch) && !re_nobreak.test(last_ch)) ||\n         (re_break_after.test(last_ch + next_ch) && !re_nobreak.test(curr_ch))) {\n      allow_break = true;\n    }\n\n    // The symbol on the left must wrap with the text on its right.\n    // Likewise, the symbol on the right must wrap with the text on its left.\n    if (allow_break && (right_symbols.includes(curr_ch) || left_symbols.includes(last_ch))) {\n      allow_break = false;\n    }\n\n    // slighly more complicated case: hyphens\n    if (\n      last_ch === '\\u002D' || // - ASCII dash\n      last_ch === '\\u2010' || // ‐ Unicode hyphen\n      last_ch === '\\u2013' || // – En dash\n      last_ch === '\\u2014' // — Em dash\n    ) {\n      const pre_last_is_ws = re_whitespace.test(text.charAt(i - 2));\n      if (pre_last_is_ws && !curr_is_ws) {\n        allow_break = false;\n      }\n      if (!pre_last_is_ws && re_chars2n.test(curr_ch + next_ch)) {\n        allow_break = true;\n      }\n    }\n\n    if (allow_break) {\n      const s = text.slice(p, i);\n      if (s.endsWith('\\u00AD')) { // ends in a S-HY ?\n        tokens.push(new Token(s.slice(0, -1)));\n        tokens.push(new SoftHyphen());\n      }\n      else {\n        tokens.push(new Token(s));\n        tokens.push(new Break());\n      }\n      p = i;\n    }\n    last_ch = curr_ch;\n  }\n\n  tokens.push(new Token(text.slice(p)));\n\n  return tokens;\n}\n","export const htmlEntitites = {\n  nbsp: '\\u00A0',\n  iexcl: '¡',\n  cent: '¢',\n  pound: '£',\n  curren: '¤',\n  yen: '¥',\n  brvbar: '¦',\n  sect: '§',\n  uml: '¨',\n  copy: '©',\n  ordf: 'ª',\n  laquo: '«',\n  not: '¬',\n  shy: '\\u00AD',\n  reg: '®',\n  macr: '¯',\n  deg: '°',\n  plusmn: '±',\n  sup2: '²',\n  sup3: '³',\n  acute: '´',\n  micro: 'µ',\n  para: '¶',\n  middot: '·',\n  cedil: '¸',\n  sup1: '¹',\n  ordm: 'º',\n  raquo: '»',\n  frac14: '¼',\n  frac12: '½',\n  frac34: '¾',\n  iquest: '¿',\n  Agrave: 'À',\n  Aacute: 'Á',\n  Acirc: 'Â',\n  Atilde: 'Ã',\n  Auml: 'Ä',\n  Aring: 'Å',\n  AElig: 'Æ',\n  Ccedil: 'Ç',\n  Egrave: 'È',\n  Eacute: 'É',\n  Ecirc: 'Ê',\n  Euml: 'Ë',\n  Igrave: 'Ì',\n  Iacute: 'Í',\n  Icirc: 'Î',\n  Iuml: 'Ï',\n  ETH: 'Ð',\n  Ntilde: 'Ñ',\n  Ograve: 'Ò',\n  Oacute: 'Ó',\n  Ocirc: 'Ô',\n  Otilde: 'Õ',\n  Ouml: 'Ö',\n  times: '×',\n  Oslash: 'Ø',\n  Ugrave: 'Ù',\n  Uacute: 'Ú',\n  Ucirc: 'Û',\n  Uuml: 'Ü',\n  Yacute: 'Ý',\n  THORN: 'Þ',\n  szlig: 'ß',\n  agrave: 'à',\n  aacute: 'á',\n  acirc: 'â',\n  atilde: 'ã',\n  auml: 'ä',\n  aring: 'å',\n  aelig: 'æ',\n  ccedil: 'ç',\n  egrave: 'è',\n  eacute: 'é',\n  ecirc: 'ê',\n  euml: 'ë',\n  igrave: 'ì',\n  iacute: 'í',\n  icirc: 'î',\n  iuml: 'ï',\n  eth: 'ð',\n  ntilde: 'ñ',\n  ograve: 'ò',\n  oacute: 'ó',\n  ocirc: 'ô',\n  otilde: 'õ',\n  ouml: 'ö',\n  divide: '÷',\n  oslash: 'ø',\n  ugrave: 'ù',\n  uacute: 'ú',\n  ucirc: 'û',\n  uuml: 'ü',\n  yacute: 'ý',\n  thorn: 'þ',\n  yuml: 'ÿ',\n  fnof: 'ƒ',\n  Alpha: 'Α',\n  Beta: 'Β',\n  Gamma: 'Γ',\n  Delta: 'Δ',\n  Epsilon: 'Ε',\n  Zeta: 'Ζ',\n  Eta: 'Η',\n  Theta: 'Θ',\n  Iota: 'Ι',\n  Kappa: 'Κ',\n  Lambda: 'Λ',\n  Mu: 'Μ',\n  Nu: 'Ν',\n  Xi: 'Ξ',\n  Omicron: 'Ο',\n  Pi: 'Π',\n  Rho: 'Ρ',\n  Sigma: 'Σ',\n  Tau: 'Τ',\n  Upsilon: 'Υ',\n  Phi: 'Φ',\n  Chi: 'Χ',\n  Psi: 'Ψ',\n  Omega: 'Ω',\n  alpha: 'α',\n  beta: 'β',\n  gamma: 'γ',\n  delta: 'δ',\n  epsilon: 'ε',\n  zeta: 'ζ',\n  eta: 'η',\n  theta: 'θ',\n  iota: 'ι',\n  kappa: 'κ',\n  lambda: 'λ',\n  mu: 'μ',\n  nu: 'ν',\n  xi: 'ξ',\n  omicron: 'ο',\n  pi: 'π',\n  rho: 'ρ',\n  sigmaf: 'ς',\n  sigma: 'σ',\n  tau: 'τ',\n  upsilon: 'υ',\n  phi: 'φ',\n  chi: 'χ',\n  psi: 'ψ',\n  omega: 'ω',\n  thetasym: 'ϑ',\n  upsih: 'ϒ',\n  piv: 'ϖ',\n  bull: '•',\n  hellip: '…',\n  prime: '′',\n  Prime: '″',\n  oline: '‾',\n  frasl: '⁄',\n  weierp: '℘',\n  image: 'ℑ',\n  real: 'ℜ',\n  trade: '™',\n  alefsym: 'ℵ',\n  larr: '←',\n  uarr: '↑',\n  rarr: '→',\n  darr: '↓',\n  harr: '↔',\n  crarr: '↵',\n  lArr: '⇐',\n  uArr: '⇑',\n  rArr: '⇒',\n  dArr: '⇓',\n  hArr: '⇔',\n  forall: '∀',\n  part: '∂',\n  exist: '∃',\n  empty: '∅',\n  nabla: '∇',\n  isin: '∈',\n  notin: '∉',\n  ni: '∋',\n  prod: '∏',\n  sum: '∑',\n  minus: '−',\n  lowast: '∗',\n  radic: '√',\n  prop: '∝',\n  infin: '∞',\n  ang: '∠',\n  and: '⊥',\n  or: '⊦',\n  cap: '∩',\n  cup: '∪',\n  int: '∫',\n  there4: '∴',\n  sim: '∼',\n  cong: '≅',\n  asymp: '≈',\n  ne: '≠',\n  equiv: '≡',\n  le: '≤',\n  ge: '≥',\n  sub: '⊂',\n  sup: '⊃',\n  nsub: '⊄',\n  sube: '⊆',\n  supe: '⊇',\n  oplus: '⊕',\n  otimes: '⊗',\n  perp: '⊥',\n  sdot: '⋅',\n  lceil: '⌈',\n  rceil: '⌉',\n  lfloor: '⌊',\n  rfloor: '⌋',\n  lang: '〈',\n  rang: '〉',\n  loz: '◊',\n  spades: '♠',\n  clubs: '♣',\n  hearts: '♥',\n  diams: '♦',\n  quot: '\"',\n  amp: '&',\n  lt: '<',\n  gt: '>',\n  OElig: 'Œ',\n  oelig: 'œ',\n  Scaron: 'Š',\n  scaron: 'š',\n  Yuml: 'Ÿ',\n  circ: 'ˆ',\n  tilde: '˜',\n  ensp: '\\u2002',\n  emsp: '\\u2003',\n  thinsp: '\\u2009',\n  zwnj: '\\u200C',\n  zwj: '\\u200D',\n  lrm: '\\u200E',\n  rlm: '\\u200F',\n  ndash: '–',\n  mdash: '—',\n  lsquo: '‘',\n  rsquo: '’',\n  sbquo: '‚',\n  ldquo: '“',\n  rdquo: '”',\n  bdquo: '„',\n  dagger: '†',\n  Dagger: '‡',\n  permil: '‰',\n  lsaquo: '‹',\n  rsaquo: '›'\n};\n","import type { FontProps } from '../types.ts';\n\nexport const BASELINE_SUB = -0.3;\nexport const BASELINE_SUPER = 0.45;\nexport const SUBSCRIPT_SIZE = 0.7;\n\nexport const FONT_DEFAULTS: FontProps = {\n  // family: 'sans-serif',\n  weight: 400,\n  style: 'normal',\n  variant: 'normal',\n  baseline: 0,\n  tracking: 0,\n  href: ''\n};\n","import type { FontProps } from '../types.ts';\nimport { FONT_DEFAULTS } from './constants.ts';\nimport { Break, LineBreak, type Token } from './tokens.ts';\n\nconst re_whitespace = /^[\\n\\r\\x20\\u2000-\\u200B\\u205F\\u3000]/;\n\nexport class ParserContext {\n  tokens: Token[];\n  stack: FontProps[];\n  props: FontProps;\n\n  constructor () {\n    this.tokens = [];\n    this.stack = [];\n    this.props = { ...FONT_DEFAULTS };\n  }\n\n  add_token (d: Token): Token {\n    d.font = this.props;\n    this.tokens.push(d);\n    return d;\n  }\n\n  open_context () {\n    // create new context\n    this.stack.push(this.props);\n    this.props = Object.create(this.props);\n  }\n\n  close_context () {\n    // restore context\n    if (!this.stack.length) {\n      throw new Error('Unexpected }');\n    }\n    this.props = this.stack.pop()!;\n  }\n\n  trimEnd () {\n    let last = this.tokens[this.tokens.length - 1];\n    while (last instanceof LineBreak) {\n      this.tokens.pop();\n      last = this.tokens[this.tokens.length - 1];\n    }\n  }\n\n  setProps (props: Partial<FontProps>) {\n    for (const [ key, value ] of Object.entries(props)) {\n      if (value != null) {\n        this.props[key] = value;\n      }\n    }\n  }\n\n  maybeLineBreak (numBreaks: number | undefined) {\n    const len = this.tokens.length;\n    if (len > 0 && numBreaks && numBreaks > 0) {\n      // ignore all breaks and whitespace...\n      let n = len - 1;\n      while (this.tokens[n] &&\n        (this.tokens[n] instanceof Break || re_whitespace.test(this.tokens[n].value))) {\n        n--;\n      }\n      // discount tailing linebreaks from how many are needed\n      while (numBreaks && this.tokens[n] && this.tokens[n] instanceof LineBreak) {\n        n--;\n        numBreaks--;\n      }\n      // add linebreaks as needed\n      while (numBreaks-- > 0) {\n        this.tokens.push(new LineBreak());\n      }\n    }\n  }\n}\n","import { Token, LineBreak } from './tokens.ts';\nimport { textparser } from './textparser.ts';\nimport { htmlEntitites } from './htmlentities.ts';\nimport { ParserContext } from './ParserContext.ts';\nimport type { FontProps } from '../types.ts';\nimport { BASELINE_SUB, BASELINE_SUPER, SUBSCRIPT_SIZE } from './constants.ts';\n\nconst re_html_tag_close = /^<\\/([a-zA-Z0-9]+)([^>]*)>/;\nconst re_html_tag_open = /^<([a-zA-Z0-9]+)((?:\\s[^=\\s/]+(?:\\s*=\\s*(?:\"[^\"]+\"|'[^']+'|[^>\\\\s]+))?)+)?\\s*(\\/?)>(\\n*)/;\nconst re_html_comment = /^<!--(.+?)-->/;\nconst re_entity = /&(?:#(\\d\\d{2,})|#x([\\da-fA-F]{2,})|([a-zA-Z][a-zA-Z1-4]{1,8}));/g;\n\nconst tag_to_prop: Record<string, (this: ParserContext, p: FontProps) => void> = {\n  b: p => (p.weight = 700),\n  strong: p => (p.weight = 700),\n  i: p => (p.style = 'italic'),\n  em: p => (p.style = 'italic'),\n  dfn: p => (p.style = 'italic'),\n  cite: p => (p.style = 'italic'),\n  code: p => (p.family = 'monospace'),\n  kbd: p => (p.family = 'monospace'),\n  samp: p => (p.family = 'monospace'),\n  var: p => (p.family = 'monospace'),\n  tt: p => (p.family = 'monospace'),\n  sub: p => {\n    p.baseline = BASELINE_SUB;\n    p.sizeAdjust = SUBSCRIPT_SIZE;\n  },\n  sup: p => {\n    p.baseline = BASELINE_SUPER;\n    p.sizeAdjust = SUBSCRIPT_SIZE;\n  }\n};\n\nconst tag_to_breaks = {\n  div: 1,\n  li: 1,\n  blockquote: 2,\n  h1: 2,\n  h2: 2,\n  h3: 2,\n  h4: 2,\n  h5: 2,\n  h6: 2,\n  ul: 2,\n  ol: 2,\n  hr: 2,\n  p: 2\n};\n\nfunction decode_entities (str: string): string {\n  return str.replace(re_entity, function (a, u, x, n) {\n    if (u || x) {\n      // unicode or hex escape\n      const radix = u ? 10 : 16;\n      return String.fromCharCode(parseInt(u || x, radix));\n    }\n    else if (n in htmlEntitites) {\n      // named entity\n      return htmlEntitites[n];\n    }\n    return a;\n  });\n}\n\nfunction unquote (s: string): string {\n  if (s && s.length > 1) {\n    if (s.startsWith('\"') && s.endsWith('\"')) {\n      return s.slice(1, -1);\n    }\n    if (s.startsWith(\"'\") && s.endsWith(\"'\")) {\n      return s.slice(1, -1);\n    }\n  }\n  return s;\n}\n\nconst reAttr = /^\\s*([^=\\s&]+)(?:\\s*=\\s*(\"[^\"]+\"|'[^']+'|[^>\\s]+))?/;\nfunction parseAttr (s: string): Record<string, string> {\n  let m: RegExpExecArray | null;\n  const r: Record<string, string> = {};\n  if (s) {\n    do {\n      m = reAttr.exec(s);\n      if (m) {\n        const val = decode_entities(unquote(m[2] || ''))\n          .replace(/[ \\r\\n\\t]+/g, ' ')\n          .trim();\n        r[m[1]] = val;\n        s = s.slice(m[0].length);\n        if (s.length && /^\\S/.test(s[0])) {\n          throw new Error('Attribute error');\n        }\n      }\n    }\n    while (m && s.length);\n    if (/\\S/.test(s)) {\n      throw new Error('Attribute error');\n    }\n  }\n  return r;\n}\n\n/**\n* Parse a very small subset of HTML.\n*\n* This parser can handle linebreaks, as well as inline text\n* instruction tags such as `<b>`, `<tt>`, `<em>`, `<sup>`.\n*/\nexport function htmlparser (text?: string | null): Token[] {\n  text = String(text || '').trim();\n\n  let m: RegExpExecArray | null;\n  let s: RegExpExecArray | null;\n  const self = new ParserContext();\n\n  while (text.length) {\n    if ((m = /^[^<]+/.exec(text))) {\n      const part = decode_entities(m[0]);\n      // delegate text handling to the simple parser\n      textparser(part).forEach(d => self.add_token(d));\n    }\n    else if ((m = re_html_comment.exec(text))) {\n      // noop\n    }\n    else if ((m = re_html_tag_close.exec(text))) {\n      // rich text close\n      self.close_context();\n      self.maybeLineBreak(tag_to_breaks[m[1]]);\n    }\n    else if ((m = re_html_tag_open.exec(text))) {\n      const tagName = m[1];\n      // common block level tags: linebreak\n      self.maybeLineBreak(tag_to_breaks[tagName]);\n      // rich text open\n      self.open_context();\n      if (tag_to_prop[tagName]) {\n        tag_to_prop[tagName].call(self, self.props);\n      }\n      const attr = parseAttr(m[2]);\n      if (tagName === 'a') {\n        self.setProps({\n          href: attr.href,\n          rel: attr.rel,\n          target: attr.target\n        });\n      }\n      if (attr.class) {\n        self.props.class = self.props.class ? self.props.class + ' ' + attr.class : attr.class;\n      }\n      if (attr.style) {\n        // TODO: allow more css props\n        s = /(?:^|\\s|;)color\\s*:\\s*([^;\\s\"']+)/.exec(attr.style);\n        if (s && s[1]) {\n          self.props.color = s[1];\n        }\n      }\n      // allow linebreaks\n      if (tagName === 'br') {\n        self.tokens.push(new LineBreak());\n      }\n    }\n    else {\n      m = [ text.slice(0, 1) ] as RegExpExecArray;\n      self.add_token(new Token(m[0]));\n    }\n    text = text.slice(m[0].length);\n  }\n\n  // discard any trailing whitespace\n  // because it will mess with linecount\n  self.trimEnd();\n\n  return self.tokens;\n}\n","export const LATEX_ENTITIES = {\n  copyright: '©',\n  textcopyright: '©',\n  dag: '†',\n  textdagger: '†',\n  ddag: '‡',\n  textdaggerdbl: '‡',\n  guillemotleft: '«',\n  guillemotright: '»',\n  guilsinglleft: '‹',\n  guilsinglright: '›',\n  ldots: '…',\n  dots: '…',\n  textellipsis: '…',\n  lq: '‘',\n  P: '¶',\n  textparagraph: '¶',\n  pounds: '£',\n  textsterling: '£',\n  quotedblbase: '„',\n  quotesinglbase: '‚',\n  rq: '’',\n  S: '§',\n  sim: '~',\n  textasciicircum: '^',\n  textasciitilde: '˜',\n  texttildelow: '~',\n  textasteriskcentered: '*',\n  textbackslash: '\\'',\n  textbar: '|',\n  textbardbl: '╎',\n  textbigcircle: '◯',\n  textbraceleft: '{',\n  textbraceright: '}',\n  textbullet: '•',\n  textdollar: '$',\n  textemdash: '—',\n  textendash: '—',\n  texteuro: '€',\n  eurosym: '€',\n  euro: '€',\n  textexclamdown: '¡',\n  textgreater: '>',\n  textless: '<',\n  textordfeminine: 'ª',\n  textordmasculine: 'º',\n  textperiodcentered: '·',\n  cdot: '·',\n  textquestiondown: '¿',\n  textquotedblleft: '“',\n  textquotedblright: '”',\n  textquoteleft: '‘',\n  textquoteright: '’',\n  textquotestraightbase: '‚',\n  textquotestraightdblbase: '„',\n  textregistered: '®',\n  textthreequartersemdash: '-', // between en-dash and em-dash.\n  texttrademark: '™',\n  texttwelveudash: '-', // between en-dash and em-dash.\n  textunderscore: '_',\n  textvisiblespace: '␣',\n\n  gets: '←',\n  textleftarrow: '←',\n  to: '→',\n  textrightarrow: '→',\n\n  textdegree: '°',\n\n  infty: '∞',\n  triangle: '△',\n  triangledown: '▽',\n  blacktriangle: '▲',\n  blacktriangledown: '▼',\n  angle: '∠',\n  sphericalangle: '∢',\n  aleph: 'ℵ',\n  hbar: 'ħ',\n  imath: '𝚤',\n  jmath: '𝚥',\n  ell: 'ℓ',\n  wp: '℘',\n  Re: 'ℜ',\n  Im: 'ℑ',\n  mho: '℧',\n  prime: '′',\n  emptyset: '∅',\n  nabla: '∇',\n  surd: '√',\n  partial: '∂',\n  top: '⟙',\n  bot: '⟂',\n  vdash: '⟝',\n  dashv: '⟞',\n  forall: '∀',\n  exists: '∃',\n  nexists: '∄',\n  neg: '¬',\n  lnot: '¬',\n  flat: '♭',\n  natural: '♮',\n  sharp: '♯',\n  backslash: '\\\\',\n  Box: '□',\n  Diamond: '♢',\n  clubsuit: '♣',\n  diamondsuit: '♦',\n  heartsuit: '♥',\n  spadesuit: '♠',\n  Join: '⨝',\n  blacksquare: '■',\n  bigstar: '★',\n\n  diagdown: '╲',\n  diagup: '╱',\n  blacklozenge: '⧫',\n\n  rfloor: '⌋',\n  lfloor: '⌊',\n  rceil: '⌉',\n  lceil: '⌈',\n  rangle: '⟩',\n  langle: '⟨',\n\n  sum: '∑',\n  int: '∫',\n  oint: '∮',\n  prod: '∏',\n  coprod: '∏',\n  bigcap: '∩',\n  bigcup: '∪',\n  bigsqcup: '⊔',\n  bigvee: '∨',\n  bigwedge: '∧',\n  bigodot: '⊙',\n  bigotimes: '⊗',\n  bigoplus: '⊕',\n  biguplus: '⊎',\n\n  alpha: 'α',\n  beta: 'β',\n  chi: 'χ',\n  delta: 'δ',\n  epsilon: 'ε',\n  eta: 'η',\n  gamma: 'γ',\n  iota: 'ι',\n  kappa: 'κ',\n  lambda: 'λ',\n  mu: 'μ',\n  nu: 'ν',\n  omega: 'ω',\n  phi: 'φ',\n  pi: 'π',\n  psi: 'ψ',\n  rho: 'ρ',\n  sigma: 'σ',\n  tau: 'τ',\n  theta: 'θ',\n  upsilon: 'υ',\n  xi: 'ξ',\n  zeta: 'ζ',\n  Alpha: 'Α',\n  Beta: 'Β',\n  Chi: 'Χ',\n  Delta: 'Δ',\n  Epsilon: 'Ε',\n  Eta: 'Η',\n  Gamma: 'Γ',\n  Iota: 'Ι',\n  Kappa: 'Κ',\n  Lambda: 'Λ',\n  Mu: 'Μ',\n  Nu: 'Ν',\n  Omega: 'Ω',\n  Phi: 'Φ',\n  Pi: 'Π',\n  Psi: 'Ψ',\n  Rho: 'Ρ',\n  Sigma: 'Σ',\n  Tau: 'Τ',\n  Theta: 'Θ',\n  Upsilon: 'Υ',\n  Xi: 'Ξ',\n  Zeta: 'Ζ',\n\n  aa: 'å',\n  AA: 'Å',\n  ae: 'æ',\n  AE: 'Æ',\n  dh: 'ð',\n  DH: '\\u00D0',\n  dj: 'đ',\n  DJ: '\\u0110',\n  ij: '\\u0133',\n  IJ: '\\u0132',\n  l: 'ł',\n  L: 'Ł',\n  ng: 'ŋ',\n  NG: 'Ŋ',\n  o: 'ø',\n  O: 'Ø',\n  oe: 'œ',\n  OE: 'Œ',\n  ss: 'ß',\n  SS: 'SS',\n  th: 'þ',\n  TH: 'Þ'\n};\n","import { Token, LineBreak } from './tokens.ts';\nimport { textparser } from './textparser.ts';\nimport { LATEX_ENTITIES } from './latexentities.ts';\nimport type { FontProps } from '../types.ts';\nimport { ParserContext } from './ParserContext.ts';\nimport { BASELINE_SUB, BASELINE_SUPER, SUBSCRIPT_SIZE } from './constants.ts';\n\nconst re_command = /^(\\^|_|\\\\[^#$%&~_^\\\\{}()\\s]+)(\\{)?/;\nconst re_comment = /^%[^\\n]+(?:\\n|$)/;\nconst re_plaintext = /^[^#$%&~_^\\\\{}]+/;\nconst re_esc = /^\\\\([&{}$%#_])/;\n\n// assume partial \\usepackage{hyperref}\n//   \\url{http://www.wikibooks.org}\n//   \\href{http://www.wikibooks.org}{Wikibooks home}\n\n// assume partial \\usepackage{color}\n//   \\color{red}\n//   {\\color{red}some colored text}\n//   \\textcolor{red}{easily}\n//   {\\textcolor{red}some colored text}\n\nconst re_preprocess = /(?:\\\\[\\\\@,!:;-]|-{2,3}|[!?]`|``?|,,|''?|~|<<|>>)/g;\nconst preprocess = {\n  '---': '\\u2014', // \\textemdash\n  '--': '\\u2013', // \\textendash\n  '!`': '¡', // \\textexclamdown\n  '?`': '¿', // \\textquestiondown\n\n  '``': '“', // \\textquotedblleft\n  ',,': '„', //\n  \"''\": '”', // \\textquotedblright\n  '`': '‘', // \\textquoteleft\n  \"'\": '’', // \\textquoteright\n  // , '\"': '”' //\n  '<<': '«', // guillemotleft\n  '>>': '»', // guillemotright\n\n  '~': '\\u00A0', // non-breaking space\n  '\\\\-': '\\u00AD', // soft hyphen\n  '\\\\,': '\\u2009', // thin space\n  '\\\\;': '\\u2003', // thick space\n  '\\\\:': '\\u2005', // medium space\n  '\\\\!': '\\u2006', // negative thin space\n  '\\\\@': '\\uFEFF', // (0 width NBSp) end sentence\n  '\\\\\\\\': '\\\\newline{}' // newline command shorthand\n};\n\ntype CommandHandler = (this: ParserContext, p: FontProps, ...args: string[]) => any;\n\nconst commands: Record<string, CommandHandler> = {\n  'bf': p => (p.weight = 700),\n  'emph': p => {\n    if (p.style === 'italic') {\n      p.style = 'normal';\n    }\n    else {\n      p.style = 'italic';\n    }\n  },\n  'it': p => (p.style = 'italic'),\n  'sl': p => (p.style = 'italic'),\n  'color': (p, c) => (p.color = c),\n  'href': (p, c) => (p.href = c),\n  '^': p => {\n    p.baseline = BASELINE_SUPER;\n    p.sizeAdjust = SUBSCRIPT_SIZE;\n  },\n  '_': p => {\n    p.baseline = BASELINE_SUB;\n    p.sizeAdjust = SUBSCRIPT_SIZE;\n  },\n  'par': function () {\n    this.tokens.push(new LineBreak(), new LineBreak());\n  },\n  'newline': function () {\n    this.tokens.push(new LineBreak());\n  },\n  'url': function (p, url) {\n    this.open_context();\n    this.props.href = url;\n    this.add_token(new Token(url));\n    this.close_context();\n  }\n};\n\ncommands.textsuperscript = commands['^'];\ncommands.textsubscript = commands._;\ncommands.textsl = commands.sl;\ncommands.mathbf = commands.bf;\ncommands.mathit = commands.it;\ncommands.textbf = commands.bf;\ncommands.textit = commands.it;\ncommands.textcolor = commands.color;\n\n/**\n * Parse a very small subset of LaTeX.\n *\n * This parser can handle linebreaks, verbatim, as well as inline text\n * instructions for non-math text. Math mode is not supported at all.\n */\nexport function latexparser (text?: string | null): Token[] {\n  text = String(text || '').trim();\n\n  // quickly preprocess some \"non-consistent\" character escapes\n  const verb = [ '' ];\n  text = text\n    // verbatim texts pulled out\n    .replace(/\\\\verb,(.*?),/, (_, t: string) => {\n      verb.push(t);\n      return '\\\\verb,' + (verb.length - 1) + ',';\n    })\n    .replace(/\\\\\\\\\\n/g, () => '\\\\\\\\')\n    .replace(re_preprocess, (a, idx, str) => ((str.charAt(idx - 1) === '\\\\') ? a : preprocess[a]))\n    .replace(/\\n\\s+/g, a => (a.slice(1).includes('\\n') ? '\\\\par ' : a))\n    .replace(/\\\\symbol\\{(\\d+)\\}/, (a, b, idx, str) => ((str.charAt(idx - 1) === '\\\\') ? a : String.fromCharCode(1 * b)))\n    // Note: x^10 is not the same as x^{10}: The former produces $x^{1}0$ instead of $x^{10}$.\n    .replace(/(^|[^\\\\])(\\^|_)(\\d|[^{]\\S*)/g, (a, b, c, d) => b + c + '{' + d + '}')\n    // verbatim texts inserted back\n    .replace(/\\\\verb,(.*?),/, (m, n) => `\\\\verb,${verb[+n]},`);\n\n  const self = new ParserContext();\n\n  let m: RegExpExecArray | null;\n  while (text.length) {\n    if ((m = re_plaintext.exec(text))) {\n      // delegate text handling to the simple parser\n      textparser(m[0]).forEach(d => self.add_token(d));\n    }\n    else if ((m = re_esc.exec(text))) {\n      self.add_token(new Token(m[1]));\n    }\n    else if ((m = re_comment.exec(text))) {\n      // noop\n    }\n    else if ((m = /^\\{/.exec(text))) {\n      // create new context\n      self.open_context();\n    }\n    else if ((m = /^\\}/.exec(text))) {\n      self.close_context();\n    }\n    else if ((m = /^\\$/.exec(text))) {\n      // toggle math mode -- not supported\n    }\n    else if ((m = /^\\\\verb,([^,]+),/.exec(text))) {\n      self.add_token(new Token(m[1]));\n    }\n    else if ((m = re_command.exec(text))) {\n      const cmd = m[1].slice(1) || m[1];\n      let ctx = !!m[2];\n      if (/^(La)?TeX$/i.test(cmd)) {\n        self.open_context();\n        self.props.family = 'serif';\n        let lt: Token;\n        if (cmd === 'LaTeX') {\n          lt = self.add_token(new Token('L'));\n          lt.font = Object.create(lt.font);\n          lt.font.tracking = -0.25;\n\n          lt = self.add_token(new Token('A'));\n          lt.font = Object.create(lt.font);\n          lt.font.sizeAdjust = 0.7;\n          lt.font.baseline = 0.3;\n          lt.font.tracking = -0.1;\n        }\n\n        lt = self.add_token(new Token('T'));\n        lt.font = Object.create(lt.font);\n        lt.font.tracking = -0.17;\n\n        lt = self.add_token(new Token('E'));\n        lt.font = Object.create(lt.font);\n        lt.font.baseline = -0.22;\n        lt.font.tracking = -0.13;\n\n        lt = self.add_token(new Token('X'));\n        self.close_context();\n      }\n      else if (cmd in LATEX_ENTITIES) {\n        self.add_token(new Token(LATEX_ENTITIES[cmd]));\n        if (ctx) {\n          self.open_context();\n        }\n      }\n      else if (cmd in commands) {\n        const args: string[] = [];\n        let narg = Math.max(0, commands[cmd].length - 1);\n        let arg: RegExpExecArray | null;\n        if (narg) {\n          // ignore matched context\n          ctx = false;\n          text = text.slice(m[0].length - 1);\n          while (narg--) { // expect a parameter\n            if ((arg = /^\\{([^}]+)\\}/.exec(text))) {\n              args.push(arg[1]);\n              text = text.slice(arg[0].length);\n            }\n            else {\n              throw new Error(cmd + ' is missing an argument');\n            }\n          }\n          m[0] = /^\\{/.exec(text) ? '{' : '';\n          ctx = !!m[0];\n        }\n        if (ctx) {\n          self.open_context();\n        }\n        commands[cmd].apply(self, [ self.props, ...args ]);\n      }\n      else {\n        self.add_token(new Token(m[1]));\n        if (ctx) {\n          self.open_context();\n        }\n      }\n    }\n    else {\n      m = [ text.slice(0, 1) ] as RegExpExecArray;\n      self.add_token(new Token(m[0]));\n    }\n    text = text.slice(m[0].length);\n  }\n\n  return self.tokens;\n}\n","/* globals SVGElement OffscreenCanvas HTMLCanvasElement CanvasRenderingContext2D */\nimport { linebreak } from './linebreak.js';\nimport { renderSVG } from './renderSVG.js';\nimport { renderCanvas } from './renderCanvas.ts';\nimport { measureText, setMeasureCanvas } from './measureText.js';\nimport { createElement } from './createElement.ts';\nimport { textparser } from './parser/textparser.ts';\nimport { htmlparser } from './parser/htmlparser.ts';\nimport { latexparser } from './parser/latexparser.ts';\nimport type { Alignment, LayoutOptions, Lines, Overflow, OverflowWrap, VAlignment } from './types.ts';\n\nconst defaults: Omit<LayoutOptions, 'parser' | 'createElement'> = {\n  overflow: 'ellipsis',\n  overflowWrap: 'normal',\n  overflowLine: '',\n  align: 'left',\n  valign: 'top',\n  width: Infinity,\n  height: Infinity,\n  x: 0,\n  font: '12px/14px sans-serif'\n};\n\n/**\n * A Textbox formatter that allows flowing rich text into a preset area.\n */\nexport class Textbox {\n  /**\n   * Default factory function to use when constructing SVG elements.\n   */\n  static createElement = createElement;\n  /**\n   * Default parser to use when consuming text.\n  */\n  static defaultparser = textparser;\n  /**\n   * Measure a string of text as printed with a specified font and return its width.\n  */\n  static measureText = measureText;\n  /**\n   * Set the canvas to use when measuring text (in a non-browser environment).\n  */\n  static setMeasureCanvas = setMeasureCanvas;\n\n  /** @internal */\n  props: LayoutOptions;\n\n  constructor (options?: Partial<LayoutOptions>) {\n    this.props = {\n      overflow: options?.overflow ?? defaults.overflow,\n      overflowWrap: options?.overflowWrap ?? defaults.overflowWrap,\n      overflowLine: options?.overflowLine ?? defaults.overflowLine,\n      align: options?.align ?? defaults.align,\n      valign: options?.valign ?? defaults.valign,\n      width: options?.width ?? defaults.width,\n      height: options?.height ?? defaults.height,\n      x: options?.x ?? defaults.x,\n      font: options?.font ?? defaults.font,\n      parser: options?.parser ?? Textbox.defaultparser,\n      createElement: options?.createElement ?? Textbox.createElement\n    };\n    if (options?.parser) {\n      this.parser(options.parser);\n    }\n  }\n\n  /**\n   * Parses text, flows it into the set dimensions and returns a list of the lines.\n   * The returned object can then be passed on to the renderer.\n   *\n   * As well as a list of lines of tokens, the lines object has a height property\n   * which is useful if you want to set the render destination to the fit the text.\n   *\n   * The lines object also includes a .hasOverflow property which indicates if the\n   * text was able to fit a designated height. It will be `true` if the text did not\n   * fit the defined space.\n   */\n  linebreak (text: string): Lines {\n    const tokens = this.props.parser(String(text).trim());\n    return linebreak(tokens, this.props);\n  }\n\n  /**\n   * Set or get a default font for the text. Parts of the text\n   * may override the default font, but this defines the font used\n   * when nothing else is specified.\n   *\n   * The method assumes a [CSS-style font declaration])(eb/CSS/Reference/Properties/font)\n   * string.\n   *\n   * By default this will be set to `\"12px/14px sans-serif\"`.\n   */\n  font (): string;\n  font (font: string): this;\n  font (font?: string): this | string {\n    if (!arguments.length) {\n      return this.props.font || defaults.font;\n    }\n    this.props.font = font ?? defaults.font;\n    return this;\n  }\n\n  /**\n   * The symbol to use when indicating text overflow (text that\n   * is cut off because it doesn't fit within the set boundaries).\n   *\n   * May be set to any string or the keyword `\"ellipsis\"`.\n   *\n   * By default this will be set to `\"ellipsis\"` which prints `…`.\n   */\n  overflow (): Overflow;\n  overflow (overflow: Overflow): this;\n  overflow (overflow?: Overflow): this | Overflow {\n    if (!arguments.length) {\n      return this.props.overflow;\n    }\n    this.props.overflow = overflow ?? defaults.overflow;\n    return this;\n  }\n\n  /**\n   * The symbol to use when indicating a single line text overflow.\n   *\n   * May be set to any string or `\"\"` to turn off line overflow cutoff.\n   *\n   * By default this will be set to `\"\"` which will allow words longer\n   * than the width of the textbox to print in full.\n   */\n  overflowLine (): Overflow;\n  overflowLine (overflow: Overflow): this;\n  overflowLine (overflow?: Overflow): this | Overflow {\n    if (!arguments.length) {\n      return this.props.overflowLine;\n    }\n    this.props.overflowLine = overflow ?? defaults.overflowLine;\n    return this;\n  }\n\n  /**\n   * Controls whether line breaks should be inserted within an otherwise unbreakable\n   * string to prevent text from overflowing the textbox.\n   *\n   * - Set this to `\"break-word\"` to allow extra breaks mid-word.\n   * - Set this to `\"normal\"` to only allow natural breaks at whitespace, punctuation, or hyphens.\n   *\n   * By default this will be set to `\"normal\"`.\n   */\n  overflowWrap (): OverflowWrap;\n  overflowWrap (wrap: OverflowWrap): this;\n  overflowWrap (wrap?: OverflowWrap): this | OverflowWrap {\n    if (!arguments.length) {\n      return this.props.overflowWrap;\n    }\n    const mode = String(wrap).toLowerCase();\n    this.props.overflowWrap = (mode === 'break-word') ? mode : defaults.overflowWrap;\n    return this;\n  }\n\n  /**\n   * Controls the vertical alignment of the text.\n   *\n   * By default this will be set to `\"top\"`.\n   */\n  valign (): VAlignment;\n  valign (align: VAlignment): this;\n  valign (align?: VAlignment): this | VAlignment {\n    if (!arguments.length) {\n      return this.props.valign;\n    }\n    this.props.valign = align ?? defaults.valign;\n    return this;\n  }\n\n  /**\n   * Controls the horizontal alignment of the text.\n   *\n   * By default this will be set to `\"left\"`.\n   */\n  align (): Alignment;\n  align (align: Alignment): this;\n  align (align?: Alignment): this | Alignment {\n    if (!arguments.length) {\n      return this.props.align;\n    }\n    this.props.align = align ?? defaults.align;\n    return this;\n  }\n\n  /**\n   * Controls the width of the textbox in which to fit the text.\n   *\n   * This can be a callback function if you want runaround text layout,\n   * or to flow the text into irregular space.\n   *\n   * By default this will be set to `Infinity` which prints a text\n   * without linebreaks into a single line.\n   */\n  width (): LayoutOptions['width'];\n  width (width: LayoutOptions['width']): this;\n  width (width?: LayoutOptions['width']): this | LayoutOptions['width'] {\n    if (!arguments.length) {\n      return this.props.width;\n    }\n    this.props.width = width ?? defaults.width;\n    return this;\n  }\n\n  /**\n   * Controls the height of the textbox in which to fit the text.\n   *\n   * By default this will be set to `Infinity` which mean text will\n   * not be subject to overflow.\n   */\n  height (): LayoutOptions['height'];\n  height (height: LayoutOptions['height']): this;\n  height (height?: LayoutOptions['height']): this | LayoutOptions['height'] {\n    if (!arguments.length) {\n      return this.props.height;\n    }\n    this.props.height = height ?? defaults.height;\n    return this;\n  }\n\n  /**\n   * Controls the indentation of text lines.\n   *\n   * This is useful for fitting text into non-rectanglular shapes. A callback\n   * provided as an argument this will be called every line with the line number\n   * as a parameter.\n   *\n   * By default this will be set to `0`.\n   */\n  x (): LayoutOptions['x'];\n  x (x: LayoutOptions['x']): this;\n  x (x?: LayoutOptions['x']): this | LayoutOptions['x'] {\n    if (!arguments.length) {\n      return this.props.height;\n    }\n    this.props.x = x ?? defaults.x;\n    return this;\n  }\n\n  /**\n   * The parser to use when parsing text input.\n   *\n   * - Set it to `\"text\"` for plaintext parsing.\n   * - Set it to `\"html\"` for basic HTML parsing (it understands such things as `<b>`, `<sup>`, `<tt>`, ...).\n   * - Set it to `\"latex\"` for a very basic LaTeX parser (it understands basic text commands and punctuation - no math mode).\n   *\n   * An alternative parser may be provided as a callback, as long as it conforms to the parser interface.\n   *\n   * By default the parser is set to `\"text\"`.\n   */\n  parser (): LayoutOptions['parser'];\n  parser (parser: LayoutOptions['parser'] | 'html' | 'text' | 'latex'): this;\n  parser (parser?: LayoutOptions['parser'] | 'html' | 'text' | 'latex'): this | LayoutOptions['parser'] {\n    if (!arguments.length) {\n      return this.props.parser;\n    }\n    if (parser === 'html') {\n      this.props.parser = htmlparser;\n    }\n    else if (parser === 'text') {\n      this.props.parser = textparser;\n    }\n    else if (parser === 'latex') {\n      this.props.parser = latexparser;\n    }\n    else {\n      this.props.parser = parser ?? Textbox.defaultparser;\n    }\n    return this;\n  }\n\n  /**\n   * The element factory function to use when constructing SVG elements within the SVG renderer.\n   *\n   * The interface conforms to React's `React.createElement` so you may simply set that function as\n   * the factory if you want to use the rendered text in a React render tree.\n   */\n  createElement (): LayoutOptions['createElement'];\n  createElement (factory: LayoutOptions['createElement']): this;\n  createElement (factory?: LayoutOptions['createElement']): this | LayoutOptions['createElement'] {\n    if (!arguments.length) {\n      return this.props.createElement;\n    }\n    this.props.createElement = factory ?? Textbox.createElement;\n    return this;\n  }\n\n  /**\n   * Render text or linebreak-output as an SVG element.\n   *\n   * The output will be a single root text element with the lines and sections contained within.\n   */\n  renderSVG (text: string | Lines): SVGElement {\n    const lines = typeof text === 'string' ? this.linebreak(text) : text;\n    return renderSVG(lines, this.props);\n  }\n\n  /**\n   * Render text or linebreak-output onto a Canvas.\n   */\n  renderCanvas (text: string | Lines, target: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D): void {\n    const lines = typeof text === 'string' ? this.linebreak(text) : text;\n    if (target instanceof CanvasRenderingContext2D) {\n      renderCanvas(lines, this.props, target);\n    }\n    else {\n      const ctx = target.getContext('2d');\n      if (ctx instanceof CanvasRenderingContext2D) {\n        renderCanvas(lines, this.props, ctx);\n      }\n    }\n  }\n\n  /**\n   * Render text or linebreak-output onto a Canvas or as an SVG element.\n   *\n   * This method determines which render output is desired based on whether a canvas based\n   * target was supplied or not.\n   *\n   * @deprecated\n   */\n  render (text: string | Lines): SVGElement;\n  render (text: string | Lines, target: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D): void;\n  render (text: string | Lines, target?: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D): SVGElement | void {\n    const lines = typeof text === 'string' ? this.linebreak(text) : text;\n    if (target) {\n      return this.renderCanvas(lines, target);\n    }\n    return this.renderSVG(lines);\n  }\n}\n","import { createElement } from './createElement.ts';\nimport type { CreateElementFunc, HAlignment, LayoutOptions, RotatorOptions, VAlignment } from './types.ts';\n\nconst alignMap = {\n  top:    -0.0,\n  middle: -0.5,\n  bottom: -1.0,\n  left:   -0.0,\n  center: -0.5,\n  right:  -1.0\n};\n\n/**\n * A convenience utility class to assist rotating text.\n */\nexport class Rotator {\n  static createElement = createElement;\n\n  /** @internal */\n  props: {\n    width: number;\n    height: number;\n    rotation: number;\n    align: HAlignment;\n    valign: VAlignment;\n    createElement: CreateElementFunc,\n  };\n\n  constructor (opts: RotatorOptions) {\n    this.props = {\n      width: Infinity,\n      height: Infinity,\n      rotation: 0,\n      align: 'left',\n      valign: 'top',\n      createElement: Rotator.createElement\n    };\n    if (opts) {\n      for (const key in opts) {\n        if (typeof this[key] === 'function') {\n          this[key](opts[key]);\n        }\n      }\n    }\n    this.render = this.render.bind(this);\n  }\n\n  /**\n   * Origin point of the rotation\n   */\n  get origin (): [ number, number ] {\n    const { align, valign, width, height } = this.props;\n    return [ alignMap[align] * width, alignMap[valign] * height ];\n  }\n\n  /**\n   * A convenience method to set or get a rotation anchor.\n   *\n   * A rotation anchor controls the origin point of the rotation relative to textbox.\n   * It is a string of one or more of alignment keywords separated by spaces.\n   *\n   * Keywords: [ `top`, `middle`, `bottom`, `left`, `center`, `right` ].\n   *\n   * By default it is set to `\"top left\"`\n   */\n  anchor (): string;\n  anchor (anchor: string): this;\n  anchor (anchor?: string): string | this {\n    if (!arguments.length) {\n      return `${this.props.align} ${this.props.valign}`;\n    }\n    if (typeof anchor === 'string') {\n      const dir = anchor.toLowerCase().trim().split(/[\\s,;]+/);\n      for (const d of dir) {\n        if (d === 'top' || d === 'middle' || d === 'bottom') {\n          this.valign(d);\n        }\n        if (d === 'left' || d === 'center' || d === 'right') {\n          this.align(d);\n        }\n      }\n    }\n    return this;\n  }\n\n  /**\n   * Controls the vertical anchor point of the rotation.\n   *\n   * By default this will be set to `\"top\"`.\n   */\n  valign (): VAlignment;\n  valign (align: VAlignment): this;\n  valign (align?: VAlignment): this | VAlignment {\n    if (!arguments.length) {\n      return this.props.valign;\n    }\n    this.props.valign = align ?? 'top';\n    return this;\n  }\n\n  /**\n   * Controls the horizontal alignment of the text.\n   *\n   * By default this will be set to `\"left\"`.\n   */\n  align (): HAlignment;\n  align (align: HAlignment): this;\n  align (align?: HAlignment): this | HAlignment {\n    if (!arguments.length) {\n      return this.props.align;\n    }\n    this.props.align = align ?? 'left';\n    return this;\n  }\n\n  /**\n   * Controls the width of the rotation box in pixels.\n   *\n   * By default this will be set to `Infinity`.\n   */\n  width (): number;\n  width (width: number): this;\n  width (width?: number): this | number {\n    if (!arguments.length) {\n      return this.props.width;\n    }\n    this.props.width = width ?? Infinity;\n    return this;\n  }\n\n  /**\n   * Controls the height of the rotation box in pixels.\n   *\n   * By default this will be set to `Infinity`.\n   */\n  height (): number;\n  height (height: number): this;\n  height (height?: number): this | number {\n    if (!arguments.length) {\n      return this.props.height;\n    }\n    this.props.height = height ?? Infinity;\n    return this;\n  }\n\n  /**\n   * Controls the angle of rotation in degrees.\n   *\n   * By default this will be set to `0`.\n   */\n  rotate (): number;\n  rotate (degrees: number): this;\n  rotate (degrees?: number): this | number {\n    if (!arguments.length) {\n      return this.props.rotation;\n    }\n    this.props.rotation = degrees ?? 0;\n    return this;\n  }\n\n  /**\n   * The element factory function to use when constructing SVG elements within the SVG renderer.\n   *\n   * The interface conforms to React's `React.createElement` so you may simply set that function as\n   * the factory if you want to use the rendered text in a React render tree.\n   */\n  createElement (): LayoutOptions['createElement'];\n  createElement (factory: LayoutOptions['createElement']): this;\n  createElement (factory?: LayoutOptions['createElement']): this | LayoutOptions['createElement'] {\n    if (!arguments.length) {\n      return this.props.createElement;\n    }\n    this.props.createElement = factory ?? Rotator.createElement;\n    return this;\n  }\n\n  /**\n   * Set up a rotated context for additional rendering.\n   *\n   * The method will set up a rotated context, call the supplied callback argument\n   * with a CanvasRenderingContext2D as its argument, and then clean up.\n   */\n  renderCanvas (\n    callback: (ctx: CanvasRenderingContext2D) => void,\n    target: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D\n  ) {\n    const ctx = 'getContext' in target ? target.getContext('2d') : target;\n    if (ctx instanceof CanvasRenderingContext2D) {\n      ctx.save();\n      ctx.rotate(this.rotate() * Math.PI / 180);\n      ctx.translate(...this.origin);\n      callback(ctx);\n      ctx.restore();\n    }\n  }\n\n  /**\n   * Render an SVG <g> element that is rotated around its origin point and\n   * place the given content inside it.\n   */\n  renderSVG (content: SVGElement) {\n    return this.props.createElement('g', {\n      transform: `rotate(${this.rotate()}) translate(${this.origin.join(',')})`\n    }, content);\n  }\n\n  /**\n   * Render onto a Canvas or as an SVG element based on whether a canvas based\n   * target was supplied or not.\n   *\n   * @deprecated\n   */\n  render (contentOrCallback: SVGElement): SVGElement;\n  render (contentOrCallback: () => void, ctx: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D): void;\n  render (\n    contentOrCallback: SVGElement | (() => void),\n    ctx?: OffscreenCanvas | HTMLCanvasElement | CanvasRenderingContext2D\n  ): SVGElement | void {\n    if (typeof contentOrCallback === 'function') {\n      if (ctx) {\n        return this.renderCanvas(contentOrCallback, ctx);\n      }\n    }\n    else if (contentOrCallback instanceof SVGElement) {\n      return this.renderSVG(contentOrCallback);\n    }\n  }\n}\n"],"mappings":"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","names":["overflow","line_index","line_width","createElement","m","valignMult","re_whitespace","re_whitespace","m","alignMap"]}