Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
24bb9aa9f5 | ||
|
|
b39bdcf475 | ||
|
|
9d154a8521 | ||
|
|
fe62c8814c | ||
|
|
9306a9c23b | ||
|
|
88e26c130e | ||
|
|
b02707ac7f | ||
|
|
ebc149ff0b | ||
|
|
be3af42fc5 | ||
|
|
ed611c77ed | ||
|
|
f25d856a2a | ||
|
|
76fed872ce | ||
|
|
9de14df016 | ||
|
|
5f0b4c9c4e | ||
|
|
7d083a024d | ||
|
|
68fcaf9bfc | ||
|
|
a2a44fbf2c | ||
|
|
026a4d9fac | ||
|
|
a461b62dd3 | ||
|
|
1cd316caf1 | ||
|
|
2bdb380130 | ||
|
|
41942a1316 | ||
|
|
9ad484744a | ||
|
|
d0a26126cc | ||
|
|
53870d58bb | ||
|
|
00d6802422 | ||
|
|
02418b943e | ||
|
|
8b2809ebaf | ||
|
|
8f5eb301b6 | ||
|
|
8f9dab1405 | ||
|
|
a6fa14124d | ||
|
|
0538aec02c | ||
|
|
1d782a00e6 | ||
|
|
9eb1fe0f00 | ||
|
|
3344b2aea9 | ||
|
|
6b23e5ef60 | ||
|
|
221598c91b | ||
|
|
d8ee743fb1 | ||
|
|
66e2b56221 | ||
|
|
d22d616727 | ||
|
|
89590a349a | ||
|
|
f447896a63 | ||
|
|
ccb998be66 | ||
|
|
813582aa8d | ||
|
|
b1e16af62d | ||
|
|
487ce2ad45 | ||
|
|
1717b2e8c0 | ||
|
|
cdd370c62d | ||
|
|
6df21ace35 | ||
|
|
c93747c476 | ||
|
|
d865b181e9 | ||
|
|
5e5bab3da9 | ||
|
|
ce2bf62d42 | ||
|
|
6da98c3a54 | ||
|
|
3598d06240 | ||
|
|
650c266945 | ||
|
|
05bbb9f86b | ||
|
|
77c8e05fa5 | ||
|
|
17f318dd75 | ||
|
|
fa5a46d5ac | ||
|
|
a4201acad9 | ||
|
|
0b5af04a6a | ||
|
|
2d6f909b0e | ||
|
|
8624257c1f | ||
|
|
b75f436aaa | ||
|
|
d81d8c28d2 | ||
|
|
559d09cad9 | ||
|
|
5ad582ec3e | ||
|
|
d02f896167 | ||
|
|
f34775ce53 | ||
|
|
5d6a55dd09 | ||
|
|
0e80e37d9d | ||
|
|
9a7e994224 | ||
|
|
3effacf816 | ||
|
|
1be10f9ae5 | ||
|
|
4c0b7d6e84 | ||
|
|
db04ea5854 | ||
|
|
567726022c | ||
|
|
1999a7716e | ||
|
|
16e071ae5e | ||
|
|
7ecf54ceb0 | ||
|
|
95e2f45f1f | ||
|
|
7fbbd60525 | ||
|
|
c715bb354c | ||
|
|
6525de7667 | ||
|
|
a2c1d0c11a | ||
|
|
e0d6315204 | ||
|
|
68ff7d076a | ||
|
|
67b57eae78 | ||
|
|
301c51ac84 | ||
|
|
904ffbdd5b | ||
|
|
ea383783ec | ||
|
|
e758a81c4c | ||
|
|
ea0f3f93bf | ||
|
|
188e73d7c1 | ||
|
|
8265e4ff88 | ||
|
|
8a8671b128 | ||
|
|
3646dc29c6 | ||
|
|
a999f598cc | ||
|
|
7a396f64a6 | ||
|
|
88e9a5290d | ||
|
|
fff15d8d3e | ||
|
|
c574d77c20 | ||
|
|
272215f9af | ||
|
|
0192590567 |
@@ -1,9 +0,0 @@
|
|||||||
# Text artifacts that are hash-pinned must check out byte-identical everywhere
|
|
||||||
assets/fonts/FiraCode-LICENSE.txt -text
|
|
||||||
# Binaries: never normalize
|
|
||||||
*.ttf -text
|
|
||||||
*.woff -text
|
|
||||||
*.woff2 -text
|
|
||||||
*.png -text
|
|
||||||
*.ico -text
|
|
||||||
*.icns -text
|
|
||||||
@@ -25,13 +25,6 @@ jobs:
|
|||||||
- name: Download external tools (pandoc)
|
- name: Download external tools (pandoc)
|
||||||
run: node scripts/download-tools.js
|
run: node scripts/download-tools.js
|
||||||
|
|
||||||
- name: Bundle MarkItDown (optional, best effort)
|
|
||||||
# Freezes markitdown + Python into bin/linux/markitdown; failure is
|
|
||||||
# non-fatal — the build then ships without it and the app falls back
|
|
||||||
# to a system markitdown at runtime.
|
|
||||||
run: npm run bundle:markitdown
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: npm test
|
run: npm test
|
||||||
|
|
||||||
@@ -66,12 +59,6 @@ jobs:
|
|||||||
- name: Download external tools (pandoc)
|
- name: Download external tools (pandoc)
|
||||||
run: node scripts/download-tools.js
|
run: node scripts/download-tools.js
|
||||||
|
|
||||||
- name: Bundle MarkItDown (optional, best effort)
|
|
||||||
# Windows runners ship python + venv; non-fatal on failure — the
|
|
||||||
# package then omits the bundled binary by design
|
|
||||||
run: npm run bundle:markitdown
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Run tests
|
- name: Run tests
|
||||||
run: npm test
|
run: npm test
|
||||||
|
|
||||||
@@ -107,44 +94,8 @@ jobs:
|
|||||||
dist/*.zip
|
dist/*.zip
|
||||||
retention-days: 5
|
retention-days: 5
|
||||||
|
|
||||||
build-macos:
|
|
||||||
runs-on: macos-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 20
|
|
||||||
cache: npm
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: npm ci
|
|
||||||
|
|
||||||
- name: Download external tools (pandoc)
|
|
||||||
run: node scripts/download-tools.js
|
|
||||||
|
|
||||||
- name: Bundle MarkItDown (optional, best effort)
|
|
||||||
run: npm run bundle:markitdown
|
|
||||||
continue-on-error: true
|
|
||||||
|
|
||||||
- name: Run tests
|
|
||||||
run: npm test
|
|
||||||
|
|
||||||
- name: Build macOS packages
|
|
||||||
run: npm run build:mac -- --publish=never
|
|
||||||
|
|
||||||
- name: Upload macOS artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: macos-artifacts
|
|
||||||
path: |
|
|
||||||
dist/*.dmg
|
|
||||||
dist/*.zip
|
|
||||||
retention-days: 5
|
|
||||||
|
|
||||||
release:
|
release:
|
||||||
needs: [build-linux, build-windows, build-macos]
|
needs: [build-linux, build-windows]
|
||||||
if: always()
|
if: always()
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
@@ -164,13 +115,6 @@ jobs:
|
|||||||
name: windows-artifacts
|
name: windows-artifacts
|
||||||
path: dist
|
path: dist
|
||||||
|
|
||||||
- name: Download macOS artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
continue-on-error: true
|
|
||||||
with:
|
|
||||||
name: macos-artifacts
|
|
||||||
path: dist
|
|
||||||
|
|
||||||
- name: Create GitHub Release
|
- name: Create GitHub Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
# CLAUDE.md — MarkdownConverter (master)
|
|
||||||
|
|
||||||
> General code-quality, JavaScript, git, security, and testing standards are in the **global CLAUDE.md**. This file holds project- and branch-specific notes.
|
|
||||||
|
|
||||||
## Project Overview
|
|
||||||
|
|
||||||
Electron desktop app for Markdown editing and universal file conversion powered by Pandoc. Cross-platform (Win/macOS/Linux). Features: multi-tab editor with live preview, 25+ themes, PDF viewer/editor (merge/split/compress/rotate/watermark/password), export to 20+ formats (PDF/DOCX/ODT/EPUB/HTML/LaTeX/RTF/PPTX), batch conversion, syntax highlighting, diagram support (Mermaid), Git integration, and a plugin system.
|
|
||||||
|
|
||||||
- **Version:** 4.4.5
|
|
||||||
- **License:** MIT
|
|
||||||
- **App ID:** `com.concreteinfo.markdownconverter`
|
|
||||||
|
|
||||||
## Branch Specifics
|
|
||||||
|
|
||||||
This is the **primary/release branch** — a vanilla JavaScript Electron app with no bundler or framework in the renderer. The renderer is a single large `renderer.js` (5,300+ lines) loaded directly via `src/index.html`. All UI is hand-rolled DOM manipulation.
|
|
||||||
|
|
||||||
## Architecture
|
|
||||||
|
|
||||||
### Main Process (`src/main.js` — 4,260 lines)
|
|
||||||
Monolithic main process file. Contains all IPC handlers, Pandoc invocation, file operations, menu definitions (600+ lines), and window lifecycle. Key modules extracted:
|
|
||||||
- `src/main/PDFOperations.js` — PDF manipulation via `pdf-lib` (merge, split, compress, rotate, delete, reorder, watermark, encrypt, decrypt, permissions)
|
|
||||||
- `src/main/GitOperations.js` — Git status/stage/commit/log via `simple-git`
|
|
||||||
|
|
||||||
### Renderer (`src/renderer.js` — 5,361 lines)
|
|
||||||
Vanilla JS, no framework. Directly manipulates DOM. Loads CodeMirror 6 via `src/editor/codemirror-setup.js`. Uses `marked` + `highlight.js` + `DOMPurify` + `mermaid` for rendering. Lazy-loads sidebar panels, REPL, command palette, zen mode.
|
|
||||||
|
|
||||||
### Preload (`src/preload.js` — 448 lines)
|
|
||||||
Exists as IPC bridge, but **`contextIsolation: false` and `nodeIntegration: true`** — the renderer has full Node access. Preload is effectively a thin passthrough.
|
|
||||||
|
|
||||||
### Security Model
|
|
||||||
- `contextIsolation: false` + `nodeIntegration: true` (legacy; the react-electron branch fixes this)
|
|
||||||
- Pandoc invoked via `execFile` (not `exec`) to prevent shell injection
|
|
||||||
- Path traversal protection: `validatePath()`, `resolveWritablePath()`, blocks sensitive system dirs
|
|
||||||
- Permission handler only allows `clipboard-read`/`clipboard-write`
|
|
||||||
- Rate limiter on conversions (2-second minimum interval)
|
|
||||||
- File size limit: 50MB
|
|
||||||
- Error message sanitization strips absolute paths
|
|
||||||
|
|
||||||
### Plugin System (`src/plugins/`)
|
|
||||||
Manifest-based discovery (`manifest.json`). Built-in `writing-studio` plugin with sprint/goal/snapshot management. Plugin API exposed via `src/plugins/plugin-api.js`.
|
|
||||||
|
|
||||||
### Settings
|
|
||||||
Custom JSON file store at `<userData>/settings.json` (NOT `electron-store` despite the dependency). Recent files at `<userData>/recent-files.json`.
|
|
||||||
|
|
||||||
## System Dependencies
|
|
||||||
|
|
||||||
| Dependency | Required | Notes |
|
|
||||||
|---|---|---|
|
|
||||||
| **Node.js** | >= 20 | Electron 41 bundles Node 20.x |
|
|
||||||
| **Pandoc** | Yes (for exports) | Downloaded to `bin/<platform>/pandoc` via `scripts/download-tools.js` (v3.9.0.2). Falls back to system PATH. Must be present for DOCX/ODT/EPUB/LaTeX/PPTX export. |
|
|
||||||
| **FFmpeg** | Bundled | `ffmpeg-static` npm package; `asarUnpacked` for packaged builds |
|
|
||||||
| **MiKTeX / TeX Live** | Optional | For LaTeX PDF export; MiKTeX PATH injected on Windows automatically |
|
|
||||||
| **ImageMagick** | Optional | Linux image conversion; listed as deb dependency |
|
|
||||||
| **LibreOffice** | Optional | Enhanced document conversion; listed as deb dependency |
|
|
||||||
|
|
||||||
## Development Commands
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm start # Launch Electron app (dev mode)
|
|
||||||
npm test # Jest test suite
|
|
||||||
npm test:watch # Jest in watch mode
|
|
||||||
npm test:coverage # Jest with coverage report
|
|
||||||
npm run lint # ESLint check (src + tests)
|
|
||||||
npm run lint:fix # ESLint auto-fix
|
|
||||||
npm run format # Prettier write
|
|
||||||
npm run format:check # Prettier check only
|
|
||||||
npm run download-tools # Download Pandoc binaries to bin/
|
|
||||||
npm run generate-icons # Generate app icons via sharp
|
|
||||||
```
|
|
||||||
|
|
||||||
## Build & Package
|
|
||||||
|
|
||||||
**Tool:** `electron-builder` (v26.0.12), config inline in `package.json` (no separate config file).
|
|
||||||
|
|
||||||
| Target | Platforms |
|
|
||||||
|---|---|
|
|
||||||
| `npm run build` | electron-builder (default platform) |
|
|
||||||
| `npm run build:win` | Windows: NSIS installer + portable + zip (x64) |
|
|
||||||
| `npm run build:mac` | macOS: default dmg |
|
|
||||||
| `npm run build:linux` | Linux: deb + AppImage + snap |
|
|
||||||
| `npm run dist` | Build without publish |
|
|
||||||
| `npm run dist:all` | Build for all platforms |
|
|
||||||
|
|
||||||
**Bundled with builds:** Pandoc binary per platform. FFmpeg via `ffmpeg-static` (asarUnpacked). NSIS installer uses custom script at `scripts/nsis-installer.nsh`.
|
|
||||||
|
|
||||||
**Output:** `dist/` directory.
|
|
||||||
|
|
||||||
**CI:** GitHub Actions workflows in `.github/workflows/` (ci.yml, release.yml).
|
|
||||||
|
|
||||||
## Project Conventions / Gotchas
|
|
||||||
|
|
||||||
- **No bundler/transpilation.** The app uses vanilla CommonJS JavaScript. `src/main.js` is loaded directly by Electron. No webpack, no Vite, no TypeScript, no Babel.
|
|
||||||
- **Monolithic files.** `main.js` (4,260 lines) and `renderer.js` (5,361 lines) contain most logic. Not ideal but is the current state of this branch.
|
|
||||||
- **CodeMirror 6** for the editor, configured in `src/editor/codemirror-setup.js`.
|
|
||||||
- **PDF rendering** uses `pdfjs-dist`; **PDF manipulation** uses `pdf-lib` in the main process.
|
|
||||||
- **Renderer security is weak** — full Node access in renderer. Do NOT introduce new privileged renderer code without understanding this.
|
|
||||||
- **Pandoc is external.** Must be installed separately or downloaded via `npm run download-tools`. HTML and built-in PDF export work without Pandoc; other formats require it.
|
|
||||||
- **PDF export fallback chain:** xelatex -> pdflatex -> lualatex -> Electron built-in `printToPDF()`.
|
|
||||||
- **ESLint flat config** (`eslint.config.js`) with ECMAScript 2022. Prettier with 2-space indent, single quotes, semicolons, 100-char width.
|
|
||||||
- **Tests:** Jest with jsdom environment, 15% coverage threshold. 24 test files in `tests/`.
|
|
||||||
- **File associations:** `.md`, `.markdown`, `.pdf` registered at install.
|
|
||||||
- **Single instance lock** enforced via `app.requestSingleInstanceLock()`.
|
|
||||||
- **Adapters layer** (`src/adapters/`) abstracts file system operations for potential future non-Electron targets.
|
|
||||||
@@ -1,7 +1,3 @@
|
|||||||
<p align="center">
|
|
||||||
<img src="assets/markdown-converter-assets/logo-horizontal.svg" alt="Markdown Converter" width="420">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# MarkdownConverter
|
# MarkdownConverter
|
||||||
|
|
||||||
A powerful cross-platform Markdown editor and document converter powered by Pandoc, built with Electron. 100% open-source with no proprietary dependencies.
|
A powerful cross-platform Markdown editor and document converter powered by Pandoc, built with Electron. 100% open-source with no proprietary dependencies.
|
||||||
@@ -47,7 +43,6 @@ A powerful cross-platform Markdown editor and document converter powered by Pand
|
|||||||
- **EPUB** - E-book format
|
- **EPUB** - E-book format
|
||||||
- **LaTeX** - Academic document format
|
- **LaTeX** - Academic document format
|
||||||
- **RTF** - Rich Text Format
|
- **RTF** - Rich Text Format
|
||||||
- **Export themes** - Five visual styles (Modern, Classic, Sepia, Minimal, Elegant) for PDF and Word exports — recolored headings, links, and fonts
|
|
||||||
|
|
||||||
### Advanced Features
|
### Advanced Features
|
||||||
- **Custom headers & footers** - Add headers/footers to exports with dynamic fields
|
- **Custom headers & footers** - Add headers/footers to exports with dynamic fields
|
||||||
@@ -56,24 +51,12 @@ A powerful cross-platform Markdown editor and document converter powered by Pand
|
|||||||
- **ASCII Art Generator** - Create text banners and diagrams
|
- **ASCII Art Generator** - Create text banners and diagrams
|
||||||
- **Word templates** - Use custom Word templates for enhanced exports
|
- **Word templates** - Use custom Word templates for enhanced exports
|
||||||
- **Import documents** - Import from 30+ formats (DOCX, PDF, HTML, etc.)
|
- **Import documents** - Import from 30+ formats (DOCX, PDF, HTML, etc.)
|
||||||
- **MarkItDown import** - Any file → Markdown via [Microsoft MarkItDown](https://github.com/microsoft/markitdown): PDF, DOCX, PPTX, XLSX, Outlook .msg, EPUB, images, ZIP (audio/OCR with the `[all]` extras)
|
|
||||||
- **Excel export** - Markdown tables to native .xlsx workbooks (one sheet per table)
|
|
||||||
- **AI Assistant** - Multi-provider AI help (OpenAI/Anthropic/Ollama/LM Studio): chat panel, summarize/improve/translate commands, grammar proofreading
|
|
||||||
- **Inline comments** - Anchor-based document comments in `.comments/` sidecars with F8 navigation
|
|
||||||
- **Wiki-links & Backlinks** - `[[Note]]` links with click-to-create and a "what links here?" panel (local knowledge base)
|
|
||||||
- **Crash recovery** - Session restore of open tabs and unsaved buffers after a crash
|
|
||||||
- **Version history** - Automatic pre-save snapshots with restore/diff/delete from the History panel
|
|
||||||
- **Vim mode & snippet expansion** - Vim keybindings toggle; Tab expands saved snippets
|
|
||||||
- **Quick Note** - Global scratchpad (Ctrl+Alt+Q) that appends to `notes/quick-notes.md`
|
|
||||||
- **Real PDF encryption** - Password protection, removal, and permissions actually work
|
|
||||||
- **Offline math & diagrams** - KaTeX bundled locally; PlantUML renders locally when the CLI is installed
|
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- [Node.js](https://nodejs.org/) (v16 or later)
|
- [Node.js](https://nodejs.org/) (v16 or later)
|
||||||
- [Pandoc](https://pandoc.org/installing.html) (required for export functionality)
|
- [Pandoc](https://pandoc.org/installing.html) (required for export functionality)
|
||||||
- Optional: [MarkItDown](https://github.com/microsoft/markitdown) (`pip install "markitdown[all]"`) for any-file → Markdown import
|
|
||||||
|
|
||||||
### Install Dependencies
|
### Install Dependencies
|
||||||
```bash
|
```bash
|
||||||
@@ -113,18 +96,9 @@ npm run build:linux
|
|||||||
| Redo | Ctrl+Shift+Z |
|
| Redo | Ctrl+Shift+Z |
|
||||||
| New Tab | Ctrl+T |
|
| New Tab | Ctrl+T |
|
||||||
| Close Tab | Ctrl+W |
|
| Close Tab | Ctrl+W |
|
||||||
| Toggle Preview | Ctrl+Shift+V |
|
| Toggle Preview | Ctrl+Shift+P |
|
||||||
| Zoom In | Ctrl+Shift++ |
|
| Zoom In | Ctrl+Shift++ |
|
||||||
| Zoom Out | Ctrl+Shift+- |
|
| Zoom Out | Ctrl+Shift+- |
|
||||||
| Command Palette | Ctrl+Shift+P |
|
|
||||||
| Zen Mode | F11 |
|
|
||||||
| Writing Analytics | Ctrl+Shift+A |
|
|
||||||
| Quick Note | Ctrl+Alt+Q |
|
|
||||||
| Universal Converter | Ctrl+Shift+C |
|
|
||||||
| Table Generator | Ctrl+Shift+T |
|
|
||||||
| ASCII Art Generator | Ctrl+Shift+A |
|
|
||||||
| Next Comment | F8 |
|
|
||||||
| Add Comment at Cursor | Ctrl+Alt+M |
|
|
||||||
|
|
||||||
## Themes
|
## Themes
|
||||||
|
|
||||||
@@ -166,43 +140,6 @@ Open PDF files directly in MarkdownConverter:
|
|||||||
- Rotate pages left or right
|
- Rotate pages left or right
|
||||||
- Close PDF to return to editor
|
- Close PDF to return to editor
|
||||||
|
|
||||||
## Bundled Dependencies, Legal Notices & Credits
|
|
||||||
|
|
||||||
MarkdownConverter ships as a self-contained package. Everything needed for the
|
|
||||||
core workflows is **bundled**; a few large optional tools are detected from
|
|
||||||
the system when present.
|
|
||||||
|
|
||||||
### Bundled with the app
|
|
||||||
|
|
||||||
| Component | License | Role |
|
|
||||||
|---|---|---|
|
|
||||||
| [Pandoc](https://pandoc.org) 3.9 | GPL-2.0+ (separate process) | 25+ export/import formats |
|
|
||||||
| [FFmpeg](https://ffmpeg.org) (via ffmpeg-static) | GPL-3.0+ build (separate process) | audio/video tools |
|
|
||||||
| [MarkItDown](https://github.com/microsoft/markitdown) (MIT) + embedded Python runtime (PSF) | MIT / PSF | any-file → Markdown import (PDF/DOCX/PPTX/XLSX/Outlook/EPUB/images/ZIP) |
|
|
||||||
| [sharp](https://sharp.pixelplumbing.com) + libvips | Apache-2.0 / LGPL-2.1+ (dynamic) | image tools |
|
|
||||||
| [KaTeX](https://katex.org), [marked](https://marked.js.org), [highlight.js], [DOMPurify], [mermaid], [CodeMirror 6], pdf-lib (@cantoo fork), pdfjs-dist, JSZip, simple-git | MIT / Apache-2.0 / BSD-3 / MPL-2.0 | editor, preview, PDF, Git |
|
|
||||||
| JetBrains Mono & Fira Code fonts | SIL OFL 1.1 | editor typography |
|
|
||||||
|
|
||||||
GPL-licensed tools run as **separate processes** (never linked into the app)
|
|
||||||
and their complete corresponding sources are offered in
|
|
||||||
[SOURCES.md](SOURCES.md). Full details: [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md),
|
|
||||||
also available inside the app under **Help → Third-Party Notices & Licenses**.
|
|
||||||
|
|
||||||
### Not bundled (used when installed)
|
|
||||||
|
|
||||||
LibreOffice (Office conversion), MiKTeX/TeX Live (LaTeX PDF), ImageMagick
|
|
||||||
(extra image formats), PlantUML + Java (local diagrams), Calibre (MOBI),
|
|
||||||
MarkItDown `[all]` extras (audio transcription / OCR).
|
|
||||||
|
|
||||||
### Credits
|
|
||||||
|
|
||||||
Built on open source: [Electron], [CodeMirror], [marked], [KaTeX],
|
|
||||||
[highlight.js], [DOMPurify](https://github.com/cure53/DOMPurify),
|
|
||||||
[mermaid](https://mermaid.js.org), [pdf-lib], [pdf.js](https://mozilla.github.io/pdf.js/),
|
|
||||||
[sharp]/libvips, [Pandoc], [FFmpeg], [MarkItDown] by Microsoft,
|
|
||||||
[simple-git], [JSZip], [JetBrains Mono], [Fira Code]. Thank you to all their
|
|
||||||
authors and maintainers.
|
|
||||||
|
|
||||||
## Open Source
|
## Open Source
|
||||||
|
|
||||||
MarkdownConverter is 100% open-source. All dependencies are permissively licensed:
|
MarkdownConverter is 100% open-source. All dependencies are permissively licensed:
|
||||||
@@ -225,4 +162,4 @@ Amit Haridas (amit.wh@gmail.com)
|
|||||||
|
|
||||||
## Version
|
## Version
|
||||||
|
|
||||||
v4.7.1
|
v4.1.0
|
||||||
|
|||||||
@@ -1,55 +0,0 @@
|
|||||||
# Source Code Availability (GPL / LGPL Written Offer)
|
|
||||||
|
|
||||||
MarkdownConverter distributes the following binaries built from GPL-licensed
|
|
||||||
software. Per GPL §3(b), this document is the written offer: **corresponding
|
|
||||||
source code for the exact versions listed below is available on request for
|
|
||||||
at least three years from each release**, and permanently at the referenced
|
|
||||||
public locations. Write to: amit.wh@gmail.com (or open a GitHub issue at
|
|
||||||
https://github.com/amitwh/markdown-converter/issues).
|
|
||||||
|
|
||||||
## Pandoc — GPL-2.0-or-later
|
|
||||||
|
|
||||||
- Binary shipped: `bin/pandoc` (v3.9.0.2, official upstream release, unmodified)
|
|
||||||
- SHA-256 (linux): `7d124235998ecd3cdd9a463b1e5f6691a178b6461824c29a36170a0882f05597`
|
|
||||||
- Source: <https://github.com/jgm/pandoc/archive/refs/tags/3.9.0.2.tar.gz>
|
|
||||||
- Pandoc statically links Haskell libraries (GHC ecosystem, mostly BSD-3);
|
|
||||||
their sources are included in the upstream release tarball's dependency set.
|
|
||||||
|
|
||||||
## FFmpeg — GPL-3.0-or-later (build configuration)
|
|
||||||
|
|
||||||
- Binary shipped: `ffmpeg` provided by the npm package `ffmpeg-static@5.3.0`
|
|
||||||
(Linux: johnvansickle.com build; Windows: gyan.dev; macOS: evermeet.cx —
|
|
||||||
all `--enable-gpl` builds including x264/x265, per the build banner)
|
|
||||||
- Source:
|
|
||||||
- FFmpeg: <https://ffmpeg.org/releases/> (use the release matching
|
|
||||||
`ffmpeg -version` of the shipped binary)
|
|
||||||
- Build scripts & pinned versions: <https://github.com/eugeneware/ffmpeg-static>
|
|
||||||
- x264: <https://code.videolan.org/videolan/x264> ·
|
|
||||||
x265: <https://bitbucket.org/multicoreware/x265_git/> ·
|
|
||||||
other `--enable-lib*` components: their upstream sources (all free/open)
|
|
||||||
|
|
||||||
## PyInstaller bootloader (inside the bundled MarkItDown binary) — GPL-2.0 with boot-exception
|
|
||||||
|
|
||||||
- Binary shipped: `bin/markitdown` (MarkItDown 0.1.7 frozen with PyInstaller 6.x)
|
|
||||||
- PyInstaller grants a special exception allowing the bootloader to be
|
|
||||||
embedded in non-GPL frozen applications; source anyway:
|
|
||||||
<https://github.com/pyinstaller/pyinstaller>
|
|
||||||
- Everything frozen above the bootloader (markitdown + Python packages +
|
|
||||||
CPython runtime) is permissively licensed (MIT/Apache/BSD/PSF/MPL);
|
|
||||||
see THIRD-PARTY-NOTICES.md §2 for the list.
|
|
||||||
- CPython runtime source: <https://www.python.org/downloads/source/>
|
|
||||||
(PSF License — not GPL, listed here for completeness).
|
|
||||||
|
|
||||||
## libvips (via sharp prebuilt binaries) — LGPL-2.1-or-later
|
|
||||||
|
|
||||||
- Shipped as dynamically-loaded libraries from `@img/*` prebuilts for sharp 0.35.4
|
|
||||||
- Source: <https://github.com/libvips/libvips> · prebuilt bundle sources:
|
|
||||||
<https://github.com/lovell/sharp-builds>
|
|
||||||
- LGPL compliance: the app's own source is public (MIT) and the libraries
|
|
||||||
remain separately replaceable files in the installation directory
|
|
||||||
(`node_modules/@img/`), satisfying the relinking requirement.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
_Versions and hashes above correspond to the release this file ships with;
|
|
||||||
update them when bumping bundled tool versions._
|
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
# Third-Party Notices & Licenses
|
|
||||||
|
|
||||||
MarkdownConverter (this app) is MIT-licensed. This document lists the
|
|
||||||
third-party components that are **distributed with** the application, their
|
|
||||||
licenses, and where to obtain source code. Full license texts for the
|
|
||||||
copyleft and font licenses referenced here are in the `third-party-licenses/`
|
|
||||||
folder shipped alongside this file (and in the source repository).
|
|
||||||
|
|
||||||
This product includes software developed by third parties under the licenses
|
|
||||||
below. Copyright and license notices are reproduced verbatim or referenced
|
|
||||||
per each license's terms.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 1. This application
|
|
||||||
|
|
||||||
**MarkdownConverter** — Copyright (C) 2024-2025 ConcreteInfo (Amit Haridas) —
|
|
||||||
MIT License. See the repository `LICENSE` file.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 2. Bundled external binaries
|
|
||||||
|
|
||||||
These run as separate operating-system processes, launched via `execFile`
|
|
||||||
with literal argv (never a shell, never linked into the app).
|
|
||||||
|
|
||||||
| Component | Version | License | Notes |
|
|
||||||
|---|---|---|---|
|
|
||||||
| Pandoc | 3.9.0.2 | GPL-2.0-or-later | Downloaded at build time by `scripts/download-tools.js` (SHA-256 pinned); license: [GPL-2.0](third-party-licenses/GPL-2.0.txt) |
|
|
||||||
| FFmpeg | bundled by `ffmpeg-static` 5.3.0 | **GPL-3.0-or-later build** (`--enable-gpl --enable-libx264/x265`) | License text: <https://ffmpeg.org/legal.html>; source offer below |
|
|
||||||
| MarkItDown | 0.1.7 (+ Python deps) | MIT | Microsoft's any-file→Markdown importer, frozen with PyInstaller by `scripts/bundle-markitdown.js`; includes an embedded CPython runtime (PSF license) |
|
|
||||||
| sharp / libvips prebuilt binaries | 0.35.4 | Apache-2.0 / **LGPL-2.1-or-later** (libvips) | Dynamically loaded native addon; LGPL compliance: this app's full MIT source is public, enabling relinking; license: [LGPL-2.1](third-party-licenses/LGPL-2.1.txt) |
|
|
||||||
| KaTeX (CSS + fonts) | 0.18.5 | MIT | `assets/katex/` |
|
|
||||||
| JetBrains Mono, Fira Code fonts | — | SIL OFL 1.1 | `assets/fonts/`; license: [OFL-1.1](third-party-licenses/OFL-1.1.txt) |
|
|
||||||
| Electron | 41.x | MIT | and its bundled Chromium (BSD-style licenses) / Node.js (MIT) / OpenSSL (Apache-2.0) — see <https://www.electronjs.org/blog/electron-licensing> |
|
|
||||||
|
|
||||||
### GPL source availability (GPL §3 offer)
|
|
||||||
|
|
||||||
Corresponding source for every GPL-licensed binary distributed with this app
|
|
||||||
is available on written request and from these permanent locations — see
|
|
||||||
**[SOURCES.md](SOURCES.md)** for exact versions and URLs.
|
|
||||||
|
|
||||||
### Python packages inside the bundled MarkItDown binary
|
|
||||||
|
|
||||||
The frozen MarkItDown binary embeds CPython and (each MIT/Apache-2.0/BSD-3/
|
|
||||||
PSF/MPL-2.0 licensed unless noted): markitdown, onnxruntime (MIT), numpy
|
|
||||||
(BSD-3), magika (Apache-2.0), beautifulsoup4 / soupsieve (MIT), requests
|
|
||||||
(Apache-2.0) + urllib3/idna/charset-normalizer, certifi (MPL-2.0),
|
|
||||||
markdownify, defusedxml (PSF), protobuf (BSD-3), flatbuffers (Apache-2.0),
|
|
||||||
pdfminer.six (MIT), python-docx, python-pptx, openpyxl, extract-msg,
|
|
||||||
markdown-it-py / mdurl, pyinstaller (GPL-2.0-with-exception — build tool
|
|
||||||
only; its bootloader is embedded, source offer included in SOURCES.md),
|
|
||||||
Packaging, six, click, chardet (LGPL — dynamically loadable Python module).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 3. npm dependencies shipped in the app (runtime)
|
|
||||||
|
|
||||||
| Package | Version | License |
|
|
||||||
|---|---|---|
|
|
||||||
| @cantoo/pdf-lib | 2.9.1 | MIT |
|
|
||||||
| @codemirror/* (autocomplete, commands, lang-*, language, lint, search, state, theme-one-dark, view), codemirror | 6.x | MIT |
|
|
||||||
| @replit/codemirror-vim | 6.4.0 | MIT |
|
|
||||||
| core-util-is | 1.0.3 | MIT |
|
|
||||||
| docx | 9.6.1 | MIT |
|
|
||||||
| dompurify | 3.4.14 | (MPL-2.0 OR Apache-2.0) |
|
|
||||||
| electron-store | 10.1.0 | MIT |
|
|
||||||
| ffmpeg-static | 5.3.0 | GPL-3.0-or-later (binary; see §2) |
|
|
||||||
| highlight.js | 11.11.1 | BSD-3-Clause |
|
|
||||||
| html2pdf.js | 0.14.0 | MIT |
|
|
||||||
| jszip | 3.10.1 | (MIT OR GPL-3.0-or-later) |
|
|
||||||
| katex | 0.18.5 | MIT |
|
|
||||||
| marked, marked-footnote, marked-highlight | 17.x / 1.4 / 2.2 | MIT |
|
|
||||||
| mermaid | 11.17.2 | MIT |
|
|
||||||
| pdfjs-dist | 5.5.207 | Apache-2.0 |
|
|
||||||
| pdfkit | 0.17.2 | MIT |
|
|
||||||
| pizzip | 3.2.0 | (MIT OR GPL-3.0) |
|
|
||||||
| sharp | 0.35.4 | Apache-2.0 (+ LGPL libvips binaries; see §2) |
|
|
||||||
| simple-git | 3.36.0 | MIT |
|
|
||||||
| tslib | 2.8.1 | 0BSD |
|
|
||||||
|
|
||||||
(Development-only dependencies — electron-builder, eslint, prettier, jest,
|
|
||||||
cross-env, @testing-library/dom — are not distributed with the application.)
|
|
||||||
|
|
||||||
## 4. Optional external tools (NOT bundled)
|
|
||||||
|
|
||||||
These are detected and used when the user installs them; no copy is
|
|
||||||
distributed with this app, so no redistribution obligations arise:
|
|
||||||
|
|
||||||
- **LibreOffice** (MPL-2.0) — enhanced Office-format conversion
|
|
||||||
- **MiKTeX / TeX Live** (LPPL/GPL per component) — LaTeX PDF export
|
|
||||||
- **ImageMagick** (Apache-2.0-style) — extra image formats in the universal converter
|
|
||||||
- **PlantUML** (GPL-3.0) + a Java runtime — local diagram rendering
|
|
||||||
- **Calibre** (`ebook-convert`) — MOBI export
|
|
||||||
- **System MarkItDown with `[all]` extras** — audio transcription / OCR
|
|
||||||
|
|
||||||
## 5. Trademarks
|
|
||||||
|
|
||||||
Product names used to describe compatibility (Pandoc, FFmpeg, LibreOffice,
|
|
||||||
MarkItDown, Microsoft, Excel, Word, PowerPoint…) are trademarks of their
|
|
||||||
respective owners and are not affiliated with this project.
|
|
||||||
|
|
||||||
## 6. License texts
|
|
||||||
|
|
||||||
See the `third-party-licenses/` directory: `GPL-2.0.txt`, `LGPL-2.1.txt`,
|
|
||||||
`MPL-2.0.txt`, `Apache-2.0.txt`, `OFL-1.1.txt`, `PSF-Python.txt`. MIT and
|
|
||||||
BSD-3-Clause texts are short and reproduced in each package's own repository;
|
|
||||||
per-package LICENSE files also ship inside `node_modules/` in source form.
|
|
||||||
@@ -1,157 +1,5 @@
|
|||||||
# PanConverter - Updates & Changelog
|
# PanConverter - Updates & Changelog
|
||||||
|
|
||||||
## Version 4.7.1 (2026-09-05)
|
|
||||||
|
|
||||||
### New: Export Themes (Word + PDF)
|
|
||||||
- Theme picker in the export dialog (basic and advanced mode) for PDF and DOCX:
|
|
||||||
**Default (Pandoc), Modern, Classic, Sepia, Minimal, Elegant**
|
|
||||||
- PDF: LaTeX header recolors/reformats headings + links (xcolor/titlesec,
|
|
||||||
core-TeX packages only); DOCX: styles.xml surgery recolors Heading1-6/Title/
|
|
||||||
Subtitle/Hyperlink and swaps heading/body fonts
|
|
||||||
- Themes persist in export presets; unknown ids in old presets fall back to
|
|
||||||
Default instead of failing the export
|
|
||||||
|
|
||||||
### Branding
|
|
||||||
- New M↓ brand identity: app icons, favicons, tray icon, welcome mark,
|
|
||||||
README wordmark (vector kit in assets/markdown-converter-assets/)
|
|
||||||
|
|
||||||
### Fixes
|
|
||||||
- **Windows**: pdfjs text/image extraction failed on Windows —
|
|
||||||
standardFontDataUrl is now a proper file:// URL (raw backslash paths
|
|
||||||
failed pdfjs's trailing-slash URL validation)
|
|
||||||
- **Windows**: sharp temp-file cleanup (EPERM retry), path-separator test
|
|
||||||
assertions, and pdfjs test timeouts fixed — the Windows CI job is green
|
|
||||||
- FiraCode tooling downloads pinned to the immutable 6.2 release;
|
|
||||||
.gitattributes stops CRLF checkout rewriting hash-pinned files
|
|
||||||
- macOS pandoc extractor locates the binary in the archive (layout changed)
|
|
||||||
- Packaged apps resolve bundled pandoc/markitdown next to the executable
|
|
||||||
(resourcesPath lookup was wrong since 4.5 — packaged builds silently used
|
|
||||||
system pandoc)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Version 4.7.0 (2026-09-05)
|
|
||||||
|
|
||||||
### Bundling & Legal Compliance
|
|
||||||
- **MarkItDown is now bundled**: `npm run bundle:markitdown` freezes Microsoft's
|
|
||||||
markitdown (MIT) + embedded Python runtime into a single ~75MB per-platform
|
|
||||||
binary (`bin/<platform>/markitdown`) via PyInstaller (ML extras excluded);
|
|
||||||
the app prefers the bundled binary and falls back to system installs
|
|
||||||
- Packaging copies the bundled markitdown for Windows/macOS/Linux alongside Pandoc
|
|
||||||
- **THIRD-PARTY-NOTICES.md** — full license inventory of everything distributed
|
|
||||||
(bundled binaries, npm runtime deps, fonts, embedded Python packages)
|
|
||||||
- **SOURCES.md** — GPL §3(b) written source offer for Pandoc / FFmpeg (GPL build) /
|
|
||||||
PyInstaller bootloader, with pinned versions + SHA-256; LGPL relinking note for libvips
|
|
||||||
- **third-party-licenses/** — canonical texts: GPL-2.0, LGPL-2.1, MPL-2.0,
|
|
||||||
Apache-2.0, OFL-1.1, PSF-Python
|
|
||||||
- **Help → Third-Party Notices & Licenses** — in-app viewer for both documents
|
|
||||||
- **download-tools.js** now SHA-256 pins and verifies every downloaded artifact
|
|
||||||
(post-download and against the cache on every run; hard-fails on mismatch)
|
|
||||||
- README gains a "Bundled Dependencies, Legal Notices & Credits" section
|
|
||||||
- Large optional tools intentionally NOT bundled (documented): LibreOffice,
|
|
||||||
MiKTeX/TeX Live, ImageMagick, PlantUML+JRE, Calibre
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Version 4.6.1 (2026-09-05)
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
- **MarkItDown import** — "File → Import with MarkItDown (Any Format)…" embeds
|
|
||||||
Microsoft's [markitdown](https://github.com/microsoft/markitdown) (MIT) as an
|
|
||||||
any-file → Markdown path: PDF, DOCX, PPTX, XLSX, Outlook .msg/.eml, EPUB,
|
|
||||||
images, CSV/JSON/XML, ZIP; audio transcription and OCR with the `[all]` extras
|
|
||||||
- Command auto-resolution: `markitdown` binary, then `python -m markitdown` /
|
|
||||||
`python3 -m markitdown` (probed once, cached)
|
|
||||||
- Same SEC-1 argv discipline as Pandoc (execFile only, paths never through a shell),
|
|
||||||
50MB input cap, 120s timeout, path-sanitized errors that surface markitdown's
|
|
||||||
actionable `pip install 'markitdown[...]'` hints
|
|
||||||
- Output written next to the source as `<name>.md` (numeric suffix instead of
|
|
||||||
overwriting) and opened in a new tab; `markitdown:available` / `markitdown:convert`
|
|
||||||
IPC for future renderer flows
|
|
||||||
- **AI Assistant: Anthropic-compatible provider** — any base URL speaking the
|
|
||||||
Anthropic messages schema (LiteLLM proxies, Bedrock gateways, local servers);
|
|
||||||
x-api-key + Bearer auth, keyless proxies supported, tolerates bases with or
|
|
||||||
without a trailing `/v1`
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
- File → Open PDF crashed the PDF editor (null operation matched no section; now
|
|
||||||
defaults to Merge)
|
|
||||||
- Backlinks panel required the wrong module path (failed at registration)
|
|
||||||
- writing-studio engines/panels now await their IPC-backed settings/file backends
|
|
||||||
(eliminates `JSON.parse("[object Promise]")` crashes)
|
|
||||||
- Manuscript panel's window.prompt (unsupported in Electron) replaced with an
|
|
||||||
inline dialog; collaboration comment store made async to match its IO
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Version 4.6.0 (2026-09-05)
|
|
||||||
|
|
||||||
### New Features
|
|
||||||
|
|
||||||
#### AI Assistant Plugin (multi-provider)
|
|
||||||
- Chat sidebar panel with rolling conversation history and insert-reply-into-document
|
|
||||||
- Providers: OpenAI, Anthropic, Ollama, LM Studio, and any OpenAI-compatible endpoint
|
|
||||||
- All provider traffic proxied through the main process — API keys never enter the renderer and the CSP stays closed to AI endpoints
|
|
||||||
- Commands: AI Summarize / Improve / Explain / Translate selection
|
|
||||||
- Answers the writing-studio `ai:analyze` contract, finally enabling the Proofread panel
|
|
||||||
|
|
||||||
#### Collaboration Plugin (inline comments)
|
|
||||||
- Anchor-based comments stored in `.comments/` sidecar files (never exported, never committed)
|
|
||||||
- Comments sidebar panel: add at cursor, list, resolve, delete, jump to anchor
|
|
||||||
- Drift detection flags moved/edited anchors; F8 navigates to the next open comment
|
|
||||||
|
|
||||||
#### Local Knowledge Base (wiki-links + backlinks)
|
|
||||||
- `[[Note]]`, `[[Note|alias]]`, `[[Note#section]]` render as links in the preview (code blocks excluded)
|
|
||||||
- Clicking a wiki-link opens the note or offers to create it
|
|
||||||
- Backlinks sidebar panel scans the folder (bounded BFS) for documents linking to the current one
|
|
||||||
|
|
||||||
#### Crash Recovery / Session Restore
|
|
||||||
- Open tabs (paths + unsaved buffer content) snapshotted to localStorage, debounced on edits, on tab changes, on unload, and once a minute
|
|
||||||
- Restore prompt on launch with per-tab restore, clean-fresh option, and 2MB content budget
|
|
||||||
|
|
||||||
#### Document Version History
|
|
||||||
- Every save snapshots the previous on-disk content to `<userData>/versions/`
|
|
||||||
- History sidebar panel: list, restore (with safety snapshot), unified diff vs. current, delete, manual "save version now"
|
|
||||||
- Per-document pruning (20 versions), path-hash storage, id-validated reads
|
|
||||||
|
|
||||||
#### Editor
|
|
||||||
- Vim keybindings (View → Vim Mode, persisted, live toggle via CodeMirror Compartment)
|
|
||||||
- Snippet Tab-expansion: type a snippet name and press Tab to insert it
|
|
||||||
- Zen Mode word-goal setter (the HUD progress bar finally has UI)
|
|
||||||
|
|
||||||
#### Export / Conversion
|
|
||||||
- **Real PDF encryption**: pdf-lib swapped for @cantoo/pdf-lib — encrypt/decrypt/permissions now actually work (UI auto-enables via the capability probe)
|
|
||||||
- **XLSX export**: markdown tables → native Excel workbook, one sheet per table (no Pandoc needed)
|
|
||||||
- **ODT headers/footers + page size**: real ODF styles.xml patching replaces the empty stub
|
|
||||||
- **Local PlantUML rendering**: diagrams render on-machine via the `plantuml` CLI when installed; plantuml.com stays as fallback
|
|
||||||
- **KaTeX bundled locally** (CSS + fonts): math renders offline, no CDN calls
|
|
||||||
- Writing heatmap (GitHub-style 30-day grid) in the writing-studio Goals panel
|
|
||||||
|
|
||||||
#### Platform
|
|
||||||
- Quick Note global scratchpad (Ctrl+Alt+Q, works when unfocused; appends to `notes/quick-notes.md`)
|
|
||||||
- Deep link protocol `markdownconverter://open?path=…`
|
|
||||||
- REPL confirmation dialog before first code execution per language per session (unsandboxed-execution guard rail)
|
|
||||||
- Writing-studio's four sidebar panels (Manuscript/Goals/Snapshots/Proofread) are now actually wired with rail icons
|
|
||||||
- Plugin sidebar panels get automatic rail icons via `registerPanel({icon})`
|
|
||||||
|
|
||||||
### Bug Fixes
|
|
||||||
- `Ctrl+Shift+P` collision: PDF (Enhanced) export now `Ctrl+Alt+Shift+P`; Command Palette keeps `Ctrl+Shift+P`
|
|
||||||
- Universal Converter's Pandoc tool no longer always reports "not installed" (`checkConverterAvailable` gained a pandoc case with bundled-binary check)
|
|
||||||
- CLI headless export: removed dangling `--css` / `--reference-doc` flags that made pandoc exit with an error; `--self-contained` replaced with `--standalone` (Pandoc 3.x)
|
|
||||||
- Removed dead "Open Export Options Dialog…" button from the converter dialog
|
|
||||||
- Removed duplicate `styles-zen.css` include
|
|
||||||
|
|
||||||
### Security
|
|
||||||
- AI provider requests carry size caps (200KB prompt), timeouts (120s), and user-safe error surfaces
|
|
||||||
- Version-history reads validate ids against traversal; history listing requires a valid document path
|
|
||||||
- PlantUML local rendering removes the diagram-text exfiltration path when a local CLI exists (CVE-MC-007 follow-up)
|
|
||||||
|
|
||||||
### Tests
|
|
||||||
- New suites: OdtStyling, AiProviders, ai-assistant prompts, collaboration comment-store, wiki-links/backlinks, session-store, XlsxExporter, VersionHistory
|
|
||||||
- PDFOperations encryption tests rewritten for the real-encryption reality
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Version 4.0.0 (2026-03-04)
|
## Version 4.0.0 (2026-03-04)
|
||||||
|
|
||||||
### Major Changes
|
### Major Changes
|
||||||
|
|||||||
|
After Width: | Height: | Size: 869 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1,93 +0,0 @@
|
|||||||
Copyright (c) 2014, The Fira Code Project Authors (https://github.com/tonsky/FiraCode)
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
http://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
@@ -1,93 +0,0 @@
|
|||||||
Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono)
|
|
||||||
|
|
||||||
This Font Software is licensed under the SIL Open Font License, Version 1.1.
|
|
||||||
This license is copied below, and is also available with a FAQ at:
|
|
||||||
https://scripts.sil.org/OFL
|
|
||||||
|
|
||||||
|
|
||||||
-----------------------------------------------------------
|
|
||||||
SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
|
|
||||||
-----------------------------------------------------------
|
|
||||||
|
|
||||||
PREAMBLE
|
|
||||||
The goals of the Open Font License (OFL) are to stimulate worldwide
|
|
||||||
development of collaborative font projects, to support the font creation
|
|
||||||
efforts of academic and linguistic communities, and to provide a free and
|
|
||||||
open framework in which fonts may be shared and improved in partnership
|
|
||||||
with others.
|
|
||||||
|
|
||||||
The OFL allows the licensed fonts to be used, studied, modified and
|
|
||||||
redistributed freely as long as they are not sold by themselves. The
|
|
||||||
fonts, including any derivative works, can be bundled, embedded,
|
|
||||||
redistributed and/or sold with any software provided that any reserved
|
|
||||||
names are not used by derivative works. The fonts and derivatives,
|
|
||||||
however, cannot be released under any other type of license. The
|
|
||||||
requirement for fonts to remain under this license does not apply
|
|
||||||
to any document created using the fonts or their derivatives.
|
|
||||||
|
|
||||||
DEFINITIONS
|
|
||||||
"Font Software" refers to the set of files released by the Copyright
|
|
||||||
Holder(s) under this license and clearly marked as such. This may
|
|
||||||
include source files, build scripts and documentation.
|
|
||||||
|
|
||||||
"Reserved Font Name" refers to any names specified as such after the
|
|
||||||
copyright statement(s).
|
|
||||||
|
|
||||||
"Original Version" refers to the collection of Font Software components as
|
|
||||||
distributed by the Copyright Holder(s).
|
|
||||||
|
|
||||||
"Modified Version" refers to any derivative made by adding to, deleting,
|
|
||||||
or substituting -- in part or in whole -- any of the components of the
|
|
||||||
Original Version, by changing formats or by porting the Font Software to a
|
|
||||||
new environment.
|
|
||||||
|
|
||||||
"Author" refers to any designer, engineer, programmer, technical
|
|
||||||
writer or other person who contributed to the Font Software.
|
|
||||||
|
|
||||||
PERMISSION & CONDITIONS
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of the Font Software, to use, study, copy, merge, embed, modify,
|
|
||||||
redistribute, and sell modified and unmodified copies of the Font
|
|
||||||
Software, subject to the following conditions:
|
|
||||||
|
|
||||||
1) Neither the Font Software nor any of its individual components,
|
|
||||||
in Original or Modified Versions, may be sold by itself.
|
|
||||||
|
|
||||||
2) Original or Modified Versions of the Font Software may be bundled,
|
|
||||||
redistributed and/or sold with any software, provided that each copy
|
|
||||||
contains the above copyright notice and this license. These can be
|
|
||||||
included either as stand-alone text files, human-readable headers or
|
|
||||||
in the appropriate machine-readable metadata fields within text or
|
|
||||||
binary files as long as those fields can be easily viewed by the user.
|
|
||||||
|
|
||||||
3) No Modified Version of the Font Software may use the Reserved Font
|
|
||||||
Name(s) unless explicit written permission is granted by the corresponding
|
|
||||||
Copyright Holder. This restriction only applies to the primary font name as
|
|
||||||
presented to the users.
|
|
||||||
|
|
||||||
4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
|
|
||||||
Software shall not be used to promote, endorse or advertise any
|
|
||||||
Modified Version, except to acknowledge the contribution(s) of the
|
|
||||||
Copyright Holder(s) and the Author(s) or with their explicit written
|
|
||||||
permission.
|
|
||||||
|
|
||||||
5) The Font Software, modified or unmodified, in part or in whole,
|
|
||||||
must be distributed entirely under this license, and must not be
|
|
||||||
distributed under any other license. The requirement for fonts to
|
|
||||||
remain under this license does not apply to any document created
|
|
||||||
using the Font Software.
|
|
||||||
|
|
||||||
TERMINATION
|
|
||||||
This license becomes null and void if any of the above conditions are
|
|
||||||
not met.
|
|
||||||
|
|
||||||
DISCLAIMER
|
|
||||||
THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
|
|
||||||
OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
|
|
||||||
COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
|
|
||||||
DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
|
|
||||||
OTHER DEALINGS IN THE FONT SOFTWARE.
|
|
||||||
|
After Width: | Height: | Size: 361 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 885 KiB |
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 885 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 655 B After Width: | Height: | Size: 606 B |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 38 KiB After Width: | Height: | Size: 206 KiB |
|
Before Width: | Height: | Size: 4.1 KiB After Width: | Height: | Size: 4.9 KiB |
@@ -1,95 +0,0 @@
|
|||||||
# Markdown Converter — Brand Assets
|
|
||||||
|
|
||||||
Visual identity for [markdown-converter](https://github.com/amitwh/markdown-converter): a cross-platform Markdown editor & document converter powered by Pandoc.
|
|
||||||
|
|
||||||
## Concept
|
|
||||||
|
|
||||||
The mark is a stylized **M** whose right descender becomes a downward chevron — a literal "**M↓**" for **Markdown**, suggesting the source document flowing downward into rendered output (PDF, DOCX, PPTX, …).
|
|
||||||
|
|
||||||
The palette is a vibrant orange-to-deep-orange gradient (`#FB923C → #C2410C`) on a white mark — warm, energetic, distinctive. The mark itself is **white** on light surfaces, and a luminous peach-to-orange gradient (`#FFEDD5 → #FB923C`) on dark surfaces.
|
|
||||||
|
|
||||||
## Files
|
|
||||||
|
|
||||||
### App icon (vector, primary)
|
|
||||||
|
|
||||||
These are **true SVG app icons** — clean vector paths, no rasters. Drop them straight into a macOS/Windows/Linux app bundle, a PWA manifest, an iOS asset catalog, an Electron build, or any HTML page.
|
|
||||||
|
|
||||||
| File | Use it for |
|
|
||||||
| --- | --- |
|
|
||||||
| `app-icon.svg` | **Primary app icon.** Emerald→teal vertical gradient, subtle white highlight upper-left, white M↓ mark. |
|
|
||||||
| `app-icon-dark.svg` | **Dark-mode app icon.** Charcoal gradient background, soft teal radial glow upper-left, mint-to-emerald gradient on the M↓ mark. |
|
|
||||||
| `app-icon-flat.svg` | **Flat solid variant.** Single emerald background, white M↓ mark. Use when you can't render gradients (print, stickers, single-color contexts). |
|
|
||||||
|
|
||||||
### Logo (wordmark)
|
|
||||||
|
|
||||||
| File | Use it for |
|
|
||||||
| --- | --- |
|
|
||||||
| `logo-horizontal.jpg` (2752×1536) | High-res raster master. README hero, press kit. |
|
|
||||||
| `logo-horizontal-1600w.jpg` (1600×893) | Web-ready compressed version. |
|
|
||||||
| `logo-horizontal.svg` | Vector wordmark. Use in HTML, CSS, anywhere that needs to scale. |
|
|
||||||
|
|
||||||
### Vector mark (for code & inline use)
|
|
||||||
|
|
||||||
| File | Use it for |
|
|
||||||
| --- | --- |
|
|
||||||
| `mark.svg` | Gradient SVG mark. Drop into HTML, use as a UI element, or rasterize at any size. |
|
|
||||||
| `mark-mono.svg` | Monochrome SVG. Uses `currentColor` — style it from CSS (`color: white;`) for any single-color context. |
|
|
||||||
| `mark-standalone.jpg` (2048×2048) | Raster M↓ on white, for places that need a PNG (GitHub avatar, doc thumbnails). |
|
|
||||||
|
|
||||||
### Favicons (rasterized from `app-icon.svg`)
|
|
||||||
|
|
||||||
In the `favicons/` directory:
|
|
||||||
|
|
||||||
| File | Use it for |
|
|
||||||
| --- | --- |
|
|
||||||
| `favicon.ico` | Legacy `.ico` (16/32/48/64 embedded). Drop at the site root. |
|
|
||||||
| `favicon-16x16.png`, `favicon-32x32.png`, `favicon-48x48.png` | Standard browser favicons. |
|
|
||||||
| `apple-touch-icon.png` (180×180) | iOS home screen & "Add to Home Screen". |
|
|
||||||
| `icon-192.png`, `icon-512.png` | Android home screen, PWA manifest, web app. |
|
|
||||||
|
|
||||||
### Social preview
|
|
||||||
|
|
||||||
| File | Use it for |
|
|
||||||
| --- | --- |
|
|
||||||
| `og-social-preview-1200x630.jpg` | **GitHub social preview** — set as the repository's social card image (Settings → Social preview). Also works as Open Graph / Twitter Card. |
|
|
||||||
|
|
||||||
## Usage in the repo
|
|
||||||
|
|
||||||
Drop the vector icons + favicon set into the repo root or a `/brand` folder, then in `README.md`:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||
<p align="left">
|
|
||||||
<img src="./brand/app-icon.svg" width="80" alt="Markdown Converter">
|
|
||||||
</p>
|
|
||||||
```
|
|
||||||
|
|
||||||
For the favicon, in `index.html` (or any HTML site):
|
|
||||||
|
|
||||||
```html
|
|
||||||
<link rel="icon" type="image/x-icon" href="/favicon.ico">
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
|
||||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
|
||||||
```
|
|
||||||
|
|
||||||
For an Electron app, point `build.icon` at the SVG (or a 512×512 PNG export):
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"build": {
|
|
||||||
"icon": "brand/icon-512.png"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Color tokens
|
|
||||||
|
|
||||||
```
|
|
||||||
--mc-orange-400: #FB923C /* gradient start (light) */
|
|
||||||
--mc-orange-700: #C2410C /* gradient end (light) */
|
|
||||||
--mc-orange-500: #F97316 /* flat / accent */
|
|
||||||
--mc-peach-100: #FFEDD5 /* dark-mode mark start */
|
|
||||||
--mc-orange-300: #FDBA74 /* dark-mode mark mid */
|
|
||||||
--mc-ink-900: #0F172A /* primary text */
|
|
||||||
--mc-ink-500: #475569 /* secondary text */
|
|
||||||
--mc-ink-400: #94A3B8 /* tagline / muted */
|
|
||||||
```
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon (dark)">
|
|
||||||
<title>Markdown Converter (dark)</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient id="darkBg" x1="0" y1="0" x2="0" y2="1024" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop offset="0%" stop-color="#1C1917"/>
|
|
||||||
<stop offset="100%" stop-color="#0C0A09"/>
|
|
||||||
</linearGradient>
|
|
||||||
<radialGradient id="darkGlow" cx="280" cy="180" r="780" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop offset="0%" stop-color="#EA580C" stop-opacity="0.65"/>
|
|
||||||
<stop offset="60%" stop-color="#9A3412" stop-opacity="0.15"/>
|
|
||||||
<stop offset="100%" stop-color="#9A3412" stop-opacity="0"/>
|
|
||||||
</radialGradient>
|
|
||||||
<linearGradient id="darkMark" x1="0" y1="180" x2="0" y2="844" gradientUnits="userSpaceOnUse">
|
|
||||||
<stop offset="0%" stop-color="#FFEDD5"/>
|
|
||||||
<stop offset="100%" stop-color="#FB923C"/>
|
|
||||||
</linearGradient>
|
|
||||||
</defs>
|
|
||||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#darkBg)"/>
|
|
||||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#darkGlow)"/>
|
|
||||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="url(#darkMark)" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
|
||||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
|
||||||
<polyline points="22,18 44.5,56 67,18"/>
|
|
||||||
<polyline points="48,60 63,76 78,60"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.4 KiB |
@@ -1,11 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon (flat)">
|
|
||||||
<title>Markdown Converter (flat)</title>
|
|
||||||
<rect width="1024" height="1024" rx="224" ry="224" fill="#F97316"/>
|
|
||||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="#FFFFFF" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
|
||||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
|
||||||
<polyline points="22,18 44.5,56 67,18"/>
|
|
||||||
<polyline points="48,60 63,76 78,60"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 609 B |
@@ -1,22 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" role="img" aria-label="Markdown Converter app icon">
|
|
||||||
<title>Markdown Converter</title>
|
|
||||||
<defs>
|
|
||||||
<linearGradient id="iconBg" x1="0" y1="0" x2="0" y2="1">
|
|
||||||
<stop offset="0%" stop-color="#FB923C"/>
|
|
||||||
<stop offset="100%" stop-color="#C2410C"/>
|
|
||||||
</linearGradient>
|
|
||||||
<radialGradient id="iconHighlight" cx="0.28" cy="0.18" r="0.55">
|
|
||||||
<stop offset="0%" stop-color="#FFFFFF" stop-opacity="0.28"/>
|
|
||||||
<stop offset="60%" stop-color="#FFFFFF" stop-opacity="0"/>
|
|
||||||
</radialGradient>
|
|
||||||
</defs>
|
|
||||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#iconBg)"/>
|
|
||||||
<rect width="1024" height="1024" rx="224" ry="224" fill="url(#iconHighlight)"/>
|
|
||||||
<g transform="translate(154, 176) scale(7.16)" fill="none" stroke="#FFFFFF" stroke-width="9" stroke-linecap="round" stroke-linejoin="round">
|
|
||||||
<line x1="26" y1="22" x2="26" y2="72"/>
|
|
||||||
<line x1="63" y1="22" x2="63" y2="75"/>
|
|
||||||
<polyline points="22,18 44.5,56 67,18"/>
|
|
||||||
<polyline points="48,60 63,76 78,60"/>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 12 KiB |
|
Before Width: | Height: | Size: 8.5 KiB |
|
Before Width: | Height: | Size: 724 B |
|
Before Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 9.0 KiB |