function activate(context) {
let disposable = vscode.workspace.onDidChangeTextDocument(event => {
// 只处理HTML文件
if (!event.document.fileName.endsWith('.html')) return;
for (let change of event.contentChanges) {
let range = change.range;
let startLine = Math.max(range.start.line - 2, 0);
let endLine = Math.min(range.end.line + 2, event.document.lineCount);
// 获取变更前后几行内容
let text = '';
for (let i = startLine; i <= endLine; i++) {
text += event.document.lineAt(i).text + 'n';
}
checkForTrackElement(text);
}
});
context.subscriptions.push(disposable);
}
function checkForTrackElement(text) {
let regex = /<([a-z]+)s+[^>]*data-track=[^>]*>/gi;
let match;
while (match = regex.exec(text)) {
console.log('Found new tracked element:', match[0]);
// 在这里可以执行你想要的操作
}
}
首先我们需要明确我们的目标:只关心新增带有 data-track 属性的元素。这里有个思路是每次变更时,先找到变更区域附近的代码片段,然后进行简单的解析。
下面是一个可行的方案:
这个方法有几个关键点:
- 我们只获取变更点前后几行的内容(这里取了上下两行),这样可以缩小搜索范围
- 使用正则表达式来匹配带有 data-track 属性的元素,这个正则比较简单直接
- 这样做的好处是我们不需要完整解析整个文档,效率比较高
这里需要注意的是正则表达式的准确性。如果属性值中包含特殊字符可能会有问题,这时就需要更复杂的解析了,但至少对大多数简单场景是适用的。
这个方案比起解析整个文档要高效得多,也更容易实现。当然如果需要更高的准确性和复杂场景支持,那可能还是得考虑使用DOM解析器之类的工具,但这会增加不少开发成本。