{"id":24541093,"url":"https://github.com/shaneholloman/markdown-moose","last_synced_at":"2026-02-25T12:12:03.113Z","repository":{"id":271561117,"uuid":"913270608","full_name":"shaneholloman/markdown-moose","owner":"shaneholloman","description":"Markdown Moose is a VSCode Extension that enhances your Markdown workflow","archived":false,"fork":false,"pushed_at":"2025-03-12T11:45:14.000Z","size":1153,"stargazers_count":1,"open_issues_count":1,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-12T12:33:16.272Z","etag":null,"topics":["formatters","markdown","vscode-extension"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/shaneholloman.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-01-07T11:06:11.000Z","updated_at":"2025-03-12T11:45:19.000Z","dependencies_parsed_at":null,"dependency_job_id":"a91a34cb-8d70-4c3d-8877-5d484da98563","html_url":"https://github.com/shaneholloman/markdown-moose","commit_stats":null,"previous_names":["shaneholloman/markdown-moose"],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaneholloman%2Fmarkdown-moose","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaneholloman%2Fmarkdown-moose/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaneholloman%2Fmarkdown-moose/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/shaneholloman%2Fmarkdown-moose/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/shaneholloman","download_url":"https://codeload.github.com/shaneholloman/markdown-moose/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243830914,"owners_count":20354850,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["formatters","markdown","vscode-extension"],"created_at":"2025-01-22T18:17:00.796Z","updated_at":"2026-02-25T12:12:03.107Z","avatar_url":"https://github.com/shaneholloman.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Markdown Moose\n\nMarkdown Moose is a VSCode Extension that enhances your Markdown workflow. It uses a plugin-based architecture where each feature is a plugin that can be loaded by the extension.\n\n## Features Added\n\n### Image Downloader Plugin\n\n- Automatically downloads images from your Markdown files\n- Saves images locally in the same directory as your Markdown file\n- Updates image links to use relative paths\n- Shows download progress with a sleek progress indicator\n\n### Image Alt Plugin\n\n- Automatically generates meaningful alt text for images based on context\n- Uses nearest heading above the image as alt text\n- Falls back to page title or file type if no nearby heading\n- Handles duplicate images with numbered alt texts\n- Configurable to preserve or overwrite existing alt text\n\n### More Plugins Coming Soon\n\n\u003e [!IMPORTANT]\n\u003e **Next feature**: [HTML to Markdown Plugins](dev/ideas.md#next-up)\n\nPlease feel free to suggest new features or create your own plugins.\n\n\u003e [!TIP]\n\u003e Wish list is here: [Markdown Moose Plugin Ideas](dev/ideas.md)\n\n## Usage\n\n1. Open a Markdown file\n2. Press `Ctrl+Shift+P` (or `Cmd+Shift+P` on Mac)\n3. Type \"Moose\" to see available commands:\n    - Select \"Moose: Download Images from Markdown\" to download and organize images\n    - Select \"Moose: Update Image Alt Text\" to generate contextual alt text for images\n\n## Configuration\n\nMarkdown Moose uses a three-tier configuration system (in order of priority):\n\n1. `.moose` Config File (Highest Priority):\n\n    - JSON file in workspace root\n    - Settings grouped by plugin name\n    - Example:\n\n    ```json\n    {\n      \"imageDownloader\": {\n        \"path\": \"./img\",\n        \"overwriteExisting\": true,\n        \"skipLargeImages\": true,\n        \"maxImageSize\": 10485760\n      },\n      \"imageAlt\": {\n        \"overwriteExisting\": false\n      }\n    }\n    ```\n\n2. Workspace Settings (Medium Priority):\n\n    - In `.vscode/settings.json`\n    - Settings prefixed with \"moose.[pluginName]\"\n    - Example:\n\n    ```json\n    {\n        \"moose.imageDownloader.path\": \"./img\",\n        \"moose.imageDownloader.overwriteExisting\": true,\n        \"moose.imageDownloader.skipLargeImages\": false,\n        \"moose.imageDownloader.maxImageSize\": 5242880,\n        \"moose.imageAlt.overwriteExisting\": false\n    }\n    ```\n\n3. VSCode User Settings (Low Priority):\n\n    - Go to Settings (Ctrl+,)\n    - Search for \"Markdown Moose\"\n    - Configure available settings\n\n### Plugin Settings\n\n#### Image Downloader Settings\n\n- `path`: Where to save downloaded images (relative to markdown file)\n    - Default: \"./img\"\n    - Examples: \"./assets/images\", \".\", \"./downloads\"\n\n- `overwriteExisting`: Whether to overwrite existing images\n    - Default: true\n    - Set to false to skip existing files\n\n- `skipLargeImages`: Whether to skip large image downloads\n    - Default: false\n    - Works with maxImageSize setting\n\n- `maxImageSize`: Maximum allowed image size in bytes\n    - Default: 5242880 (5MB)\n    - Only used when skipLargeImages is true\n\n#### Image Alt Settings\n\n- `overwriteExisting`: Whether to overwrite existing alt text\n    - Default: false\n    - Set to true to update all images regardless of existing alt text\n\nNotes:\n\n- Paths should be relative to the markdown file\n- Directories are created automatically if they don't exist\n- Higher priority settings override lower priority ones\n\n## Plugin Architecture\n\nMarkdown Moose (the Extension) is built with extensibility in mind. The core extension acts as a host that can load multiple plugins. Each plugin adds specific features to enhance your Markdown editing experience.\n\nFor example, the Image Downloader plugin adds the ability to download and manage images in your markdown files. You can create your own plugins to add more features to the extension.\n\n### Creating a Plugin\n\n1. Create a new directory in the `src/plugins` directory\n2. Implement the Plugin interface:\n\n    ```typescript\n    interface Plugin {\n        name: string;\n        description: string;\n        version: string;\n        author: string;\n        commands: Command[];\n        activate(context: vscode.ExtensionContext): void;\n        deactivate(): void;\n    }\n\n    interface Command {\n        id: string;\n        title: string;\n        execute: (...args: any[]) =\u003e any;\n    }\n    ```\n\n    Example plugin structure:\n\n    ```typescript\n    import * as vscode from 'vscode';\n    import { Plugin, Command } from '../../types';\n\n    export class MyPlugin implements Plugin {\n        public name = 'My Plugin';\n        public description = 'Does something awesome';\n        public version = '1.0.0';\n        public author = 'Your Name';\n        public commands: Command[];\n\n        constructor() {\n            this.commands = [\n                {\n                    id: 'markdown-moose.myCommand',\n                    title: 'My Awesome Command',\n                    execute: this.myCommand.bind(this)\n                }\n            ];\n        }\n\n        public activate(context: vscode.ExtensionContext): void {\n            // Register commands\n            for (const command of this.commands) {\n                const disposable = vscode.commands.registerCommand(\n                    command.id,\n                    command.execute\n                );\n                context.subscriptions.push(disposable);\n            }\n        }\n\n        public deactivate(): void {\n            // Cleanup if needed\n        }\n\n        private async myCommand(): Promise\u003cvoid\u003e {\n            // Your command implementation\n        }\n    }\n\n    export default new MyPlugin();\n    ```\n\n3. Register your plugin (see Current Implementation below)\n\n### Plugin System: Current State \u0026 Future Vision\n\n#### Current Implementation\n\nPlugins currently require manual registration in the codebase. To add a new plugin:\n\n1. Create your plugin directory in `src/plugins/your-plugin-name/`\n2. Implement the Plugin interface in your main file (e.g., `index.ts`)\n3. Register the plugin in `src/plugins/index.ts`\n4. Add command and setting contributions to `package.json`\n\nExample plugin registration in `src/plugins/index.ts`:\n\n```typescript\ntry {\n    log('Loading my plugin...');\n    const myPlugin = require('./my-plugin-name').default;\n    if (isValidPlugin(myPlugin)) {\n        plugins.push(myPlugin);\n    }\n} catch (error) {\n    // Error handling\n}\n```\n\n#### Future Vision: True Drop-in Architecture\n\nWe are working towards a true drop-in plugin architecture where:\n\n- Plugins can be added by simply placing them in a plugins directory\n- No manual registration or code changes required\n- Dynamic discovery and loading of plugins\n- Hot-reloading during development\n- Proper isolation and versioning\n\nThis vision requires significant architectural work, including:\n\n- Dynamic plugin discovery system\n- Plugin manifest format\n- Dependency management\n- Security sandboxing\n- Version compatibility checking\n\n#### Help Us Get There\n\nWe welcome contributions towards achieving this vision. Areas where help is needed:\n\n- Plugin discovery system design\n- Manifest format specification\n- Hot-reload implementation\n- Plugin isolation strategies\n- Testing framework for plugins\n\n## Contributing\n\n1. Fork the repository\n2. Create a new plugin in `src/plugins/your-plugin-name`\n3. Implement the Plugin interface\n4. Submit a pull request\n\n## License\n\nMIT\n\n## Author\n\nShane Holloman\n\n---\n\nHappy Markdown editing with the Moose!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshaneholloman%2Fmarkdown-moose","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fshaneholloman%2Fmarkdown-moose","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fshaneholloman%2Fmarkdown-moose/lists"}