mirror of
https://github.com/vadimmelnicuk/meo.git
synced 2026-05-03 04:30:34 +00:00
feat: initialize project with essential files
This commit is contained in:
@@ -0,0 +1,4 @@
|
||||
# Markdown Editor Optimized (MEO)
|
||||
---
|
||||
## 0.1.0
|
||||
- Initial build of the Markdown Editor Optimized (MEO) VSCode extension.
|
||||
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) [year] [fullname]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
@@ -1,34 +1,15 @@
|
||||
# MEO - Markdown Editor Optimized
|
||||
|
||||
A native VS Code custom editor for Markdown files powered by CodeMirror 6 with live preview mode.
|
||||
# Markdown Editor Optimized (MEO)
|
||||
WYSIWYG editor for markdown files with live edit mode.
|
||||
|
||||
## Features
|
||||
- Custom editor for `.md` files with live preview and modern toolbar
|
||||
- Uses VS Code color tokens and layout guidance
|
||||
- Live mode hides markdown syntax markers outside active blocks
|
||||
- Source mode with full syntax highlighting
|
||||
|
||||
## Development
|
||||
|
||||
Install dependencies:
|
||||
|
||||
```bash
|
||||
bun install:all
|
||||
```
|
||||
|
||||
Build the extension and webview:
|
||||
|
||||
```bash
|
||||
bun run build
|
||||
```
|
||||
|
||||
Run extension in development mode:
|
||||
|
||||
```
|
||||
FN+F5 (or F5) in VS Code to launch the extension in a new window with the webview.
|
||||
```
|
||||
- Toggle between live and source modes seamlessly in a single tab.
|
||||
- Syntax highlighting with Monokai inspired color scheme.
|
||||
- Rendering of mermaid diagrams and other markdown features.
|
||||
- Easy management of markdown tables with a dedicated table editor.
|
||||
- Tasks list support with interactive checkboxes.
|
||||
- Auto save of markdown files as you edit.
|
||||
- Content outline view for easy navigation through document structure.
|
||||
|
||||
## Usage
|
||||
- Open a `.md` file.
|
||||
- Run the command `Markdown Editor Optimized: Open With Editor`.
|
||||
- Set as default editor if desired.
|
||||
- Open a `.md` or `.markdown` files with the Markdown Editor Optimized by right-clicking the file in the explorer and selecting `Open with Markdown Editor Optimized`.
|
||||
- Set the editor as default by running command `Markdown Editor Optimized: Set as Default`.
|
||||
|
||||
+47
-4
@@ -1,24 +1,41 @@
|
||||
{
|
||||
"name": "markdown-editor-optimized",
|
||||
"displayName": "Markdown Editor Optimized",
|
||||
"description": "VS Code custom editor for Markdown files with live preview mode powered by CodeMirror 6.",
|
||||
"description": "WYSIWYG editor for markdown files with live edit mode.",
|
||||
"version": "0.1.0",
|
||||
"publisher": "vadimmelnicuk",
|
||||
"private": true,
|
||||
"icon": "logo.png",
|
||||
"engines": {
|
||||
"vscode": "^1.97.0"
|
||||
},
|
||||
"categories": [
|
||||
"Programming Languages",
|
||||
"Other"
|
||||
],
|
||||
"keywords": [
|
||||
"markdown",
|
||||
"editor",
|
||||
"live-edit",
|
||||
"wysiwyg",
|
||||
"markdown-editor",
|
||||
"markdown-preview"
|
||||
],
|
||||
"main": "./dist/extension.js",
|
||||
"activationEvents": [
|
||||
"onLanguage:markdown"
|
||||
],
|
||||
"contributes": {
|
||||
"contributes": {
|
||||
"commands": [
|
||||
{
|
||||
"command": "markdownEditorOptimized.open",
|
||||
"title": "Markdown Editor Optimized: Open With Editor",
|
||||
"title": "Open With Markdown Editor Optimized",
|
||||
"icon": "$(book)"
|
||||
},
|
||||
{
|
||||
"command": "markdownEditorOptimized.setDefaultEditor",
|
||||
"title": "Markdown Editor Optimized: Set as Default",
|
||||
"icon": "$(check)"
|
||||
}
|
||||
],
|
||||
"customEditors": [
|
||||
@@ -35,7 +52,33 @@
|
||||
],
|
||||
"priority": "default"
|
||||
}
|
||||
]
|
||||
],
|
||||
"menus": {
|
||||
"explorer/context": [
|
||||
{
|
||||
"command": "markdownEditorOptimized.open",
|
||||
"when": "resourceFilename =~ /\\.(md|markdown)$/",
|
||||
"group": "navigation"
|
||||
}
|
||||
],
|
||||
"editor/title/context": [
|
||||
{
|
||||
"command": "markdownEditorOptimized.open",
|
||||
"when": "resourceFilename =~ /\\.(md|markdown)$/",
|
||||
"group": "navigation"
|
||||
}
|
||||
]
|
||||
},
|
||||
"configuration": {
|
||||
"title": "Markdown Editor Optimized",
|
||||
"properties": {
|
||||
"markdownEditorOptimized.useAsDefault": {
|
||||
"type": "boolean",
|
||||
"default": true,
|
||||
"description": "Use Markdown Editor Optimized as the default editor for Markdown files"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"scripts": {
|
||||
"install:all": "bun install && (cd webview && bun install)",
|
||||
|
||||
+23
-5
@@ -70,12 +70,30 @@ export function activate(context: vscode.ExtensionContext): void {
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('markdownEditorOptimized.open', async () => {
|
||||
const active = vscode.window.activeTextEditor;
|
||||
if (!active || active.document.languageId !== 'markdown') {
|
||||
vscode.commands.registerCommand('markdownEditorOptimized.open', async (uri?: vscode.Uri) => {
|
||||
let targetUri = uri;
|
||||
if (!targetUri) {
|
||||
const active = vscode.window.activeTextEditor;
|
||||
if (!active) {
|
||||
return;
|
||||
}
|
||||
targetUri = active.document.uri;
|
||||
}
|
||||
if (!targetUri.fsPath.endsWith('.md') && !targetUri.fsPath.endsWith('.markdown')) {
|
||||
return;
|
||||
}
|
||||
await vscode.commands.executeCommand('vscode.openWith', active.document.uri, VIEW_TYPE);
|
||||
await vscode.commands.executeCommand('vscode.openWith', targetUri, VIEW_TYPE);
|
||||
})
|
||||
);
|
||||
|
||||
context.subscriptions.push(
|
||||
vscode.commands.registerCommand('markdownEditorOptimized.setDefaultEditor', async () => {
|
||||
const config = vscode.workspace.getConfiguration('workbench');
|
||||
const associations = config.get<Record<string, string>>('editorAssociations') || {};
|
||||
associations['*.md'] = VIEW_TYPE;
|
||||
associations['*.markdown'] = VIEW_TYPE;
|
||||
await config.update('editorAssociations', associations, vscode.ConfigurationTarget.Global);
|
||||
void vscode.window.showInformationMessage('Markdown Editor Optimized is now set as the default editor for Markdown files.');
|
||||
})
|
||||
);
|
||||
}
|
||||
@@ -106,7 +124,7 @@ class MarkdownWebviewProvider implements vscode.CustomTextEditorProvider {
|
||||
|
||||
panel.webview.html = this.getWebviewHtml(panel.webview);
|
||||
|
||||
let mode: EditorMode = 'source';
|
||||
let mode: EditorMode = 'live';
|
||||
let applyQueue: Promise<void> = Promise.resolve();
|
||||
let initDelivered = false;
|
||||
let isApplyingOwnChange = false;
|
||||
|
||||
@@ -404,6 +404,23 @@ class HtmlTableWidget extends WidgetType {
|
||||
event.clipboardData?.setData('text/plain', text);
|
||||
};
|
||||
|
||||
const onKeyDown = (event) => {
|
||||
if (this.selectedCellCount() <= 1) return;
|
||||
if (event.key !== 'Backspace' && event.key !== 'Delete') return;
|
||||
if (!this.selectionRange || !this.domRefs) return;
|
||||
event.preventDefault();
|
||||
for (let row = this.selectionRange.fromRow; row <= this.selectionRange.toRow; row++) {
|
||||
for (let col = this.selectionRange.fromCol; col <= this.selectionRange.toCol; col++) {
|
||||
const input = this.domRefs.allRowInputs[row][col];
|
||||
if (input.value !== '') {
|
||||
input.value = '';
|
||||
this.hasPendingCellEdits = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
this.scheduleLayout({ resizeRows: true });
|
||||
};
|
||||
|
||||
const onFocusOut = (event) => {
|
||||
const nextTarget = event.relatedTarget;
|
||||
if (nextTarget instanceof Node && table.contains(nextTarget)) return;
|
||||
@@ -457,6 +474,7 @@ class HtmlTableWidget extends WidgetType {
|
||||
table.addEventListener('pointerup', endPointerSelection);
|
||||
table.addEventListener('pointercancel', endPointerSelection);
|
||||
table.addEventListener('copy', onCopy);
|
||||
table.addEventListener('keydown', onKeyDown);
|
||||
table.addEventListener('focusout', onFocusOut);
|
||||
document.addEventListener('pointerdown', onDocumentPointerDown, true);
|
||||
this.cleanupFns.push(() => {
|
||||
@@ -466,6 +484,7 @@ class HtmlTableWidget extends WidgetType {
|
||||
table.removeEventListener('pointerup', endPointerSelection);
|
||||
table.removeEventListener('pointercancel', endPointerSelection);
|
||||
table.removeEventListener('copy', onCopy);
|
||||
table.removeEventListener('keydown', onKeyDown);
|
||||
table.removeEventListener('focusout', onFocusOut);
|
||||
document.removeEventListener('pointerdown', onDocumentPointerDown, true);
|
||||
});
|
||||
|
||||
@@ -312,7 +312,7 @@ let syncedText = '';
|
||||
let inFlight = false;
|
||||
let inFlightText = null;
|
||||
let saveAfterSync = false;
|
||||
let currentMode = 'source';
|
||||
let currentMode = 'live';
|
||||
let hasLocalModePreference = false;
|
||||
|
||||
const updateModeUI = () => {
|
||||
|
||||
Reference in New Issue
Block a user