首页 > 其他分享 >vscode插件开发,使用CustomEditor进行OFD文件预览

vscode插件开发,使用CustomEditor进行OFD文件预览

时间:2023-12-08 09:33:24浏览次数:31  
标签:插件 const CustomEditor ofd vscode js webview OFD

使用js开发,对ofd预览使用的三方库是 ofd.js ,通过将 ofd.js 继承到插件里面对点击ofd文件进行预览的效果

要实现的效果大致如下:

  • 识别*.ofd结尾的文件
  • 打开OfdViewer窗口,实现预览ofd文件
    那么开始了,这里就不详细讲解如何创建vscode插件开发,直接看几个重要的代码,也就是实现的逻辑。
    首先注册自定义预览窗口,这里定义了一个 OFD Viewer 的 CustomEditor ,实现一个webview来进行预览操作,他只对 ofd 结尾的文件有效
"contributes": {
		"customEditors": [
			{
				"viewType": "com.xxss0903.ofdviewer",
				"displayName": "OFD Viewer",
				"selector": [
					{
						"filenamePattern": "*.ofd"
					}
				]
			}
		],
	},

有了上面的注册我们再src文件夹下面创建一个ofdEditor.ts文件,这个是OFD Viewer的插件入口,用于插件的一般操作以及与webview进行互动。

有了ofdEditor之后我们需要在extensions里对预览插件进行注册

完成上面几步就创建了一个基本的插件了,接下来就是对插件进行功能开发了。
首先是获取一个webview对应的html内容,webview将加载下面部分的html文件,可以看到引用了media文件夹下面的ofdViewer.js和ofdviewer.css
两个前端需要的js和css文件。并且我们也把ofd的打包文件ofd.umd.js放到了media文件夹下面用于加载ofd.js插件。

  private getHtmlForWebview(webview: vscode.Webview): string {
    // Local path to script and css for the webview
    const scriptUri = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "ofdViewer.js")
    );  
    const scriptOfdUri = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "ofd.umd.js")
    );
    const scriptUri3 = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "ofdViewerVue.js")
    ); 
    const styleResetUri = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "reset.css")
    );

    const styleVSCodeUri = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "vscode.css")
    );

    const styleMainUri = webview.asWebviewUri(
      vscode.Uri.joinPath(this._context.extensionUri, "media", "ofdViewer.css")
    );

    // Use a nonce to whitelist which scripts can be run
    const nonce = getNonce();
    const nonce2 = getNonce();
    console.log("get nonce", nonce, nonce2);

    return /* html */ `
				<!DOCTYPE html>
				<html lang="en">
				<head>
					<meta charset="UTF-8">
	
					<!--
					Use a content security policy to only allow loading images from https or from our extension directory,
					and only allow scripts that have a specific nonce.
					-->
					<meta http-equiv="Content-Security-Policy" content="default-src * 'self' 'unsafe-inline' 'unsafe-eval' data: gap: content: https://xxx.com;media-src * blob: 'self' http://* 'unsafe-inline' 'unsafe-eval';style-src * 'self' 'unsafe-inline';img-src * 'self' data: content:;connect-src * blob:;">

					<meta name="viewport" content="width=device-width, initial-scale=1.0">
	
					<link href="${styleResetUri}" rel="stylesheet" />
					<link href="${styleVSCodeUri}" rel="stylesheet" />
					<link href="${styleMainUri}" rel="stylesheet" />
					<title>Paw Draw</title>

          <script src="https://cdn.staticfile.org/vue/3.2.36/vue.global.min.js"></script>
				</head>
				<body>
					<div id="app">
            <div ref="ofdContainerRef" id="ofd-container"></div>
            <div display="gone" ref="ofdDataRef" id="ofd-data">
              <textarea ref="codeMirrorRef" id="code-mirror"></textarea>
            </div>
          </div>

          
					<script type="module" src="${scriptOfdUri}"></script>
					<script type="module" src="${scriptUri}"></script>
					<script type="module" src="${scriptUri3}"></script>
				</body>
				</html>`;
  }

接下来就是ofdViewer.js的内容,用于解析和预览ofd文件了

