@nocturnium/svelte-ide 1.0.0-rc.1

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.
Files changed (330) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +251 -0
  3. package/dist/components/agents/AgentActivityPanel.svelte +565 -0
  4. package/dist/components/agents/AgentActivityPanel.svelte.d.ts +24 -0
  5. package/dist/components/agents/AgentAvatar.svelte +417 -0
  6. package/dist/components/agents/AgentAvatar.svelte.d.ts +23 -0
  7. package/dist/components/agents/AgentCursor.svelte +224 -0
  8. package/dist/components/agents/AgentCursor.svelte.d.ts +35 -0
  9. package/dist/components/agents/AgentPresenceBar.svelte +261 -0
  10. package/dist/components/agents/AgentPresenceBar.svelte.d.ts +20 -0
  11. package/dist/components/agents/index.d.ts +4 -0
  12. package/dist/components/agents/index.js +5 -0
  13. package/dist/components/ai/AIConversationList.svelte +524 -0
  14. package/dist/components/ai/AIConversationList.svelte.d.ts +17 -0
  15. package/dist/components/ai/AIEditPreview.svelte +132 -0
  16. package/dist/components/ai/AIEditPreview.svelte.d.ts +8 -0
  17. package/dist/components/ai/AIInlineEdit.svelte +155 -0
  18. package/dist/components/ai/AIInlineEdit.svelte.d.ts +10 -0
  19. package/dist/components/ai/AIMessage.svelte +239 -0
  20. package/dist/components/ai/AIMessage.svelte.d.ts +13 -0
  21. package/dist/components/ai/AIMessageActions.svelte +176 -0
  22. package/dist/components/ai/AIMessageActions.svelte.d.ts +12 -0
  23. package/dist/components/ai/AIMessageContent.svelte +355 -0
  24. package/dist/components/ai/AIMessageContent.svelte.d.ts +7 -0
  25. package/dist/components/ai/AIPanel.svelte +561 -0
  26. package/dist/components/ai/AIPanel.svelte.d.ts +7 -0
  27. package/dist/components/ai/AISuggestionWidget.svelte +132 -0
  28. package/dist/components/ai/AISuggestionWidget.svelte.d.ts +10 -0
  29. package/dist/components/ai/AIToolCallDisplay.svelte +317 -0
  30. package/dist/components/ai/AIToolCallDisplay.svelte.d.ts +12 -0
  31. package/dist/components/ai/index.d.ts +9 -0
  32. package/dist/components/ai/index.js +10 -0
  33. package/dist/components/core/Avatar.svelte +110 -0
  34. package/dist/components/core/Avatar.svelte.d.ts +12 -0
  35. package/dist/components/core/Badge.svelte +98 -0
  36. package/dist/components/core/Badge.svelte.d.ts +11 -0
  37. package/dist/components/core/Button.svelte +175 -0
  38. package/dist/components/core/Button.svelte.d.ts +18 -0
  39. package/dist/components/core/ConnectionStatus.svelte +294 -0
  40. package/dist/components/core/ConnectionStatus.svelte.d.ts +20 -0
  41. package/dist/components/core/ContextMenu.svelte +176 -0
  42. package/dist/components/core/ContextMenu.svelte.d.ts +19 -0
  43. package/dist/components/core/ErrorBoundary.svelte +277 -0
  44. package/dist/components/core/ErrorBoundary.svelte.d.ts +23 -0
  45. package/dist/components/core/Icon.svelte +107 -0
  46. package/dist/components/core/Icon.svelte.d.ts +8 -0
  47. package/dist/components/core/Input.svelte +138 -0
  48. package/dist/components/core/Input.svelte.d.ts +20 -0
  49. package/dist/components/core/Kbd.svelte +34 -0
  50. package/dist/components/core/Kbd.svelte.d.ts +7 -0
  51. package/dist/components/core/ResizeHandle.svelte +200 -0
  52. package/dist/components/core/ResizeHandle.svelte.d.ts +23 -0
  53. package/dist/components/core/Spinner.svelte +35 -0
  54. package/dist/components/core/Spinner.svelte.d.ts +7 -0
  55. package/dist/components/core/Textarea.svelte +112 -0
  56. package/dist/components/core/Textarea.svelte.d.ts +18 -0
  57. package/dist/components/core/Tooltip.svelte +103 -0
  58. package/dist/components/core/Tooltip.svelte.d.ts +11 -0
  59. package/dist/components/core/index.d.ts +13 -0
  60. package/dist/components/core/index.js +14 -0
  61. package/dist/components/editor/AIFocusLayer.svelte +430 -0
  62. package/dist/components/editor/AIFocusLayer.svelte.d.ts +32 -0
  63. package/dist/components/editor/Breadcrumbs.svelte +435 -0
  64. package/dist/components/editor/Breadcrumbs.svelte.d.ts +33 -0
  65. package/dist/components/editor/BreakpointLayer.svelte +642 -0
  66. package/dist/components/editor/BreakpointLayer.svelte.d.ts +20 -0
  67. package/dist/components/editor/CognitiveLoadMeter.svelte +324 -0
  68. package/dist/components/editor/CognitiveLoadMeter.svelte.d.ts +18 -0
  69. package/dist/components/editor/CollaborativeEditor.svelte +218 -0
  70. package/dist/components/editor/CollaborativeEditor.svelte.d.ts +32 -0
  71. package/dist/components/editor/CommandPalette.svelte +434 -0
  72. package/dist/components/editor/CommandPalette.svelte.d.ts +11 -0
  73. package/dist/components/editor/ComplexityLayer.svelte +293 -0
  74. package/dist/components/editor/ComplexityLayer.svelte.d.ts +23 -0
  75. package/dist/components/editor/ConflictZoneLayer.svelte +441 -0
  76. package/dist/components/editor/ConflictZoneLayer.svelte.d.ts +25 -0
  77. package/dist/components/editor/ContextLens.svelte +262 -0
  78. package/dist/components/editor/ContextLens.svelte.d.ts +27 -0
  79. package/dist/components/editor/CustomEditor.svelte +1242 -0
  80. package/dist/components/editor/CustomEditor.svelte.d.ts +37 -0
  81. package/dist/components/editor/DebugConsole.svelte +646 -0
  82. package/dist/components/editor/DebugConsole.svelte.d.ts +41 -0
  83. package/dist/components/editor/EchoCursorLayer.svelte +363 -0
  84. package/dist/components/editor/EchoCursorLayer.svelte.d.ts +24 -0
  85. package/dist/components/editor/Editor.svelte +61 -0
  86. package/dist/components/editor/Editor.svelte.d.ts +22 -0
  87. package/dist/components/editor/EditorGutter.svelte +119 -0
  88. package/dist/components/editor/EditorGutter.svelte.d.ts +19 -0
  89. package/dist/components/editor/EditorLines.svelte +182 -0
  90. package/dist/components/editor/EditorLines.svelte.d.ts +43 -0
  91. package/dist/components/editor/EditorPane.svelte +134 -0
  92. package/dist/components/editor/EditorPane.svelte.d.ts +9 -0
  93. package/dist/components/editor/EditorSelections.svelte +186 -0
  94. package/dist/components/editor/EditorSelections.svelte.d.ts +25 -0
  95. package/dist/components/editor/EditorTabs.svelte +170 -0
  96. package/dist/components/editor/EditorTabs.svelte.d.ts +12 -0
  97. package/dist/components/editor/FileExplorer.svelte +811 -0
  98. package/dist/components/editor/FileExplorer.svelte.d.ts +67 -0
  99. package/dist/components/editor/FileIcon.svelte +110 -0
  100. package/dist/components/editor/FileIcon.svelte.d.ts +10 -0
  101. package/dist/components/editor/FindReplace.svelte +448 -0
  102. package/dist/components/editor/FindReplace.svelte.d.ts +40 -0
  103. package/dist/components/editor/GhostBracketLayer.svelte +391 -0
  104. package/dist/components/editor/GhostBracketLayer.svelte.d.ts +24 -0
  105. package/dist/components/editor/GitBlameLayer.svelte +436 -0
  106. package/dist/components/editor/GitBlameLayer.svelte.d.ts +18 -0
  107. package/dist/components/editor/InlineDiagnosticsLayer.svelte +540 -0
  108. package/dist/components/editor/InlineDiagnosticsLayer.svelte.d.ts +35 -0
  109. package/dist/components/editor/InlineDiffLayer.svelte +337 -0
  110. package/dist/components/editor/InlineDiffLayer.svelte.d.ts +31 -0
  111. package/dist/components/editor/MinimalEditor.svelte +75 -0
  112. package/dist/components/editor/MinimalEditor.svelte.d.ts +6 -0
  113. package/dist/components/editor/MinimalEditor2.svelte +84 -0
  114. package/dist/components/editor/MinimalEditor2.svelte.d.ts +6 -0
  115. package/dist/components/editor/Minimap.svelte +327 -0
  116. package/dist/components/editor/Minimap.svelte.d.ts +34 -0
  117. package/dist/components/editor/PluginPreviewSandbox.svelte +793 -0
  118. package/dist/components/editor/PluginPreviewSandbox.svelte.d.ts +49 -0
  119. package/dist/components/editor/ProblemsPanel.svelte +628 -0
  120. package/dist/components/editor/ProblemsPanel.svelte.d.ts +25 -0
  121. package/dist/components/editor/QuickActionsMenu.svelte +403 -0
  122. package/dist/components/editor/QuickActionsMenu.svelte.d.ts +18 -0
  123. package/dist/components/editor/SnippetPalette.svelte +530 -0
  124. package/dist/components/editor/SnippetPalette.svelte.d.ts +16 -0
  125. package/dist/components/editor/StructureMap.svelte +431 -0
  126. package/dist/components/editor/StructureMap.svelte.d.ts +37 -0
  127. package/dist/components/editor/SymbolOutline.svelte +722 -0
  128. package/dist/components/editor/SymbolOutline.svelte.d.ts +44 -0
  129. package/dist/components/editor/TimelineScrubber.svelte +470 -0
  130. package/dist/components/editor/TimelineScrubber.svelte.d.ts +40 -0
  131. package/dist/components/editor/TokenRenderer.svelte +69 -0
  132. package/dist/components/editor/TokenRenderer.svelte.d.ts +15 -0
  133. package/dist/components/editor/constants.d.ts +32 -0
  134. package/dist/components/editor/constants.js +36 -0
  135. package/dist/components/editor/core/ai-awareness.d.ts +176 -0
  136. package/dist/components/editor/core/ai-awareness.js +210 -0
  137. package/dist/components/editor/core/bracket-healer.d.ts +189 -0
  138. package/dist/components/editor/core/bracket-healer.js +406 -0
  139. package/dist/components/editor/core/breakpoints.d.ts +203 -0
  140. package/dist/components/editor/core/breakpoints.js +414 -0
  141. package/dist/components/editor/core/commands.d.ts +108 -0
  142. package/dist/components/editor/core/commands.js +246 -0
  143. package/dist/components/editor/core/complexity-analyzer.d.ts +123 -0
  144. package/dist/components/editor/core/complexity-analyzer.js +376 -0
  145. package/dist/components/editor/core/conflict-predictor.d.ts +135 -0
  146. package/dist/components/editor/core/conflict-predictor.js +316 -0
  147. package/dist/components/editor/core/crdt-binding.d.ts +118 -0
  148. package/dist/components/editor/core/crdt-binding.js +286 -0
  149. package/dist/components/editor/core/diagnostics.d.ts +210 -0
  150. package/dist/components/editor/core/diagnostics.js +335 -0
  151. package/dist/components/editor/core/echo-cursor.d.ts +201 -0
  152. package/dist/components/editor/core/echo-cursor.js +267 -0
  153. package/dist/components/editor/core/folding.d.ts +124 -0
  154. package/dist/components/editor/core/folding.js +672 -0
  155. package/dist/components/editor/core/ghost-pair.d.ts +122 -0
  156. package/dist/components/editor/core/ghost-pair.js +221 -0
  157. package/dist/components/editor/core/git-blame.d.ts +170 -0
  158. package/dist/components/editor/core/git-blame.js +324 -0
  159. package/dist/components/editor/core/index.d.ts +26 -0
  160. package/dist/components/editor/core/index.js +24 -0
  161. package/dist/components/editor/core/keybindings.d.ts +79 -0
  162. package/dist/components/editor/core/keybindings.js +357 -0
  163. package/dist/components/editor/core/multi-cursor.d.ts +196 -0
  164. package/dist/components/editor/core/multi-cursor.js +521 -0
  165. package/dist/components/editor/core/navigation.d.ts +107 -0
  166. package/dist/components/editor/core/navigation.js +408 -0
  167. package/dist/components/editor/core/quick-actions.d.ts +189 -0
  168. package/dist/components/editor/core/quick-actions.js +427 -0
  169. package/dist/components/editor/core/search.d.ts +88 -0
  170. package/dist/components/editor/core/search.js +192 -0
  171. package/dist/components/editor/core/semantic-analyzer.d.ts +77 -0
  172. package/dist/components/editor/core/semantic-analyzer.js +424 -0
  173. package/dist/components/editor/core/snippet-manager.d.ts +202 -0
  174. package/dist/components/editor/core/snippet-manager.js +565 -0
  175. package/dist/components/editor/core/state.d.ts +367 -0
  176. package/dist/components/editor/core/state.js +900 -0
  177. package/dist/components/editor/core/timeline.d.ts +204 -0
  178. package/dist/components/editor/core/timeline.js +349 -0
  179. package/dist/components/editor/editor-find.d.ts +56 -0
  180. package/dist/components/editor/editor-find.js +148 -0
  181. package/dist/components/editor/editor-input.d.ts +77 -0
  182. package/dist/components/editor/editor-input.js +445 -0
  183. package/dist/components/editor/editor-multicursor.d.ts +21 -0
  184. package/dist/components/editor/editor-multicursor.js +196 -0
  185. package/dist/components/editor/editor-scroll.d.ts +14 -0
  186. package/dist/components/editor/editor-scroll.js +34 -0
  187. package/dist/components/editor/index.d.ts +15 -0
  188. package/dist/components/editor/index.js +21 -0
  189. package/dist/components/editor/languages.d.ts +62 -0
  190. package/dist/components/editor/languages.js +285 -0
  191. package/dist/components/editor/theme.d.ts +88 -0
  192. package/dist/components/editor/theme.js +139 -0
  193. package/dist/components/editor/tokenizer/base.d.ts +40 -0
  194. package/dist/components/editor/tokenizer/base.js +203 -0
  195. package/dist/components/editor/tokenizer/index.d.ts +56 -0
  196. package/dist/components/editor/tokenizer/index.js +215 -0
  197. package/dist/components/editor/tokenizer/languages/css.d.ts +17 -0
  198. package/dist/components/editor/tokenizer/languages/css.js +194 -0
  199. package/dist/components/editor/tokenizer/languages/go.d.ts +17 -0
  200. package/dist/components/editor/tokenizer/languages/go.js +220 -0
  201. package/dist/components/editor/tokenizer/languages/html.d.ts +24 -0
  202. package/dist/components/editor/tokenizer/languages/html.js +145 -0
  203. package/dist/components/editor/tokenizer/languages/javascript.d.ts +56 -0
  204. package/dist/components/editor/tokenizer/languages/javascript.js +452 -0
  205. package/dist/components/editor/tokenizer/languages/json.d.ts +12 -0
  206. package/dist/components/editor/tokenizer/languages/json.js +91 -0
  207. package/dist/components/editor/tokenizer/languages/markdown.d.ts +16 -0
  208. package/dist/components/editor/tokenizer/languages/markdown.js +156 -0
  209. package/dist/components/editor/tokenizer/languages/python.d.ts +20 -0
  210. package/dist/components/editor/tokenizer/languages/python.js +227 -0
  211. package/dist/components/editor/tokenizer/languages/svelte.d.ts +40 -0
  212. package/dist/components/editor/tokenizer/languages/svelte.js +326 -0
  213. package/dist/components/editor/tokenizer/types.d.ts +86 -0
  214. package/dist/components/editor/tokenizer/types.js +4 -0
  215. package/dist/components/layout/IDELayout.svelte +274 -0
  216. package/dist/components/layout/IDELayout.svelte.d.ts +29 -0
  217. package/dist/components/layout/StatusBar.svelte +511 -0
  218. package/dist/components/layout/StatusBar.svelte.d.ts +47 -0
  219. package/dist/components/layout/index.d.ts +2 -0
  220. package/dist/components/layout/index.js +3 -0
  221. package/dist/components/lsp/AutocompleteWidget.svelte +364 -0
  222. package/dist/components/lsp/AutocompleteWidget.svelte.d.ts +33 -0
  223. package/dist/components/lsp/DiagnosticMarker.svelte +166 -0
  224. package/dist/components/lsp/DiagnosticMarker.svelte.d.ts +19 -0
  225. package/dist/components/lsp/DiagnosticsPanel.svelte +388 -0
  226. package/dist/components/lsp/DiagnosticsPanel.svelte.d.ts +21 -0
  227. package/dist/components/lsp/HoverTooltip.svelte +274 -0
  228. package/dist/components/lsp/HoverTooltip.svelte.d.ts +24 -0
  229. package/dist/components/lsp/LSPEditor.svelte +486 -0
  230. package/dist/components/lsp/LSPEditor.svelte.d.ts +39 -0
  231. package/dist/components/lsp/SignatureHelpWidget.svelte +216 -0
  232. package/dist/components/lsp/SignatureHelpWidget.svelte.d.ts +22 -0
  233. package/dist/components/lsp/index.d.ts +6 -0
  234. package/dist/components/lsp/index.js +7 -0
  235. package/dist/components/plugins/PluginCard.svelte +153 -0
  236. package/dist/components/plugins/PluginCard.svelte.d.ts +19 -0
  237. package/dist/components/plugins/PluginPanel.svelte +280 -0
  238. package/dist/components/plugins/PluginPanel.svelte.d.ts +8 -0
  239. package/dist/components/plugins/PluginProposalForm.svelte +250 -0
  240. package/dist/components/plugins/PluginProposalForm.svelte.d.ts +6 -0
  241. package/dist/components/plugins/PluginStatusBadge.svelte +14 -0
  242. package/dist/components/plugins/PluginStatusBadge.svelte.d.ts +8 -0
  243. package/dist/components/plugins/index.d.ts +4 -0
  244. package/dist/components/plugins/index.js +5 -0
  245. package/dist/components/vfs/LockConflictDialog.svelte +705 -0
  246. package/dist/components/vfs/LockConflictDialog.svelte.d.ts +21 -0
  247. package/dist/components/vfs/LockIndicator.svelte +194 -0
  248. package/dist/components/vfs/LockIndicator.svelte.d.ts +29 -0
  249. package/dist/components/vfs/LockOverlay.svelte +344 -0
  250. package/dist/components/vfs/LockOverlay.svelte.d.ts +17 -0
  251. package/dist/components/vfs/VersionConflictDialog.svelte +549 -0
  252. package/dist/components/vfs/VersionConflictDialog.svelte.d.ts +24 -0
  253. package/dist/components/vfs/index.d.ts +4 -0
  254. package/dist/components/vfs/index.js +5 -0
  255. package/dist/crdt/awareness.d.ts +42 -0
  256. package/dist/crdt/awareness.js +109 -0
  257. package/dist/crdt/document.d.ts +101 -0
  258. package/dist/crdt/document.js +187 -0
  259. package/dist/crdt/index.d.ts +9 -0
  260. package/dist/crdt/index.js +8 -0
  261. package/dist/crdt/provider.d.ts +85 -0
  262. package/dist/crdt/provider.js +150 -0
  263. package/dist/crdt/types.d.ts +61 -0
  264. package/dist/crdt/types.js +4 -0
  265. package/dist/crdt/undo.d.ts +34 -0
  266. package/dist/crdt/undo.js +70 -0
  267. package/dist/index.d.ts +277 -0
  268. package/dist/index.js +280 -0
  269. package/dist/plugins/index.d.ts +103 -0
  270. package/dist/plugins/index.js +153 -0
  271. package/dist/services/error-handling.d.ts +95 -0
  272. package/dist/services/error-handling.js +413 -0
  273. package/dist/services/ide-integration.d.ts +83 -0
  274. package/dist/services/ide-integration.js +367 -0
  275. package/dist/services/lsp-client.d.ts +69 -0
  276. package/dist/services/lsp-client.js +667 -0
  277. package/dist/services/mock-ai.d.ts +37 -0
  278. package/dist/services/mock-ai.js +318 -0
  279. package/dist/services/optimistic.d.ts +141 -0
  280. package/dist/services/optimistic.js +367 -0
  281. package/dist/services/vfs-client.d.ts +81 -0
  282. package/dist/services/vfs-client.js +348 -0
  283. package/dist/stores/agents.svelte.d.ts +85 -0
  284. package/dist/stores/agents.svelte.js +459 -0
  285. package/dist/stores/ai-persistence.svelte.d.ts +76 -0
  286. package/dist/stores/ai-persistence.svelte.js +334 -0
  287. package/dist/stores/ai.svelte.d.ts +140 -0
  288. package/dist/stores/ai.svelte.js +383 -0
  289. package/dist/stores/collaboration.svelte.d.ts +164 -0
  290. package/dist/stores/collaboration.svelte.js +334 -0
  291. package/dist/stores/editor.svelte.d.ts +131 -0
  292. package/dist/stores/editor.svelte.js +250 -0
  293. package/dist/stores/index.d.ts +10 -0
  294. package/dist/stores/index.js +29 -0
  295. package/dist/stores/layout.svelte.d.ts +171 -0
  296. package/dist/stores/layout.svelte.js +351 -0
  297. package/dist/stores/plugin.svelte.d.ts +121 -0
  298. package/dist/stores/plugin.svelte.js +410 -0
  299. package/dist/stores/vfs.svelte.d.ts +123 -0
  300. package/dist/stores/vfs.svelte.js +680 -0
  301. package/dist/styles/theme.css +623 -0
  302. package/dist/types/agents.d.ts +127 -0
  303. package/dist/types/agents.js +5 -0
  304. package/dist/types/ai.d.ts +137 -0
  305. package/dist/types/ai.js +4 -0
  306. package/dist/types/crdt.d.ts +222 -0
  307. package/dist/types/crdt.js +5 -0
  308. package/dist/types/editor.d.ts +52 -0
  309. package/dist/types/editor.js +18 -0
  310. package/dist/types/events.d.ts +133 -0
  311. package/dist/types/events.js +4 -0
  312. package/dist/types/filesystem.d.ts +77 -0
  313. package/dist/types/filesystem.js +4 -0
  314. package/dist/types/index.d.ts +9 -0
  315. package/dist/types/index.js +12 -0
  316. package/dist/types/lsp.d.ts +691 -0
  317. package/dist/types/lsp.js +108 -0
  318. package/dist/types/plugin.d.ts +239 -0
  319. package/dist/types/plugin.js +5 -0
  320. package/dist/types/vfs.d.ts +191 -0
  321. package/dist/types/vfs.js +18 -0
  322. package/dist/utils/format.d.ts +55 -0
  323. package/dist/utils/format.js +152 -0
  324. package/dist/utils/index.d.ts +3 -0
  325. package/dist/utils/index.js +4 -0
  326. package/dist/utils/keybindings.d.ts +33 -0
  327. package/dist/utils/keybindings.js +171 -0
  328. package/dist/utils/language.d.ts +27 -0
  329. package/dist/utils/language.js +222 -0
  330. package/package.json +178 -0
