Skip to content

Commit 510986d

Browse files
committed
fix doc issue
1 parent f0c18d2 commit 510986d

File tree

4 files changed

+177
-37
lines changed

4 files changed

+177
-37
lines changed

package-lock.json

Lines changed: 19 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,12 @@
5353
"when": "view == tcTerraform.resourcesExplorer.cvm",
5454
"group": "navigation"
5555
}
56+
],
57+
"editor/context": [
58+
{
59+
"command": "tcTerraform.doc.show",
60+
"group": "navigation"
61+
}
5662
]
5763
},
5864
"viewsContainers": {
@@ -164,12 +170,25 @@
164170
{
165171
"command": "tcTerraformer.import",
166172
"title": "Import",
167-
"category": "TencentCloud Terraformer"
173+
"category": "Hidden"
168174
},
169175
{
170176
"command": "tcTerraformer.plan",
171177
"title": "Plan",
172-
"category": "TencentCloud Terraformer"
178+
"category": "Hidden"
179+
},
180+
{
181+
"command": "tcTerraform.doc.show",
182+
"title": "Go to Terraform Definition",
183+
"category": "Hidden"
184+
}
185+
],
186+
"keybindings": [
187+
{
188+
"command": "tcTerraform.doc.show",
189+
"key": "ctrl+alt+d",
190+
"mac": "cmd+alt+d",
191+
"when": "editorTextFocus"
173192
}
174193
],
175194
"configuration": {
@@ -241,6 +260,7 @@
241260
"@types/fs-extra": "^11.0.1",
242261
"@types/glob": "^8.0.1",
243262
"@types/lodash": "^4.14.191",
263+
"@types/marked": "^6.0.0",
244264
"@types/mocha": "^10.0.1",
245265
"@types/node": "16.x",
246266
"@types/opn": "^3.0.28",
@@ -270,7 +290,7 @@
270290
"jsdom": "^22.1.0",
271291
"lodash": "^4.17.21",
272292
"lodash-es": "^4.17.21",
273-
"marked": "^0.3.6",
293+
"marked": "^11.0.1",
274294
"opn": "^6.0.0",
275295
"reflect-metadata": "^0.1.13",
276296
"shared": "^0.2.0",
Lines changed: 110 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,113 @@
1-
import {
2-
DefinitionProvider,
3-
TextDocument,
4-
Position,
5-
CancellationToken,
6-
Definition
7-
} from "vscode";
1+
import * as vscode from "vscode";
82
import * as _ from "lodash";
9-
// import * as opn from "opn";
10-
import opn from "opn";
11-
import resources from '../../config/tips/tiat-resources.json';
12-
13-
const urlPrefix = "https://www.terraform.io";
14-
15-
export class TerraformResDocProvider implements DefinitionProvider {
16-
public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Definition {
17-
const words = document.getWordRangeAtPosition(position);
18-
const resName = document.getText(words);
19-
20-
const found = _.get(resources, resName);
21-
const urlSuffix = found.url?.toString() || "";
22-
var target = <string>(urlPrefix + urlSuffix);
23-
if (urlSuffix && target) {
24-
opn(target);
3+
import * as fs from "fs";
4+
import * as path from "path";
5+
import { marked } from 'marked';
6+
import { dispose } from "vscode-extension-telemetry-wrapper";
7+
8+
export class TerraformResDocProvider {
9+
// public provideDefinition(document: TextDocument, position: Position, token: CancellationToken): Definition {
10+
// const words = document.getWordRangeAtPosition(position);
11+
// const resName = document.getText(words);
12+
13+
// const found = _.get(resources, resName);
14+
// const urlSuffix = found.url?.toString() || "";
15+
// var target = <string>(urlPrefix + urlSuffix);
16+
// if (urlSuffix && target) {
17+
// opn(target);
18+
// }
19+
// return null;
20+
// }
21+
22+
public static currentProvider: TerraformResDocProvider | undefined;
23+
private readonly _panel: vscode.WebviewPanel;
24+
private readonly _extensionUri: vscode.Uri;
25+
private _disposables: vscode.Disposable[] = [];
26+
public static readonly viewType = 'tcTerraform.doc.show.id';
27+
28+
public static async createOrShow(context: vscode.ExtensionContext, resType: string) {
29+
const column = vscode.window.activeTextEditor
30+
? vscode.window.activeTextEditor.viewColumn
31+
: undefined;
32+
33+
34+
const targetColumn = column + 1;
35+
const rightEditor = vscode.window.visibleTextEditors.find((editor) => editor.viewColumn === targetColumn);
36+
37+
let newEditor = rightEditor;
38+
39+
if (!newEditor) {
40+
// new editor to the right of the current editor
41+
const tempFile = await vscode.workspace.openTextDocument({ content: '', language: 'plaintext' });
42+
newEditor = await vscode.window.showTextDocument(tempFile, { viewColumn: targetColumn, preview: false });
43+
}
44+
45+
// If we already have a panel, show it.
46+
if (TerraformResDocProvider.currentProvider) {
47+
// TerraformResDocProvider.currentProvider._panel.reveal(targetColumn);
48+
TerraformResDocProvider.currentProvider.dispose();
49+
return;
50+
}
51+
52+
// Otherwise, create a new panel.
53+
const panel = vscode.window.createWebviewPanel(
54+
TerraformResDocProvider.viewType,
55+
`Doc Definition: ${resType}`,
56+
newEditor.viewColumn,
57+
getWebviewOptions(context.extensionUri),
58+
);
59+
// construct the _panel
60+
TerraformResDocProvider.currentProvider = new TerraformResDocProvider(panel, context.extensionUri);
61+
const current = TerraformResDocProvider.currentProvider;
62+
const docsRoot = path.join(context.extensionPath, 'config', 'docs', 'r');
63+
const mdResType = resType.replace('tencentcloud_', '');
64+
const markdownPath = path.join(docsRoot, `${mdResType}.html.markdown`);
65+
if (!fs.existsSync(markdownPath)) {
66+
console.error('Can not find the markdownFile: %s', markdownPath);
67+
return;
2568
}
26-
return null;
69+
const markdownFile = fs.readFileSync(markdownPath, 'utf8');
70+
71+
let markdown;
72+
try {
73+
const cleanedMarkdownFile = markdownFile.replace(/---[\s\S]*?---/, '');
74+
markdown = marked(cleanedMarkdownFile);
75+
current._panel.webview.html = markdown;
76+
} catch (error) {
77+
console.error('Error processing the Markdown file:', error);
78+
return;
79+
}
80+
// Listen for when the panel is disposed
81+
current._panel.onDidDispose(() => current.dispose(), null, current._disposables);
82+
}
83+
84+
dispose() {
85+
TerraformResDocProvider.currentProvider = undefined;
86+
87+
// Clean up our resources
88+
this._panel.dispose();
89+
90+
while (this._disposables.length) {
91+
const x = this._disposables.pop();
92+
if (x) {
93+
x.dispose();
94+
}
95+
}
96+
}
97+
98+
public constructor(panel?: vscode.WebviewPanel, extensionUri?: vscode.Uri) {
99+
this._panel = panel;
100+
this._extensionUri = extensionUri;
27101
}
28-
}
102+
}
103+
104+
function getWebviewOptions(extensionUri: vscode.Uri): vscode.WebviewOptions {
105+
return {
106+
// Enable javascript in the webview
107+
enableScripts: true,
108+
109+
// And restrict the webview to only loading content from our extension's `media` directory.
110+
localResourceRoots: [vscode.Uri.joinPath(extensionUri, 'media')]
111+
};
112+
}
113+

src/extension.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,38 @@ export async function activate(context: vscode.ExtensionContext) {
6565
context.subscriptions.push(disposableTferPlan);
6666

6767
// auto-complete
68-
console.log('activate the tips(resource and options) feature');
69-
const tipsProvider = new TerraformTipsProvider();
68+
console.log('activate the auto-complete(resource and argument) feature');
7069
const exampleProvider = new autocomplete.TerraformExampleProvider();
70+
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, exampleProvider, autocomplete.EXAMPLE_TRIGGER_CHARACTER));
71+
72+
// tips
73+
console.log('activate the tips(options and doc) feature');
74+
const tipsProvider = new TerraformTipsProvider();
7175
context.subscriptions.push(
7276
vscode.workspace.onDidChangeTextDocument((event) => {
7377
tipsProvider.handleCharacterEvent(event);
7478
})
7579
);
7680
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, tipsProvider, ...TIPS_TRIGGER_CHARACTER));
77-
context.subscriptions.push(vscode.languages.registerDefinitionProvider(TF_MODE, new TerraformResDocProvider()));
78-
context.subscriptions.push(vscode.languages.registerCompletionItemProvider(TF_MODE, exampleProvider, autocomplete.EXAMPLE_TRIGGER_CHARACTER));
81+
82+
context.subscriptions.push(vscode.commands.registerCommand('tcTerraform.doc.show', () => {
83+
const editor = vscode.window.activeTextEditor;
84+
if (!editor) {
85+
return; // no editor opening
86+
}
87+
88+
// get the words under current selection
89+
const doc = editor.document;
90+
const selection = editor.selection;
91+
const words = doc.getWordRangeAtPosition(selection.start);
92+
const resType = doc.getText(words);
93+
94+
const regex = /^tencentcloud(?:_[^\s]+)*$/;
95+
if (!regex.test(resType)) {
96+
return; // not match the regex
97+
}
98+
TerraformResDocProvider.createOrShow(context, resType);
99+
}));
79100

80101
// example
81102
console.log('activate the auto complete(example) feature');

0 commit comments

Comments
 (0)