{"version":3,"file":"index.js","names":[],"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\n}\n\ndeclare module '@tiptap/core' {\n interface Commands {\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({\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,OAAO,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;GAAQ,gBAAgB,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,CACL,cAAc;GACZ,MAAM;GACN,MAAM,KAAK;EACb,CAAC,CACH;CACF;CAEA,gBAAgB;EACd,OAAO,CACL,cAAc;GACZ,MAAM;GACN,MAAM,KAAK;EACb,CAAC,CACH;CACF;AACF,CAAC;;;ACnMD,IAAA,cAAe"}