-
Notifications
You must be signed in to change notification settings - Fork 5
/
extension.js
144 lines (130 loc) · 4.9 KB
/
extension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Object.defineProperty(exports, '__esModule', {
value: true,
});
// eslint-disable-next-line
const vscode = require('vscode'); // подключаем библиотеку vscode
const customLinksObject = vscode.workspace.getConfiguration().vueDocs.links;
// шаблон для веб-отображения
const getWebviewContent = (uri) => {
const html = `
<!DOCTYPE html>
<html lang="en">
<head>
<style>
body, html
{
margin: 0; padding: 0; height: 100%; overflow: hidden; background-color: #fff;
}
</style>
</head>
<body>
<iframe width="100%" height="100%" src="${uri}" frameborder="0">
<p>can't display ${uri}</p>
</iframe>
</body>
</html>
`;
return html;
};
const getLang = () => {
const supportedLangs = ['ru', 'en', 'zh'];
const configLang = vscode.workspace.getConfiguration().vueDocs.lang;
/* eslint "no-nested-ternary": 0 */
const interfaceLang = vscode.env.language.includes('ru')
? 'ru'
: vscode.env.language.includes('en')
? 'en'
: vscode.env.language.includes('zh')
? 'zh'
: null;
// console.log(interfaceLang);
if (configLang !== '') {
return configLang;
}
// @ts-ignore
if (supportedLangs.includes(interfaceLang)) {
return interfaceLang;
}
return 'en';
};
const getURIof = (item = '', lang = 'en') => {
if (typeof customLinksObject[item] === 'string') {
// console.log(customLinksObject[item]);
return String(customLinksObject[item]);
}
const URIof = {
Vue: {
en: 'https://vuejs.org/v2/guide/',
ru: 'https://ru.vuejs.org/v2/guide/',
zh: 'https://cn.vuejs.org/v2/guide/',
},
Vuex: {
en: 'https://vuex.vuejs.org/en/',
ru: 'https://vuex.vuejs.org/ru/',
zh: 'https://vuex.vuejs.org/zh/',
},
'Vue Router': {
en: 'https://router.vuejs.org/en/',
ru: 'https://router.vuejs.org/ru/',
zh: 'https://router.vuejs.org/zh/',
},
'Vue SSR': {
en: 'https://ssr.vuejs.org/en/',
ru: 'https://ssr.vuejs.org/ru/',
zh: 'https://ssr.vuejs.org/zh/',
},
'Nuxt.js': {
en: 'https://nuxtjs.org/guide',
ru: 'https://ru.nuxtjs.org/guide',
zh: 'https://zh.nuxtjs.org/guide',
},
VuePress: {
en: 'https://vuepress.vuejs.org/guide/',
ru: 'https://vuepress-lrouuhpdsl.now.sh/ru/guide/', // FIXME: когда выйдет перевод на оф сайте
zh: 'https://vuepress.vuejs.org/zh/guide/',
},
};
// TODO: delete logs
// console.log('Выбран пункт: ', item);
// console.log('URIof: ', URIof);
// console.log('URIof[item][lang]: ', URIof[item][lang]);
// console.log("язык интерфейса vs code: ", vscode.env.language);
// console.log('lang: ', lang);
// console.log('язык в настройках: ', vscode.workspace.getConfiguration().vueDocs.lang);
return String(URIof[item][lang]);
};
// активация расширения
const activate = (context) => {
const openVueDocs = vscode.commands.registerCommand('extension.openVueDocs', () => {
const customMenuItems = Object.getOwnPropertyNames(customLinksObject);
const defaultMenuItems = ['Vue', 'Vuex', 'Vue Router', 'Vue SSR', 'Nuxt.js', 'VuePress']; // возможные опции
const menuItems = [].concat(defaultMenuItems, customMenuItems);
// console.log(menuItems);
// выбор опции из выпадающего списка
vscode.window.showQuickPick(menuItems).then((selectedMenuItem) => {
if (selectedMenuItem) {
// если опция выбрана - работаем, (возможна ситуация когда пользователь кликнул мимо и selectedMenuItem === undefined)
// подготавливаем веб-вью панель
const panel = vscode.window.createWebviewPanel(
'webDocs',
selectedMenuItem,
vscode.ViewColumn.One,
{
// разрешить загруженным сайтам использовать свои скрипты (потенциально опасно)
// https://code.visualstudio.com/docs/extensions/webview#_scripts-and-message-passing
enableScripts: true,
// лучше использовать сохранение состояния
// https://code.visualstudio.com/docs/extensions/webview#_persistence
retainContextWhenHidden: true,
}
);
const lang = getLang();
// получаем URI соответствующий выбранному пункту меню
const selectedURI = getURIof(selectedMenuItem, lang);
panel.webview.html = getWebviewContent(selectedURI); // показываем ранее определённый шаблон с полученым URI
}
});
});
context.subscriptions.push(openVueDocs);
};
exports.activate = activate;