{"version":3,"file":"index.cjs","names":["Mark","mergeAttributes","markInputRule","markPasteRule"],"sources":["../src/code.ts","../src/index.ts"],"sourcesContent":["import type { InputRuleMatch, PasteRuleMatch } from '@tiptap/core'\nimport { Mark, markInputRule, markPasteRule, mergeAttributes } from '@tiptap/core'\n\nexport interface CodeOptions {\n  /**\n   * The HTML attributes applied to the code element.\n   * @default {}\n   * @example { class: 'foo' }\n   */\n  HTMLAttributes: Record<string, any>\n}\n\ndeclare module '@tiptap/core' {\n  interface Commands<ReturnType> {\n    code: {\n      /**\n       * Set a code mark\n       */\n      setCode: () => ReturnType\n      /**\n       * Toggle inline code\n       */\n      toggleCode: () => ReturnType\n      /**\n       * Unset a code mark\n       */\n      unsetCode: () => ReturnType\n    }\n  }\n}\n\n/**\n * The regular expression used for the inline code input rule.\n * @deprecated The extension now uses a function-based finder internally.\n * This regex is kept for backward compatibility.\n */\nexport const inputRegex = /(^|[^`])`([^`]+)`(?!`)$/\n\n/**\n * The regular expression used for the inline code paste rule.\n * @deprecated The extension now uses a function-based finder internally.\n * This regex is kept for backward compatibility.\n */\nexport const pasteRegex = /(^|[^`])`([^`]+)`(?!`)/g\n\n/**\n * A function-based finder for the inline code input rule.\n * Used internally by the extension to ensure the preceding character\n * is not consumed as part of the match, preventing it from being deleted.\n */\nexport const inputRegexMatch = (text: string): InputRuleMatch | null => {\n  const match = /`([^`]+)`(?!`)$/.exec(text)\n\n  if (!match) {\n    return null\n  }\n\n  // Ensure the opening backtick isn't preceded by another backtick\n  if (match.index > 0 && text[match.index - 1] === '`') {\n    return null\n  }\n\n  return {\n    index: match.index,\n    text: match[0],\n    replaceWith: match[1],\n  }\n}\n\n/**\n * A function-based finder for the inline code paste rule.\n * Used internally by the extension to avoid consuming the preceding\n * character as part of the match.\n */\nexport const pasteRegexMatch = (text: string): PasteRuleMatch[] => {\n  const regex = /`([^`]+)`(?!`)/g\n  const matches: PasteRuleMatch[] = []\n  let match: RegExpExecArray | null\n\n  while ((match = regex.exec(text)) !== null) {\n    // Ensure the opening backtick isn't preceded by another backtick\n    if (match.index > 0 && text[match.index - 1] === '`') {\n      continue\n    }\n\n    matches.push({\n      index: match.index,\n      text: match[0],\n      replaceWith: match[1],\n    })\n  }\n\n  return matches\n}\n\n// A code span must be fenced by a backtick run its own content does not contain\nfunction shortestUnusedBacktickRun(text: string): number {\n  const runs = new Set((text.match(/`+/g) || []).map(run => run.length))\n  let length = 1\n\n  while (runs.has(length)) {\n    length += 1\n  }\n\n  return length\n}\n\n/**\n * This extension allows you to mark text as inline code.\n * @see https://tiptap.dev/api/marks/code\n */\nexport const Code = Mark.create<CodeOptions>({\n  name: 'code',\n\n  addOptions() {\n    return {\n      HTMLAttributes: {},\n    }\n  },\n\n  excludes: '_',\n\n  code: true,\n\n  exitable: true,\n\n  parseHTML() {\n    return [{ tag: 'code' }]\n  },\n\n  renderHTML({ HTMLAttributes }) {\n    return ['code', mergeAttributes(this.options.HTMLAttributes, HTMLAttributes), 0]\n  },\n\n  markdownTokenName: 'codespan',\n\n  parseMarkdown: (token, helpers) => {\n    // Convert 'codespan' token to code mark\n    // For codespan tokens, we use the raw text content, not tokens\n    return helpers.applyMark('code', [{ type: 'text', text: token.text || '' }])\n  },\n\n  renderMarkdown: (node, h, context) => {\n    if (!node.content) {\n      return ''\n    }\n\n    // Children are a placeholder here, so the fence comes from the full span text\n    const markText = typeof context?.meta?.markText === 'string' ? context.meta.markText : ''\n    const fence = '`'.repeat(shortestUnusedBacktickRun(markText))\n    // CommonMark strips one space on each side, so padding keeps backticks apart\n    const padding = markText.startsWith('`') || markText.endsWith('`') ? ' ' : ''\n\n    return `${fence}${padding}${h.renderChildren(node.content)}${padding}${fence}`\n  },\n\n  addCommands() {\n    return {\n      setCode:\n        () =>\n        ({ commands }) => {\n          return commands.setMark(this.name)\n        },\n      toggleCode:\n        () =>\n        ({ commands }) => {\n          return commands.toggleMark(this.name)\n        },\n      unsetCode:\n        () =>\n        ({ commands }) => {\n          return commands.unsetMark(this.name)\n        },\n    }\n  },\n\n  addKeyboardShortcuts() {\n    return {\n      'Mod-e': () => this.editor.commands.toggleCode(),\n    }\n  },\n\n  addInputRules() {\n    return [\n      markInputRule({\n        find: inputRegexMatch,\n        type: this.type,\n      }),\n    ]\n  },\n\n  addPasteRules() {\n    return [\n      markPasteRule({\n        find: pasteRegexMatch,\n        type: this.type,\n      }),\n    ]\n  },\n})\n","import { Code } from './code.js'\n\nexport * from './code.js'\n\nexport default Code\n"],"mappings":";;;;;;;;;;;AAoCA,MAAa,aAAa;;;;;;AAO1B,MAAa,aAAa;;;;;;AAO1B,MAAa,mBAAmB,SAAwC;CACtE,MAAM,QAAQ,kBAAkB,KAAK,IAAI;CAEzC,IAAI,CAAC,OACH,OAAO;CAIT,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,OAAO,KAC/C,OAAO;CAGT,OAAO;EACL,OAAO,MAAM;EACb,MAAM,MAAM;EACZ,aAAa,MAAM;CACrB;AACF;;;;;;AAOA,MAAa,mBAAmB,SAAmC;CACjE,MAAM,QAAQ;CACd,MAAM,UAA4B,CAAC;CACnC,IAAI;CAEJ,QAAQ,QAAQ,MAAM,KAAK,IAAI,OAAO,MAAM;EAE1C,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ,OAAO,KAC/C;EAGF,QAAQ,KAAK;GACX,OAAO,MAAM;GACb,MAAM,MAAM;GACZ,aAAa,MAAM;EACrB,CAAC;CACH;CAEA,OAAO;AACT;AAGA,SAAS,0BAA0B,MAAsB;CACvD,MAAM,OAAO,IAAI,KAAK,KAAK,MAAM,KAAK,KAAK,CAAC,EAAA,CAAG,KAAI,QAAO,IAAI,MAAM,CAAC;CACrE,IAAI,SAAS;CAEb,OAAO,KAAK,IAAI,MAAM,GACpB,UAAU;CAGZ,OAAO;AACT;;;;;AAMA,MAAa,OAAOA,aAAAA,KAAK,OAAoB;CAC3C,MAAM;CAEN,aAAa;EACX,OAAO,EACL,gBAAgB,CAAC,EACnB;CACF;CAEA,UAAU;CAEV,MAAM;CAEN,UAAU;CAEV,YAAY;EACV,OAAO,CAAC,EAAE,KAAK,OAAO,CAAC;CACzB;CAEA,WAAW,EAAE,kBAAkB;EAC7B,OAAO;GAAC;IAAQC,GAAAA,aAAAA,gBAAAA,CAAgB,KAAK,QAAQ,gBAAgB,cAAc;GAAG;EAAC;CACjF;CAEA,mBAAmB;CAEnB,gBAAgB,OAAO,YAAY;EAGjC,OAAO,QAAQ,UAAU,QAAQ,CAAC;GAAE,MAAM;GAAQ,MAAM,MAAM,QAAQ;EAAG,CAAC,CAAC;CAC7E;CAEA,iBAAiB,MAAM,GAAG,YAAY;;EACpC,IAAI,CAAC,KAAK,SACR,OAAO;EAIT,MAAM,WAAW,QAAA,YAAA,QAAA,YAAA,KAAA,MAAA,gBAAO,QAAS,UAAA,QAAA,kBAAA,KAAA,IAAA,KAAA,IAAA,cAAM,cAAa,WAAW,QAAQ,KAAK,WAAW;EACvF,MAAM,QAAQ,IAAI,OAAO,0BAA0B,QAAQ,CAAC;EAE5D,MAAM,UAAU,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,GAAG,IAAI,MAAM;EAE3E,OAAO,GAAG,QAAQ,UAAU,EAAE,eAAe,KAAK,OAAO,IAAI,UAAU;CACzE;CAEA,cAAc;EACZ,OAAO;GACL,gBAEG,EAAE,eAAe;IAChB,OAAO,SAAS,QAAQ,KAAK,IAAI;GACnC;GACF,mBAEG,EAAE,eAAe;IAChB,OAAO,SAAS,WAAW,KAAK,IAAI;GACtC;GACF,kBAEG,EAAE,eAAe;IAChB,OAAO,SAAS,UAAU,KAAK,IAAI;GACrC;EACJ;CACF;CAEA,uBAAuB;EACrB,OAAO,EACL,eAAe,KAAK,OAAO,SAAS,WAAW,EACjD;CACF;CAEA,gBAAgB;EACd,OAAO,EAAA,GACLC,aAAAA,cAAAA,CAAc;GACZ,MAAM;GACN,MAAM,KAAK;EACb,CAAC,CACH;CACF;CAEA,gBAAgB;EACd,OAAO,EAAA,GACLC,aAAAA,cAAAA,CAAc;GACZ,MAAM;GACN,MAAM,KAAK;EACb,CAAC,CACH;CACF;AACF,CAAC;;;ACnMD,IAAA,cAAe"}