markdown-actions 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +33 -0
- package/README.md +379 -0
- package/dist/markdown-actions.esm.js +625 -0
- package/dist/markdown-actions.esm.js.map +7 -0
- package/dist/markdown-actions.js +646 -0
- package/dist/markdown-actions.js.map +7 -0
- package/dist/markdown-actions.min.js +19 -0
- package/package.json +45 -0
- package/src/core/detection.js +169 -0
- package/src/core/formats.js +76 -0
- package/src/core/insertion-new.js +66 -0
- package/src/core/insertion.js +79 -0
- package/src/core/selection-new.js +137 -0
- package/src/core/selection.js +117 -0
- package/src/core/style-args.js +33 -0
- package/src/core/style-text.js +30 -0
- package/src/index-new.js +260 -0
- package/src/index.js +229 -0
- package/src/operations/block-new.js +109 -0
- package/src/operations/block.js +139 -0
- package/src/operations/list-new.js +137 -0
- package/src/operations/list.js +152 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/core/style-args.js", "../src/core/selection-new.js", "../src/core/insertion-new.js", "../src/operations/block-new.js", "../src/operations/list-new.js", "../src/core/style-text.js", "../src/core/detection.js", "../src/index-new.js"],
|
|
4
|
+
"sourcesContent": ["/**\n * Style arguments type definition and defaults\n * Matches GitHub's implementation exactly\n */\n\n/**\n * Get default style arguments\n * MUST match GitHub's defaults exactly (index.ts lines 805-818)\n */\nexport function getDefaultStyleArgs() {\n return {\n prefix: '',\n suffix: '',\n blockPrefix: '',\n blockSuffix: '',\n multiline: false,\n replaceNext: '',\n prefixSpace: false,\n scanFor: '',\n surroundWithNewlines: false,\n orderedList: false,\n unorderedList: false,\n trimFirst: false\n }\n}\n\n/**\n * Merge style with defaults\n * Ensures ALL properties are present\n */\nexport function mergeStyleWithDefaults(style) {\n return { ...getDefaultStyleArgs(), ...style }\n}", "/**\n * Selection utilities - EXACT match to GitHub's implementation\n * Based on markdown-toolbar-element index.ts\n */\n\n/**\n * Check if string contains multiple lines\n * GitHub: index.ts line 419-421\n */\nexport function isMultipleLines(string) {\n return string.trim().split('\\n').length > 1\n}\n\n/**\n * Repeat string n times\n * GitHub: index.ts line 423-425\n */\nfunction repeat(string, n) {\n return Array(n + 1).join(string)\n}\n\n/**\n * Find word selection start\n * GitHub: index.ts line 427-433\n */\nexport function wordSelectionStart(text, i) {\n let index = i\n while (text[index] && text[index - 1] != null && !text[index - 1].match(/\\s/)) {\n index--\n }\n return index\n}\n\n/**\n * Find word selection end\n * GitHub: index.ts line 435-442\n */\nexport function wordSelectionEnd(text, i, multiline) {\n let index = i\n const breakpoint = multiline ? /\\n/ : /\\s/\n while (text[index] && !text[index].match(breakpoint)) {\n index++\n }\n return index\n}\n\n/**\n * Expand selection to line boundaries\n * GitHub: index.ts line 502-515\n * CRITICAL: This modifies the textarea selection directly!\n */\nexport function expandSelectionToLine(textarea) {\n const lines = textarea.value.split('\\n')\n let counter = 0\n for (let index = 0; index < lines.length; index++) {\n const lineLength = lines[index].length + 1\n if (textarea.selectionStart >= counter && textarea.selectionStart < counter + lineLength) {\n textarea.selectionStart = counter\n }\n if (textarea.selectionEnd >= counter && textarea.selectionEnd < counter + lineLength) {\n textarea.selectionEnd = counter + lineLength - 1\n }\n counter += lineLength\n }\n}\n\n/**\n * Expand selected text\n * GitHub: index.ts line 517-537\n * CRITICAL: This modifies the textarea selection to include format markers if they exist\n */\nexport function expandSelectedText(textarea, prefixToUse, suffixToUse, multiline = false) {\n if (textarea.selectionStart === textarea.selectionEnd) {\n textarea.selectionStart = wordSelectionStart(textarea.value, textarea.selectionStart)\n textarea.selectionEnd = wordSelectionEnd(textarea.value, textarea.selectionEnd, multiline)\n } else {\n const expandedSelectionStart = textarea.selectionStart - prefixToUse.length\n const expandedSelectionEnd = textarea.selectionEnd + suffixToUse.length\n const beginsWithPrefix = textarea.value.slice(expandedSelectionStart, textarea.selectionStart) === prefixToUse\n const endsWithSuffix = textarea.value.slice(textarea.selectionEnd, expandedSelectionEnd) === suffixToUse\n if (beginsWithPrefix && endsWithSuffix) {\n textarea.selectionStart = expandedSelectionStart\n textarea.selectionEnd = expandedSelectionEnd\n }\n }\n return textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n}\n\n/**\n * Calculate newlines to surround selected text\n * GitHub: index.ts line 544-573\n */\nexport function newlinesToSurroundSelectedText(textarea) {\n const beforeSelection = textarea.value.slice(0, textarea.selectionStart)\n const afterSelection = textarea.value.slice(textarea.selectionEnd)\n\n const breaksBefore = beforeSelection.match(/\\n*$/)\n const breaksAfter = afterSelection.match(/^\\n*/)\n const newlinesBeforeSelection = breaksBefore ? breaksBefore[0].length : 0\n const newlinesAfterSelection = breaksAfter ? breaksAfter[0].length : 0\n\n let newlinesToAppend\n let newlinesToPrepend\n\n if (beforeSelection.match(/\\S/) && newlinesBeforeSelection < 2) {\n newlinesToAppend = repeat('\\n', 2 - newlinesBeforeSelection)\n }\n\n if (afterSelection.match(/\\S/) && newlinesAfterSelection < 2) {\n newlinesToPrepend = repeat('\\n', 2 - newlinesAfterSelection)\n }\n\n if (newlinesToAppend == null) {\n newlinesToAppend = ''\n }\n\n if (newlinesToPrepend == null) {\n newlinesToPrepend = ''\n }\n\n return { newlinesToAppend, newlinesToPrepend }\n}\n\n/**\n * Preserve selection helper (not in GitHub's but useful)\n */\nexport function preserveSelection(textarea, callback) {\n const start = textarea.selectionStart\n const end = textarea.selectionEnd\n const scrollTop = textarea.scrollTop\n \n callback()\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n textarea.scrollTop = scrollTop\n}", "/**\n * Text insertion with undo/redo support\n * EXACT match to GitHub's implementation\n * Based on markdown-toolbar-element index.ts lines 444-485\n */\n\nlet canInsertText = null\n\n/**\n * Insert text into textarea\n * GitHub: index.ts lines 446-485\n * CRITICAL: Uses the CURRENT selection (which may have been expanded)\n */\nexport function insertText(textarea, { text, selectionStart, selectionEnd }) {\n const originalSelectionStart = textarea.selectionStart\n const before = textarea.value.slice(0, originalSelectionStart)\n const after = textarea.value.slice(textarea.selectionEnd)\n\n if (canInsertText === null || canInsertText === true) {\n textarea.contentEditable = 'true'\n try {\n canInsertText = document.execCommand('insertText', false, text)\n } catch (error) {\n canInsertText = false\n }\n textarea.contentEditable = 'false'\n }\n\n if (canInsertText && !textarea.value.slice(0, textarea.selectionStart).endsWith(text)) {\n canInsertText = false\n }\n\n if (!canInsertText) {\n try {\n document.execCommand('ms-beginUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.value = before + text + after\n try {\n document.execCommand('ms-endUndoUnit')\n } catch (e) {\n // Do nothing.\n }\n textarea.dispatchEvent(new CustomEvent('input', { bubbles: true, cancelable: true }))\n }\n\n if (selectionStart != null && selectionEnd != null) {\n textarea.setSelectionRange(selectionStart, selectionEnd)\n } else {\n textarea.setSelectionRange(originalSelectionStart, textarea.selectionEnd)\n }\n}\n\n/**\n * Set undo method (for configuration)\n */\nexport function setUndoMethod(method) {\n if (method === 'native') {\n canInsertText = true\n } else if (method === 'manual') {\n canInsertText = false\n } else {\n canInsertText = null\n }\n}", "/**\n * Block and multiline operations - EXACT match to GitHub's implementation\n * Based on markdown-toolbar-element index.ts lines 581-670\n */\n\nimport { \n isMultipleLines, \n expandSelectedText, \n newlinesToSurroundSelectedText \n} from '../core/selection-new.js'\n\n/**\n * Block style operation\n * GitHub: index.ts lines 581-646\n */\nexport function blockStyle(textarea, arg) {\n let newlinesToAppend\n let newlinesToPrepend\n\n const { prefix, suffix, blockPrefix, blockSuffix, replaceNext, prefixSpace, scanFor, surroundWithNewlines } = arg\n const originalSelectionStart = textarea.selectionStart\n const originalSelectionEnd = textarea.selectionEnd\n\n let selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let prefixToUse = isMultipleLines(selectedText) && blockPrefix.length > 0 ? `${blockPrefix}\\n` : prefix\n let suffixToUse = isMultipleLines(selectedText) && blockSuffix.length > 0 ? `\\n${blockSuffix}` : suffix\n\n if (prefixSpace) {\n const beforeSelection = textarea.value[textarea.selectionStart - 1]\n if (textarea.selectionStart !== 0 && beforeSelection != null && !beforeSelection.match(/\\s/)) {\n prefixToUse = ` ${prefixToUse}`\n }\n }\n selectedText = expandSelectedText(textarea, prefixToUse, suffixToUse, arg.multiline)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const hasReplaceNext = replaceNext.length > 0 && suffixToUse.indexOf(replaceNext) > -1 && selectedText.length > 0\n if (surroundWithNewlines) {\n const ref = newlinesToSurroundSelectedText(textarea)\n newlinesToAppend = ref.newlinesToAppend\n newlinesToPrepend = ref.newlinesToPrepend\n prefixToUse = newlinesToAppend + prefix\n suffixToUse += newlinesToPrepend\n }\n\n if (selectedText.startsWith(prefixToUse) && selectedText.endsWith(suffixToUse)) {\n const replacementText = selectedText.slice(prefixToUse.length, selectedText.length - suffixToUse.length)\n if (originalSelectionStart === originalSelectionEnd) {\n let position = originalSelectionStart - prefixToUse.length\n position = Math.max(position, selectionStart)\n position = Math.min(position, selectionStart + replacementText.length)\n selectionStart = selectionEnd = position\n } else {\n selectionEnd = selectionStart + replacementText.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (!hasReplaceNext) {\n let replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = originalSelectionStart + prefixToUse.length\n selectionEnd = originalSelectionEnd + prefixToUse.length\n const whitespaceEdges = selectedText.match(/^\\s*|\\s*$/g)\n if (arg.trimFirst && whitespaceEdges) {\n const leadingWhitespace = whitespaceEdges[0] || ''\n const trailingWhitespace = whitespaceEdges[1] || ''\n replacementText = leadingWhitespace + prefixToUse + selectedText.trim() + suffixToUse + trailingWhitespace\n selectionStart += leadingWhitespace.length\n selectionEnd -= trailingWhitespace.length\n }\n return { text: replacementText, selectionStart, selectionEnd }\n } else if (scanFor.length > 0 && selectedText.match(scanFor)) {\n suffixToUse = suffixToUse.replace(replaceNext, selectedText)\n const replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = selectionEnd = selectionStart + prefixToUse.length\n return { text: replacementText, selectionStart, selectionEnd }\n } else {\n const replacementText = prefixToUse + selectedText + suffixToUse\n selectionStart = selectionStart + prefixToUse.length + selectedText.length + suffixToUse.indexOf(replaceNext)\n selectionEnd = selectionStart + replaceNext.length\n return { text: replacementText, selectionStart, selectionEnd }\n }\n}\n\n/**\n * Multiline style operation\n * GitHub: index.ts lines 648-670\n */\nexport function multilineStyle(textarea, arg) {\n const { prefix, suffix, surroundWithNewlines } = arg\n let text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n const lines = text.split('\\n')\n const undoStyle = lines.every(line => line.startsWith(prefix) && line.endsWith(suffix))\n\n if (undoStyle) {\n text = lines.map(line => line.slice(prefix.length, line.length - suffix.length)).join('\\n')\n selectionEnd = selectionStart + text.length\n } else {\n text = lines.map(line => prefix + line + suffix).join('\\n')\n if (surroundWithNewlines) {\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n selectionStart += newlinesToAppend.length\n selectionEnd = selectionStart + text.length\n text = newlinesToAppend + text + newlinesToPrepend\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}", "/**\n * List operations - EXACT match to GitHub's implementation\n * Based on markdown-toolbar-element index.ts lines 676-784\n */\n\nimport { expandSelectionToLine, newlinesToSurroundSelectedText } from '../core/selection-new.js'\n\n/**\n * Undo ordered list style\n * GitHub: index.ts lines 676-689\n */\nfunction undoOrderedListStyle(text) {\n const lines = text.split('\\n')\n const orderedListRegex = /^\\d+\\.\\s+/\n const shouldUndoOrderedList = lines.every(line => orderedListRegex.test(line))\n let result = lines\n if (shouldUndoOrderedList) {\n result = lines.map(line => line.replace(orderedListRegex, ''))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoOrderedList\n }\n}\n\n/**\n * Undo unordered list style\n * GitHub: index.ts lines 691-704\n */\nfunction undoUnorderedListStyle(text) {\n const lines = text.split('\\n')\n const unorderedListPrefix = '- '\n const shouldUndoUnorderedList = lines.every(line => line.startsWith(unorderedListPrefix))\n let result = lines\n if (shouldUndoUnorderedList) {\n result = lines.map(line => line.slice(unorderedListPrefix.length, line.length))\n }\n\n return {\n text: result.join('\\n'),\n processed: shouldUndoUnorderedList\n }\n}\n\n/**\n * Make prefix for list item\n * GitHub: index.ts lines 706-712\n */\nfunction makePrefix(index, unorderedList) {\n if (unorderedList) {\n return '- '\n } else {\n return `${index + 1}. `\n }\n}\n\n/**\n * Clear existing list style\n * GitHub: index.ts lines 714-728\n */\nfunction clearExistingListStyle(style, selectedText) {\n let undoResultOpositeList\n let undoResult\n let pristineText\n if (style.orderedList) {\n undoResult = undoOrderedListStyle(selectedText)\n undoResultOpositeList = undoUnorderedListStyle(undoResult.text)\n pristineText = undoResultOpositeList.text\n } else {\n undoResult = undoUnorderedListStyle(selectedText)\n undoResultOpositeList = undoOrderedListStyle(undoResult.text)\n pristineText = undoResultOpositeList.text\n }\n return [undoResult, undoResultOpositeList, pristineText]\n}\n\n/**\n * Apply list style to text\n * GitHub: index.ts lines 730-784\n * CRITICAL: This function modifies the textarea selection via expandSelectionToLine\n */\nexport function listStyle(textarea, style) {\n const noInitialSelection = textarea.selectionStart === textarea.selectionEnd\n let selectionStart = textarea.selectionStart\n let selectionEnd = textarea.selectionEnd\n\n // Select whole line - MODIFIES textarea.selectionStart and textarea.selectionEnd\n expandSelectionToLine(textarea)\n\n const selectedText = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n\n // If the user intent was to do an undo, we will stop after this.\n // Otherwise, we will still undo to other list type to prevent list stacking\n const [undoResult, undoResultOpositeList, pristineText] = clearExistingListStyle(style, selectedText)\n\n const prefixedLines = pristineText.split('\\n').map((value, index) => {\n return `${makePrefix(index, style.unorderedList)}${value}`\n })\n\n const totalPrefixLength = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, style.unorderedList).length\n }, 0)\n\n const totalPrefixLengthOpositeList = prefixedLines.reduce((previousValue, _currentValue, currentIndex) => {\n return previousValue + makePrefix(currentIndex, !style.unorderedList).length\n }, 0)\n\n if (undoResult.processed) {\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart - makePrefix(0, style.unorderedList).length, 0)\n selectionEnd = selectionStart\n } else {\n selectionStart = textarea.selectionStart\n selectionEnd = textarea.selectionEnd - totalPrefixLength\n }\n return { text: pristineText, selectionStart, selectionEnd }\n }\n\n const { newlinesToAppend, newlinesToPrepend } = newlinesToSurroundSelectedText(textarea)\n const text = newlinesToAppend + prefixedLines.join('\\n') + newlinesToPrepend\n\n if (noInitialSelection) {\n selectionStart = Math.max(selectionStart + makePrefix(0, style.unorderedList).length + newlinesToAppend.length, 0)\n selectionEnd = selectionStart\n } else {\n if (undoResultOpositeList.processed) {\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength - totalPrefixLengthOpositeList\n } else {\n selectionStart = Math.max(textarea.selectionStart + newlinesToAppend.length, 0)\n selectionEnd = textarea.selectionEnd + newlinesToAppend.length + totalPrefixLength\n }\n }\n\n return { text, selectionStart, selectionEnd }\n}", "/**\n * Main text styling orchestration\n * EXACT match to GitHub's implementation\n * Based on markdown-toolbar-element index.ts lines 487-500\n */\n\nimport { isMultipleLines } from './selection-new.js'\nimport { insertText } from './insertion-new.js'\nimport { blockStyle, multilineStyle } from '../operations/block-new.js'\nimport { listStyle } from '../operations/list-new.js'\n\n/**\n * Style selected text in textarea\n * GitHub: index.ts lines 487-500\n * CRITICAL: This is the main orchestrator that decides which operation to use\n */\nexport function styleSelectedText(textarea, styleArgs) {\n const text = textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)\n\n let result\n if (styleArgs.orderedList || styleArgs.unorderedList) {\n result = listStyle(textarea, styleArgs)\n } else if (styleArgs.multiline && isMultipleLines(text)) {\n result = multilineStyle(textarea, styleArgs)\n } else {\n result = blockStyle(textarea, styleArgs)\n }\n\n insertText(textarea, result)\n}", "/**\n * Format detection utilities\n */\n\nimport { FORMATS } from './formats.js'\n\n/**\n * Check if text has a specific format applied\n */\nfunction hasFormatApplied(text, format) {\n if (!format.prefix) return false\n \n if (format.suffix) {\n return text.startsWith(format.prefix) && text.endsWith(format.suffix)\n } else {\n return text.startsWith(format.prefix)\n }\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n if (!textarea) return []\n \n const formats = []\n const { selectionStart, selectionEnd, value } = textarea\n \n // Get current line for line-based formats\n const lines = value.split('\\n')\n let lineStart = 0\n let currentLine = ''\n \n for (const line of lines) {\n if (selectionStart >= lineStart && selectionStart <= lineStart + line.length) {\n currentLine = line\n break\n }\n lineStart += line.length + 1\n }\n \n // Check line-based formats\n if (currentLine.startsWith('- ')) {\n if (currentLine.startsWith('- [ ] ') || currentLine.startsWith('- [x] ')) {\n formats.push('task-list')\n } else {\n formats.push('bullet-list')\n }\n }\n \n if (/^\\d+\\.\\s/.test(currentLine)) {\n formats.push('numbered-list')\n }\n \n if (currentLine.startsWith('> ')) {\n formats.push('quote')\n }\n \n if (currentLine.startsWith('# ')) formats.push('header')\n if (currentLine.startsWith('## ')) formats.push('header-2')\n if (currentLine.startsWith('### ')) formats.push('header-3')\n \n // Check inline formats by looking around cursor\n const lookBehind = Math.max(0, selectionStart - 10)\n const lookAhead = Math.min(value.length, selectionEnd + 10)\n const surrounding = value.slice(lookBehind, lookAhead)\n \n // Check for bold\n if (surrounding.includes('**')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBold = beforeCursor.lastIndexOf('**')\n const nextCloseBold = afterCursor.indexOf('**')\n if (lastOpenBold !== -1 && nextCloseBold !== -1) {\n formats.push('bold')\n }\n }\n \n // Check for italic\n if (surrounding.includes('_')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenItalic = beforeCursor.lastIndexOf('_')\n const nextCloseItalic = afterCursor.indexOf('_')\n if (lastOpenItalic !== -1 && nextCloseItalic !== -1) {\n formats.push('italic')\n }\n }\n \n // Check for code\n if (surrounding.includes('`')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n if (beforeCursor.includes('`') && afterCursor.includes('`')) {\n formats.push('code')\n }\n }\n \n // Check for link\n if (surrounding.includes('[') && surrounding.includes(']')) {\n const beforeCursor = value.slice(Math.max(0, selectionStart - 100), selectionStart)\n const afterCursor = value.slice(selectionEnd, Math.min(value.length, selectionEnd + 100))\n const lastOpenBracket = beforeCursor.lastIndexOf('[')\n const nextCloseBracket = afterCursor.indexOf(']')\n if (lastOpenBracket !== -1 && nextCloseBracket !== -1) {\n const afterBracket = value.slice(selectionEnd + nextCloseBracket + 1, selectionEnd + nextCloseBracket + 10)\n if (afterBracket.startsWith('(')) {\n formats.push('link')\n }\n }\n }\n \n return formats\n}\n\n/**\n * Check if specific format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n const activeFormats = getActiveFormats(textarea)\n return activeFormats.includes(format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n if (!textarea) return\n \n const { toWord, toLine, toFormat } = options\n const { selectionStart, selectionEnd, value } = textarea\n \n if (toLine) {\n // Find line boundaries\n const lines = value.split('\\n')\n let lineStart = 0\n let lineEnd = 0\n let currentPos = 0\n \n for (const line of lines) {\n if (selectionStart >= currentPos && selectionStart <= currentPos + line.length) {\n lineStart = currentPos\n lineEnd = currentPos + line.length\n break\n }\n currentPos += line.length + 1\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n } else if (toWord && selectionStart === selectionEnd) {\n // Find word boundaries\n let start = selectionStart\n let end = selectionEnd\n \n // Move start back to word boundary\n while (start > 0 && !/\\s/.test(value[start - 1])) {\n start--\n }\n \n // Move end forward to word boundary\n while (end < value.length && !/\\s/.test(value[end])) {\n end++\n }\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n }\n}", "/**\n * markdown-actions - Lightweight markdown toolbar functionality\n * Exact implementation matching GitHub's markdown-toolbar-element\n */\n\nimport { mergeStyleWithDefaults } from './core/style-args.js'\nimport { styleSelectedText } from './core/style-text.js'\nimport { setUndoMethod } from './core/insertion-new.js'\nimport { preserveSelection, expandSelectionToLine } from './core/selection-new.js'\nimport { getActiveFormats as getActive, hasFormat as has } from './core/detection.js'\n\n/**\n * Format configurations matching GitHub's manualStyles\n * GitHub: index.ts lines 86-118\n */\nconst FORMATS = {\n bold: { prefix: '**', suffix: '**', trimFirst: true },\n italic: { prefix: '_', suffix: '_', trimFirst: true },\n code: { \n prefix: '`', \n suffix: '`', \n blockPrefix: '```', \n blockSuffix: '```' \n },\n link: { \n prefix: '[', \n suffix: '](url)', \n replaceNext: 'url', \n scanFor: 'https?://' \n },\n quote: { \n prefix: '> ', \n multiline: true, \n surroundWithNewlines: true \n },\n bulletList: { \n prefix: '- ', \n multiline: true, \n unorderedList: true \n },\n numberedList: { \n prefix: '1. ', \n multiline: true, \n orderedList: true \n },\n header1: { prefix: '# ' },\n header2: { prefix: '## ' },\n header3: { prefix: '### ' },\n header4: { prefix: '#### ' },\n header5: { prefix: '##### ' },\n header6: { prefix: '###### ' }\n}\n\n/**\n * Apply style to textarea\n * Mimics GitHub's applyStyle function (index.ts lines 801-827)\n */\nfunction applyStyle(textarea, format) {\n const style = mergeStyleWithDefaults(format)\n textarea.focus()\n styleSelectedText(textarea, style)\n}\n\n/**\n * Toggle bold formatting\n */\nexport function toggleBold(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.bold)\n}\n\n/**\n * Toggle italic formatting\n */\nexport function toggleItalic(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.italic)\n}\n\n/**\n * Toggle code formatting\n */\nexport function toggleCode(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.code)\n}\n\n/**\n * Insert or toggle link formatting\n */\nexport function insertLink(textarea, options = {}) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n \n let format = { ...FORMATS.link }\n \n // Override with custom URL if provided\n if (options.url) {\n format.suffix = `](${options.url})`\n format.replaceNext = ''\n }\n \n // Handle custom text if provided\n if (options.text && !textarea.value.slice(textarea.selectionStart, textarea.selectionEnd)) {\n const pos = textarea.selectionStart\n textarea.value = textarea.value.slice(0, pos) + options.text + textarea.value.slice(pos)\n textarea.selectionStart = pos\n textarea.selectionEnd = pos + options.text.length\n }\n \n applyStyle(textarea, format)\n}\n\n/**\n * Toggle bullet list formatting\n */\nexport function toggleBulletList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.bulletList)\n}\n\n/**\n * Toggle numbered list formatting\n */\nexport function toggleNumberedList(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.numberedList)\n}\n\n/**\n * Toggle quote formatting\n */\nexport function toggleQuote(textarea) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, FORMATS.quote)\n}\n\n/**\n * Insert header with specific level\n */\nexport function insertHeader(textarea, level = 1) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n if (level < 1 || level > 6) level = 1\n \n const headerKey = `header${level}`\n const format = FORMATS[headerKey] || FORMATS.header1\n \n // Select current line\n const value = textarea.value\n const start = textarea.selectionStart\n let lineStart = start\n let lineEnd = start\n \n // Find line boundaries\n while (lineStart > 0 && value[lineStart - 1] !== '\\n') {\n lineStart--\n }\n while (lineEnd < value.length && value[lineEnd] !== '\\n') {\n lineEnd++\n }\n \n textarea.selectionStart = lineStart\n textarea.selectionEnd = lineEnd\n \n const currentLine = value.slice(lineStart, lineEnd)\n \n // Remove any existing header formatting\n const cleanedLine = currentLine.replace(/^#{1,6}\\s*/, '')\n \n // Apply new header\n const newLine = format.prefix + cleanedLine\n \n // Use our style system\n const tempSelection = textarea.selectionStart\n textarea.value = value.slice(0, lineStart) + newLine + value.slice(lineEnd)\n textarea.selectionStart = lineStart + format.prefix.length\n textarea.selectionEnd = lineStart + newLine.length\n}\n\n/**\n * Get active formats at cursor position\n */\nexport function getActiveFormats(textarea) {\n return getActive(textarea)\n}\n\n/**\n * Check if format is active at cursor\n */\nexport function hasFormat(textarea, format) {\n return has(textarea, format)\n}\n\n/**\n * Expand selection based on options\n */\nexport function expandSelection(textarea, options = {}) {\n if (!textarea) return\n \n const { toWord, toLine } = options\n const { selectionStart, selectionEnd, value } = textarea\n \n if (toLine) {\n expandSelectionToLine(textarea)\n } else if (toWord && selectionStart === selectionEnd) {\n // Find word boundaries\n let start = selectionStart\n let end = selectionEnd\n \n // Move start back to word boundary\n while (start > 0 && !/\\s/.test(value[start - 1])) {\n start--\n }\n \n // Move end forward to word boundary\n while (end < value.length && !/\\s/.test(value[end])) {\n end++\n }\n \n textarea.selectionStart = start\n textarea.selectionEnd = end\n }\n}\n\n/**\n * Apply custom format\n */\nexport function applyCustomFormat(textarea, format) {\n if (!textarea || textarea.disabled || textarea.readOnly) return\n applyStyle(textarea, format)\n}\n\n/**\n * Preserve selection during callback\n */\nexport { preserveSelection }\n\n/**\n * Configure undo method\n */\nexport { setUndoMethod }\n\n/**\n * Default export with all functions\n */\nexport default {\n toggleBold,\n toggleItalic,\n toggleCode,\n insertLink,\n toggleBulletList,\n toggleNumberedList,\n toggleQuote,\n insertHeader,\n getActiveFormats,\n hasFormat,\n expandSelection,\n applyCustomFormat,\n preserveSelection,\n setUndoMethod\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["FORMATS", "getActiveFormats", "hasFormat", "getActiveFormats", "hasFormat"]
|
|
7
|
+
}
|