(function () {
  const vscode = acquireVsCodeApi();
  const screenWidth = document.body.clientWidth;

  function displayOfdElementToPage(views) {
    let ofdContainer = document.querySelector(".ofd-container");
    ofdContainer.innerHTML = "";
    for (const div of views) {
      ofdContainer.appendChild(div);
    }
  }

  window.addEventListener("message", async (e) => {
    const { type, body, requestId } = e.data;
    // console.log("ofdeditor listen message", e.data);
    switch (type) {
      case "init":
        // console.log("ofeditor html init");
      case "update":  
        // console.log("ofeditor html update");
      case "getFileData":
        // console.log("ofeditor html getFileData", body);
        // var abBody = body.value.buffer;
        ofd.parseOfdDocument({
          ofd: body.value,
          success(res) {
            // console.log("ofdeditor success", res);
            // 渲染ofd
            const ofdView = ofd.renderOfd(screenWidth, res[0]);
            //将ofd添加到html上面
            displayOfdElementToPage(ofdView);
          },
          fail(error) {
            // console.log("ofdeditor parse error", error);
            vscode.postMessage({
              type: 'openOfdError',
              error: error.message
            });
          },
        });
    }
  });
  // Signal to VS Code that the webview is initialized.
  // 先通知vs插件js代码准备好了,然后vscode插件会返回init方法来通知js进行自己的初始化
  vscode.postMessage({ type: "ready" });
})();

主要是添加了一个window.addEventListener的方法,用于插件和webview进行通信,比如插件点击文件之后传输文件路径给webview,webview将解析错误发生时传输错误给插件用于消息提示。

标签:插件,const,CustomEditor,ofd,vscode,js,webview,OFD
From: https://www.cnblogs.com/xxss0903/p/17884466.html

相关文章

  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:CP加入,删除效果:系统RTL结构图:2.算法涉及理论知识概要正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM技术的主要优势在于其可以有效地抵抗多径效应和频率......
  • m基于FPGA的OFDM系统verilog实现,包括IFFT,FFT,成型滤波以及加CP去CP,包含testbench
    1.算法仿真效果vivado2019.2仿真结果如下:   CP加入,删除效果:   系统RTL结构图:   2.算法涉及理论知识概要          正交频分复用(OrthogonalFrequencyDivisionMultiplexing,OFDM)是一种高效的无线通信技术,已经被广泛应用于无线通信领域。OFDM......
  • 支持生成接口文档!Apipost IDEA插件使用体验
    前言Idea是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea还具有许多插件和扩展,可以根据开发人员的需要进行定制和扩展,从而提高开发效率,今天我们就来介绍一款国产的API调试插件:Apipost-Helper什么是Apipost-Helper?Apipost-He......
  • 超级好用的IDEA插件推荐
    IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。今天给大家介绍一款IDEA插件:Apipost-Helper-2.0。代码写完直接编辑器内调试、还支持生成接口文档、......
  • HydroOJ 从入门到入土(5)插件集锦
    总有些需求,未必有啥用,但是很可爱.本文将介绍一些插件相关的知识,并不专业,因为我不懂js(逃目录1.关于插件2.官方插件3.三方插件4.官方站上的第三方插件1.关于插件插件使用js/ts语言编写.插件功能强大,分前后端,可以干任何事情,所以尽量不要使用来路不......
  • pycharm插件离线安装
    给不能联网的电脑或者不能访问外网的云桌面安装pycharm插件,需要离线安装首先在能访问网络的电脑上打开插件主页,如下:下载插件安装文件   ......
  • vscode-go语言插件,调试器协议分析(二)
    版本信息Server:{"Commands":["gopls.add_dependency","gopls.add_import","gopls.add_telemetry_counters","gopls.apply_fix","gopls.change_signature","gopls.check_u......
  • vscode-go语言插件,调试器协议分析
    c客户端,vscodes服务端,调试器----------------------------------------------c-->客户端,请求调试器初始化{"command":"initialize","arguments":{"clientID":"vscode","clientName":......
  • ofd批注支持<ofd:Rotate>非标准的页面旋转属性
    boolannot_has_outerbox=true;autoboundary=apparence->GetAttribute(L"Boundary");if(boundary.GetStringLength()<=0){boundary=elem->GetAttribute(L"Boundary");if(boundary.Get......
  • 超好用的IDEA插件,完全免费
    IDEA是一款功能强大的集成开发环境(IDE),它可以帮助开发人员更加高效地编写、调试和部署软件应用程序。我们在编写完接口代码后需要进行接口调试等操作,一般需要打开额外的调试工具。今天给大家介绍一款IDEA插件:Apipost-Helper-2.0。代码写完直接编辑器内调试、还支持生成接口文档、接......