


In-depth understanding of the implementation principle of markdown preview in vscode
vscode’s markdown preview is a function we use all day long. Have you ever thought about how it is implemented? Maybe one day you will receive a request for customized markdown preview. What should you do? [Recommended learning: "vscode tutorial"]
In fact, the overall idea is relatively simple, which is to create a webview panel, set the content to the HTML generated by markdown, and then modify the webview simultaneously when markdown is updated. html will do.
Idea Analysis
Create a webview through vscode.window.createWebviewPanel, specify it to be opened on the side, and then set the html through the webview.html attribute of the panel object.
html is generated through the markdown content of the editor. The editor content is obtained through editor.document.getText(), and then a third-party markdown to html conversion library is called to generate it.
This completes the markdown preview.
After the preview needs to be updated, listen to the events of vscode.workspace.onDidSaveTextDocument and vscode.workspace.onDidChangeTextDocument. When the document is updated and saved, get the content of the editor, regenerate the html, and then set it to the webview.
WebviewPanel supports webview.postMessage(message); to pass messages, and supports a series of commands such as updateHTML, which can be triggered by passing messages.
But how do you know which document updates which webview?
You can maintain a map and record it into the map when creating the webviewPanel. The key is the file path, so that when updating, the corresponding webview can be found and updated.
In this way, the update of markdown content is completed.
In fact, the overall idea is relatively simple. Let’s write down the code.
Code implementation
Let’s take a look at the code of the vscode-markdown-preview-enhanced plug-in. This is It is also a plug-in for previewing markdown. The code is quite simple and can be used for learning.
(The following code is simplified code)
First, the plug-in must specify the triggering conditions, that is, specify activationEvents in package.json:
"activationEvents": [ "onLanguage:markdown", "onCommand:markdown-preview-enhanced.openPreviewToTheSide" ],
Here is It is activated when editing markdown content, and one is activated when command is executed.
The specific activation logic is in the active method:
export function activate(context: vscode.ExtensionContext) { const contentProvider = new MarkdownPreviewEnhancedView(context); context.subscriptions.push( vscode.commands.registerCommand( "markdown-preview-enhanced.openPreviewToTheSide", openPreviewToTheSide, ), ); function openPreviewToTheSide(uri?: vscode.Uri) { let resource = uri; if (!(resource instanceof vscode.Uri)) { if (vscode.window.activeTextEditor) { resource = vscode.window.activeTextEditor.document.uri; } } contentProvider.initPreview(resource, vscode.window.activeTextEditor, { viewColumn: vscode.ViewColumn.Two, preserveFocus: true, }); } }
We registered the command, and executing the command will get the url of the current editor, and then preview the markdown.
All the logic of preview is centrally defined in the instance object of MarkdownPreviewEnhancedView, and initPreivew is executed when the command is triggered.
public async initPreview( sourceUri: vscode.Uri, editor: vscode.TextEditor, viewOptions: { viewColumn: vscode.ViewColumn; preserveFocus?: boolean }, ) { // 创建 webview let previewPanel: vscode.WebviewPanel = vscode.window.createWebviewPanel( "markdown-preview-enhanced", `Preview ${path.basename(sourceUri.fsPath)}`, viewOptions ); // 监听 webview 的消息 previewPanel.webview.onDidReceiveMessage((message) => {}); // 记录 webview 到 map 中 this.previewMaps[sourceUri.fsPath] = previewPanel; // 拿到编辑器的文本,生成 html const text = editor.document.getText(); engine .generateHTMLTemplateForPreview({inputString: text}) .then((html) => { // 设置 html 到 previewPanel previewPanel.webview.html = html; }); }
Create the webviewPanel in initWebivew and save the webviewPanel to the map. The key is the file path of the document. Get the editor text to generate html and set it to webview.html, thus completing the markdown preview.
After this path is passed, we will realize the preview of markdown.
But only previewing once is not enough. After updating the document, it needs to be updated automatically. We continue to add event monitoring in the active method:
context.subscriptions.push( vscode.workspace.onDidSaveTextDocument((document) => { if (isMarkdownFile(document)) { contentProvider.updateMarkdown(document.uri, true); } }), ); context.subscriptions.push( vscode.workspace.onDidChangeTextDocument((event) => { if (isMarkdownFile(event.document)) { contentProvider.update(event.document.uri); } }), );
When monitoring text modification and saving, call the update method to update.
public updateMarkdown(sourceUri: Uri) { // 从 map 中根据文件路径取出对应的 webviewPanel const previewPanel = this.previewMaps[sourceUri.fsPath]; // 生成最新的 html 传递给 webview const text = document.getText(); engine .parseMD(text) .then(({ markdown, html }) => { previewPanel.webview.postMessage({ command: "updateHTML", html }); } }
Here is to pass the updateHTML command message to the html content through webview.postMessage, triggering the update of the html content.
In this way, we achieve synchronous refresh of markdown.
Summary
The preview of markdown in vscode is a commonly used but not difficult function to implement. We looked at the source code of the vscode-markdown-preview-enhanced plug-in and clarified the overall Process:
- Create a webviewPanel through vscode.window.createWebviewPanel to display html
- html After getting the text content through editor.document.getText(), generate it through a third-party package and set it to webviewPanel
- Listens to workspace.onDidSaveTextDocument and workspace.onDidChangeTextDocument to get the latest content, and then generates HTML and updates it to the webview by passing the udpateHTML message through webview.postMessage.
- It should be noted that a map needs to be recorded to save the corresponding relationship between uri.fsPath and webviewPanel, so that the text content changes and updates the corresponding webview
Markdown preview is a common but It is not a difficult requirement and is more suitable for entry-level vscode plug-in development. I hope this article can help you clarify your ideas.
For more programming-related knowledge, please visit: Introduction to Programming! !
The above is the detailed content of In-depth understanding of the implementation principle of markdown preview in vscode. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

How to define header files using Visual Studio Code? Create a header file and declare symbols in the header file using the .h or .hpp suffix name (such as classes, functions, variables) Compile the program using the #include directive to include the header file in the source file. The header file will be included and the declared symbols are available.

VS Code system requirements: Operating system: Windows 10 and above, macOS 10.12 and above, Linux distribution processor: minimum 1.6 GHz, recommended 2.0 GHz and above memory: minimum 512 MB, recommended 4 GB and above storage space: minimum 250 MB, recommended 1 GB and above other requirements: stable network connection, Xorg/Wayland (Linux)

How to solve the problem that Chinese comments in Visual Studio Code become question marks: Check the file encoding and make sure it is "UTF-8 without BOM". Change the font to a font that supports Chinese characters, such as "Song Style" or "Microsoft Yahei". Reinstall the font. Enable Unicode support. Upgrade VSCode, restart the computer, and recreate the source file.

vscode built-in terminal is a development tool that allows running commands and scripts within the editor to simplify the development process. How to use vscode terminal: Open the terminal with the shortcut key (Ctrl/Cmd). Enter a command or run the script. Use hotkeys (such as Ctrl L to clear the terminal). Change the working directory (such as the cd command). Advanced features include debug mode, automatic code snippet completion, and interactive command history.

Writing code in Visual Studio Code (VSCode) is simple and easy to use. Just install VSCode, create a project, select a language, create a file, write code, save and run it. The advantages of VSCode include cross-platform, free and open source, powerful features, rich extensions, and lightweight and fast.

Common commands for VS Code terminals include: Clear the terminal screen (clear), list the current directory file (ls), change the current working directory (cd), print the current working directory path (pwd), create a new directory (mkdir), delete empty directory (rmdir), create a new file (touch) delete a file or directory (rm), copy a file or directory (cp), move or rename a file or directory (mv) display file content (cat) view file content and scroll (less) view file content only scroll down (more) display the first few lines of the file (head)

Visual Studio Code (VSCode) is a cross-platform, open source and free code editor developed by Microsoft. It is known for its lightweight, scalability and support for a wide range of programming languages. To install VSCode, please visit the official website to download and run the installer. When using VSCode, you can create new projects, edit code, debug code, navigate projects, expand VSCode, and manage settings. VSCode is available for Windows, macOS, and Linux, supports multiple programming languages and provides various extensions through Marketplace. Its advantages include lightweight, scalability, extensive language support, rich features and version

Causes and solutions for the VS Code terminal commands not available: The necessary tools are not installed (Windows: WSL; macOS: Xcode command line tools) Path configuration is wrong (add executable files to PATH environment variables) Permission issues (run VS Code as administrator) Firewall or proxy restrictions (check settings, unrestrictions) Terminal settings are incorrect (enable use of external terminals) VS Code installation is corrupt (reinstall or update) Terminal configuration is incompatible (try different terminal types or commands) Specific environment variables are missing (set necessary environment variables)
