feat(vscode): close HTML tags as they are typed in .wrn files

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-18 21:16:47 +05:30
co-authored by Claude Opus 5
parent d9e8f5be82
commit e83f0366ef
6 changed files with 179 additions and 33 deletions
+33 -1
View File
@@ -23,6 +23,37 @@ async function recoverWrnLanguage(document) {
}
}
/**
* Auto-close tags as they are typed.
*
* LSP has no request for this, so the client watches document changes and asks
* the server whether the tag should close. The server owns the decision because
* void elements and already-closed tags must not be closed.
*/
function registerAutoCloseTags(context, client) {
const listener = vscode.workspace.onDidChangeTextDocument(async (event) => {
if (event.document.languageId !== "wrn") return;
if (!vscode.workspace.getConfiguration("wrnexus.html").get("autoClosingTags", true)) return;
const change = event.contentChanges[0];
if (!change || (change.text !== ">" && change.text !== "/")) return;
const editor = vscode.window.activeTextEditor;
if (!editor || editor.document !== event.document) return;
const position = change.range.start.translate(0, change.text.length);
const snippet = await client.sendRequest("wrn/tagComplete", {
textDocument: { uri: event.document.uri.toString() },
position: { line: position.line, character: position.character },
});
if (typeof snippet !== "string" || !snippet) return;
await editor.insertSnippet(new vscode.SnippetString(snippet), position);
});
context.subscriptions.push(listener);
}
/** @param {vscode.ExtensionContext} context */
async function activate(context) {
for (const document of vscode.workspace.textDocuments) void recoverWrnLanguage(document);
@@ -43,6 +74,7 @@ async function activate(context) {
{ documentSelector: [{ scheme: "file", language: WRN_LANGUAGE_ID }] },
);
await client.start();
registerAutoCloseTags(context, client);
}
async function deactivate() {
@@ -51,4 +83,4 @@ async function deactivate() {
if (running) await running.stop();
}
module.exports = { activate, deactivate, recoverWrnLanguage };
module.exports = { activate, deactivate, recoverWrnLanguage, registerAutoCloseTags };