|
99 | 99 | } |
100 | 100 | // Parse @use, @think, @search, @prompt fields |
101 | 101 | if (block.type !== 'Image' && block.type !== 'Memory') { |
102 | | - var useMatch = block.prompt.match(/^@use:\s*(.+)$/m); |
| 102 | + var useMatch = block.prompt.match(/^(?:@use|Use):\s*(.+)$/m); |
103 | 103 | if (useMatch) { |
104 | 104 | block.useMemory = useMatch[1].split(',').map(function (s) { return s.trim(); }); |
105 | 105 | block.prompt = block.prompt.replace(useMatch[0], '').trim(); |
106 | 106 | } |
107 | 107 | // Parse @think: yes/no field |
108 | | - var thinkMatch = block.prompt.match(/^@think:\s*(yes|no)$/mi); |
| 108 | + var thinkMatch = block.prompt.match(/^(?:@think|Think):\s*(yes|no)$/mi); |
109 | 109 | if (thinkMatch) { |
110 | 110 | block.think = thinkMatch[1].toLowerCase() === 'yes'; |
111 | 111 | block.prompt = block.prompt.replace(thinkMatch[0], '').trim(); |
112 | 112 | } else if (block.think === undefined) { |
113 | 113 | block.think = false; |
114 | 114 | } |
115 | 115 | // Parse @search: field |
116 | | - var searchMatch = block.prompt.match(/^@search:\s*(\S+)$/mi); |
| 116 | + var searchMatch = block.prompt.match(/^(?:@search|Search):\s*(\S+)$/mi); |
117 | 117 | if (searchMatch) { |
118 | 118 | block.search = searchMatch[1].toLowerCase(); |
119 | 119 | block.prompt = block.prompt.replace(searchMatch[0], '').trim(); |
120 | 120 | } |
121 | 121 | // Strip @prompt: prefix if present (backward-compat: works without it too) |
122 | | - var promptMatch = block.prompt.match(/^@prompt:\s*/m); |
| 122 | + var promptMatch = block.prompt.match(/^(?:@prompt|Prompt):\s*/m); |
123 | 123 | if (promptMatch) { |
124 | 124 | block.prompt = block.prompt.replace(promptMatch[0], '').trim(); |
125 | 125 | } |
126 | 126 | } |
127 | 127 | // Parse Memory block fields |
128 | 128 | if (block.type === 'Memory') { |
129 | | - var nameMatch = block.prompt.match(/^@name:\s*(.+)$/m); |
| 129 | + var nameMatch = block.prompt.match(/^(?:@name|Name):\s*(.+)$/m); |
130 | 130 | block.memoryName = nameMatch ? nameMatch[1].trim() : 'default'; |
131 | 131 | } |
132 | 132 |
|
|
142 | 142 | var lines = prompt.split('\n'); |
143 | 143 | for (var i = 0; i < lines.length; i++) { |
144 | 144 | var line = lines[i].trim(); |
145 | | - var stepMatch = line.match(/^@step\s*(\d+)\s*:\s*(.+)/i); |
| 145 | + var stepMatch = line.match(/^(?:@step|Step)\s*(\d+)\s*:\s*(.+)/i); |
146 | 146 | if (stepMatch) { |
147 | 147 | steps.push({ |
148 | 148 | number: parseInt(stepMatch[1], 10), |
|
179 | 179 | if (_dedupInProgress) return markdown; |
180 | 180 | var fenced = getFencedRanges(markdown); |
181 | 181 | var tagRe = /\{\{Memory:\s*([\s\S]*?)\}\}/g; |
182 | | - var nameRe = /^@name:\s*(.+)$/m; |
| 182 | + var nameRe = /^(?:@name|Name):\s*(.+)$/m; |
183 | 183 | var seen = {}; |
184 | 184 | var replacements = []; // { start, end, oldName, newName } |
185 | 185 | var m; |
|
534 | 534 | function getDocMemoryNames() { |
535 | 535 | var text = M.markdownEditor ? M.markdownEditor.value : ''; |
536 | 536 | var names = []; |
537 | | - var re = /\{\{Memory:[^}]*@name:\s*([^\s}]+)/gi; |
| 537 | + var re = /\{\{Memory:[^}]*(?:@name|Name):\s*([^\s}]+)/gi; |
538 | 538 | var m; |
539 | 539 | while ((m = re.exec(text)) !== null) { |
540 | 540 | var n = m[1].replace(/[,}]/g, '').trim(); |
|
908 | 908 | M.bindDocgenPreviewActions = bindDocgenPreviewActions; |
909 | 909 | M.parseDocgenBlocks = parseDocgenBlocks; |
910 | 910 |
|
| 911 | + // Trigger re-render now that docgen is loaded. |
| 912 | + // The initial render (phase 2) happens before this module loads (phase 3e), |
| 913 | + // so tags display as raw text until we re-render here. |
| 914 | + if (M.markdownEditor) { |
| 915 | + M.markdownEditor.dispatchEvent(new Event('input')); |
| 916 | + } |
| 917 | + |
911 | 918 | })(window.MDView); |
0 commit comments