{"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/**\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) => {\n    if (!node.content) {\n      return ''\n    }\n\n    return `\\`${h.renderChildren(node.content)}\\``\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;;;;;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,MAAM;EAC3B,IAAI,CAAC,KAAK,SACR,OAAO;EAGT,OAAO,KAAK,EAAE,eAAe,KAAK,OAAO,EAAE;CAC7C;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;;;ACjLD,IAAA,cAAe"}