vscode.previewHtml
получил одобрение в пользу Webview.Я обновил расширение ahk для vscode , используя этот новый API.С hh.exe -decompile Docs AutoHotkey.chm
я получил версию основного сайта AutoHotkey для локального сайта.Я хотел показать во втором столбце контекстную документацию, чтобы вы могли прочитать об этом во время кодирования.Так я и сделал.Мне удалось загрузить страницу с таблицей стилей, но ссылки не работают: я всегда остаюсь на одной и той же странице.
Даже если я могу изменить свои настройки, я не могу перейти на другую страницу,Хотя вы можете прочитать во всплывающей подсказке значение href, каждый раз, когда вы нажимаете на ссылку, ничего не происходит.Папка Docs хранится внутри пути расширения, поэтому localResourceRoots
должно быть в порядке.
Странная вещь, которую я заметил, заключается в том, что даже если для enableScripts
установлено значение true, кажется, что не все jsкод выполняется, потому что на веб-сайте AutoHotkey, в .chm и в каждом .html-файлах, открытых с помощью FF, я вижу боковую панель, но не на странице WebView.
Это код для создания WebView.:
this.docsPanel = vscode.window.createWebviewPanel('ahk-offline-docs', 'Documentation', { viewColumn: vscode.ViewColumn.Two, preserveFocus: true }, {
enableScripts: true,
enableFindWidget: true,
enableCommandUris: true,
localResourceRoots: [vscode.Uri.file(path.join(this.docsDirectoryPath, 'docs//')).with({ scheme: 'vscode-resource' })]
});
this.docsPanel.onDidDispose((e) => {
this.isDocsPanelDisposed = true;
});
И этот код загружает страницу в WebView:
let url = vscode.Uri.file(path.join(this.docsDirectoryPath, 'docs/')).with({ scheme: 'vscode-resource' });
const dom = new JSDOM(data, { runScripts: "dangerously" });
const aTags = dom.window.document.getElementsByTagName('a');
const len = aTags.length;
const basePath = url.toString();
for (let i = 0; i < len; i++) {
const a = aTags[i];
if (!a.href.includes('about:blank')) {
const commentCommandUri = vscode.Uri.parse(`command:ahk.spy`);
a.href = basePath + a.href;
// a.removeAttribute('href');
// a.setAttribute('onclick', '{command:ahk.spy}');
}
}
let ser = dom.serialize();
this.docsPanel.webview.html = /*data/*ser*/ser.toString().replace('<head>', `<head>\n<base href="${url.toString()}/">`);
Альтернативной идеей было запустить vscode.commands со страницы (из-за enableCommandUris
) но я не понял, как выполнить эту операцию.
Если вам нужно / хотите воспроизвести эту проблему, вам просто нужно клонировать репозиторий, перейдя в ветку improving-offline-docs
и откройте файл offline-docs-manager.ts
, метод openTheDocsPanel()
Можно ли переключить текущую страницу, используя ссылки?Должен ли я разработать систему postMessage?или я где-то пропустил настройки?или есть еще лучший способ сделать это?
Заранее спасибо!