@@ -0,0 +1,91 @@
1
+ /**
2
+ * JSON tokenizer
3
+ */
4
+ import { createToken } from '../base';
5
+ export class JSONTokenizer {
6
+ language = 'json';
7
+ getInitialState() {
8
+ return {};
9
+ }
10
+ tokenizeLine(line, lineNumber, prevState) {
11
+ const tokens = [];
12
+ let pos = 0;
13
+ const state = { ...prevState };
14
+ while (pos < line.length) {
15
+ const remaining = line.slice(pos);
16
+ const token = this.getNextToken(remaining, pos);
17
+ if (token) {
18
+ tokens.push(token);
19
+ pos = token.end;
20
+ }
21
+ else {
22
+ tokens.push(createToken('text', remaining[0], pos));
23
+ pos += 1;
24
+ }
25
+ }
26
+ if (tokens.length === 0) {
27
+ tokens.push(createToken('text', '', 0));
28
+ }
29
+ return { lineNumber, tokens, text: line, state };
30
+ }
31
+ getNextToken(text, pos) {
32
+ // Whitespace
33
+ const wsMatch = text.match(/^[ \t]+/);
34
+ if (wsMatch) {
35
+ return createToken('text', wsMatch[0], pos);
36
+ }
37
+ // Property keys (strings before colon)
38
+ if (text.startsWith('"')) {
39
+ const stringEnd = this.findStringEnd(text);
40
+ const str = text.slice(0, stringEnd);
41
+ // Check if followed by colon (property key)
42
+ const afterString = text.slice(stringEnd).trim();
43
+ if (afterString.startsWith(':')) {
44
+ return createToken('property', str, pos);
45
+ }
46
+ return createToken('string', str, pos);
47
+ }
48
+ // Numbers
49
+ const numMatch = text.match(/^-?(?:0|[1-9]\d*)(?:\.\d+)?(?:[eE][+-]?\d+)?/);
50
+ if (numMatch) {
51
+ return createToken('number', numMatch[0], pos);
52
+ }
53
+ // Boolean and null
54
+ const boolMatch = text.match(/^(?:true|false)\b/);
55
+ if (boolMatch) {
56
+ return createToken('constant.boolean', boolMatch[0], pos);
57
+ }
58
+ const nullMatch = text.match(/^null\b/);
59
+ if (nullMatch) {
60
+ return createToken('constant.null', nullMatch[0], pos);
61
+ }
62
+ // Punctuation
63
+ if (text[0] === '{' || text[0] === '}') {
64
+ return createToken('punctuation.brace', text[0], pos);
65
+ }
66
+ if (text[0] === '[' || text[0] === ']') {
67
+ return createToken('punctuation.bracket', text[0], pos);
68
+ }
69
+ if (text[0] === ':' || text[0] === ',') {
70
+ return createToken('punctuation.separator', text[0], pos);
71
+ }
72
+ return createToken('text', text[0], pos);
73
+ }
74
+ findStringEnd(text) {
75
+ let i = 1;
76
+ while (i < text.length) {
77
+ if (text[i] === '\\' && i + 1 < text.length) {
78
+ i += 2;
79
+ continue;
80
+ }
81
+ if (text[i] === '"') {
82
+ return i + 1;
83
+ }
84
+ i++;
85
+ }
86
+ return text.length;
87
+ }
88
+ }
89
+ export function createJSONTokenizer() {
90
+ return new JSONTokenizer();
91
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Markdown tokenizer
3
+ */
4
+ import type { TokenizedLine, TokenizerState } from '../types';
5
+ interface MarkdownTokenizerState extends TokenizerState {
6
+ inFencedCode?: boolean;
7
+ codeLanguage?: string;
8
+ }
9
+ export declare class MarkdownTokenizer {
10
+ language: string;
11
+ getInitialState(): MarkdownTokenizerState;
12
+ tokenizeLine(line: string, lineNumber: number, prevState?: MarkdownTokenizerState): TokenizedLine;
13
+ private tokenizeInline;
14
+ }
15
+ export declare function createMarkdownTokenizer(): MarkdownTokenizer;
16
+ export {};
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Markdown tokenizer
3
+ */
4
+ import { createToken } from '../base';
5
+ export class MarkdownTokenizer {
6
+ language = 'markdown';
7
+ getInitialState() {
8
+ return {};
9
+ }
10
+ tokenizeLine(line, lineNumber, prevState) {
11
+ const tokens = [];
12
+ const state = { ...prevState };
13
+ // Handle fenced code block
14
+ if (state.inFencedCode) {
15
+ if (line.match(/^```\s*$/)) {
16
+ tokens.push(createToken('markup.code', line, 0));
17
+ state.inFencedCode = false;
18
+ state.codeLanguage = undefined;
19
+ }
20
+ else {
21
+ tokens.push(createToken('markup.code', line, 0));
22
+ }
23
+ return { lineNumber, tokens, text: line, state };
24
+ }
25
+ // Check for fenced code block start
26
+ const fenceMatch = line.match(/^```(\w*)/);
27
+ if (fenceMatch) {
28
+ tokens.push(createToken('markup.code', line, 0));
29
+ state.inFencedCode = true;
30
+ state.codeLanguage = fenceMatch[1] || undefined;
31
+ return { lineNumber, tokens, text: line, state };
32
+ }
33
+ // Headings
34
+ const headingMatch = line.match(/^(#{1,6})\s+(.*)$/);
35
+ if (headingMatch) {
36
+ tokens.push(createToken('markup.heading', headingMatch[1], 0));
37
+ tokens.push(createToken('text', ' ', headingMatch[1].length));
38
+ this.tokenizeInline(headingMatch[2], headingMatch[1].length + 1, tokens);
39
+ return { lineNumber, tokens, text: line, state };
40
+ }
41
+ // Horizontal rule
42
+ if (line.match(/^(?:[-*_]\s*){3,}$/)) {
43
+ tokens.push(createToken('punctuation', line, 0));
44
+ return { lineNumber, tokens, text: line, state };
45
+ }
46
+ // Block quotes
47
+ const quoteMatch = line.match(/^(>\s*)/);
48
+ if (quoteMatch) {
49
+ tokens.push(createToken('markup.quote', quoteMatch[1], 0));
50
+ this.tokenizeInline(line.slice(quoteMatch[1].length), quoteMatch[1].length, tokens);
51
+ return { lineNumber, tokens, text: line, state };
52
+ }
53
+ // Unordered lists
54
+ const ulMatch = line.match(/^(\s*[-*+])\s/);
55
+ if (ulMatch) {
56
+ tokens.push(createToken('markup.list', ulMatch[1], 0));
57
+ tokens.push(createToken('text', ' ', ulMatch[1].length));
58
+ this.tokenizeInline(line.slice(ulMatch[0].length), ulMatch[0].length, tokens);
59
+ return { lineNumber, tokens, text: line, state };
60
+ }
61
+ // Ordered lists
62
+ const olMatch = line.match(/^(\s*\d+\.)\s/);
63
+ if (olMatch) {
64
+ tokens.push(createToken('markup.list', olMatch[1], 0));
65
+ tokens.push(createToken('text', ' ', olMatch[1].length));
66
+ this.tokenizeInline(line.slice(olMatch[0].length), olMatch[0].length, tokens);
67
+ return { lineNumber, tokens, text: line, state };
68
+ }
69
+ // Indented code block
70
+ if (line.match(/^(?: |\t)/)) {
71
+ tokens.push(createToken('markup.code', line, 0));
72
+ return { lineNumber, tokens, text: line, state };
73
+ }
74
+ // Regular paragraph
75
+ this.tokenizeInline(line, 0, tokens);
76
+ if (tokens.length === 0) {
77
+ tokens.push(createToken('text', '', 0));
78
+ }
79
+ return { lineNumber, tokens, text: line, state };
80
+ }
81
+ tokenizeInline(text, offset, tokens) {
82
+ let pos = 0;
83
+ while (pos < text.length) {
84
+ const remaining = text.slice(pos);
85
+ // Inline code
86
+ const codeMatch = remaining.match(/^`([^`]+)`/);
87
+ if (codeMatch) {
88
+ tokens.push(createToken('markup.code', codeMatch[0], offset + pos));
89
+ pos += codeMatch[0].length;
90
+ continue;
91
+ }
92
+ // Images ![alt](url)
93
+ const imgMatch = remaining.match(/^!\[([^\]]*)\]\(([^)]+)\)/);
94
+ if (imgMatch) {
95
+ tokens.push(createToken('markup.link', imgMatch[0], offset + pos));
96
+ pos += imgMatch[0].length;
97
+ continue;
98
+ }
99
+ // Links [text](url)
100
+ const linkMatch = remaining.match(/^\[([^\]]+)\]\(([^)]+)\)/);
101
+ if (linkMatch) {
102
+ tokens.push(createToken('markup.link', linkMatch[0], offset + pos));
103
+ pos += linkMatch[0].length;
104
+ continue;
105
+ }
106
+ // Reference-style links [text][ref]
107
+ const refLinkMatch = remaining.match(/^\[([^\]]+)\]\[([^\]]*)\]/);
108
+ if (refLinkMatch) {
109
+ tokens.push(createToken('markup.link', refLinkMatch[0], offset + pos));
110
+ pos += refLinkMatch[0].length;
111
+ continue;
112
+ }
113
+ // Autolinks <url>
114
+ const autoLinkMatch = remaining.match(/^<(https?:\/\/[^>]+)>/);
115
+ if (autoLinkMatch) {
116
+ tokens.push(createToken('markup.link', autoLinkMatch[0], offset + pos));
117
+ pos += autoLinkMatch[0].length;
118
+ continue;
119
+ }
120
+ // Bold **text** or __text__
121
+ const boldMatch = remaining.match(/^(?:\*\*([^*]+)\*\*|__([^_]+)__)/);
122
+ if (boldMatch) {
123
+ tokens.push(createToken('markup.bold', boldMatch[0], offset + pos));
124
+ pos += boldMatch[0].length;
125
+ continue;
126
+ }
127
+ // Italic *text* or _text_
128
+ const italicMatch = remaining.match(/^(?:\*([^*]+)\*|_([^_]+)_)/);
129
+ if (italicMatch) {
130
+ tokens.push(createToken('markup.italic', italicMatch[0], offset + pos));
131
+ pos += italicMatch[0].length;
132
+ continue;
133
+ }
134
+ // Strikethrough ~~text~~
135
+ const strikeMatch = remaining.match(/^~~([^~]+)~~/);
136
+ if (strikeMatch) {
137
+ tokens.push(createToken('punctuation', strikeMatch[0], offset + pos));
138
+ pos += strikeMatch[0].length;
139
+ continue;
140
+ }
141
+ // Regular text
142
+ const textMatch = remaining.match(/^[^`*_\[!<~]+/);
143
+ if (textMatch) {
144
+ tokens.push(createToken('text', textMatch[0], offset + pos));
145
+ pos += textMatch[0].length;
146
+ continue;
147
+ }
148
+ // Single character fallback
149
+ tokens.push(createToken('text', remaining[0], offset + pos));
150
+ pos += 1;
151
+ }
152
+ }
153
+ }
154
+ export function createMarkdownTokenizer() {
155
+ return new MarkdownTokenizer();
156
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Python tokenizer
3
+ */
4
+ import type { TokenizedLine, TokenizerState } from '../types';
5
+ interface PythonTokenizerState extends TokenizerState {
6
+ stringDelimiter?: string;
7
+ stringTriple?: boolean;
8
+ }
9
+ export declare class PythonTokenizer {
10
+ language: string;
11
+ getInitialState(): PythonTokenizerState;
12
+ tokenizeLine(line: string, lineNumber: number, prevState?: PythonTokenizerState): TokenizedLine;
13
+ private getNextToken;
14
+ private classifyIdentifier;
15
+ private tokenizeString;
16
+ private tokenizeTripleString;
17
+ private tokenizeMultilineStringContinuation;
18
+ }
19
+ export declare function createPythonTokenizer(): PythonTokenizer;
20
+ export {};
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Python tokenizer
3
+ */
4
+ import { createToken } from '../base';
5
+ // Python keywords
6
+ const keywords = new Set([
7
+ 'and', 'as', 'assert', 'async', 'await', 'break', 'class', 'continue',
8
+ 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from',
9
+ 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not',
10
+ 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'
11
+ ]);
12
+ const controlKeywords = new Set([
13
+ 'if', 'elif', 'else', 'for', 'while', 'try', 'except', 'finally',
14
+ 'with', 'break', 'continue', 'return', 'raise', 'yield', 'await'
15
+ ]);
16
+ const builtins = new Set([
17
+ 'True', 'False', 'None', 'self', 'cls'
18
+ ]);
19
+ const builtinFunctions = new Set([
20
+ 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes',
21
+ 'callable', 'chr', 'classmethod', 'compile', 'complex', 'delattr',
22
+ 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'filter',
23
+ 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr',
24
+ 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass',
25
+ 'iter', 'len', 'list', 'locals', 'map', 'max', 'memoryview', 'min',
26
+ 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property',
27
+ 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice',
28
+ 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type',
29
+ 'vars', 'zip', '__import__'
30
+ ]);
31
+ export class PythonTokenizer {
32
+ language = 'python';
33
+ getInitialState() {
34
+ return {};
35
+ }
36
+ tokenizeLine(line, lineNumber, prevState) {
37
+ const tokens = [];
38
+ let pos = 0;
39
+ const state = { ...prevState };
40
+ // Handle multi-line string continuation
41
+ if (state.inMultilineString && state.stringDelimiter) {
42
+ const result = this.tokenizeMultilineStringContinuation(line, pos, state);
43
+ tokens.push(...result.tokens);
44
+ pos = result.pos;
45
+ if (pos >= line.length) {
46
+ return { lineNumber, tokens, text: line, state };
47
+ }
48
+ }
49
+ while (pos < line.length) {
50
+ const remaining = line.slice(pos);
51
+ const token = this.getNextToken(remaining, pos, state);
52
+ if (token) {
53
+ tokens.push(token);
54
+ pos = token.end;
55
+ }
56
+ else {
57
+ tokens.push(createToken('text', remaining[0], pos));
58
+ pos += 1;
59
+ }
60
+ }
61
+ if (tokens.length === 0) {
62
+ tokens.push(createToken('text', '', 0));
63
+ }
64
+ return { lineNumber, tokens, text: line, state };
65
+ }
66
+ getNextToken(text, pos, state) {
67
+ // Whitespace
68
+ const wsMatch = text.match(/^[ \t]+/);
69
+ if (wsMatch) {
70
+ return createToken('text', wsMatch[0], pos);
71
+ }
72
+ // Comments
73
+ if (text.startsWith('#')) {
74
+ return createToken('comment.line', text, pos);
75
+ }
76
+ // Triple-quoted strings
77
+ const tripleMatch = text.match(/^(?:f|r|b|fr|rf|br|rb)?(?:'''|""")/i);
78
+ if (tripleMatch) {
79
+ const prefix = tripleMatch[0];
80
+ const delimiter = prefix.slice(-3);
81
+ return this.tokenizeTripleString(text, pos, delimiter, state);
82
+ }
83
+ // Regular strings
84
+ const stringMatch = text.match(/^(?:f|r|b|fr|rf|br|rb)?["']/i);
85
+ if (stringMatch) {
86
+ const prefix = stringMatch[0];
87
+ const delimiter = prefix.slice(-1);
88
+ return this.tokenizeString(text, pos, delimiter);
89
+ }
90
+ // Numbers
91
+ const numMatch = text.match(/^(?:0[xX][0-9a-fA-F]+|0[bB][01]+|0[oO][0-7]+|(?:\d+\.?\d*|\.\d+)(?:[eE][+-]?\d+)?j?)/);
92
+ if (numMatch) {
93
+ return createToken('number', numMatch[0], pos);
94
+ }
95
+ // Decorators
96
+ if (text.startsWith('@')) {
97
+ const decoratorMatch = text.match(/^@[a-zA-Z_][a-zA-Z0-9_.]*/);
98
+ if (decoratorMatch) {
99
+ return createToken('function', decoratorMatch[0], pos);
100
+ }
101
+ }
102
+ // Identifiers and keywords
103
+ const identMatch = text.match(/^[a-zA-Z_][a-zA-Z0-9_]*/);
104
+ if (identMatch) {
105
+ const word = identMatch[0];
106
+ return createToken(this.classifyIdentifier(word, text, identMatch[0].length), word, pos);
107
+ }
108
+ // Operators
109
+ const opMatch = text.match(/^(?:->|:=|==|!=|<=|>=|<<|>>|\*\*|\/\/|[+\-*/%&|^~<>=!@])/);
110
+ if (opMatch) {
111
+ return createToken('operator', opMatch[0], pos);
112
+ }
113
+ // Punctuation
114
+ const punctMatch = text.match(/^[{}[\](),.:;]/);
115
+ if (punctMatch) {
116
+ const char = punctMatch[0];
117
+ let type = 'punctuation';
118
+ if (char === '{' || char === '}')
119
+ type = 'punctuation.brace';
120
+ else if (char === '[' || char === ']')
121
+ type = 'punctuation.bracket';
122
+ else if (char === '(' || char === ')')
123
+ type = 'punctuation.paren';
124
+ else if (char === ',' || char === ';' || char === ':')
125
+ type = 'punctuation.separator';
126
+ else if (char === '.')
127
+ type = 'punctuation.accessor';
128
+ return createToken(type, char, pos);
129
+ }
130
+ return createToken('text', text[0], pos);
131
+ }
132
+ classifyIdentifier(word, context, wordLength) {
133
+ // Built-in constants
134
+ if (builtins.has(word)) {
135
+ if (word === 'True' || word === 'False')
136
+ return 'constant.boolean';
137
+ if (word === 'None')
138
+ return 'constant.null';
139
+ return 'constant.builtin';
140
+ }
141
+ // Keywords
142
+ if (keywords.has(word)) {
143
+ if (controlKeywords.has(word))
144
+ return 'keyword.control';
145
+ if (word === 'def' || word === 'class' || word === 'lambda')
146
+ return 'keyword.definition';
147
+ if (word === 'import' || word === 'from' || word === 'as')
148
+ return 'keyword.module';
149
+ return 'keyword';
150
+ }
151
+ // Built-in functions
152
+ if (builtinFunctions.has(word)) {
153
+ const afterWord = context.slice(wordLength).trim();
154
+ if (afterWord.startsWith('(')) {
155
+ return 'function.call';
156
+ }
157
+ return 'type.builtin';
158
+ }
159
+ // Check if followed by ( - likely a function call
160
+ const afterWord = context.slice(wordLength).trim();
161
+ if (afterWord.startsWith('(')) {
162
+ return 'function.call';
163
+ }
164
+ // Check if it's a type (PascalCase)
165
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(word)) {
166
+ return 'type.class';
167
+ }
168
+ // Magic methods/attributes
169
+ if (word.startsWith('__') && word.endsWith('__')) {
170
+ return 'constant.builtin';
171
+ }
172
+ return 'variable';
173
+ }
174
+ tokenizeString(text, pos, delimiter) {
175
+ // Find prefix length
176
+ const prefixMatch = text.match(/^(?:f|r|b|fr|rf|br|rb)?/i);
177
+ const prefixLen = prefixMatch ? prefixMatch[0].length : 0;
178
+ let i = prefixLen + 1;
179
+ while (i < text.length) {
180
+ if (text[i] === '\\' && i + 1 < text.length) {
181
+ i += 2;
182
+ continue;
183
+ }
184
+ if (text[i] === delimiter) {
185
+ return createToken('string', text.slice(0, i + 1), pos);
186
+ }
187
+ if (text[i] === '\n') {
188
+ break;
189
+ }
190
+ i++;
191
+ }
192
+ return createToken('string', text.slice(0, i), pos);
193
+ }
194
+ tokenizeTripleString(text, pos, delimiter, state) {
195
+ // Find prefix length
196
+ const prefixMatch = text.match(/^(?:f|r|b|fr|rf|br|rb)?/i);
197
+ const prefixLen = prefixMatch ? prefixMatch[0].length : 0;
198
+ const searchStart = prefixLen + 3;
199
+ const endIdx = text.indexOf(delimiter, searchStart);
200
+ if (endIdx !== -1) {
201
+ return createToken('string', text.slice(0, endIdx + 3), pos);
202
+ }
203
+ else {
204
+ state.inMultilineString = true;
205
+ state.stringDelimiter = delimiter;
206
+ return createToken('string', text, pos);
207
+ }
208
+ }
209
+ tokenizeMultilineStringContinuation(line, startPos, state) {
210
+ const tokens = [];
211
+ const delimiter = state.stringDelimiter || '"""';
212
+ const endIdx = line.indexOf(delimiter);
213
+ if (endIdx !== -1) {
214
+ tokens.push(createToken('string', line.slice(0, endIdx + 3), startPos));
215
+ state.inMultilineString = false;
216
+ state.stringDelimiter = undefined;
217
+ return { tokens, pos: endIdx + 3 };
218
+ }
219
+ else {
220
+ tokens.push(createToken('string', line, startPos));
221
+ return { tokens, pos: line.length };
222
+ }
223
+ }
224
+ }
225
+ export function createPythonTokenizer() {
226
+ return new PythonTokenizer();
227
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Svelte tokenizer for syntax highlighting
3
+ *
4
+ * Supports:
5
+ * - Template directives: {#if}, {#each}, {@html}, etc.
6
+ * - JavaScript expressions in curly braces
7
+ * - Svelte-specific attributes: bind:, on:, use:, transition:, etc.
8
+ * - Script and style sections
9
+ * - HTML template parts
10
+ */
11
+ import type { LanguageTokenizer, TokenizedLine, TokenizerState } from '../types';
12
+ /**
13
+ * Svelte-specific tokenizer state
14
+ */
15
+ export interface SvelteTokenizerState extends TokenizerState {
16
+ /** Current context: 'template', 'script', or 'style' */
17
+ context: 'template' | 'script' | 'style';
18
+ /** Depth of nested script/style tags */
19
+ tagDepth: number;
20
+ /** Script/style tokenizer state */
21
+ innerState?: TokenizerState;
22
+ }
23
+ /**
24
+ * Svelte tokenizer
25
+ */
26
+ export declare class SvelteTokenizer implements LanguageTokenizer {
27
+ language: string;
28
+ private tsTokenizer;
29
+ private cssTokenizer;
30
+ constructor();
31
+ getInitialState(): SvelteTokenizerState;
32
+ tokenizeLine(line: string, lineNumber: number, state: SvelteTokenizerState): TokenizedLine;
33
+ private tokenizeTemplate;
34
+ private tokenizeTag;
35
+ private tokenizeJSExpression;
36
+ }
37
+ /**
38
+ * Create a Svelte tokenizer
39
+ */
40
+ export declare function createSvelteTokenizer(): SvelteTokenizer;