do LibPick

This commit is contained in:
锦恢 2023-04-12 22:09:03 +08:00
parent a246fbdebe
commit 52349329df
13 changed files with 345 additions and 71 deletions

View File

View File

@ -273,6 +273,23 @@
}
],
"menus": {
"view/title": [
{
"command": "digital-ide.treeView.arch.collapse",
"group": "navigation",
"when": "view == digital-ide-treeView-arch"
},
{
"command": "TOOL.libPick",
"group": "navigation",
"when": "view == digital-ide-treeView-arch"
},
{
"command": "digital-ide.treeView.arch.refresh",
"group": "navigation",
"when": "view == digital-ide-treeView-arch"
}
],
"editor/title": [
{
"when": "editorLangId == verilog || editorLangId == systemverilog || editorLangId == vhdl",
@ -286,6 +303,26 @@
}
]
},
"views": {
"TOOL": [
{
"id": "digital-ide-treeView-arch",
"name": "architecture"
},
{
"id": "digital-ide-treeView-tool",
"name": "TOOL"
},
{
"id": "digital-ide-treeView-hardware",
"name": "HARD Options"
},
{
"id": "digital-ide-treeView-software",
"name": "SOFT Options"
}
]
},
"keybindings": [
{
"command": "digital-ide.tool.instance",

View File

@ -7,24 +7,24 @@
"digital-ide.tool.instance.title": "生成选中 module 的例化模板",
"digital-ide.tool.testbench.title": "从当前文件中选择 module 生成 testbench",
"digital-ide.tool.icarus.simulateFile.title": "对当前文件进行仿真",
"digital-ide.treeView.arch.expand.title": "",
"digital-ide.treeView.arch.collapse.title": "",
"digital-ide.treeView.arch.refresh.title": "",
"digital-ide.treeView.arch.openFile.title": "",
"digital-ide.tool.tool.clean.title": "",
"digital-ide.soft.launch.title": "",
"digital-ide.soft.build.title": "",
"digital-ide.soft.download.title": "",
"digital-ide.hard.launch.title": "",
"digital-ide.hard.simulate.title": "",
"digital-ide.hard.simulate.cli.title": "",
"digital-ide.hard.simulate.gui.title": "",
"digital-ide.hard.refresh.title": "",
"digital-ide.hard.build.title": "",
"digital-ide.hard.build.synth.title": "",
"digital-ide.hard.build.impl.title": "",
"digital-ide.hard.build.bitstream.title": "",
"digital-ide.hard.program.title": "",
"digital-ide.hard.gui.title": "",
"digital-ide.hard.exit.title": ""
"digital-ide.treeView.arch.expand.title": "扩大树视图中的所有项目",
"digital-ide.treeView.arch.collapse.title": "崩溃树视图中的所有项目",
"digital-ide.treeView.arch.refresh.title": "刷新树视图",
"digital-ide.treeView.arch.openFile.title": "在树视图打开相应的文件",
"digital-ide.tool.tool.clean.title": "干净的当前项目",
"digital-ide.soft.launch.title": "启动SDK开发辅助功能",
"digital-ide.soft.build.title": "建立项目当前的SDK",
"digital-ide.soft.download.title": "下载文件到设备引导",
"digital-ide.hard.launch.title": "启动FPGA开发辅助功能",
"digital-ide.hard.simulate.title": "启动生产仿真",
"digital-ide.hard.simulate.cli.title": "在CLI推出制造商模拟",
"digital-ide.hard.simulate.gui.title": "在GUI推出制造商模拟",
"digital-ide.hard.refresh.title": "刷新当前的项目文件",
"digital-ide.hard.build.title": "fpga构建当前项目",
"digital-ide.hard.build.synth.title": "Synth当前项目",
"digital-ide.hard.build.impl.title": "Impl当前项目",
"digital-ide.hard.build.bitstream.title": "生成一些文件",
"digital-ide.hard.program.title": "下载文件到设备",
"digital-ide.hard.gui.title": "打开界面",
"digital-ide.hard.exit.title": "退出当前项目"
}

View File

@ -1,30 +1,30 @@
{
"digital-ide.property-json.generate.title": "",
"digital-ide.property-json.overwrite.title": "",
"digital-ide.hdlDoc.exportFile.title": "",
"digital-ide.hdlDoc.exportProject.title": "",
"digital-ide.hdlDoc.showWebview.title": "",
"digital-ide.tool.instance.title": "",
"digital-ide.tool.testbench.title": "",
"digital-ide.tool.icarus.simulateFile.title": "",
"digital-ide.treeView.arch.expand.title": "",
"digital-ide.treeView.arch.collapse.title": "",
"digital-ide.treeView.arch.refresh.title": "",
"digital-ide.treeView.arch.openFile.title": "",
"digital-ide.tool.tool.clean.title": "",
"digital-ide.soft.launch.title": "",
"digital-ide.soft.build.title": "",
"digital-ide.soft.download.title": "",
"digital-ide.hard.launch.title": "",
"digital-ide.hard.simulate.title": "",
"digital-ide.hard.simulate.cli.title": "",
"digital-ide.hard.simulate.gui.title": "",
"digital-ide.hard.refresh.title": "",
"digital-ide.hard.build.title": "",
"digital-ide.hard.build.synth.title": "",
"digital-ide.hard.build.impl.title": "",
"digital-ide.hard.build.bitstream.title": "",
"digital-ide.hard.program.title": "",
"digital-ide.hard.gui.title": "",
"digital-ide.hard.exit.title": ""
"digital-ide.property-json.generate.title": "生成 property.json 配置文件",
"digital-ide.property-json.overwrite.title": "修改默認的 property.json 模板文件",
"digital-ide.hdlDoc.exportFile.title": "導出當前文件的文檔",
"digital-ide.hdlDoc.exportProject.title": "導出當前項目的文檔",
"digital-ide.hdlDoc.showWebview.title": "在 webview 中展示文檔",
"digital-ide.tool.instance.title": "生成選中 module 的例化模板",
"digital-ide.tool.testbench.title": "從當前文件中選擇 module 生成 testbench",
"digital-ide.tool.icarus.simulateFile.title": "對當前文件進行仿真",
"digital-ide.treeView.arch.expand.title": "擴大樹視圖中的所有項目",
"digital-ide.treeView.arch.collapse.title": "崩潰樹視圖中的所有項目",
"digital-ide.treeView.arch.refresh.title": "刷新樹視圖",
"digital-ide.treeView.arch.openFile.title": "在樹視圖打開相應的文件",
"digital-ide.tool.tool.clean.title": "乾淨的當前項目",
"digital-ide.soft.launch.title": "啟動SDK開發輔助功能",
"digital-ide.soft.build.title": "建立項目當前的SDK",
"digital-ide.soft.download.title": "下載文件到設備引導",
"digital-ide.hard.launch.title": "啟動FPGA開發輔助功能",
"digital-ide.hard.simulate.title": "啟動生產仿真",
"digital-ide.hard.simulate.cli.title": "在CLI推出製造商模擬",
"digital-ide.hard.simulate.gui.title": "在GUI推出製造商模擬",
"digital-ide.hard.refresh.title": "刷新當前的項目文件",
"digital-ide.hard.build.title": "fpga構建當前項目",
"digital-ide.hard.build.synth.title": "Synth當前項目",
"digital-ide.hard.build.impl.title": "Impl當前項目",
"digital-ide.hard.build.bitstream.title": "生成一些文件",
"digital-ide.hard.program.title": "下載文件到設備",
"digital-ide.hard.gui.title": "打開界面",
"digital-ide.hard.exit.title": "退出當前項目"
}

View File

@ -10,7 +10,7 @@ PACKAGE_FILE = './package.json'
LANG_PACKGE_FILES = {
'en': './package.nls.json',
'zh-cn': './package.nls.zh-cn.json',
'zh-tw': './package.nls.zh-tw.json'
'zh-tw': './package.nls.zh-tw.json',
}
def generate_title_token(command_name: str) -> str:

View File

@ -1,6 +1,69 @@
import sys
import os
sys.path.append(os.path.abspath('.'))
from typing import Dict
import requests as r
from zhconv import convert
from script.util import read_json, write_json
PACKAGE_FILE = './package.json'
LANG_PACKGE_FILES = {
'en': './package.nls.json',
'zh-cn': './package.nls.zh-cn.json',
'zh-tw': './package.nls.zh-tw.json',
}
def youdao_translate(query: str, from_lang: str='AUTO', to_lang: str='AUTO') -> str:
url = 'http://fanyi.youdao.com/translate'
data = {
"i": query, # 待翻译的字符串
"from": from_lang,
"to": to_lang,
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "16081210430989",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_CLICKBUTTION"
}
res = r.post(url, data=data).json()
return res['translateResult'][0][0]['tgt']
def to_complex_zh(words: str) -> str:
return convert(words, 'zh-tw')
def translate_from_en(en_config: Dict[str, str], target_config: Dict[str, str], target_lang_id: str):
for command in target_config.keys():
desc = target_config[command]
if len(desc) == 0:
en_desc = en_config.get(command, '')
assert len(en_desc) > 0, f'command:{command} in en_config is empty'
target_desc = youdao_translate(en_desc, from_lang='en', to_lang=target_lang_id)
target_config[command] = target_desc
def translate_complex_zh(zh_config: Dict[str, str], zh_tw_config: Dict[str, str]):
for command in zh_tw_config.keys():
zh_desc = zh_config.get(command, '')
assert len(zh_desc) > 0, f'{command} in zh_config is empty'
complex_zh_desc = to_complex_zh(zh_desc)
zh_tw_config[command] = complex_zh_desc
def main():
en_config = read_json(LANG_PACKGE_FILES["en"])
zh_cn_config = read_json(LANG_PACKGE_FILES["zh-cn"])
zh_tw_config = read_json(LANG_PACKGE_FILES["zh-tw"])
translate_from_en(en_config, zh_cn_config, 'zh')
translate_complex_zh(zh_cn_config, zh_tw_config)
write_json(LANG_PACKGE_FILES["zh-cn"], zh_cn_config)
write_json(LANG_PACKGE_FILES["zh-tw"], zh_tw_config)
main()

View File

@ -2,12 +2,12 @@ import * as vscode from 'vscode';
import { opeParam, MainOutput, ReportType } from './global';
import { hdlParam } from './hdlParser';
import { prjManage } from './manager';
import { registerAllCommands } from './function';
import { prjManage, registerManagerCommands } from './manager';
import { registerFunctionCommands } from './function';
async function registerCommand(context: vscode.ExtensionContext) {
registerAllCommands(context);
registerFunctionCommands(context);
registerManagerCommands(context);
}
async function launch(context: vscode.ExtensionContext) {

View File

@ -17,7 +17,7 @@ function registerSimulation(context: vscode.ExtensionContext) {
vscode.commands.registerCommand('digital-ide.tool.icarus.simulateFile', sim.Icarus.simulateFile);
}
function registerAllCommands(context: vscode.ExtensionContext) {
function registerFunctionCommands(context: vscode.ExtensionContext) {
registerDocumentation(context);
registerSimulation(context);
registerTreeView(context);
@ -25,10 +25,10 @@ function registerAllCommands(context: vscode.ExtensionContext) {
function registerTreeView(context: vscode.ExtensionContext) {
// register normal tree
vscode.window.registerTreeDataProvider('digital-ide.treeView.arch', treeView.moduleTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide.treeView.tool', treeView.toolTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide.treeView.hardware', treeView.hardwareTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide.treeView.software', treeView.softwareTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide-treeView-arch', treeView.moduleTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide-treeView-tool', treeView.toolTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide-treeView-hardware', treeView.hardwareTreeProvider);
vscode.window.registerTreeDataProvider('digital-ide-treeView-software', treeView.softwareTreeProvider);
// constant used in tree
vscode.commands.executeCommand('setContext', 'TOOL-tree-expand', false);
@ -43,5 +43,5 @@ function registerTreeView(context: vscode.ExtensionContext) {
export {
registerAllCommands
registerFunctionCommands
};

View File

@ -21,7 +21,7 @@ function expandTreeView() {
}
function collapseTreeView() {
vscode.commands.executeCommand('workbench.actions.treeView.TOOL-tree-arch.collapseAll');
vscode.commands.executeCommand('workbench.actions.treeView.digital-ide-treeView-arch.collapseAll');
vscode.commands.executeCommand('setContext', 'TOOL-tree-expand', true);
}

View File

@ -1,5 +1,14 @@
import * as vscode from 'vscode';
import { prjManage } from './prj';
function registerManagerCommands(context: vscode.ExtensionContext) {
vscode.commands.registerCommand('digital-ide.property-json.generate', prjManage.generatePropertyJson);
vscode.commands.registerCommand('digital-ide.property-json.overwrite', prjManage.overwritePropertyJson);
}
export {
prjManage
prjManage,
registerManagerCommands
};

172
src/manager/libPick.ts Normal file
View File

@ -0,0 +1,172 @@
import * as vscode from 'vscode';
import * as fspath from 'path';
import * as fs from 'fs';
import { AbsPath, opeParam } from '../global';
import { HdlLangID } from '../global/enum';
import { hdlDir, hdlFile, hdlPath } from '../hdlFs';
import { getIconConfig } from '../hdlFs/icons';
type MissPathType = { path?: string };
type LibPickItem = vscode.QuickPickItem & MissPathType;
class LibPick {
commonPath: AbsPath;
customPath: AbsPath;
commonQuickPickItem: LibPickItem;
customQuickPickItem: LibPickItem;
rootItems: LibPickItem[];
backQuickPickItem: LibPickItem;
curPath: AbsPath;
selectedQuickPickItem: LibPickItem | undefined;
constructor () {
this.commonPath = hdlPath.join(opeParam.extensionPath, 'lib', 'common');
this.customPath = hdlPath.toSlash(vscode.workspace.getConfiguration('PRJ.custom.Lib.repo').get('path', ''));
this.commonQuickPickItem = {
label: "$(libpick-common) common",
description: 'common library provided by us',
detail: 'current path: ' + this.commonPath,
path: this.commonPath,
buttons: [{iconPath: getIconConfig('import'), tooltip: 'import everything in common'}]
};
this.customQuickPickItem = {
label: "$(libpick-custom) custom",
description: 'custom library by yourself',
detail: 'current path: ' + this.customPath,
path: this.customPath,
buttons: [{iconPath: getIconConfig('import'), tooltip: 'import everything in custom'}]
};
this.rootItems = [
this.commonQuickPickItem,
this.customQuickPickItem
];
this.backQuickPickItem = {
label: '...',
description: 'return'
};
this.curPath = '';
}
getPathIcon(path: AbsPath): string {
let prompt;
if (hdlFile.isFile(path)) {
const langID = hdlFile.getLanguageId(path);
if (langID === HdlLangID.Vhdl) {
prompt = 'vhdl';
} else if (langID === HdlLangID.Verilog ||
langID === HdlLangID.SystemVerilog) {
prompt = 'verilog';
} else {
prompt = 'unknown';
}
} else {
prompt = 'folder';
}
return `$(libpick-${prompt})`;
}
private makeQuickPickItemsByPath(path: AbsPath, back: boolean=true): LibPickItem[] {
const items: LibPickItem[] = [];
if (!hdlPath.exist(path)) {
return items;
}
if (back) {
items.push(this.backQuickPickItem);
}
for (const fileName of fs.readdirSync(path)) {
const filePath = hdlPath.join(path, fileName);
const themeIcon = this.getPathIcon(filePath);
const label = themeIcon + " " + fileName;
const mdPath = hdlPath.join(path, fileName, 'readme.md');
const mdText = hdlFile.readFile(mdPath);
const description = mdText ? mdText : '';
const buttons = [{iconPath: getIconConfig('import'), tooltip: 'import everything in ' + fileName}];
items.push({label, description, path: filePath, buttons});
}
return items;
}
private provideQuickPickItem(item?: LibPickItem) {
if (!item) {
return this.rootItems;
} else if (item === this.backQuickPickItem) {
if ((this.curPath === this.commonPath) ||
(this.curPath === this.customPath)) {
return this.rootItems;
} else {
// rollback the current path
this.curPath = fspath.dirname(this.curPath);
}
} else if (item === this.commonQuickPickItem) {
this.curPath = this.commonPath;
} else if (item === this.customQuickPickItem) {
this.curPath = this.customPath;
} else {
const label = item.label;
const fileName = label.replace(/\$\([\s\S]*\)/, '').trim();
this.curPath = hdlPath.join(this.curPath, fileName);
}
return this.makeQuickPickItemsByPath(this.curPath);
}
async pickItems() {
const pickWidget = vscode.window.createQuickPick<LibPickItem>();
pickWidget.placeholder = 'pick the library';
pickWidget.items = this.provideQuickPickItem();
pickWidget.onDidChangeSelection(items => {
console.log('enter onDidChangeSelection');
if (items[0]) {
this.selectedQuickPickItem = items[0];
}
});
pickWidget.onDidAccept(() => {
console.log('enter onDidAccept');
if (this.selectedQuickPickItem) {
const childernItems = this.provideQuickPickItem(this.selectedQuickPickItem);
if (childernItems && childernItems.length > 0) {
pickWidget.items = childernItems;
}
}
});
pickWidget.onDidTriggerItemButton(event => {
const selectedPath = event.item.path;
if (selectedPath && hdlPath.exist(selectedPath)) {
const ppyPath = hdlPath.join(opeParam.workspacePath, '.vscode', 'property.json');
let prjInfo = null;
// 如果存在,则读取用户的配置文件,否则使用默认的
if (!hdlPath.exist(ppyPath)) {
prjInfo = hdlFile.readJSON(opeParam.propertyInitPath);
} else {
prjInfo = hdlFile.readJSON(ppyPath);
}
if (selectedPath.includes(this.commonQuickPickItem.path!)) {
// this is a module import from common, use relative path
const relPath = selectedPath.replace(this.commonQuickPickItem.path + '/', '');
appendLibraryCommonPath(relPath, prjInfo);
} else {
// this is a module import from custom, use absolute path
const relPath = selectedPath.replace(this.customQuickPickItem.path + '/', '');
appendLibraryCustomPath(relPath, prjInfo);
}
hdlFile.writeJSON(ppyPath, prjInfo);
}
});
pickWidget.show();
}
}

View File

@ -8,15 +8,8 @@ import { RawPrjInfo } from '../global/prjInfo';
import { hdlFile, hdlPath } from '../hdlFs';
class PrjManage {
constructor() {
vscode.commands.registerCommand('digital-ide.property-json.generate',
this.generatePropertyJson);
vscode.commands.registerCommand('digital-ide.property-json.overwrite',
this.overwritePropertyJson);
}
// generate property template and write it to .vscode/property.json
private async generatePropertyJson() {
public async generatePropertyJson() {
if (fs.existsSync(opeParam.propertyJsonPath)) {
vscode.window.showWarningMessage('property file already exists !!!');
return;
@ -26,7 +19,7 @@ class PrjManage {
}
// overwrite content in current property.json to property-init.json
private async overwritePropertyJson() {
public async overwritePropertyJson() {
const options = {
preview: false,
viewColumn: vscode.ViewColumn.Active