{"version":3,"sources":["jsdelivr-header.js","/npm/@traptitech/traq-markdown-it@7.1.0/src/index.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/highlight.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/default/language_subset.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/util.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/traQMarkdownIt.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/regexpPlugin.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/data/stampEffects.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/stamp.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/json.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/default/domain_whitelist.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/embeddingExtractor.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/InlineRenderer.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/container.ts","/npm/@traptitech/traq-markdown-it@7.1.0/src/stampCss.ts"],"names":[],"mappings":"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","file":"/npm/@traptitech/traq-markdown-it@7.1.0/dist/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@traptitech/traq-markdown-it@7.1.0/dist/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","export type { Store } from './Store'\nexport type {\n  Embedding,\n  EmbeddingOrUrl,\n  ExternalUrl,\n  EmbeddingFile,\n  EmbeddingMessage\n} from './embeddingExtractor'\nexport type { MarkdownRenderResult } from './traQMarkdownIt'\nexport type { AnimeEffect, SizeEffect } from './stamp'\n\nexport { createHighlightFunc } from './highlight'\nexport { default as markPlugin } from 'markdown-it-mark'\nexport { default as spoilerPlugin } from '@traptitech/markdown-it-spoiler'\nexport { traQMarkdownIt } from './traQMarkdownIt'\nexport { default as stampPlugin, animeEffectSet, sizeEffectSet } from './stamp'\nexport { default as jsonPlugin } from './json'\nexport { default as katexPlugin } from '@traptitech/markdown-it-katex'\nexport { useContainer } from './container'\nexport { stampCssPlugin } from './stampCss'\n","import hljs from 'highlight.js'\nimport defaultSubset from './default/language_subset'\nimport { escapeHtml } from './util'\n\nconst noHighlightRe = /^(no-?highlight|plain|text)$/i\n\nexport const createHighlightFunc =\n  (preClass: string, withCaption = true, useSubsetForAuto = true) =>\n  (code: string, lang: string): string => {\n    let langName: string\n    let citeTag = ''\n\n    if (withCaption) {\n      const [_langName, langCaption] = lang.split(':')\n      langName = _langName ?? ''\n      if (langCaption) {\n        citeTag = `<cite>${escapeHtml(langCaption)}</cite>`\n      }\n    } else {\n      langName = lang\n    }\n\n    if (hljs.getLanguage(langName)) {\n      const result = hljs.highlight(code, { language: langName })\n      return `<pre class=\"${preClass}\">${citeTag}<code class=\"lang-${result.language}\">${result.value}</code></pre>`\n    } else if (noHighlightRe.test(langName)) {\n      return `<pre class=\"${preClass}\">${citeTag}<code>${escapeHtml(\n        code\n      )}</code></pre>`\n    } else {\n      const result = hljs.highlightAuto(\n        code,\n        useSubsetForAuto ? defaultSubset : undefined\n      )\n      return `<pre class=\"${preClass}\">${citeTag}<code class=\"lang-${result.language}\">${result.value}</code></pre>`\n    }\n  }\n","export default [\n  'actionscript',\n  'awk',\n  'bash',\n  'basic',\n  'bnf',\n  'csharp',\n  'h',\n  'cpp',\n  'cmake',\n  'coq',\n  'css',\n  'clojure',\n  'coffeescript',\n  'crystal',\n  'd',\n  'dart',\n  'delphi',\n  'diff',\n  'django',\n  'dockerfile',\n  'elixir',\n  'elm',\n  'fsharp',\n  'fortran',\n  'go',\n  'gradle',\n  'groovy',\n  'xml',\n  'http',\n  'haml',\n  'handlebars',\n  'haxe',\n  'ini',\n  'json',\n  'java',\n  'javascript',\n  'kotlin',\n  'tex',\n  'less',\n  'lisp',\n  'livescript',\n  'lua',\n  'makefile',\n  'markdown',\n  'mathematica',\n  'matlab',\n  'nginx',\n  'nimrod',\n  'ocaml',\n  'objectivec',\n  'glsl',\n  'graphql',\n  'php',\n  'perl',\n  'plaintext',\n  'pgsql',\n  'powershell',\n  'processing',\n  'prolog',\n  'protobuf',\n  'python',\n  'r',\n  'ruby',\n  'scss',\n  'sql',\n  'scheme',\n  'shell',\n  'stylus',\n  'swift',\n  'twig',\n  'typescript',\n  'vbnet',\n  'vbscript',\n  'verilog',\n  'vim',\n  'x86asm',\n  'xquery',\n  'yaml',\n  'wasm',\n  'zephir'\n]\n","const htmlReplaceRe = /[&<>\"]/g\nconst htmlReplaceMap = new Map([\n  ['&', '&amp;'],\n  ['<', '&lt;'],\n  ['>', '&gt;'],\n  ['\"', '&quot;']\n])\n\n// eslint-disable-next-line @typescript-eslint/no-non-null-assertion\nconst replaceHtmlChar = (ch: string): string => htmlReplaceMap.get(ch)!\n\nexport const escapeHtml = (html: string): string => {\n  if (htmlReplaceRe.test(html)) {\n    return html.replace(htmlReplaceRe, replaceHtmlChar)\n  }\n  return html\n}\n","import MarkdownIt from 'markdown-it'\nimport MarkdownItMark from 'markdown-it-mark'\nimport spoiler from '@traptitech/markdown-it-spoiler'\nimport stamp from './stamp'\nimport json from './json'\nimport katex from '@traptitech/markdown-it-katex'\nimport katexE from 'katex'\nimport mila from 'markdown-it-link-attributes'\nimport filter from 'markdown-it-image-filter'\nimport { createHighlightFunc } from './highlight'\nimport defaultWhitelist from './default/domain_whitelist'\nimport type Token from 'markdown-it/lib/token.mjs'\nimport type { Store } from './Store'\nimport EmbeddingExtractor, { type EmbeddingOrUrl } from './embeddingExtractor'\nimport { InlineRenderer } from './InlineRenderer'\n\nexport type MarkdownRenderResult = {\n  embeddings: EmbeddingOrUrl[]\n  rawText: string\n  renderedText: string\n}\n\nexport class traQMarkdownIt {\n  readonly mdOptions = {\n    breaks: true,\n    linkify: true,\n    highlight: createHighlightFunc('traq-code traq-lang')\n  } as const\n  readonly katexOptions = {\n    katex: katexE,\n    output: 'html',\n    strict: (errCode: string): string =>\n      errCode === 'unicodeTextInMathMode' ? 'ignore' : 'warn',\n    maxSize: 100,\n    blockClass: 'is-scroll'\n  } as const\n  readonly md = new MarkdownIt(this.mdOptions)\n  readonly embeddingExtractor: EmbeddingExtractor\n  readonly inlineRenderer = new InlineRenderer()\n\n  constructor(\n    store: Readonly<Store>,\n    whitelist: readonly string[] = defaultWhitelist,\n    embeddingOrigin: string\n  ) {\n    this.embeddingExtractor = new EmbeddingExtractor(embeddingOrigin)\n    this.setRendererRule()\n    this.setPlugin(store, whitelist)\n  }\n\n  private setPlugin(\n    store: Readonly<Store>,\n    whitelist: readonly string[]\n  ): void {\n    this.md\n      .use(MarkdownItMark)\n      .use(spoiler, true)\n      .use(json, store)\n      .use(stamp, store)\n      .use(katex, this.katexOptions)\n      .use(mila, {\n        attrs: {\n          target: '_blank',\n          rel: 'nofollow noopener noreferrer'\n        }\n      })\n      .use(filter(whitelist, { httpsOnly: true }))\n\n    const dummyMd = new MarkdownIt(this.mdOptions)\n    dummyMd.use(katex, {\n      ...this.katexOptions,\n      maxSize: 1,\n      macros: {\n        // 文字サイズを変更する関数を無効化する\n        '\\\\Huge': () => '',\n        '\\\\huge': () => '',\n        '\\\\LARGE': () => '',\n        '\\\\Large': () => '',\n        '\\\\large': () => ''\n      }\n    })\n\n    this.inlineRenderer.setRules(this.md.renderer.rules, {\n      math_inline: dummyMd.renderer.rules.math_inline,\n      math_block: dummyMd.renderer.rules.math_inline\n    })\n  }\n\n  private setRendererRule(): void {\n    this.md.linkify.tlds(['app', 'dev', 'games', 'tech', 'show'], true)\n    this.md.block.State.prototype.skipEmptyLines = function skipEmptyLines(\n      from: number\n    ): number {\n      for (let max = this.lineMax; from < max; from++) {\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n        if (this.bMarks[from]! + this.tShift[from]! < this.eMarks[from]!) {\n          break\n        }\n        this.push('hardbreak', 'br', 0)\n      }\n      return from\n    }\n  }\n\n  _render(tokens: Token[]): string {\n    return this.md.renderer.render(tokens, this.mdOptions, {})\n  }\n\n  render(text: string): MarkdownRenderResult {\n    const parsed = this.md.parse(text, {})\n\n    const embeddings = this.embeddingExtractor.extract(parsed)\n    this.embeddingExtractor.removeTailEmbeddings(parsed)\n\n    return {\n      embeddings,\n      rawText: text,\n      renderedText: this._render(parsed)\n    }\n  }\n\n  _renderInline(tokens: Token[]): string {\n    return this.inlineRenderer.render(tokens, this.mdOptions, {})\n  }\n\n  renderInline(text: string): MarkdownRenderResult {\n    const parsed = this.md.parse(text, {})\n\n    const embeddings = this.embeddingExtractor.extract(parsed)\n    this.embeddingExtractor.removeTailEmbeddings(parsed)\n    this.embeddingExtractor.replace(parsed)\n\n    return {\n      embeddings,\n      rawText: text,\n      renderedText: this._renderInline(parsed)\n    }\n  }\n}\n","/*!\n * markdown-it-regexp\n * Copyright (c) 2014 Alex Kocharin\n * MIT Licensed\n */\n\nimport MarkdownIt from 'markdown-it'\nimport Token from 'markdown-it/lib/token.mjs'\n\nexport default function RegexpPlugin(\n  regexp: RegExp,\n  replacer: (match: RegExpMatchArray) => string\n): (md: MarkdownIt) => void {\n  let counter = 0\n\n  return function (md) {\n    const flags =\n      (regexp.global ? 'g' : '') +\n      (regexp.multiline ? 'm' : '') +\n      (regexp.ignoreCase ? 'i' : '')\n    const parsedRegexp = RegExp('^' + regexp.source, flags)\n    const id = 'regexp-' + counter++\n\n    md.inline.ruler.push(id, (state, silent) => {\n      // slowwww... maybe use an advanced regexp engine for this\n      const match = parsedRegexp.exec(state.src.slice(state.pos))\n      if (!match) return false\n\n      if (state.pending) {\n        state.pushPending()\n      }\n\n      // valid match found, now we need to advance cursor\n      const oldPos = state.pos\n      state.pos += match[0].length\n\n      // don't insert any tokens in silent mode\n      if (silent) return true\n\n      const token = state.push(id, '', 0) as Token & {\n        meta: { match: RegExpMatchArray }\n        position: number\n        size: number\n      }\n      token.meta = { match: match }\n      token.position = oldPos\n      token.size = match[0].length\n\n      return true\n    })\n\n    md.renderer.rules[id] = (tokens, idx) => {\n      return replacer(tokens[idx]?.meta.match)\n    }\n  }\n}\n","export const animeEffects = [\n  'rotate',\n  'rotate-inv',\n  'wiggle',\n  'parrot',\n  'zoom',\n  'inversion',\n  'turn',\n  'turn-v',\n  'happa',\n  'pyon',\n  'flashy',\n  'pull',\n  'atsumori',\n  'stretch',\n  'stretch-v',\n  'conga',\n  'conga-inv',\n  'marquee',\n  'marquee-inv',\n  'rainbow',\n  'ascension',\n  'shake',\n  'party',\n  'attract'\n] as const\nexport const sizeEffects = ['ex-large', 'large', 'small'] as const\n","import type MarkdownIt from 'markdown-it'\nimport regexp from './regexpPlugin'\nimport { escapeHtml } from './util'\nimport type { Store } from './Store'\nimport { animeEffects, sizeEffects } from './data/stampEffects'\n\nlet store: Readonly<\n  Pick<Store, 'getUserByName' | 'getStampByName' | 'generateStampHref'>\n>\nlet baseUrl = ''\n\nexport const animeEffectSet: ReadonlySet<string> = new Set(animeEffects)\nexport const sizeEffectSet: ReadonlySet<string> = new Set(sizeEffects)\nexport type AnimeEffect = (typeof animeEffects)[number]\nexport type SizeEffect = (typeof sizeEffects)[number]\n\nconst animeEffectAliasMap: ReadonlyMap<AnimeEffect, AnimeEffect> = new Map([\n  ['marquee', 'conga'],\n  ['marquee-inv', 'conga-inv']\n] as const)\n\nconst maxEffectCount = 5\n\nconst wrapWithEffect = (\n  stampHtml: string,\n  animeEffects: readonly AnimeEffect[],\n  sizeEffect: SizeEffect | ''\n): string => {\n  const filterOpenTag = animeEffects\n    .map(\n      (e, i) =>\n        `<span class=\"emoji-effect ${e}${\n          i === 0 && sizeEffect ? ` ${sizeEffect}` : ''\n        }\">`\n    )\n    .join('')\n  const filterCloseTag = '</span>'.repeat(animeEffects.length)\n  return filterOpenTag + stampHtml + filterCloseTag\n}\n\nconst isSizeEffect = (e: string): e is SizeEffect => sizeEffectSet.has(e)\nconst isAnimeEffect = (e: string): e is AnimeEffect => animeEffectSet.has(e)\n\nconst renderStampDomWithStyle = (\n  rawMatch: string,\n  stampName: string,\n  imgTitle: string,\n  style: string,\n  effects: readonly string[]\n): string => {\n  const escapedTitle = escapeHtml(imgTitle)\n  const escapedStyle = escapeHtml(style)\n  const escapedName = escapeHtml(stampName)\n\n  const sizeEffects = effects.filter(isSizeEffect)\n  const animeEffects = effects.filter(isAnimeEffect)\n\n  // 知らないエフェクトはダメ\n  if (sizeEffects.length + animeEffects.length < effects.length) {\n    return rawMatch\n  }\n\n  // アニメーション系エフェクトは5つまで\n  if (animeEffects.length > maxEffectCount) {\n    return rawMatch\n  }\n\n  // aliasの置き換え\n  const replacedAnimeEffects = animeEffects.map(\n    e => animeEffectAliasMap.get(e) ?? e\n  )\n\n  // 複数サイズ指定が合った場合は最後のものを適用\n  const sizeEffectClass = sizeEffects[sizeEffects.length - 1] || ''\n\n  const stampHtml = `<i class=\"emoji message-emoji ${sizeEffectClass}\" title=\":${escapedTitle}:\" style=\"${escapedStyle};\">:${escapedName}:</i>`\n\n  return wrapWithEffect(stampHtml, replacedAnimeEffects, sizeEffectClass)\n}\n\nconst renderStampDom = (\n  rawMatch: string,\n  stampName: string,\n  imgTitle: string,\n  imgUrl: string,\n  effects: readonly string[]\n): string =>\n  renderStampDomWithStyle(\n    rawMatch,\n    stampName,\n    imgTitle,\n    `background-image: url(${imgUrl})`,\n    effects\n  )\n\nconst stampReg = /^[a-zA-Z0-9+_-]{1,32}$/\nexport const hslReg =\n  /(?<color>hsl\\(\\d+,\\s*[\\d]+(?:\\.[\\d]+)?%,\\s*[\\d]+(?:\\.[\\d]+)?%\\))(?<effects>.*)/\nexport const hexReg = /0x(?<color>[0-9a-fA-F]{6})(?<effects>.*)/\n\ninterface ColorRegExpGroup {\n  color: string\n  effects: string\n}\n\nexport const renderHslStamp = (match: Readonly<RegExpExecArray>): string => {\n  // HSL: hsl(..., ...%, ...%)\n  const { color, effects } = match.groups as Readonly<ColorRegExpGroup>\n\n  return renderStampDomWithStyle(\n    `:${match[0]}:`,\n    color,\n    color,\n    `background-color: ${color}`,\n    effects === '' ? [] : effects.split('.').slice(1)\n  )\n}\n\nexport const renderHexStamp = (match: Readonly<RegExpExecArray>): string => {\n  // Hex: 0x......\n  const { color, effects } = match.groups as Readonly<ColorRegExpGroup>\n\n  return renderStampDomWithStyle(\n    `:${match[0]}:`,\n    `0x${color}`,\n    `0x${color}`,\n    `background-color: #${color}`,\n    effects === '' ? [] : effects.split('.').slice(1)\n  )\n}\n\nexport const getStampImageUrl = (fileId: string) => {\n  if (store.generateStampHref) {\n    return store.generateStampHref(fileId)\n  }\n  return `${baseUrl}/api/v3/files/${fileId}`\n}\n\nexport const renderUserStamp = (\n  stampName: string,\n  raw: string,\n  effects: readonly string[]\n): string => {\n  // 先頭の@を除いたものがユーザー名\n  const userName = stampName.slice(1)\n  const user = store.getUserByName(userName)\n  if (!user) {\n    return raw\n  }\n\n  return renderStampDom(\n    raw,\n    stampName,\n    stampName,\n    getStampImageUrl(user.iconFileId),\n    effects\n  )\n}\n\nexport const renderNormalStamp = (\n  stampName: string,\n  raw: string,\n  effects: readonly string[]\n): string => {\n  const stamp = store.getStampByName(stampName)\n  if (!stamp) {\n    return raw\n  }\n\n  return renderStampDom(\n    raw,\n    stampName,\n    stamp.name,\n    getStampImageUrl(stamp.fileId),\n    effects\n  )\n}\n\nexport const renderStamp = (match: Readonly<RegExpMatchArray>): string => {\n  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n  const raw = match[0]!\n  const inner = raw.slice(1, -1)\n\n  const hexMatch = hexReg.exec(inner)\n  if (hexMatch) {\n    return renderHexStamp(hexMatch)\n  }\n\n  const hslMatch = hslReg.exec(inner)\n  if (hslMatch) {\n    return renderHslStamp(hslMatch)\n  }\n\n  const [stampName, ...effects] = inner.split('.') as [string, ...string[]]\n\n  // ユーザーアイコン\n  if (stampName.startsWith('@')) {\n    return renderUserStamp(stampName, raw, effects)\n  }\n\n  if (!stampReg.exec(stampName)) {\n    return raw\n  }\n\n  // 通常スタンプ\n  return renderNormalStamp(stampName, raw, effects)\n}\n\n/**\n * `[a-zA-Z0-9+_-]{1,32}`の部分が通常のスタンプ\n * `@(?:Webhook#)?[a-zA-Z0-9_-]+`の部分がユーザーアイコンスタンプ\n * `\\w+\\([^:<>\"'=+!?]+\\)`の部分が色のスタンプ\n * (?:\\.[\\w+-.]+)?の部分がスタンプエフェクト\n */\nconst stampRegExp =\n  /:(?:[a-zA-Z0-9+_-]{1,32}|@(?:Webhook#)?[a-zA-Z0-9_-]+|\\w+\\([^:<>\"'=+!?]+\\))(?:\\.[\\w+-.]+)?:/\n\n/**\n * @param _baseUrl スタンプの画像の`/api/v3`の前につくURLの部分 (tailing slashなし)\n */\nexport default function stampPlugin(\n  md: MarkdownIt,\n  _store: Readonly<\n    Pick<Store, 'getUserByName' | 'getStampByName' | 'generateStampHref'>\n  >,\n  _baseUrl?: string\n): void {\n  store = _store\n  if (_baseUrl) {\n    baseUrl = _baseUrl\n  }\n  regexp(stampRegExp, renderStamp)(md)\n}\n","import json from 'markdown-it-json'\nimport type { Store } from './Store'\nimport type MarkdownIt from 'markdown-it'\nimport type StateInline from 'markdown-it/lib/rules_inline/state_inline.mjs'\nimport type StateBlock from 'markdown-it/lib/rules_block/state_block.mjs'\n\nlet store: Readonly<Store>\n\ninterface StructData {\n  type: string\n  raw: string\n  id: string\n\n  [k: string]: unknown\n}\n\ninterface ValidStructData extends StructData {\n  type: 'user' | 'channel' | 'group'\n}\n\nexport const isStructData = (\n  data: Readonly<Record<string, unknown>>\n): data is StructData => {\n  return (\n    typeof data['type'] === 'string' &&\n    typeof data['raw'] === 'string' &&\n    typeof data['id'] === 'string'\n  )\n}\n\nexport const validate = (\n  data: Readonly<Record<string, unknown>>\n): data is ValidStructData => {\n  if (!isStructData(data)) {\n    return false\n  }\n\n  const { type, id } = data\n  return (\n    type === 'user' ||\n    (type === 'channel' && !!store.getChannel(id)) ||\n    type === 'group'\n  )\n}\n\ntype TransformFunc = (\n  state: StateBlock | StateInline,\n  data: Readonly<ValidStructData>\n) => void\n\nconst transformUser: TransformFunc = (state, { type, id, raw }) => {\n  const attributes: [string, string][] = []\n  const me = store.getMe()\n\n  attributes.push(['href', store.generateUserHref(id)])\n\n  if (id === me?.id) {\n    attributes.push(['class', 'message-user-link-highlight message-user-link'])\n  } else {\n    attributes.push(['class', 'message-user-link'])\n  }\n\n  let t = state.push('traq_extends_link_open', 'a', 1)\n  t.attrs = attributes\n  t.meta = { type, data: id }\n  t = state.push('text', '', 0)\n  t.content = raw\n  state.push('traq_extends_link_close', 'a', -1)\n}\n\nconst transformUserGroup: TransformFunc = (state, { type, id, raw }) => {\n  const attributes: [string, string][] = []\n  const userGroup = store.getUserGroup(id)\n  const me = store.getMe()\n\n  attributes.push(['href', store.generateUserGroupHref(id)])\n\n  if (userGroup?.members?.some(user => user.id === me?.id) ?? false) {\n    attributes.push([\n      'class',\n      'message-group-link-highlight message-group-link'\n    ])\n  } else {\n    attributes.push(['class', 'message-group-link'])\n  }\n\n  let t = state.push('traq_extends_link_open', 'a', 1)\n  t.attrs = attributes\n  t.meta = { type, data: id }\n  t = state.push('text', '', 0)\n  t.content = raw\n  state.push('traq_extends_link_close', 'a', -1)\n}\n\nconst transformChannel: TransformFunc = (state, { type, id, raw }) => {\n  const attributes: [string, string][] = []\n\n  attributes.push(['href', store.generateChannelHref(id)])\n  attributes.push(['class', 'message-channel-link'])\n\n  let t = state.push('traq_extends_link_open', 'a', 1)\n  t.attrs = attributes\n  t.meta = { type, data: raw }\n  t = state.push('text', '', 0)\n  t.content = raw\n  state.push('traq_extends_link_close', 'a', -1)\n}\n\nconst transform: TransformFunc = (state, data) => {\n  if (data.type === 'user') {\n    transformUser(state, data)\n    return\n  }\n  if (data.type === 'channel' && store.getChannel(data.id)) {\n    transformChannel(state, data)\n    return\n  }\n  if (data.type === 'group') {\n    transformUserGroup(state, data)\n    return\n  }\n}\n\nexport default function messageExtendsPlugin(\n  md: MarkdownIt,\n  _store: Readonly<Store>\n): void {\n  store = _store\n  json(validate, transform)(md)\n}\n","export default [\n  'libra.tokyotech.org',\n  'user-images.githubusercontent.com',\n  'git.trap.jp',\n  'wiki.trapti.tech',\n  'wiki.trap.jp',\n  'md.trapti.tech',\n  'md.trap.jp',\n  'trap.jp',\n  'traq-dev.tokyotech.org'\n] as const\n","import type Token from 'markdown-it/lib/token.mjs'\n\nconst uuidRegexp = /^[\\da-f]{8}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{4}-[\\da-f]{12}$/\n\nexport type Embedding = EmbeddingFile | EmbeddingMessage\nexport type EmbeddingOrUrl = InternalUrl | ExternalUrl | Embedding\n\ntype EmbeddingBase = {\n  type: EmbeddingType\n  id: string\n}\n\nexport type InternalUrl = {\n  type: 'internal'\n}\nexport type ExternalUrl = {\n  type: 'url'\n  url: string\n}\n\ntype EmbeddingType = 'file' | 'message'\n\nexport type EmbeddingFile = EmbeddingBase & {\n  type: 'file'\n}\nexport type EmbeddingMessage = EmbeddingBase & {\n  type: 'message'\n}\n\ninterface TokenWithEmbeddingData extends Token {\n  children: TokenWithEmbeddingData[] | null\n  embedding?: EmbeddingOrUrl\n}\n\nexport default class EmbeddingExtractor {\n  readonly pathNameEmbeddingTypeMap: ReadonlyMap<string, Embedding['type']> =\n    new Map([\n      ['files', 'file'],\n      ['messages', 'message']\n    ] as const)\n  readonly embeddingOrigin: string\n\n  constructor(embeddingOrigin: string) {\n    this.embeddingOrigin = embeddingOrigin\n  }\n\n  private extractType(url: Readonly<URL>): EmbeddingOrUrl['type'] {\n    if (url.origin !== this.embeddingOrigin) return 'url'\n    const name = url.pathname.split('/')[1] ?? ''\n    return this.pathNameEmbeddingTypeMap.get(name) ?? 'internal'\n  }\n\n  private extractId(\n    url: Readonly<URL>,\n    type: EmbeddingOrUrl['type']\n  ): Embedding['id'] | undefined {\n    if (\n      url.origin !== this.embeddingOrigin ||\n      type === 'url' ||\n      type === 'internal'\n    ) {\n      return undefined\n    }\n    const id = url.pathname.split('/')[2] ?? ''\n    return uuidRegexp.test(id) ? id : undefined\n  }\n\n  urlToEmbeddingData(url: string): EmbeddingOrUrl | undefined {\n    let urlObj: URL\n    try {\n      urlObj = new URL(url)\n    } catch {\n      return // 不正なURLだったので無視\n    }\n\n    if (urlObj.protocol !== 'http:' && urlObj.protocol !== 'https:') {\n      return\n    }\n\n    const type = this.extractType(urlObj)\n    const id = this.extractId(urlObj, type)\n\n    if (type === 'internal') {\n      return\n    } else if (type === 'url') {\n      return { type, url }\n    } else if (id) {\n      return { type, id }\n    }\n    return\n  }\n\n  /**\n   * パースされたトークンの木構造から再帰的にURLを抽出する\n   * 同時にトークンにURLの情報を付与する\n   */\n  private extractUrlsFromTokens(\n    tokens: readonly TokenWithEmbeddingData[],\n    embeddings: EmbeddingOrUrl[] = []\n  ): EmbeddingOrUrl[] {\n    let inSpoilerCount = 0\n\n    for (const token of tokens) {\n      if (token.children) {\n        this.extractUrlsFromTokens(token.children, embeddings)\n        continue\n      }\n\n      if (token.type === 'spoiler_open') {\n        inSpoilerCount++\n        continue\n      }\n      if (token.type === 'spoiler_close' && inSpoilerCount > 0) {\n        inSpoilerCount--\n        continue\n      }\n\n      // spoiler内部は無視\n      if (inSpoilerCount > 0) continue\n\n      if (token.type === 'link_open') {\n        const url = token.attrGet('href')\n        if (url) {\n          const embedding = this.urlToEmbeddingData(url)\n          if (embedding) {\n            token.embedding = embedding\n            embeddings.push(embedding)\n          }\n        }\n      }\n\n      // ``の内部はtoken.type === 'code_inline'\n      // ```の内部はtoken.type === 'fence'\n    }\n    return embeddings\n  }\n\n  /**\n   * markdownからURL・埋め込みURLを抽出する\n   *\n   * @param typeIdExtractor マッチ結果から埋め込み/通常URLの種別を返す関数\n   * @param idExtractor マッチ結果から埋め込みidを返す関数（通常URL時は`undefined`）\n   */\n  extract(tokens: readonly Token[]): EmbeddingOrUrl[] {\n    const embeddings = this.extractUrlsFromTokens(tokens)\n    const knownIdSet = new Set<string>()\n\n    // かぶっているURLを取り除く(順序を保つため配列でそのまま行う)\n    const filteredEmbeddings: EmbeddingOrUrl[] = []\n    for (const embedding of embeddings) {\n      if (embedding.type === 'internal') continue\n      if (embedding.type === 'url') {\n        filteredEmbeddings.push(embedding)\n        continue\n      }\n\n      if (!knownIdSet.has(embedding.id)) {\n        knownIdSet.add(embedding.id)\n        filteredEmbeddings.push(embedding)\n      }\n    }\n    return filteredEmbeddings\n  }\n\n  /**\n   * paragraphのchildのtokenの配列から末尾の埋め込みを取り除く\n   *\n   * @param tokens ネストされていないtokenの配列\n   * @returns 取り除かれたらtrue\n   */\n  removeTailEmbeddingsFromTailParagraph(\n    tokens: Array<Readonly<TokenWithEmbeddingData>>\n  ): boolean {\n    /**\n     * `token.type === 'link_open' && token.markup === 'linkify`と\n     * `token.type === 'link_close' && token.markup === 'linkify`の間にいるかどうか\n     * `token.markup === 'linkify'`で[]()の形式のリンクは無視\n     */\n    let isInLink = false\n    /**\n     * 取り除く埋め込みのトークンの先頭位置\n     * ここから最後までを取り除く\n     */\n    let removeStartIndex = -1\n\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      const token = tokens[i]!\n      if (token.type === 'softbreak') {\n        // 取り除かれた埋め込みの直前の改行を取り除く\n        if (removeStartIndex > 0 && !isInLink) {\n          removeStartIndex = i\n        }\n        continue\n      }\n\n      if (token.type === 'link_open' && token.markup === 'linkify') {\n        isInLink = false\n        const type = token.embedding?.type\n        if (type === 'file' || type === 'message') {\n          removeStartIndex = i\n          continue\n        }\n        // 埋め込みでないリンクのときそのまま進む\n        // (breakすると埋め込みでないものが埋め込みが来る前に来たときの検知ができない)\n      }\n      if (isInLink) continue\n\n      if (token.type === 'link_close' && token.markup === 'linkify') {\n        isInLink = true\n        continue\n      }\n\n      // 埋め込みでないものが埋め込みが来る前に来たとき\n      if (removeStartIndex === -1) {\n        return false\n      }\n\n      break\n    }\n    // 終了時\n    tokens.splice(removeStartIndex, tokens.length - removeStartIndex)\n    return true\n  }\n\n  /**\n   * 末尾の埋め込みURLを除去する\n   *\n   * 末尾から「改行」の連続(あってもなくてもよい)、「「埋め込み」を含むparagraph」の場合だけを確認する\n   */\n  removeTailEmbeddings(tokens: Array<Readonly<TokenWithEmbeddingData>>): void {\n    /**\n     * `token.type === 'paragraph_open'`と`token.type === 'paragraph_close'`の間にいるかどうか\n     */\n    let isInParagraph = false\n    /**\n     * `token.type === 'paragraph_close'`が一旦除去されるので復元のために保持しておく\n     */\n    let paragraphCloseToken = undefined\n\n    for (let i = tokens.length - 1; i >= 0; i--) {\n      // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n      const token = tokens[i]!\n      if (token.type === 'hardbreak') continue\n      if (token.type === 'paragraph_close') {\n        isInParagraph = true\n        paragraphCloseToken = token\n        continue\n      }\n\n      if (!(isInParagraph && token.type === 'inline') || !token.children) {\n        return\n      }\n\n      // ここからparagraph内のchildrenをもっている`token.type === 'inline'`のとき\n\n      const removed = this.removeTailEmbeddingsFromTailParagraph(token.children)\n      if (removed) {\n        tokens.splice(i + 1, tokens.length - (i + 1))\n\n        const lastToken = tokens[tokens.length - 1]\n        if (\n          lastToken &&\n          lastToken.type === 'inline' &&\n          lastToken.children?.length === 0\n        ) {\n          tokens.pop()\n        }\n        if (paragraphCloseToken) {\n          tokens.push(paragraphCloseToken)\n        }\n      }\n    }\n  }\n\n  /**\n   * markdownから埋め込みURLを抽出してすべて置換する\n   */\n  replace(tokens: readonly TokenWithEmbeddingData[]): void {\n    /**\n     * 今居る場所が挟まれているlinkのトークン\n     */\n    let linkOpenToken: Required<TokenWithEmbeddingData> | undefined = undefined\n\n    for (const token of tokens) {\n      if (token.children) {\n        this.replace(token.children)\n        continue\n      }\n\n      if (token.embedding) {\n        linkOpenToken = token as Required<TokenWithEmbeddingData>\n      }\n      if (!linkOpenToken) continue\n      if (token.type === 'text') {\n        if (linkOpenToken.embedding.type === 'message') {\n          token.content = '[[引用メッセージ]]'\n        } else if (linkOpenToken.embedding.type === 'file') {\n          token.content = '[[添付ファイル]]'\n        }\n        continue\n      }\n      if (token.type === 'link_close' && token.markup === 'linkify') {\n        linkOpenToken = undefined\n        continue\n      }\n    }\n  }\n}\n","import type { Options } from 'markdown-it/lib/index.mjs'\nimport Renderer, { type RenderRuleRecord } from 'markdown-it/lib/renderer.mjs'\nimport type Token from 'markdown-it/lib/token.mjs'\nimport { escapeHtml } from './util'\n\nexport class InlineRenderer extends Renderer {\n  /**\n   * Rulesのblockルールは使われない\n   * blockRulesに入れたもののみ利用される\n   */\n  private blockRules: RenderRuleRecord = {}\n\n  setRules(\n    defaultRules: RenderRuleRecord | null = null,\n    overrideRules: RenderRuleRecord = {}\n  ): void {\n    if (defaultRules !== null) {\n      this.rules = { ...defaultRules }\n    }\n\n    /* eslint-disable @typescript-eslint/no-non-null-assertion */\n\n    this.rules.softbreak = () => ' '\n    this.blockRules.softbreak = () => ' '\n    this.rules.hardbreak = () => ' '\n    this.blockRules.hardbreak = () => ' '\n\n    this.rules.image = (tokens, idx) => {\n      const token = tokens[idx]!\n      const attrsStr = (token.attrs ?? [])\n        .filter(([attr]) => attr !== 'src' && attr !== 'alt')\n        .map(([key, val]) => `${escapeHtml(key)}=\"${escapeHtml(val)}\"`)\n        .join(' ')\n      return `<a href=\"${\n        token.attrGet('src') ?? ''\n      }\" ${attrsStr} data-is-image>${token.content}</a>`\n    }\n\n    this.blockRules.code_block = this.rules.code_inline\n    this.blockRules.fence = this.rules.code_inline\n    this.blockRules.hr = (tokens, idx) => ` ${tokens[idx]!.markup} `\n    this.blockRules.heading_open = (tokens, idx) =>\n      `${'#'.repeat(+tokens[idx]!.tag.slice(1))} `\n    this.blockRules.blockquote_open = (tokens, idx) => `${tokens[idx]!.markup} `\n    this.blockRules.list_item_open = (tokens, idx) => {\n      const token = tokens[idx]!\n      return `${token.info}${token.markup} `\n    }\n    this.blockRules.th_open = () => '| '\n    this.blockRules.td_open = () => '| '\n    this.blockRules.tr_close = () => ' |'\n\n    /* eslint-enable @typescript-eslint/no-non-null-assertion */\n\n    for (const [key, val] of Object.entries(overrideRules)) {\n      this.rules[key] = val\n      this.blockRules[key] = val\n    }\n  }\n\n  private renderContent(token: Token): string {\n    return escapeHtml(token.content)\n  }\n\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  render(tokens: Token[], options: Options, env: any): string {\n    let result = ''\n\n    for (const [i, token] of tokens.entries()) {\n      const type = token.type\n      const blockRule = this.blockRules[type]\n\n      // 意味の切れ目に空白を入れる\n      if (token.nesting === 1 && tokens[i - 1]?.nesting === -1) {\n        result += ' '\n      }\n\n      if (type === 'inline') {\n        result += this.renderInline(token.children ?? [], options, env)\n      } else if (blockRule !== undefined) {\n        result += blockRule(tokens, i, options, env, this)\n      } else {\n        result += this.renderContent(token)\n      }\n    }\n\n    return result\n  }\n}\n","import type Md from 'markdown-it'\nimport container from 'markdown-it-container'\n\nconst defaultLabels = ['success', 'info', 'warning', 'danger'] as const\n\nexport const useContainer = (\n  md: Md,\n  labels: readonly string[] = defaultLabels\n): void => {\n  labels.forEach(label => {\n    md.use(container, label)\n  })\n}\n","import type MarkdownIt from 'markdown-it'\nimport regexp from './regexpPlugin'\n\n// See stamp.ts stampRegExp\nconst stampRegExp = /:(?:[a-zA-Z0-9+_-]{1,32}|@[a-zA-Z0-9_-]+)(?:\\.[\\w+-.]+)?:/\nconst stampRegExpWithSize =\n  /:(?:[a-zA-Z0-9+_-]{1,32}|@[a-zA-Z0-9_-]+)(?:\\.[\\w+-.]+)?[:;]/\n\nconst renderUserStamp = (wrappedName: string, name: string, size: number) => {\n  // 最初の@を取り除く\n  const username = name.slice(1)\n\n  return `<i class=\"emoji s${size}\" title=\"${wrappedName}\" style=\"background-image: url(https://q.trap.jp/api/v3/public/icon/${username})\">${wrappedName}</i>`\n}\n\nconst renderStamp = (wrappedName: string, name: string, size: number) => {\n  const className = `e_${name.replaceAll('+', '_-plus-_')}`\n  return `<i class=\"emoji s${size} ${className}\" title=\"${wrappedName}\">${wrappedName}</i>`\n}\n\nexport const stampCssPlugin = (\n  md: MarkdownIt,\n  stamps: readonly string[],\n  enableSize = false\n): void => {\n  regexp(\n    enableSize ? stampRegExpWithSize : stampRegExp,\n    ([wrappedName = '']): string => {\n      const size = enableSize ? (wrappedName.endsWith(':') ? 32 : 16) : 24\n      const name = wrappedName.slice(1, -1)\n\n      if (name.startsWith('@')) {\n        return renderUserStamp(wrappedName, name, size)\n      }\n\n      if (!stamps.includes(name)) return wrappedName\n      return renderStamp(wrappedName, name, size)\n    }\n  )(md)\n}\n"]}