{"format":1,"manifest":{"name":"regex-tester","publisher":"vyloxi","version":"1.1.0","displayName":"Regex Tester","description":"Try a regular expression on sample text: live highlighting, every match and every capture group.","engines":{"ferrum":"^0.1.0"},"categories":["Tools"],"icon":"icon.png","repository":"https://github.com/voukengdongmofrankysteve/ferrum-market","license":"MIT","main":"extension.js","activationEvents":["onCommand:regexTester.open"],"permissions":[],"contributes":{"commands":[{"command":"regexTester.open","title":"Open Regex Tester","category":"Regex Tester"}]}},"files":{"icon.png":{"encoding":"base64","content":"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"},"extension.js":{"encoding":"utf8","content":"// Regex Tester: try a regular expression on sample text and see every match and group. Everything runs in the panel.\n\nfunction page(pattern, flags, text) {\n  const esc = (s) => String(s).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;');\n  return `<style>\n  body { font-family: var(--ui); } label { display: block; color: var(--fg-dim); font-size: 12px; margin: 10px 0 4px; }\n  input, textarea { width: 100%; box-sizing: border-box; background: var(--raised, transparent); color: var(--fg); border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; font: 13px var(--mono, monospace); outline: none; } input:focus, textarea:focus { border-color: var(--accent); }\n  .row { display: flex; gap: 10px; } .row > div:first-child { flex: 1; } .row > div:last-child { width: 110px; }\n  textarea { height: 130px; resize: vertical; } #hl { white-space: pre-wrap; word-break: break-word; border: 1px solid var(--border); border-radius: 6px; padding: 8px 10px; font: 13px/1.5 var(--mono, monospace); min-height: 40px; }\n  mark { background: var(--accent); color: #fff; border-radius: 2px; } mark.b { opacity: .65; } #err { color: #e5534b; margin-top: 6px; min-height: 18px; }\n  table { width: 100%; border-collapse: collapse; font: 12px var(--mono, monospace); margin-top: 6px; } td, th { text-align: left; border-bottom: 1px solid var(--border); padding: 3px 8px; vertical-align: top; } th { color: var(--fg-dim); font-weight: 400; }\n  .dim { color: var(--fg-dim); font-size: 12px; } button { background: var(--raised, transparent); color: var(--fg); border: 1px solid var(--border); border-radius: 5px; padding: 4px 10px; cursor: pointer; }\n</style>\n<div class=\"row\"><div><label>Pattern</label><input id=\"p\" value=\"${esc(pattern)}\" spellcheck=\"false\"></div><div><label>Flags</label><input id=\"f\" value=\"${esc(flags)}\" spellcheck=\"false\"></div></div>\n<div id=\"err\"></div>\n<label>Test text</label><textarea id=\"t\" spellcheck=\"false\">${esc(text)}</textarea>\n<label>Matches <span id=\"n\" class=\"dim\"></span></label><div id=\"hl\"></div>\n<label>Groups</label><table id=\"tb\"></table>\n<div style=\"margin-top:12px\"><button id=\"use\">Insert /pattern/flags into the file</button></div>\n<script>\n  const $ = (id) => document.getElementById(id);\n  const esc = (s) => String(s).replace(/&/g, '&amp;').replace(/</g, '&lt;');\n  function run() {\n    const p = $('p').value, f = $('f').value, t = $('t').value;\n    $('err').textContent = ''; $('tb').innerHTML = ''; $('n').textContent = '';\n    if (!p) { $('hl').innerHTML = esc(t); return; }\n    let re;\n    try { re = new RegExp(p, f.includes('g') ? f : f + 'g'); } catch (e) { $('err').textContent = e.message; $('hl').innerHTML = esc(t); return; }\n    let out = '', last = 0, n = 0, i = 0, rows = '';\n    for (const m of t.matchAll(re)) {\n      if (n++ > 2000) break;\n      out += esc(t.slice(last, m.index)) + '<mark class=\"' + (i++ % 2 ? 'b' : '') + '\">' + esc(m[0]) + '</mark>';\n      last = m.index + m[0].length;\n      const groups = m.slice(1).map((g, gi) => (gi + 1) + ': ' + esc(g === undefined ? '(none)' : g)).concat(Object.entries(m.groups || {}).map(([k, v]) => k + ': ' + esc(v))).join('<br>');\n      rows += '<tr><td>' + n + '</td><td>' + m.index + '</td><td>' + esc(m[0]) + '</td><td>' + groups + '</td></tr>';\n      if (m[0] === '') re.lastIndex++;\n    }\n    $('hl').innerHTML = out + esc(t.slice(last));\n    $('n').textContent = '(' + Math.min(n, 2000) + ')';\n    if (rows) $('tb').innerHTML = '<tr><th>#</th><th>At</th><th>Match</th><th>Groups</th></tr>' + rows;\n  }\n  ['p', 'f', 't'].forEach((id) => $(id).addEventListener('input', run));\n  $('use').onclick = () => ferrumPanel.postMessage({ type: 'insert', text: '/' + $('p').value + '/' + $('f').value.replace(/g/g, '') + ($('f').value.includes('g') ? 'g' : '') });\n  run();\n</script>`;\n}\n\nexports._test = { page };\n\nexports.activate = function (context) {\n  context.subscriptions.push(\n    ferrum.commands.register('regexTester.open', async () => {\n      const doc = await ferrum.editor.active();\n      const text = (doc && doc.selectedText) || 'Hello 123, World 4567!\\nemail: ada@example.com';\n      const panel = await ferrum.window.showPanel({ title: 'Regex Tester', html: page('\\\\d+', 'g', text) });\n      panel.onMessage(async (m) => {\n        if (m.type !== 'insert') return;\n        const d = await ferrum.editor.active();\n        if (!d) return ferrum.window.showMessage('Open a file to insert into.', 'warn');\n        await ferrum.editor.insert(String(m.text).slice(0, 4000));\n      });\n    }),\n  );\n};\n\nexports.deactivate = function () {};\n"},"README.md":{"encoding":"utf8","content":"# Regex Tester\n\nOpen the panel (selected text becomes the test text). Type a pattern and flags and watch the matches light up as you type. A table lists every match with its position and its numbered and named groups. Errors in the pattern show under the field. **Insert /pattern/flags into the file** puts the regex in your code.\n\nIt uses JavaScript regular expressions, the same ones the editor's search uses.\n\nNo permissions needed. The panel never leaves your computer.\n"}}}