mirror of
https://github.com/amitwh/markdown-converter.git
synced 2026-08-02 18:10:18 +05:30
Compare commits
47
Commits
react-electron
...
v1.7.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9f15a02511 | ||
|
|
9799b95cea | ||
|
|
83150eea88 | ||
|
|
9b2b94ad74 | ||
|
|
17c32f0b7d | ||
|
|
b93129bc44 | ||
|
|
b23e60a704 | ||
|
|
c559b34f3e | ||
|
|
a780f2984a | ||
|
|
0c9961d412 | ||
|
|
ed7a80f99e | ||
|
|
18b7d82610 | ||
|
|
cd1f7ac37d | ||
|
|
7b8a94150a | ||
|
|
2a12a1b034 | ||
|
|
2bc3989c00 | ||
|
|
f50ffe8ed2 | ||
|
|
5376bddc59 | ||
|
|
978e642f0c | ||
|
|
00749ac52c | ||
|
|
d3b67b1388 | ||
|
|
35310beccf | ||
|
|
e1f0aafa88 | ||
|
|
aac496923e | ||
|
|
256f944b88 | ||
|
|
dbe57d2fad | ||
|
|
9a45849003 | ||
|
|
dfb603c2ea | ||
|
|
fda173d9a1 | ||
|
|
ddababf284 | ||
|
|
376fa00b08 | ||
|
|
5cbcfa466d | ||
|
|
328451f88d | ||
|
|
1b10a39b15 | ||
|
|
7fe53b4b9c | ||
|
|
edb163eab4 | ||
|
|
7131d1a38e | ||
|
|
6d3813e5e9 | ||
|
|
bfe362245d | ||
|
|
0d21ddbf15 | ||
|
|
7b5165bcb1 | ||
|
|
5c5cffed83 | ||
|
|
becfec5ae6 | ||
|
|
bd38c5342d | ||
|
|
f3e829ca63 | ||
|
|
b0a96f680a | ||
|
|
a6da95b057 |
@@ -0,0 +1,33 @@
|
|||||||
|
{
|
||||||
|
"permissions": {
|
||||||
|
"allow": [
|
||||||
|
"Bash(git checkout:*)",
|
||||||
|
"Bash(npm install)",
|
||||||
|
"Bash(npm run build:*)",
|
||||||
|
"Bash(rmdir:*)",
|
||||||
|
"Bash(powershell:*)",
|
||||||
|
"Bash(npx electron-builder:*)",
|
||||||
|
"Bash(dir dist)",
|
||||||
|
"Bash(git tag:*)",
|
||||||
|
"Bash(git push:*)",
|
||||||
|
"Bash(gh release create:*)",
|
||||||
|
"Bash(gh auth:*)",
|
||||||
|
"Bash(gh release delete:*)",
|
||||||
|
"Bash(gh release list:*)",
|
||||||
|
"Bash(gh release upload:*)",
|
||||||
|
"Bash(npm install:*)",
|
||||||
|
"Bash(npm uninstall:*)",
|
||||||
|
"Bash(git add:*)",
|
||||||
|
"Bash(git commit:*)",
|
||||||
|
"Bash(npm start)",
|
||||||
|
"Read(//h/**)",
|
||||||
|
"Bash(cd:*)",
|
||||||
|
"Bash(npm run build:win-unsigned:*)",
|
||||||
|
"Bash(dir:*)",
|
||||||
|
"Bash(git merge:*)",
|
||||||
|
"Bash(timeout:*)",
|
||||||
|
"Bash(findstr:*)"
|
||||||
|
],
|
||||||
|
"deny": []
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
name: New MCP server
|
||||||
|
version: 0.0.1
|
||||||
|
schema: v1
|
||||||
|
mcpServers:
|
||||||
|
- name: New MCP server
|
||||||
|
command: npx
|
||||||
|
args:
|
||||||
|
- -y
|
||||||
|
- <your-mcp-server>
|
||||||
|
env: {}
|
||||||
@@ -1,189 +1,569 @@
|
|||||||
# Pan Converter
|
# PanConverter - Claude Development Guide
|
||||||
|
|
||||||
## Overview
|
## Project Overview
|
||||||
Pan Converter is a cross-platform desktop application for editing and converting Markdown files using Pandoc. It features a rich markdown editor with live preview, multiple themes, and support for exporting to various formats.
|
|
||||||
|
|
||||||
## Features
|
**PanConverter** is a cross-platform Markdown editor and converter powered by Pandoc, built with Electron. It provides professional-grade editing capabilities with comprehensive export options.
|
||||||
- **Markdown Editor**: Full-featured editor with syntax highlighting
|
|
||||||
- **Live Preview**: Real-time preview of your markdown content
|
|
||||||
- **Multiple Themes**: Light, Dark, Solarized, Monokai, and GitHub themes
|
|
||||||
- **Format Conversion**: Export to HTML, PDF, DOCX, LaTeX, RTF, ODT, and EPUB using Pandoc
|
|
||||||
- **Cross-Platform**: Runs on Windows, macOS, and Linux
|
|
||||||
- **Auto-Save**: Automatic saving every 30 seconds
|
|
||||||
|
|
||||||
## Requirements
|
**Current Version**: v1.7.1
|
||||||
- **Pandoc**: Must be installed on the system for export functionality
|
**Author**: Amit Haridas (amit.wh@gmail.com)
|
||||||
- Ubuntu/Debian: `sudo apt-get install pandoc`
|
**License**: MIT
|
||||||
- macOS: `brew install pandoc`
|
**Repository**: https://github.com/amitwh/pan-converter
|
||||||
- Windows: Download from https://pandoc.org/installing.html
|
|
||||||
|
|
||||||
## Development Setup
|
## Architecture & Technology Stack
|
||||||
|
|
||||||
|
### Core Technologies
|
||||||
|
- **Electron** - Cross-platform desktop application framework
|
||||||
|
- **Pandoc** - Universal document converter (required system dependency)
|
||||||
|
- **ConvertAPI** - Cloud-based file conversion (200+ formats)
|
||||||
|
- **marked** - Markdown parsing and rendering
|
||||||
|
- **highlight.js** - Syntax highlighting
|
||||||
|
- **KaTeX** - Mathematical expression rendering
|
||||||
|
- **DOMPurify** - HTML sanitization
|
||||||
|
|
||||||
|
### Application Structure
|
||||||
|
```
|
||||||
|
src/
|
||||||
|
├── main.js # Electron main process, menu system, IPC handlers
|
||||||
|
├── renderer.js # TabManager class, multi-file editing, event handling
|
||||||
|
├── index.html # Application layout with tabbed interface
|
||||||
|
├── styles.css # Base styling with multi-theme support
|
||||||
|
└── styles-modern.css # Modern glassmorphism UI design system (v1.7.1)
|
||||||
|
|
||||||
|
assets/
|
||||||
|
└── icon.png # Application icon
|
||||||
|
|
||||||
|
package.json # Dependencies and build configuration
|
||||||
|
CLAUDE.md # Development documentation for AI assistants
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Commands
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- Node.js (v14 or higher)
|
|
||||||
- npm or yarn
|
|
||||||
- Pandoc (for export features)
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
```bash
|
```bash
|
||||||
# Clone the repository
|
# Install Node.js dependencies
|
||||||
git clone <repository-url>
|
|
||||||
cd pan-converter
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
npm install
|
npm install
|
||||||
|
|
||||||
# Generate icons
|
# Install Pandoc (required for export functionality)
|
||||||
|
# Ubuntu/Debian:
|
||||||
|
sudo apt-get install pandoc
|
||||||
|
|
||||||
|
# macOS:
|
||||||
|
brew install pandoc
|
||||||
|
|
||||||
|
# Windows: Download from https://pandoc.org/installing.html
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running the Application
|
||||||
|
```bash
|
||||||
|
# Start development server
|
||||||
|
npm start
|
||||||
|
|
||||||
|
# Start with debugging
|
||||||
|
npm start --enable-logging
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building & Packaging
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Generate application icons
|
||||||
npm run generate-icons
|
npm run generate-icons
|
||||||
|
|
||||||
# Start the application
|
# Build for current platform
|
||||||
npm start
|
|
||||||
```
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
### Build for Current Platform
|
|
||||||
```bash
|
|
||||||
npm run build
|
npm run build
|
||||||
```
|
|
||||||
|
|
||||||
### Build for Specific Platforms
|
# Platform-specific builds
|
||||||
```bash
|
npm run build:win # Windows
|
||||||
# Windows
|
npm run build:mac # macOS
|
||||||
npm run build:win
|
npm run build:linux # Linux (AppImage, .deb, .snap)
|
||||||
|
|
||||||
# macOS
|
# Build for all platforms
|
||||||
npm run build:mac
|
|
||||||
|
|
||||||
# Linux (generates .deb, .AppImage, and .snap)
|
|
||||||
npm run build:linux
|
|
||||||
```
|
|
||||||
|
|
||||||
### Build for All Platforms
|
|
||||||
```bash
|
|
||||||
npm run dist:all
|
npm run dist:all
|
||||||
```
|
```
|
||||||
|
|
||||||
## Project Structure
|
### Git Branch Management
|
||||||
```
|
```bash
|
||||||
pan-converter/
|
# Switch to platform-specific branches
|
||||||
├── src/
|
git checkout linux # Linux development
|
||||||
│ ├── main.js # Main process
|
git checkout macos # macOS development
|
||||||
│ ├── renderer.js # Renderer process
|
git checkout windows # Windows development
|
||||||
│ ├── index.html # Main window HTML
|
git checkout master # Main development branch
|
||||||
│ └── styles.css # Application styles
|
|
||||||
├── assets/
|
# Update all branches with latest changes
|
||||||
│ ├── icon.svg # Source icon
|
git checkout master
|
||||||
│ └── icon.png # Generated icons
|
git push origin master
|
||||||
├── scripts/
|
git checkout linux && git merge master && git push origin linux
|
||||||
│ └── generate-icons.js # Icon generation script
|
git checkout macos && git merge master && git push origin macos
|
||||||
├── package.json # Project configuration
|
git checkout windows && git merge master && git push origin windows
|
||||||
└── CLAUDE.md # This file
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## Architecture
|
### Release Management
|
||||||
|
```bash
|
||||||
|
# Create and push release tag
|
||||||
|
git tag v1.2.1 -m "Release message"
|
||||||
|
git push origin v1.2.1
|
||||||
|
|
||||||
|
# Create GitHub release with packages
|
||||||
|
gh release create v1.2.1 --title "Title" --notes "Release notes" \
|
||||||
|
"dist/PanConverter-1.2.1.AppImage" \
|
||||||
|
"dist/pan-converter_1.2.1_amd64.deb" \
|
||||||
|
"dist/pan-converter_1.2.1_amd64.snap"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Feature Implementation Guide
|
||||||
|
|
||||||
|
### v1.7.1 Modern UI Design (Latest)
|
||||||
|
|
||||||
|
#### 🎨 Glassmorphism & Gradient UI
|
||||||
|
**Modern Design System** (`src/styles-modern.css`, `src/index.html:7-11`)
|
||||||
|
- **Glassmorphism Effects** - Translucent backgrounds with backdrop-filter blur
|
||||||
|
- **Animated Gradient Background** - Purple-blue gradient that shifts colors dynamically
|
||||||
|
- **CSS Custom Properties** - Centralized theming with CSS variables
|
||||||
|
- **Modern Typography** - Inter font family for UI, JetBrains Mono for code
|
||||||
|
- **Smooth Animations** - CSS transitions with cubic-bezier easing
|
||||||
|
- **Enhanced Hover Effects** - Interactive elements with scale and transform effects
|
||||||
|
- **Custom Scrollbars** - Styled scrollbars matching the modern aesthetic
|
||||||
|
- **Progress Bars** - Shimmer animations and gradient fills
|
||||||
|
|
||||||
|
**Design Features:**
|
||||||
|
- Animated gradient background (15-second color shift loop)
|
||||||
|
- Glass-effect tabs with blur and semi-transparency
|
||||||
|
- Gradient-based buttons with hover/active states
|
||||||
|
- Modern card-based dialogs with rounded corners
|
||||||
|
- Enhanced typography with gradient text for headings
|
||||||
|
- Ripple-like hover effects on interactive elements
|
||||||
|
- Theme variables for consistent colors and spacing
|
||||||
|
- Shadow effects with proper depth perception
|
||||||
|
|
||||||
|
**Technical Implementation:**
|
||||||
|
- Created comprehensive `styles-modern.css` file (780+ lines)
|
||||||
|
- Google Fonts integration (Inter, JetBrains Mono)
|
||||||
|
- CSS Grid and Flexbox for modern layouts
|
||||||
|
- backdrop-filter for glassmorphism (with fallbacks)
|
||||||
|
- CSS animations with @keyframes
|
||||||
|
- RGB/RGBA color system with opacity control
|
||||||
|
- CSS custom properties for easy theming
|
||||||
|
|
||||||
|
### v1.7.0 PDF Editor & Universal Converter
|
||||||
|
|
||||||
|
#### 📄 Comprehensive PDF Editor
|
||||||
|
**Complete PDF Manipulation Suite** (`src/main.js:1566-2068`, `src/index.html:552-921`, `src/renderer.js:1951-2429`)
|
||||||
|
- **Merge PDFs** - Combine multiple PDF files into a single document
|
||||||
|
- **Split PDF** - Split PDFs by page ranges, intervals, or file size
|
||||||
|
- **Compress PDF** - Reduce PDF file size with optimization
|
||||||
|
- **Rotate Pages** - Rotate specific pages or entire documents (90°, 180°, 270°)
|
||||||
|
- **Delete Pages** - Remove unwanted pages from PDFs
|
||||||
|
- **Reorder Pages** - Rearrange pages in any order
|
||||||
|
- **Add Watermark** - Text watermarks with customizable position, size, color, opacity
|
||||||
|
- **Password Protection** - Encrypt PDFs with user and owner passwords
|
||||||
|
- **Remove Password** - Decrypt password-protected PDFs
|
||||||
|
- **Set Permissions** - Control printing, copying, modifying, and other document permissions
|
||||||
|
|
||||||
|
**Technical Implementation:**
|
||||||
|
- Uses `pdf-lib` (v1.17.1) for all PDF operations
|
||||||
|
- Full async/await implementation for optimal performance
|
||||||
|
- Comprehensive error handling and user feedback
|
||||||
|
- Progress indicators for long-running operations
|
||||||
|
- Page range parsing (e.g., "1-5, 7, 9-12")
|
||||||
|
- RGB color conversion for watermarks
|
||||||
|
- Support for encrypted PDFs
|
||||||
|
|
||||||
|
**Watermark Features:**
|
||||||
|
- Multiple positioning options (center, diagonal, corners, top/bottom)
|
||||||
|
- Customizable font size (8-144px)
|
||||||
|
- Adjustable opacity (0-100%)
|
||||||
|
- Color picker for text color
|
||||||
|
- Apply to all pages or custom page ranges
|
||||||
|
|
||||||
|
**Security Features:**
|
||||||
|
- 128-bit and 256-bit encryption support
|
||||||
|
- User password (required to open PDF)
|
||||||
|
- Owner password (required to modify permissions)
|
||||||
|
- Granular permission controls:
|
||||||
|
- Allow/deny printing (high/low resolution)
|
||||||
|
- Allow/deny content modification
|
||||||
|
- Allow/deny content copying
|
||||||
|
- Allow/deny annotations
|
||||||
|
- Allow/deny form filling
|
||||||
|
- Allow/deny accessibility features
|
||||||
|
- Allow/deny document assembly
|
||||||
|
- Allow/deny high-quality printing
|
||||||
|
|
||||||
|
#### 🔄 Universal File Converter
|
||||||
|
**Open-Source Multi-Tool Converter** (`src/main.js:446-600`, `src/index.html:257-483`, `src/renderer.js:1372-1940`)
|
||||||
|
- **LibreOffice** - Document conversions (DOCX, PDF, ODT, RTF, TXT, HTML, XLSX, PPTX)
|
||||||
|
- **ImageMagick** - Image format conversions (JPG, PNG, GIF, TIFF, WebP, SVG, etc.)
|
||||||
|
- **FFmpeg** - Video and audio conversions (MP4, AVI, MOV, MP3, WAV, etc.)
|
||||||
|
- **Pandoc** - Document markup conversions (Markdown, HTML, LaTeX, EPUB, etc.)
|
||||||
|
|
||||||
|
**Features:**
|
||||||
|
- Single file and batch folder conversion
|
||||||
|
- Tool-specific advanced options:
|
||||||
|
- ImageMagick: Quality, DPI, resize, compression type
|
||||||
|
- FFmpeg: Video/audio codecs, bitrate, preset, framerate
|
||||||
|
- LibreOffice: Export quality, page range, bookmarks
|
||||||
|
- Automatic tool detection and availability checking
|
||||||
|
- Recursive folder processing
|
||||||
|
- 100% offline and open-source
|
||||||
|
- No API keys required
|
||||||
|
|
||||||
|
### v1.6.1 Bug Fixes
|
||||||
|
|
||||||
|
#### 🐛 File Association Rendering Fix
|
||||||
|
**Fixed Double-Click File Loading** (`src/main.js:1364-1379`)
|
||||||
|
- Fixed critical issue where files opened via double-click weren't rendering
|
||||||
|
- Added proper wait for renderer load state before sending file data
|
||||||
|
- Implemented `did-finish-load` event listener to prevent race conditions
|
||||||
|
- Files now render correctly when opened from Windows Explorer
|
||||||
|
|
||||||
|
### v1.6.0 Enhanced Markdown Editor & ConvertAPI Integration
|
||||||
|
|
||||||
|
#### ✨ Complete Markdown Toolbar
|
||||||
|
**Additional Formatting Buttons** (`src/index.html:78-98`, `src/renderer.js:596-723`)
|
||||||
|
- **Strikethrough** button - Wraps text with `~~strikethrough~~`
|
||||||
|
- **Code Block** button - Inserts fenced code blocks with triple backticks
|
||||||
|
- **Horizontal Rule** button - Adds section divider with `---`
|
||||||
|
- Complete suite of markdown formatting tools now available
|
||||||
|
|
||||||
|
#### 🔍 Fixed Find & Replace
|
||||||
|
**Focus and Highlighting Improvements** (`src/renderer.js:725-870`)
|
||||||
|
- Fixed focus issue - dialog no longer loses focus while typing
|
||||||
|
- Visual highlighting with text selection showing current match
|
||||||
|
- Smart auto-scroll to display matches prominently
|
||||||
|
- Real-time match counting: "Match X of Y"
|
||||||
|
- Replace single match or replace all functionality
|
||||||
|
- Enter/Shift+Enter keyboard navigation
|
||||||
|
|
||||||
|
#### 📏 Fixed Line Numbers
|
||||||
|
**Line Counting and Synchronization** (`src/renderer.js:337-355`)
|
||||||
|
- Fixed bug using `'\\n'` instead of `'\n'` for line splitting
|
||||||
|
- Added scroll synchronization between line numbers and editor
|
||||||
|
- Line numbers update correctly as you type
|
||||||
|
- Smooth scrolling keeps line numbers aligned
|
||||||
|
|
||||||
|
#### ☁️ ConvertAPI Cloud Integration
|
||||||
|
**200+ Format Cloud Conversion** (`src/main.js:370-416`, `src/index.html:257-307`, `src/renderer.js:1540-1603`)
|
||||||
|
- New **ConvertAPI menu** with cloud-based file conversion
|
||||||
|
- Support for 200+ file formats: MD, DOCX, PDF, HTML, JPG, PNG, EPUB, ODT
|
||||||
|
- Secure API key storage in localStorage for reuse
|
||||||
|
- Real-time conversion status and progress tracking
|
||||||
|
- Free tier: 250 conversions per month
|
||||||
|
- Professional conversion dialog with format selection
|
||||||
|
- Get API key at: https://www.convertapi.com
|
||||||
|
|
||||||
|
**Technical Implementation:**
|
||||||
|
- Installed `convertapi` npm package (v1.15.0)
|
||||||
|
- IPC handlers for cloud conversion workflow
|
||||||
|
- Error handling and user feedback dialogs
|
||||||
|
- Async/await pattern for conversion operations
|
||||||
|
|
||||||
|
### v1.5.0 Enhanced Features & Open Source Compatibility
|
||||||
|
|
||||||
|
#### 🔧 Export Function Fixes & Optional Advanced Options
|
||||||
|
**Export Dialog Enhancement** (`src/index.html:125-133`, `src/renderer.js:960-985`)
|
||||||
|
- Fixed export function issues after advanced export options integration
|
||||||
|
- Added optional advanced export options via checkbox toggle (unchecked by default)
|
||||||
|
- Basic export options always visible, advanced options hidden until enabled
|
||||||
|
- Clean UI separation between simple and advanced export workflows
|
||||||
|
|
||||||
|
#### 🏗️ Open Source Compatibility & Dependency Removal
|
||||||
|
**Removed Proprietary Dependencies** (`src/main.js:430-450`, `package.json:32-37`)
|
||||||
|
- Removed bundled Pandoc binaries - now requires system-installed Pandoc
|
||||||
|
- Replaced proprietary XLSX dependency with open-source CSV export
|
||||||
|
- Removed non-essential bundled binaries to ensure open-source compatibility
|
||||||
|
- Updated export functions to use system Pandoc installation
|
||||||
|
|
||||||
|
#### ✨ Advanced User Experience Features
|
||||||
|
**Auto-Save System** (`src/renderer.js:445-484`)
|
||||||
|
- Automatic saving every 30 seconds with visual indicators
|
||||||
|
- Smooth slide-in animation for auto-save notifications
|
||||||
|
- Prevents data loss during extended editing sessions
|
||||||
|
- Integrated with file opening and tab creation workflows
|
||||||
|
|
||||||
|
**Enhanced Document Statistics** (`src/renderer.js:385-444`)
|
||||||
|
- Comprehensive statistics: words, characters, lines, paragraphs, sentences
|
||||||
|
- Estimated reading time calculation (200 words per minute)
|
||||||
|
- Real-time updates as user types
|
||||||
|
- Professional presentation in status bar
|
||||||
|
|
||||||
|
**Recent Files Management** (`src/main.js:69-114`, `src/renderer.js:487-512`)
|
||||||
|
- Recent files menu with last 10 opened files
|
||||||
|
- Persistent storage via localStorage and user data directory
|
||||||
|
- Menu integration with File > Recent Files submenu
|
||||||
|
- Clear recent files functionality with menu rebuild
|
||||||
|
|
||||||
|
**Mathematical Expression Support** (`src/renderer.js:1099-1130`, `src/renderer.js:292-306`)
|
||||||
|
- KaTeX integration for rendering mathematical expressions
|
||||||
|
- Support for multiple delimiters: $$, $, \\[\\], \\(\\)
|
||||||
|
- Real-time math rendering in preview pane
|
||||||
|
- Fallback handling for missing KaTeX library
|
||||||
|
|
||||||
|
### v1.4.0 Advanced Export & Batch Processing
|
||||||
|
|
||||||
|
#### 🔧 Fixed File Association Support
|
||||||
|
**File Loading Fix** (`src/main.js:385-390`, `src/renderer.js:485-486`)
|
||||||
|
- Fixed timing issue with file association loading
|
||||||
|
- Added proper `renderer-ready` event to ensure TabManager is initialized
|
||||||
|
- Files now open correctly when double-clicked or opened via right-click menu
|
||||||
|
- Command-line file arguments are properly handled on startup
|
||||||
|
|
||||||
|
#### 🎛️ Advanced Export Options Dialog
|
||||||
|
**Template & Metadata Support** (`src/main.js:247-357`, `src/index.html:117-212`)
|
||||||
|
- Comprehensive export options dialog with professional UI
|
||||||
|
- Template selection (default or custom template files)
|
||||||
|
- Metadata fields (title, author, date, subject) with dynamic field addition
|
||||||
|
- Document options: Table of Contents, section numbering, citations
|
||||||
|
- PDF-specific options: Engine selection (XeLaTeX, PDFLaTeX, LuaLaTeX), custom margins
|
||||||
|
- Bibliography support: .bib, .yaml, .json files with CSL styling
|
||||||
|
- All export formats now use enhanced options dialog
|
||||||
|
|
||||||
|
#### 📁 Batch File Conversion System
|
||||||
|
**Multi-File Processing** (`src/main.js:179-186`, `src/main.js:559-690`)
|
||||||
|
- New "Batch" menu for converting entire folders
|
||||||
|
- Recursive folder processing with progress tracking
|
||||||
|
- Support for all export formats with advanced options
|
||||||
|
- Real-time progress bar and file-by-file status updates
|
||||||
|
- Maintains folder structure in output directory
|
||||||
|
- Error handling with completion statistics
|
||||||
|
|
||||||
|
#### 🎨 Enhanced UI Components
|
||||||
|
**Dialog System** (`src/styles.css:838-1361`)
|
||||||
|
- Professional modal dialogs with backdrop and animations
|
||||||
|
- Theme-aware styling for all new components
|
||||||
|
- Responsive layouts with proper accessibility
|
||||||
|
- Form validation and user feedback systems
|
||||||
|
- Progress indicators for long-running operations
|
||||||
|
|
||||||
|
### v1.3.x Tabbed Interface & Enhanced Features
|
||||||
|
|
||||||
|
#### 🗂️ Tabbed Multi-File Support (v1.3.0)
|
||||||
|
**TabManager Class** (`src/renderer.js`)
|
||||||
|
- Complete tab management system for multiple files
|
||||||
|
- Tab switching, creation, and closure
|
||||||
|
- State preservation per tab (content, cursor position, scroll)
|
||||||
|
- File path tracking for each tab
|
||||||
|
- Keyboard shortcuts: `Ctrl/Cmd+T` (new tab), `Ctrl/Cmd+W` (close tab)
|
||||||
|
|
||||||
|
#### 🎯 Enhanced PDF Export (v1.3.0)
|
||||||
|
**Multi-Engine Fallback System** (`src/main.js:239-280`)
|
||||||
|
- Primary: XeLaTeX with proper margins
|
||||||
|
- Fallback 1: PDFLaTeX
|
||||||
|
- Fallback 2: wkhtmltopdf
|
||||||
|
- Automatic engine detection and switching
|
||||||
|
|
||||||
|
#### 📁 File Association Support (v1.3.1)
|
||||||
|
**OS Integration** (`src/main.js:452-498`, `package.json:50-65`)
|
||||||
|
- Double-click .md files to open in PanConverter
|
||||||
|
- Command-line argument handling
|
||||||
|
- Pending file queue for startup loading
|
||||||
|
|
||||||
|
#### 🎨 Typography & Spacing (v1.3.2-1.3.3)
|
||||||
|
**Preview Enhancement** (`src/styles.css`)
|
||||||
|
- Restored ideal text spacing from v1.0
|
||||||
|
- Font sizes increased to 15px for better readability
|
||||||
|
- Comprehensive selector coverage for legacy and new containers
|
||||||
|
- Theme-aware typography for all content types
|
||||||
|
|
||||||
|
### v1.2.1 Comprehensive Editor Enhancements
|
||||||
|
|
||||||
|
#### ✨ Advanced Editor Features
|
||||||
|
|
||||||
|
**Find & Replace System** (`src/renderer.js:200-350`)
|
||||||
|
- Dialog-based interface with match highlighting
|
||||||
|
- Forward/backward navigation through matches
|
||||||
|
- Replace single or replace all functionality
|
||||||
|
- Real-time match counting and status display
|
||||||
|
- Escape key closes dialog
|
||||||
|
|
||||||
|
**Line Numbers** (`src/renderer.js:450-500`, `src/styles.css:517-598`)
|
||||||
|
- Toggle-able line numbers with toolbar button
|
||||||
|
- Synchronized scrolling with editor content
|
||||||
|
- Theme-aware styling for all supported themes
|
||||||
|
- Dynamic line number generation based on content
|
||||||
|
|
||||||
|
**Undo/Redo System** (`src/renderer.js:100-150`)
|
||||||
|
- Stack-based state management for editor history
|
||||||
|
- Keyboard shortcuts: `Ctrl/Cmd+Z` (undo), `Ctrl/Cmd+Shift+Z` (redo)
|
||||||
|
- Intelligent state saving on text changes
|
||||||
|
- Memory-efficient history management
|
||||||
|
|
||||||
|
**Smart Auto-Indentation** (`src/renderer.js:350-400`)
|
||||||
|
- Automatic list continuation on Enter key
|
||||||
|
- Proper indentation handling for nested lists
|
||||||
|
- Support for ordered and unordered lists
|
||||||
|
- Intelligent whitespace management
|
||||||
|
|
||||||
|
**Enhanced Keyboard Shortcuts** (`src/renderer.js:400-450`)
|
||||||
|
- `Tab`/`Shift+Tab` for line indentation/outdentation
|
||||||
|
- `Enter` for auto-continuing lists
|
||||||
|
- `Ctrl/Cmd+F` for find & replace dialog
|
||||||
|
- `Escape` for closing dialogs
|
||||||
|
|
||||||
|
**Word/Character Count** (`src/renderer.js:500-530`)
|
||||||
|
- Live counting displayed in status bar
|
||||||
|
- Updates automatically as content changes
|
||||||
|
- Word and character statistics
|
||||||
|
|
||||||
|
#### 📤 Export & Conversion Features
|
||||||
|
|
||||||
|
**PowerPoint Export** (`src/main.js:330-350`)
|
||||||
|
- Convert markdown to PPTX presentations
|
||||||
|
- Automatic slide-level formatting (`--slide-level=2`)
|
||||||
|
- Smart presentation structure handling
|
||||||
|
|
||||||
|
**Spreadsheet Export** (`src/main.js:370-457`)
|
||||||
|
- Export markdown tables to Excel (XLSX/XLS) and ODS formats
|
||||||
|
- Multi-table support with separate worksheets
|
||||||
|
- Automatic table detection and parsing
|
||||||
|
- Error handling for files without tables
|
||||||
|
|
||||||
|
**Document Import** (`src/main.js:280-315`)
|
||||||
|
- Import DOCX, ODT, RTF, HTML, PDF, PPTX, ODP files
|
||||||
|
- Automatic conversion to markdown format
|
||||||
|
- File dialog with appropriate filters
|
||||||
|
- Success notifications and error handling
|
||||||
|
|
||||||
|
**Table Creation Helper** (`src/renderer.js:600-650`)
|
||||||
|
- Built-in table generator with row/column specification
|
||||||
|
- Automatic markdown table formatting
|
||||||
|
- Proper header separation and alignment
|
||||||
|
|
||||||
|
#### 🎨 Interface & Theming
|
||||||
|
|
||||||
|
**Multi-Theme Support** (`src/styles.css:214-598`)
|
||||||
|
- Light, Dark, Solarized, Monokai, GitHub themes
|
||||||
|
- Complete theming for all UI components
|
||||||
|
- Theme-aware styling for new features (find dialog, line numbers)
|
||||||
|
- Persistent theme selection with local storage
|
||||||
|
|
||||||
|
**Enhanced UI Components** (`src/index.html:94-108`)
|
||||||
|
- Find & replace dialog with modern styling
|
||||||
|
- Toolbar buttons for all new features
|
||||||
|
- Status bar with live statistics
|
||||||
|
- Responsive layout with proper spacing
|
||||||
|
|
||||||
|
## File Structure & Key Components
|
||||||
|
|
||||||
### Main Process (`src/main.js`)
|
### Main Process (`src/main.js`)
|
||||||
- Manages application lifecycle
|
- **Menu System**: Comprehensive menu with file operations, editing, conversion, view options, batch processing
|
||||||
- Creates and manages windows
|
- **IPC Handlers**: Communication between main and renderer processes
|
||||||
- Handles file operations
|
- **File Operations**: Open, save, import/export functionality with file association support
|
||||||
- Manages menu bar
|
- **Export System**: Advanced export with templates, metadata, and Pandoc integration
|
||||||
- Communicates with renderer via IPC
|
- **Batch Processing**: Multi-file conversion with progress tracking and error handling
|
||||||
|
- **Theme Management**: Persistent theme storage and application
|
||||||
|
- **Spreadsheet Export**: Table extraction and XLSX generation
|
||||||
|
- **About Dialog**: Application information and feature list
|
||||||
|
|
||||||
### Renderer Process (`src/renderer.js`)
|
### Renderer Process (`src/renderer.js`)
|
||||||
- Handles UI interactions
|
- **Editor Initialization**: CodeMirror-like functionality with custom implementation
|
||||||
- Manages editor state
|
- **TabManager System**: Multi-file editing with state management
|
||||||
- Renders markdown preview
|
- **Find & Replace Engine**: Search algorithms with regex support
|
||||||
- Handles theme switching
|
- **Undo/Redo Manager**: History stack management
|
||||||
- Communicates with main process via IPC
|
- **Auto-indentation Logic**: Smart list continuation
|
||||||
|
- **Live Preview**: Real-time markdown rendering with DOMPurify
|
||||||
|
- **Export Dialog Management**: Advanced options collection and validation
|
||||||
|
- **Batch Conversion Interface**: Folder selection, progress tracking, and user feedback
|
||||||
|
- **Event Handling**: Keyboard shortcuts and UI interactions
|
||||||
|
- **Statistics Tracking**: Word/character counting
|
||||||
|
|
||||||
### Key Libraries
|
### Styling (`src/styles.css`)
|
||||||
- **Electron**: Desktop application framework
|
- **Base Styles**: Application layout and typography
|
||||||
- **marked**: Markdown parsing
|
- **Component Styles**: Toolbar, editor, preview, dialogs
|
||||||
- **highlight.js**: Syntax highlighting
|
- **Theme Implementations**: Complete styling for all themes
|
||||||
- **DOMPurify**: HTML sanitization
|
- **Responsive Design**: Flexible layouts and proper spacing
|
||||||
- **electron-store**: Persistent storage
|
- **Animation Support**: Smooth transitions and hover effects
|
||||||
- **electron-builder**: Application packaging
|
|
||||||
|
|
||||||
## Features Implementation
|
### HTML Structure (`src/index.html`)
|
||||||
|
- **Toolbar**: Feature buttons with SVG icons
|
||||||
|
- **Tab Bar**: Multi-file navigation with close buttons
|
||||||
|
- **Find Dialog**: Search and replace interface
|
||||||
|
- **Export Options Dialog**: Advanced export configuration with templates and metadata
|
||||||
|
- **Batch Conversion Dialog**: Folder selection and conversion progress
|
||||||
|
- **Editor Container**: Line numbers and text editor with tab content management
|
||||||
|
- **Preview Pane**: Rendered markdown display
|
||||||
|
- **Status Bar**: Statistics and application status
|
||||||
|
|
||||||
### Markdown Editor
|
## Testing & Quality Assurance
|
||||||
- Uses native textarea with custom styling
|
|
||||||
- Supports common markdown shortcuts via toolbar
|
|
||||||
- Tab key inserts 4 spaces for code indentation
|
|
||||||
- Auto-save every 30 seconds when content changes
|
|
||||||
|
|
||||||
### Live Preview
|
### Manual Testing Checklist
|
||||||
- Updates in real-time as you type
|
- [ ] All keyboard shortcuts work correctly
|
||||||
- Sanitized HTML output for security
|
- [ ] Find & replace functions properly with edge cases
|
||||||
- Syntax highlighting for code blocks
|
- [ ] Line numbers sync correctly with content
|
||||||
- GitHub-flavored markdown support
|
- [ ] Undo/redo preserves cursor position
|
||||||
|
- [ ] Auto-indentation works with various list types
|
||||||
|
- [ ] File association loading (double-click .md files)
|
||||||
|
- [ ] Export options dialog with templates and metadata
|
||||||
|
- [ ] Batch conversion with progress tracking
|
||||||
|
- [ ] All themes render correctly for new components
|
||||||
|
- [ ] Export functions work with various document formats
|
||||||
|
- [ ] Table creation and export functionality
|
||||||
|
- [ ] Cross-platform compatibility
|
||||||
|
|
||||||
### Theme System
|
### Known Issues & Limitations
|
||||||
- Themes stored in user preferences
|
- AppImage may require `--no-sandbox` flag on some Linux systems
|
||||||
- Applied via CSS classes on body element
|
- Large files (>1MB) may cause performance issues
|
||||||
- Persists across application restarts
|
- Windows/Mac builds require platform-specific environments
|
||||||
- Five built-in themes
|
- Pandoc must be installed separately for export functionality
|
||||||
|
|
||||||
### Export System
|
## Deployment & Distribution
|
||||||
- Uses Pandoc command-line tool
|
|
||||||
- Supports multiple output formats
|
|
||||||
- Maintains original file structure
|
|
||||||
- Shows error messages if Pandoc not installed
|
|
||||||
|
|
||||||
## Platform-Specific Branches
|
### Release Packages
|
||||||
|
- **Linux AppImage**: Universal Linux package (self-contained)
|
||||||
|
- **Debian Package**: `.deb` for Ubuntu/Debian systems
|
||||||
|
- **Snap Package**: Universal Linux package via Snap Store
|
||||||
|
- **Future**: Windows `.exe` and macOS `.dmg` packages
|
||||||
|
|
||||||
The repository maintains separate branches for platform-specific customizations:
|
### Release Process
|
||||||
- `master`: Main development branch
|
1. Update version in `package.json`, `src/main.js`, and `README.md`
|
||||||
- `linux`: Linux-specific configurations
|
2. Commit changes and push to all platform branches
|
||||||
- `macos`: macOS-specific configurations
|
3. Build platform-specific packages
|
||||||
- `windows`: Windows-specific configurations
|
4. Create Git tag and GitHub release
|
||||||
|
5. Upload packages to GitHub release
|
||||||
|
6. Update documentation and announce release
|
||||||
|
|
||||||
## Debian Package
|
## Contributing Guidelines
|
||||||
|
|
||||||
The application can be built as a `.deb` package for Debian-based systems:
|
### Code Style
|
||||||
```bash
|
- Use consistent indentation (2 spaces)
|
||||||
npm run build:linux
|
- Follow JavaScript ES6+ standards
|
||||||
```
|
- Comment complex functionality
|
||||||
|
- Maintain separation between main and renderer processes
|
||||||
|
- Use descriptive variable and function names
|
||||||
|
|
||||||
The generated `.deb` file will:
|
### Adding New Features
|
||||||
- Install to `/opt/pan-converter`
|
1. Plan feature implementation and UI integration
|
||||||
- Create desktop entry for application menu
|
2. Update relevant files (main.js, renderer.js, styles.css)
|
||||||
- Set up proper file associations
|
3. Test across all supported themes
|
||||||
- Declare Pandoc as dependency
|
4. Update documentation and README
|
||||||
|
5. Test on multiple platforms if possible
|
||||||
|
6. Submit pull request with detailed description
|
||||||
|
|
||||||
## Testing
|
### Bug Reporting
|
||||||
|
- Include steps to reproduce
|
||||||
|
- Specify platform and version information
|
||||||
|
- Attach relevant screenshots or error logs
|
||||||
|
- Check existing issues before creating new ones
|
||||||
|
|
||||||
### Manual Testing
|
## Future Roadmap
|
||||||
1. File Operations: New, Open, Save, Save As
|
|
||||||
2. Editor Features: Bold, Italic, Headings, Links, Code, Lists, Quotes
|
|
||||||
3. Preview Toggle: Show/hide preview pane
|
|
||||||
4. Theme Switching: Test all five themes
|
|
||||||
5. Export Functions: Test each export format
|
|
||||||
6. Auto-save: Verify 30-second auto-save works
|
|
||||||
|
|
||||||
### Platform Testing
|
### Planned Features
|
||||||
Test on:
|
- [ ] Collaborative editing capabilities
|
||||||
- Windows 10/11
|
- [ ] Plugin system for extensions
|
||||||
- macOS 11+ (Big Sur and later)
|
- [ ] Advanced markdown extensions (math, diagrams)
|
||||||
- Ubuntu 20.04+, Debian 11+
|
- [ ] Cloud synchronization options
|
||||||
|
- [ ] Mobile companion app
|
||||||
|
- [ ] Advanced export templates
|
||||||
|
- [ ] Spell check and grammar checking
|
||||||
|
- [ ] Version control integration
|
||||||
|
|
||||||
## Known Issues
|
### Technical Improvements
|
||||||
- ICO and ICNS icons need manual conversion from PNG
|
- [ ] Performance optimization for large files
|
||||||
- Pandoc must be installed separately
|
- [ ] Memory usage optimization
|
||||||
- Large files may cause performance issues
|
- [ ] Startup time improvements
|
||||||
|
- [ ] Better error handling and user feedback
|
||||||
|
- [ ] Automated testing suite
|
||||||
|
- [ ] Continuous integration/deployment
|
||||||
|
|
||||||
## Future Enhancements
|
---
|
||||||
- [ ] Add spell checking
|
|
||||||
- [ ] Implement find and replace
|
|
||||||
- [ ] Add custom CSS for preview
|
|
||||||
- [ ] Support for markdown extensions
|
|
||||||
- [ ] Plugin system for custom exporters
|
|
||||||
- [ ] Cloud sync capabilities
|
|
||||||
- [ ] Collaborative editing
|
|
||||||
|
|
||||||
## License
|
**Last Updated**: October 11, 2025
|
||||||
MIT License
|
**Claude Assistant**: Development completed for v1.7.1 with modern glassmorphism UI design featuring animated gradient backgrounds, translucent glass effects, smooth animations, enhanced typography with Inter and JetBrains Mono fonts, and comprehensive CSS custom properties for consistent theming.
|
||||||
|
|
||||||
## Support
|
|
||||||
For issues or feature requests, please open an issue on the GitHub repository.
|
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
# Export Functionality Fix - Summary
|
||||||
|
|
||||||
|
## Issues Found and Fixed
|
||||||
|
|
||||||
|
### 1. **Primary Issue: Pandoc Installation Problem**
|
||||||
|
- **Problem**: Pandoc is installed but has a system error (paging file too small)
|
||||||
|
- **Impact**: All pandoc-dependent exports (DOCX, LaTeX, etc.) were failing
|
||||||
|
- **Solution**: Added robust fallback mechanisms
|
||||||
|
|
||||||
|
### 2. **Export Function Improvements**
|
||||||
|
|
||||||
|
#### Before (Issues):
|
||||||
|
- ❌ No pandoc availability checking
|
||||||
|
- ❌ Poor error messages
|
||||||
|
- ❌ No fallback for missing pandoc
|
||||||
|
- ❌ Limited debugging information
|
||||||
|
|
||||||
|
#### After (Fixed):
|
||||||
|
- ✅ **Pandoc Detection**: Automatically checks if pandoc is available
|
||||||
|
- ✅ **Built-in HTML Export**: Works without pandoc using marked library
|
||||||
|
- ✅ **Built-in PDF Export**: Works without pandoc using Electron's printToPDF
|
||||||
|
- ✅ **Better Error Messages**: Clear instructions for users
|
||||||
|
- ✅ **Comprehensive Logging**: Debug information in console
|
||||||
|
- ✅ **Graceful Fallbacks**: Falls back to built-in converters when pandoc fails
|
||||||
|
|
||||||
|
## How It Works Now
|
||||||
|
|
||||||
|
### Export Process Flow:
|
||||||
|
1. **User clicks export** → Check if file is saved
|
||||||
|
2. **Select output location** → Show save dialog
|
||||||
|
3. **Check pandoc availability** → Async pandoc detection
|
||||||
|
4. **Choose export method**:
|
||||||
|
- **If pandoc available**: Use pandoc with format-specific options
|
||||||
|
- **If pandoc not available**:
|
||||||
|
- HTML → Use built-in marked converter
|
||||||
|
- PDF → Use Electron's printToPDF
|
||||||
|
- Other formats → Show helpful error with installation guide
|
||||||
|
|
||||||
|
### Supported Export Formats:
|
||||||
|
|
||||||
|
#### ✅ **Always Work** (no pandoc required):
|
||||||
|
- **HTML**: Built-in converter using marked library
|
||||||
|
- **PDF**: Built-in converter using Electron
|
||||||
|
|
||||||
|
#### ✅ **Work with Pandoc** (better quality):
|
||||||
|
- **DOCX**: Microsoft Word format
|
||||||
|
- **LaTeX**: LaTeX document
|
||||||
|
- **RTF**: Rich Text Format
|
||||||
|
- **ODT**: OpenDocument Text
|
||||||
|
- **EPUB**: E-book format
|
||||||
|
- **PPTX**: PowerPoint presentations
|
||||||
|
- **ODP**: OpenDocument Presentations
|
||||||
|
|
||||||
|
## Testing the Fixes
|
||||||
|
|
||||||
|
### Manual Test Procedure:
|
||||||
|
1. **Start the application**: `npm start`
|
||||||
|
2. **Open test file**: Load `test-export.md`
|
||||||
|
3. **Test HTML export**: File → Export → HTML (should work)
|
||||||
|
4. **Test PDF export**: File → Export → PDF (should work)
|
||||||
|
5. **Test DOCX export**: File → Export → DOCX (will show pandoc error)
|
||||||
|
|
||||||
|
### Expected Behavior:
|
||||||
|
- **HTML/PDF exports**: Should work immediately and create files
|
||||||
|
- **Other format exports**: Should show informative error about pandoc
|
||||||
|
- **Console logs**: Should show debug information about export process
|
||||||
|
|
||||||
|
## Fix Summary
|
||||||
|
|
||||||
|
### Code Changes Made:
|
||||||
|
1. **Added `checkPandocAvailability()` function** - Detects pandoc
|
||||||
|
2. **Added `exportToHTML()` function** - Built-in HTML export
|
||||||
|
3. **Added `exportToPDFElectron()` function** - Built-in PDF export
|
||||||
|
4. **Added `exportWithPandoc()` helper** - Generic pandoc export
|
||||||
|
5. **Added `exportWithPandocPDF()` helper** - PDF with fallbacks
|
||||||
|
6. **Improved `exportFile()` function** - Main export logic with detection
|
||||||
|
7. **Enhanced error handling** - Better user messages
|
||||||
|
8. **Added comprehensive logging** - Debug information
|
||||||
|
|
||||||
|
### Files Modified:
|
||||||
|
- `src/main.js` - Enhanced export functionality
|
||||||
|
- `test-export.md` - Created test file
|
||||||
|
- `test-export-functionality.js` - Created test script
|
||||||
|
|
||||||
|
## User Instructions
|
||||||
|
|
||||||
|
### For Users Without Pandoc:
|
||||||
|
- ✅ **HTML and PDF exports work perfectly**
|
||||||
|
- ✅ **No additional software needed**
|
||||||
|
- ✅ **Professional-looking output with proper styling**
|
||||||
|
|
||||||
|
### For Users Who Want All Formats:
|
||||||
|
1. **Install Pandoc**: Visit https://pandoc.org/installing.html
|
||||||
|
2. **For PDF with LaTeX**: Also install MiKTeX or TeX Live
|
||||||
|
3. **Restart the application** after installation
|
||||||
|
4. **All export formats will then be available**
|
||||||
|
|
||||||
|
## Result
|
||||||
|
🎉 **Export functionality is now working reliably!**
|
||||||
|
- Built-in exports (HTML, PDF) work without any dependencies
|
||||||
|
- Clear error messages guide users for advanced formats
|
||||||
|
- Robust error handling prevents crashes
|
||||||
|
- Better user experience with informative dialogs
|
||||||
@@ -0,0 +1,82 @@
|
|||||||
|
# GEMINI.md
|
||||||
|
|
||||||
|
## Project Overview
|
||||||
|
|
||||||
|
This project is a cross-platform Markdown editor and converter named **PanConverter**. It is built using the Electron framework, allowing it to run on Windows, macOS, and Linux. The application provides a rich text editor for writing Markdown, a live preview pane, and robust export capabilities powered by Pandoc.
|
||||||
|
|
||||||
|
The core technologies used are:
|
||||||
|
- **Electron:** For creating the desktop application.
|
||||||
|
- **JavaScript:** The primary programming language.
|
||||||
|
- **Pandoc:** For converting Markdown to various formats like PDF, DOCX, HTML, etc.
|
||||||
|
- **Marked:** For parsing and rendering the Markdown preview in real-time.
|
||||||
|
- **CodeMirror:** As the underlying text editor component.
|
||||||
|
- **highlight.js:** For syntax highlighting in the editor.
|
||||||
|
- **DOMPurify:** To sanitize the HTML output in the preview pane for security.
|
||||||
|
|
||||||
|
The application features a tabbed interface for working with multiple files, various themes, find and replace functionality, and detailed document statistics.
|
||||||
|
|
||||||
|
## Building and Running
|
||||||
|
|
||||||
|
To build and run this project locally, you will need to have Node.js and npm installed.
|
||||||
|
|
||||||
|
### Installation
|
||||||
|
|
||||||
|
1. **Clone the repository:**
|
||||||
|
```bash
|
||||||
|
git clone https://github.com/amitwh/pan-converter.git
|
||||||
|
cd pan-converter
|
||||||
|
```
|
||||||
|
|
||||||
|
2. **Install dependencies:**
|
||||||
|
```bash
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
|
### Running the Application
|
||||||
|
|
||||||
|
To run the application in development mode, use the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm start
|
||||||
|
```
|
||||||
|
|
||||||
|
### Building the Application
|
||||||
|
|
||||||
|
You can build the application for different platforms using the scripts defined in `package.json`.
|
||||||
|
|
||||||
|
- **Build for the current platform:**
|
||||||
|
```bash
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Build for a specific platform:**
|
||||||
|
```bash
|
||||||
|
npm run build:win # For Windows
|
||||||
|
npm run build:mac # For macOS
|
||||||
|
npm run build:linux # For Linux
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Build for all platforms at once:**
|
||||||
|
```bash
|
||||||
|
npm run dist:all
|
||||||
|
```
|
||||||
|
|
||||||
|
The distributable files will be located in the `dist/` directory.
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
The project does not have a dedicated test suite configured. The `test` script in `package.json` currently returns an error.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm test
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development Conventions
|
||||||
|
|
||||||
|
- **Code Style:** The codebase is written in JavaScript (ES6+). There is no linter or formatter configured, but the code generally follows standard JavaScript conventions.
|
||||||
|
- **Main vs. Renderer Process:** The application logic is split between the Electron main process (`src/main.js`) and the renderer process (`src/renderer.js`).
|
||||||
|
- `src/main.js` handles window management, application menus, file system operations, and communication with the operating system.
|
||||||
|
- `src/renderer.js` manages the user interface, editor functionality, and the Markdown preview.
|
||||||
|
- **Dependencies:** Project dependencies are managed through `package.json`. `devDependencies` are used for the build process, while `dependencies` are required for the application to run.
|
||||||
|
- **User Data:** The application stores settings and recent files in the user's application data directory.
|
||||||
|
- **Pandoc Integration:** The application relies on a system-installed version of Pandoc for its export functionality. It does not bundle Pandoc.
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2024 Amit Haridas
|
||||||
|
|
||||||
|
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.
|
||||||
+378
@@ -0,0 +1,378 @@
|
|||||||
|
\hypertarget{panconverter}{%
|
||||||
|
\section{PanConverter}\label{panconverter}}
|
||||||
|
|
||||||
|
A cross-platform Markdown editor and converter powered by Pandoc.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\centering
|
||||||
|
\includegraphics{assets/icon.png}
|
||||||
|
\caption{PanConverter}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\hypertarget{features}{%
|
||||||
|
\subsection{Features}\label{features}}
|
||||||
|
|
||||||
|
\hypertarget{advanced-markdown-editor}{%
|
||||||
|
\subsubsection{✨ Advanced Markdown
|
||||||
|
Editor}\label{advanced-markdown-editor}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
🗂️ \textbf{Tabbed Interface} - Work with multiple files simultaneously
|
||||||
|
in separate tabs
|
||||||
|
\item
|
||||||
|
📝 \textbf{Rich Text Editor} - Full-featured editor with syntax
|
||||||
|
highlighting and comprehensive toolbar
|
||||||
|
\item
|
||||||
|
🔍 \textbf{Find \& Replace} - Powerful search and replace with match
|
||||||
|
highlighting and navigation
|
||||||
|
\item
|
||||||
|
🔢 \textbf{Line Numbers} - Toggle line numbers for easier code editing
|
||||||
|
and navigation
|
||||||
|
\item
|
||||||
|
↩️ \textbf{Smart Auto-Indentation} - Automatic list continuation and
|
||||||
|
intelligent indentation
|
||||||
|
\item
|
||||||
|
⏪ \textbf{Undo/Redo} - Full undo/redo support with keyboard shortcuts
|
||||||
|
\item
|
||||||
|
⌨️ \textbf{Advanced Shortcuts} - Tab indentation, line selection, and
|
||||||
|
smart text formatting
|
||||||
|
\item
|
||||||
|
📂 \textbf{File Association Support} - Open markdown files directly
|
||||||
|
from file manager
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{themes-interface}{%
|
||||||
|
\subsubsection{🎨 Themes \& Interface}\label{themes-interface}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
👁️ \textbf{Live Preview} - See your markdown rendered in real-time
|
||||||
|
with synchronized scrolling
|
||||||
|
\item
|
||||||
|
🎨 \textbf{Multiple Themes} - Choose from Light, Dark, Solarized,
|
||||||
|
Monokai, or GitHub themes
|
||||||
|
\item
|
||||||
|
💾 \textbf{Auto-Save} - Never lose your work with automatic saving
|
||||||
|
every 30 seconds
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{export-conversion}{%
|
||||||
|
\subsubsection{📤 Export \& Conversion}\label{export-conversion}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
📄 \textbf{Enhanced PDF Export} - Robust PDF generation with multiple
|
||||||
|
LaTeX engine fallbacks (XeLaTeX, PDFLaTeX, wkhtmltopdf)
|
||||||
|
\item
|
||||||
|
📄 \textbf{Document Export} - Convert to HTML, DOCX, LaTeX, RTF, ODT,
|
||||||
|
EPUB, PowerPoint (PPTX), and OpenDocument Presentation (ODP)
|
||||||
|
\item
|
||||||
|
📊 \textbf{Spreadsheet Export} - Export markdown tables to Excel
|
||||||
|
(XLSX/XLS) and OpenDocument Spreadsheet (ODS) formats
|
||||||
|
\item
|
||||||
|
📥 \textbf{Document Import} - Import DOCX, ODT, RTF, HTML, PDF, and
|
||||||
|
presentation files to markdown
|
||||||
|
\item
|
||||||
|
📋 \textbf{Table Creation Helper} - Built-in table generator for easy
|
||||||
|
markdown table creation
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{platform-support}{%
|
||||||
|
\subsubsection{🖥️ Platform Support}\label{platform-support}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{Cross-Platform} - Works seamlessly on Windows, macOS, and
|
||||||
|
Linux
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{installation}{%
|
||||||
|
\subsection{Installation}\label{installation}}
|
||||||
|
|
||||||
|
\hypertarget{prerequisites}{%
|
||||||
|
\subsubsection{Prerequisites}\label{prerequisites}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\href{https://pandoc.org/installing.html}{Pandoc} must be installed
|
||||||
|
for export functionality
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{Ubuntu/Debian}: \texttt{sudo\ apt-get\ install\ pandoc}
|
||||||
|
\item
|
||||||
|
\textbf{macOS}: \texttt{brew\ install\ pandoc}
|
||||||
|
\item
|
||||||
|
\textbf{Windows}: Download installer from Pandoc website
|
||||||
|
\end{itemize}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{pdf-export-requirements}{%
|
||||||
|
\subsubsection{PDF Export Requirements}\label{pdf-export-requirements}}
|
||||||
|
|
||||||
|
For optimal PDF export, install a LaTeX engine (recommended): -
|
||||||
|
\textbf{Ubuntu/Debian}:
|
||||||
|
\texttt{sudo\ apt-get\ install\ texlive-xetex\ texlive-latex-base} -
|
||||||
|
\textbf{macOS}: \texttt{brew\ install\ -\/-cask\ mactex} -
|
||||||
|
\textbf{Windows}: Install MiKTeX or TeX Live - \textbf{Alternative}:
|
||||||
|
\texttt{sudo\ apt-get\ install\ wkhtmltopdf} (fallback option)
|
||||||
|
|
||||||
|
\hypertarget{download}{%
|
||||||
|
\subsubsection{Download}\label{download}}
|
||||||
|
|
||||||
|
Download the latest release for your platform from the
|
||||||
|
\href{https://github.com/amitwh/pan-converter/releases}{Releases} page.
|
||||||
|
|
||||||
|
\hypertarget{linux}{%
|
||||||
|
\paragraph{Linux}\label{linux}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{AppImage}: \texttt{PanConverter-1.3.1.AppImage} (universal,
|
||||||
|
may require \texttt{-\/-no-sandbox} flag)
|
||||||
|
\item
|
||||||
|
\textbf{Debian Package}: \texttt{pan-converter\_1.3.1\_amd64.deb}
|
||||||
|
\item
|
||||||
|
\textbf{Snap Package}: \texttt{pan-converter\_1.3.1\_amd64.snap}
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{install-from-source}{%
|
||||||
|
\subsubsection{Install from Source}\label{install-from-source}}
|
||||||
|
|
||||||
|
\begin{Shaded}
|
||||||
|
\begin{Highlighting}[]
|
||||||
|
\FunctionTok{git}\NormalTok{ clone https://github.com/amitwh/pan{-}converter.git}
|
||||||
|
\BuiltInTok{cd}\NormalTok{ pan{-}converter}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ install}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ start}
|
||||||
|
\end{Highlighting}
|
||||||
|
\end{Shaded}
|
||||||
|
|
||||||
|
\hypertarget{usage}{%
|
||||||
|
\subsection{Usage}\label{usage}}
|
||||||
|
|
||||||
|
\hypertarget{basic-workflow}{%
|
||||||
|
\subsubsection{Basic Workflow}\label{basic-workflow}}
|
||||||
|
|
||||||
|
\begin{enumerate}
|
||||||
|
\def\labelenumi{\arabic{enumi}.}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{Write} - Use the editor to write your Markdown content
|
||||||
|
\item
|
||||||
|
\textbf{Preview} - Toggle the preview pane to see rendered output
|
||||||
|
\item
|
||||||
|
\textbf{Theme} - Choose your preferred theme from the View menu
|
||||||
|
\item
|
||||||
|
\textbf{Export} - Export your document to various formats
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
\hypertarget{export-options}{%
|
||||||
|
\subsubsection{Export Options}\label{export-options}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{Documents}: HTML, PDF, DOCX, LaTeX, RTF, ODT, EPUB
|
||||||
|
\item
|
||||||
|
\textbf{Presentations}: PowerPoint (PPTX), OpenDocument Presentation
|
||||||
|
(ODP)
|
||||||
|
\item
|
||||||
|
\textbf{Spreadsheets}: Excel (XLSX/XLS), OpenDocument Spreadsheet
|
||||||
|
(ODS)
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{import-conversion}{%
|
||||||
|
\subsubsection{Import \& Conversion}\label{import-conversion}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{Import Documents}: Convert DOCX, ODT, RTF, HTML, PDF, and
|
||||||
|
presentation files to Markdown
|
||||||
|
\item
|
||||||
|
\textbf{Cross-Format Conversion}: Convert current file between
|
||||||
|
multiple formats
|
||||||
|
\item
|
||||||
|
\textbf{Smart Presentation Handling}: Automatic slide-level formatting
|
||||||
|
for PPTX/ODP exports
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{table-creation}{%
|
||||||
|
\subsubsection{Table Creation}\label{table-creation}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
Click the table button in the toolbar
|
||||||
|
\item
|
||||||
|
Specify number of rows and columns
|
||||||
|
\item
|
||||||
|
Automatically generates properly formatted Markdown tables
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{keyboard-shortcuts}{%
|
||||||
|
\subsection{Keyboard Shortcuts}\label{keyboard-shortcuts}}
|
||||||
|
|
||||||
|
\hypertarget{file-operations}{%
|
||||||
|
\subsubsection{File Operations}\label{file-operations}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ N} - New file/tab
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ T} - New tab
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ W} - Close current tab
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ Tab} - Switch to next tab
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ O} - Open file
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ S} - Save file
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ Shift\ +\ S} - Save as
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ I} - Import document
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{editor-features}{%
|
||||||
|
\subsubsection{Editor Features}\label{editor-features}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ F} - Find \& Replace
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ Z} - Undo
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ Shift\ +\ Z} - Redo
|
||||||
|
\item
|
||||||
|
\texttt{Tab} - Indent lines or insert 4 spaces
|
||||||
|
\item
|
||||||
|
\texttt{Shift\ +\ Tab} - Outdent selected lines
|
||||||
|
\item
|
||||||
|
\texttt{Enter} - Auto-continue lists with proper indentation
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{view-navigation}{%
|
||||||
|
\subsubsection{View \& Navigation}\label{view-navigation}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ P} - Toggle preview
|
||||||
|
\item
|
||||||
|
\texttt{Ctrl/Cmd\ +\ Enter} - Toggle preview (alternative)
|
||||||
|
\item
|
||||||
|
\texttt{Escape} - Close find dialog
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{building}{%
|
||||||
|
\subsection{Building}\label{building}}
|
||||||
|
|
||||||
|
\begin{Shaded}
|
||||||
|
\begin{Highlighting}[]
|
||||||
|
\CommentTok{\# Install dependencies}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ install}
|
||||||
|
|
||||||
|
\CommentTok{\# Generate icons}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run generate{-}icons}
|
||||||
|
|
||||||
|
\CommentTok{\# Build for current platform}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run build}
|
||||||
|
|
||||||
|
\CommentTok{\# Build for specific platform}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run build:win }\CommentTok{\# Windows}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run build:mac }\CommentTok{\# macOS }
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run build:linux }\CommentTok{\# Linux (generates .deb, .AppImage, and .snap)}
|
||||||
|
|
||||||
|
\CommentTok{\# Build for all platforms}
|
||||||
|
\ExtensionTok{npm}\NormalTok{ run dist:all}
|
||||||
|
\end{Highlighting}
|
||||||
|
\end{Shaded}
|
||||||
|
|
||||||
|
\hypertarget{version-history}{%
|
||||||
|
\subsection{Version History}\label{version-history}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
\textbf{v1.3.1} - Bug fixes: Fixed file associations for
|
||||||
|
double-clicking .md files, corrected 50/50 layout alignment for
|
||||||
|
editor/preview panes
|
||||||
|
\item
|
||||||
|
\textbf{v1.3.0} - Major update: Tabbed interface for multiple files,
|
||||||
|
enhanced PDF export with LaTeX engines, fixed file associations,
|
||||||
|
removed redundant converter menu, improved UI architecture
|
||||||
|
\item
|
||||||
|
\textbf{v1.2.1} - Comprehensive editor enhancements: Find \& Replace,
|
||||||
|
Line Numbers, Undo/Redo, Auto-indentation, PowerPoint export, document
|
||||||
|
conversion menu, table creation helper, spreadsheet export
|
||||||
|
\item
|
||||||
|
\textbf{v1.1.0} - Added Excel/ODS spreadsheet export, updated author
|
||||||
|
information, renamed to PanConverter
|
||||||
|
\item
|
||||||
|
\textbf{v1.0.0} - Initial release with basic markdown editing, themes,
|
||||||
|
and Pandoc export
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{known-issues}{%
|
||||||
|
\subsection{Known Issues}\label{known-issues}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
AppImage may require \texttt{-\/-no-sandbox} flag on some Linux
|
||||||
|
systems
|
||||||
|
\item
|
||||||
|
Windows/Mac builds require platform-specific build environments
|
||||||
|
\item
|
||||||
|
Large files may cause performance issues
|
||||||
|
\end{itemize}
|
||||||
|
|
||||||
|
\hypertarget{contributing}{%
|
||||||
|
\subsection{Contributing}\label{contributing}}
|
||||||
|
|
||||||
|
Contributions are welcome! Please feel free to submit a Pull Request to
|
||||||
|
the \href{https://github.com/amitwh/pan-converter}{GitHub repository}.
|
||||||
|
|
||||||
|
\hypertarget{license}{%
|
||||||
|
\subsection{License}\label{license}}
|
||||||
|
|
||||||
|
MIT License - see LICENSE file for details.
|
||||||
|
|
||||||
|
\hypertarget{author}{%
|
||||||
|
\subsection{Author}\label{author}}
|
||||||
|
|
||||||
|
\textbf{Amit Haridas} -
|
||||||
|
\href{mailto:amit.wh@gmail.com}{\nolinkurl{amit.wh@gmail.com}}
|
||||||
|
|
||||||
|
\hypertarget{acknowledgments}{%
|
||||||
|
\subsection{Acknowledgments}\label{acknowledgments}}
|
||||||
|
|
||||||
|
\begin{itemize}
|
||||||
|
\tightlist
|
||||||
|
\item
|
||||||
|
Built with \href{https://www.electronjs.org/}{Electron}
|
||||||
|
\item
|
||||||
|
Markdown parsing by \href{https://marked.js.org/}{marked}
|
||||||
|
\item
|
||||||
|
Export functionality powered by \href{https://pandoc.org/}{Pandoc}
|
||||||
|
\item
|
||||||
|
Syntax highlighting by \href{https://highlightjs.org/}{highlight.js}
|
||||||
|
\item
|
||||||
|
Spreadsheet export by \href{https://www.npmjs.com/package/xlsx}{XLSX}
|
||||||
|
\item
|
||||||
|
HTML sanitization by
|
||||||
|
\href{https://www.npmjs.com/package/dompurify}{DOMPurify}
|
||||||
|
\end{itemize}
|
||||||
@@ -6,24 +6,60 @@ A cross-platform Markdown editor and converter powered by Pandoc.
|
|||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
- 📝 **Rich Markdown Editor** - Full-featured editor with syntax highlighting
|
### ✨ Advanced Markdown Editor
|
||||||
- 👁️ **Live Preview** - See your markdown rendered in real-time
|
- 🗂️ **Tabbed Interface** - Work with multiple files simultaneously in separate tabs
|
||||||
|
- 📝 **Rich Text Editor** - Full-featured editor with syntax highlighting and comprehensive toolbar
|
||||||
|
- 🔍 **Find & Replace** - Powerful search and replace with match highlighting and navigation
|
||||||
|
- 🔢 **Line Numbers** - Toggle line numbers for easier code editing and navigation
|
||||||
|
- ↩️ **Smart Auto-Indentation** - Automatic list continuation and intelligent indentation
|
||||||
|
- ⏪ **Undo/Redo** - Full undo/redo support with keyboard shortcuts
|
||||||
|
- ⌨️ **Advanced Shortcuts** - Tab indentation, line selection, and smart text formatting
|
||||||
|
- 📂 **File Association Support** - Open markdown files directly from file manager
|
||||||
|
|
||||||
|
### 🎨 Themes & Interface
|
||||||
|
- 👁️ **Live Preview** - See your markdown rendered in real-time with synchronized scrolling
|
||||||
- 🎨 **Multiple Themes** - Choose from Light, Dark, Solarized, Monokai, or GitHub themes
|
- 🎨 **Multiple Themes** - Choose from Light, Dark, Solarized, Monokai, or GitHub themes
|
||||||
- 📤 **Export to Multiple Formats** - Convert to HTML, PDF, DOCX, LaTeX, RTF, ODT, and EPUB
|
- 💾 **Auto-Save** - Never lose your work with automatic saving every 30 seconds
|
||||||
- 💾 **Auto-Save** - Never lose your work with automatic saving
|
- 📊 **Enhanced Statistics** - Detailed document statistics including word count, character count, lines, paragraphs, sentences, and estimated reading time
|
||||||
- 🖥️ **Cross-Platform** - Works on Windows, macOS, and Linux
|
- 🕒 **Recent Files** - Quick access to recently opened files via File menu
|
||||||
|
- 🧮 **Math Support** - Render mathematical expressions using KaTeX (supports $$, $, \\[\\], \\(\\) delimiters)
|
||||||
|
|
||||||
|
### 📤 Export & Conversion
|
||||||
|
- 📄 **Enhanced PDF Export** - Robust PDF generation with multiple LaTeX engine fallbacks (XeLaTeX, PDFLaTeX, wkhtmltopdf)
|
||||||
|
- 📄 **Document Export** - Convert to HTML, DOCX, LaTeX, RTF, ODT, EPUB, PowerPoint (PPTX), and OpenDocument Presentation (ODP)
|
||||||
|
- 📊 **Spreadsheet Export** - Export markdown tables to CSV format for compatibility with any spreadsheet application
|
||||||
|
- 📥 **Document Import** - Import DOCX, ODT, RTF, HTML, PDF, and presentation files to markdown
|
||||||
|
- 📋 **Table Creation Helper** - Built-in table generator for easy markdown table creation
|
||||||
|
|
||||||
|
### 🖥️ Platform Support
|
||||||
|
- **Cross-Platform** - Works seamlessly on Windows, macOS, and Linux
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
### Prerequisites
|
### Prerequisites
|
||||||
- [Pandoc](https://pandoc.org/installing.html) must be installed for export functionality
|
- [Pandoc](https://pandoc.org/installing.html) must be installed for export functionality
|
||||||
|
- **Ubuntu/Debian**: `sudo apt-get install pandoc`
|
||||||
|
- **macOS**: `brew install pandoc`
|
||||||
|
- **Windows**: Download installer from Pandoc website
|
||||||
|
|
||||||
|
### PDF Export Requirements
|
||||||
|
For optimal PDF export, install a LaTeX engine (recommended):
|
||||||
|
- **Ubuntu/Debian**: `sudo apt-get install texlive-xetex texlive-latex-base`
|
||||||
|
- **macOS**: `brew install --cask mactex`
|
||||||
|
- **Windows**: Install MiKTeX or TeX Live
|
||||||
|
- **Alternative**: `sudo apt-get install wkhtmltopdf` (fallback option)
|
||||||
|
|
||||||
### Download
|
### Download
|
||||||
Download the latest release for your platform from the [Releases](https://github.com/yourusername/pan-converter/releases) page.
|
Download the latest release for your platform from the [Releases](https://github.com/amitwh/pan-converter/releases) page.
|
||||||
|
|
||||||
|
#### Linux
|
||||||
|
- **AppImage**: `PanConverter-1.5.0.AppImage` (universal, may require `--no-sandbox` flag)
|
||||||
|
- **Debian Package**: `pan-converter_1.5.6_amd64.deb`
|
||||||
|
- **Snap Package**: `pan-converter_1.5.6_amd64.snap`
|
||||||
|
|
||||||
### Install from Source
|
### Install from Source
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/yourusername/pan-converter.git
|
git clone https://github.com/amitwh/pan-converter.git
|
||||||
cd pan-converter
|
cd pan-converter
|
||||||
npm install
|
npm install
|
||||||
npm start
|
npm start
|
||||||
@@ -31,45 +67,108 @@ npm start
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
### Basic Workflow
|
||||||
1. **Write** - Use the editor to write your Markdown content
|
1. **Write** - Use the editor to write your Markdown content
|
||||||
2. **Preview** - Toggle the preview pane to see rendered output
|
2. **Preview** - Toggle the preview pane to see rendered output
|
||||||
3. **Theme** - Choose your preferred theme from the View menu
|
3. **Theme** - Choose your preferred theme from the View menu
|
||||||
4. **Export** - Export your document to various formats via File > Export
|
4. **Export** - Export your document to various formats
|
||||||
|
|
||||||
|
### Export Options
|
||||||
|
- **Documents**: HTML, PDF, DOCX, LaTeX, RTF, ODT, EPUB
|
||||||
|
- **Presentations**: PowerPoint (PPTX), OpenDocument Presentation (ODP)
|
||||||
|
- **Spreadsheets**: CSV format for tables (compatible with Excel, LibreOffice, Google Sheets)
|
||||||
|
- **Advanced Export Options**: Optional template support, metadata insertion, table of contents, section numbering, and PDF-specific settings
|
||||||
|
- **Batch Conversion**: Convert entire folders of markdown files with progress tracking
|
||||||
|
|
||||||
|
### Import & Conversion
|
||||||
|
- **Import Documents**: Convert DOCX, ODT, RTF, HTML, PDF, and presentation files to Markdown
|
||||||
|
- **Cross-Format Conversion**: Convert current file between multiple formats
|
||||||
|
- **Smart Presentation Handling**: Automatic slide-level formatting for PPTX/ODP exports
|
||||||
|
|
||||||
|
### Table Creation
|
||||||
|
- Click the table button in the toolbar
|
||||||
|
- Specify number of rows and columns
|
||||||
|
- Automatically generates properly formatted Markdown tables
|
||||||
|
|
||||||
## Keyboard Shortcuts
|
## Keyboard Shortcuts
|
||||||
|
|
||||||
- `Ctrl/Cmd + N` - New file
|
### File Operations
|
||||||
|
- `Ctrl/Cmd + N` - New file/tab
|
||||||
|
- `Ctrl/Cmd + T` - New tab
|
||||||
|
- `Ctrl/Cmd + W` - Close current tab
|
||||||
|
- `Ctrl/Cmd + Tab` - Switch to next tab
|
||||||
- `Ctrl/Cmd + O` - Open file
|
- `Ctrl/Cmd + O` - Open file
|
||||||
- `Ctrl/Cmd + S` - Save file
|
- `Ctrl/Cmd + S` - Save file
|
||||||
- `Ctrl/Cmd + Shift + S` - Save as
|
- `Ctrl/Cmd + Shift + S` - Save as
|
||||||
|
- `Ctrl/Cmd + I` - Import document
|
||||||
|
|
||||||
|
### Editor Features
|
||||||
|
- `Ctrl/Cmd + F` - Find & Replace
|
||||||
|
- `Ctrl/Cmd + Z` - Undo
|
||||||
|
- `Ctrl/Cmd + Shift + Z` - Redo
|
||||||
|
- `Tab` - Indent lines or insert 4 spaces
|
||||||
|
- `Shift + Tab` - Outdent selected lines
|
||||||
|
- `Enter` - Auto-continue lists with proper indentation
|
||||||
|
|
||||||
|
### View & Navigation
|
||||||
- `Ctrl/Cmd + P` - Toggle preview
|
- `Ctrl/Cmd + P` - Toggle preview
|
||||||
- `Ctrl/Cmd + Enter` - Toggle preview (alternative)
|
- `Ctrl/Cmd + Enter` - Toggle preview (alternative)
|
||||||
|
- `Escape` - Close find dialog
|
||||||
|
|
||||||
## Building
|
## Building
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
# Install dependencies
|
||||||
|
npm install
|
||||||
|
|
||||||
|
# Generate icons
|
||||||
|
npm run generate-icons
|
||||||
|
|
||||||
# Build for current platform
|
# Build for current platform
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
# Build for specific platform
|
# Build for specific platform
|
||||||
npm run build:win
|
npm run build:win # Windows
|
||||||
npm run build:mac
|
npm run build:mac # macOS
|
||||||
npm run build:linux
|
npm run build:linux # Linux (generates .deb, .AppImage, and .snap)
|
||||||
|
|
||||||
# Build for all platforms
|
# Build for all platforms
|
||||||
npm run dist:all
|
npm run dist:all
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Version History
|
||||||
|
|
||||||
|
- **v1.5.6** - (Your release notes here)
|
||||||
|
- **v1.5.5** - Refactored PDF export, simplified Pandoc pathing, and removed XLSX dependency.
|
||||||
|
- **v1.3.1** - Bug fixes: Fixed file associations for double-clicking .md files, corrected 50/50 layout alignment for editor/preview panes
|
||||||
|
- **v1.3.0** - Major update: Tabbed interface for multiple files, enhanced PDF export with LaTeX engines, fixed file associations, removed redundant converter menu, improved UI architecture
|
||||||
|
- **v1.2.1** - Comprehensive editor enhancements: Find & Replace, Line Numbers, Undo/Redo, Auto-indentation, PowerPoint export, document conversion menu, table creation helper, spreadsheet export
|
||||||
|
- **v1.1.0** - Added Excel/ODS spreadsheet export, updated author information, renamed to PanConverter
|
||||||
|
- **v1.0.0** - Initial release with basic markdown editing, themes, and Pandoc export
|
||||||
|
|
||||||
|
## Known Issues
|
||||||
|
|
||||||
|
- AppImage may require `--no-sandbox` flag on some Linux systems
|
||||||
|
- Windows/Mac builds require platform-specific build environments
|
||||||
|
- Large files may cause performance issues
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
|
|
||||||
Contributions are welcome! Please feel free to submit a Pull Request.
|
Contributions are welcome! Please feel free to submit a Pull Request to the [GitHub repository](https://github.com/amitwh/pan-converter).
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License - see LICENSE file for details
|
MIT License - see LICENSE file for details.
|
||||||
|
|
||||||
|
## Author
|
||||||
|
|
||||||
|
**Amit Haridas** - [amit.wh@gmail.com](mailto:amit.wh@gmail.com)
|
||||||
|
|
||||||
## Acknowledgments
|
## Acknowledgments
|
||||||
|
|
||||||
- Built with [Electron](https://www.electronjs.org/)
|
- Built with [Electron](https://www.electronjs.org/)
|
||||||
- Markdown parsing by [marked](https://marked.js.org/)
|
- Markdown parsing by [marked](https://marked.js.org/)
|
||||||
- Export functionality powered by [Pandoc](https://pandoc.org/)
|
- Export functionality powered by [Pandoc](https://pandoc.org/)
|
||||||
|
- Syntax highlighting by [highlight.js](https://highlightjs.org/)
|
||||||
|
- Spreadsheet export by [XLSX](https://www.npmjs.com/package/xlsx)
|
||||||
|
- HTML sanitization by [DOMPurify](https://www.npmjs.com/package/dompurify)
|
||||||
BIN
Binary file not shown.
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 8.6 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
+74
-11
@@ -1,23 +1,30 @@
|
|||||||
{
|
{
|
||||||
"name": "pan-converter",
|
"name": "pan-converter",
|
||||||
"version": "1.0.0",
|
"version": "1.7.1",
|
||||||
"description": "Cross-platform Markdown editor and converter using Pandoc",
|
"description": "Cross-platform Markdown editor and converter using Pandoc",
|
||||||
"main": "src/main.js",
|
"main": "src/main.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "electron .",
|
"start": "electron .",
|
||||||
"test": "echo \"Error: no test specified\" && exit 1",
|
"test": "echo \"Error: no test specified\" && exit 1",
|
||||||
"build": "electron-builder",
|
"build": "electron-builder",
|
||||||
"build:win": "electron-builder --win",
|
"build:win": "cross-env CSC_LINK=code-signing-cert.pfx CSC_KEY_PASSWORD=PanConverter2024! electron-builder --win",
|
||||||
|
"build:win-unsigned": "cross-env CSC_IDENTITY_AUTO_DISCOVERY=false electron-builder --win",
|
||||||
"build:mac": "electron-builder --mac",
|
"build:mac": "electron-builder --mac",
|
||||||
"build:linux": "electron-builder --linux",
|
"build:linux": "electron-builder --linux",
|
||||||
"dist": "electron-builder --publish=never",
|
"dist": "electron-builder --publish=never",
|
||||||
"dist:all": "electron-builder -mwl",
|
"dist:all": "electron-builder -mwl",
|
||||||
"generate-icons": "node scripts/generate-icons.js"
|
"generate-icons": "node scripts/generate-icons.js"
|
||||||
},
|
},
|
||||||
"keywords": ["markdown", "pandoc", "converter", "editor"],
|
"keywords": [
|
||||||
"author": "Your Name",
|
"markdown",
|
||||||
|
"pandoc",
|
||||||
|
"converter",
|
||||||
|
"editor"
|
||||||
|
],
|
||||||
|
"author": "Amit Haridas <amit.wh@gmail.com>",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"cross-env": "^10.0.0",
|
||||||
"electron": "^37.4.0",
|
"electron": "^37.4.0",
|
||||||
"electron-builder": "^26.0.12",
|
"electron-builder": "^26.0.12",
|
||||||
"sharp": "^0.34.3"
|
"sharp": "^0.34.3"
|
||||||
@@ -27,7 +34,10 @@
|
|||||||
"dompurify": "^3.2.6",
|
"dompurify": "^3.2.6",
|
||||||
"electron-store": "^10.1.0",
|
"electron-store": "^10.1.0",
|
||||||
"highlight.js": "^11.11.1",
|
"highlight.js": "^11.11.1",
|
||||||
"marked": "^16.2.1"
|
"marked": "^16.2.1",
|
||||||
|
"pdf-lib": "^1.17.1",
|
||||||
|
"tslib": "^2.8.1",
|
||||||
|
"xlsx": "^0.18.5"
|
||||||
},
|
},
|
||||||
"build": {
|
"build": {
|
||||||
"appId": "com.panconverter.app",
|
"appId": "com.panconverter.app",
|
||||||
@@ -35,19 +45,73 @@
|
|||||||
"directories": {
|
"directories": {
|
||||||
"output": "dist"
|
"output": "dist"
|
||||||
},
|
},
|
||||||
|
"icon": "assets/icon",
|
||||||
"files": [
|
"files": [
|
||||||
"src/**/*",
|
"src/**/*",
|
||||||
"assets/**/*",
|
"assets/**/*",
|
||||||
|
"scripts/**/*",
|
||||||
"node_modules/**/*",
|
"node_modules/**/*",
|
||||||
"package.json"
|
"package.json"
|
||||||
],
|
],
|
||||||
|
"fileAssociations": [
|
||||||
|
{
|
||||||
|
"ext": "md",
|
||||||
|
"name": "Markdown Document",
|
||||||
|
"description": "Markdown Document",
|
||||||
|
"mimeType": "text/markdown",
|
||||||
|
"role": "Editor"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ext": "markdown",
|
||||||
|
"name": "Markdown Document",
|
||||||
|
"description": "Markdown Document",
|
||||||
|
"mimeType": "text/markdown",
|
||||||
|
"role": "Editor"
|
||||||
|
}
|
||||||
|
],
|
||||||
"mac": {
|
"mac": {
|
||||||
"category": "public.app-category.productivity",
|
"category": "public.app-category.productivity"
|
||||||
"icon": "assets/icon.icns"
|
|
||||||
},
|
},
|
||||||
"win": {
|
"win": {
|
||||||
|
"target": [
|
||||||
|
{
|
||||||
"target": "nsis",
|
"target": "nsis",
|
||||||
"icon": "assets/icon.ico"
|
"arch": [
|
||||||
|
"x64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "portable",
|
||||||
|
"arch": [
|
||||||
|
"x64"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"target": "zip",
|
||||||
|
"arch": [
|
||||||
|
"x64"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"artifactName": "${productName}-${version}-${arch}.${ext}",
|
||||||
|
"requestedExecutionLevel": "asInvoker",
|
||||||
|
"signAndEditExecutable": false
|
||||||
|
},
|
||||||
|
"nsis": {
|
||||||
|
"oneClick": false,
|
||||||
|
"perMachine": false,
|
||||||
|
"allowToChangeInstallationDirectory": true,
|
||||||
|
"displayLanguageSelector": true,
|
||||||
|
"createDesktopShortcut": true,
|
||||||
|
"createStartMenuShortcut": true,
|
||||||
|
"shortcutName": "PanConverter",
|
||||||
|
"runAfterFinish": true,
|
||||||
|
"menuCategory": "Productivity",
|
||||||
|
"license": "LICENSE",
|
||||||
|
"warningsAsErrors": false,
|
||||||
|
"artifactName": "${productName}-Setup-${version}.${ext}",
|
||||||
|
"deleteAppDataOnUninstall": false,
|
||||||
|
"differentialPackage": true
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"target": [
|
"target": [
|
||||||
@@ -55,15 +119,14 @@
|
|||||||
"AppImage",
|
"AppImage",
|
||||||
"snap"
|
"snap"
|
||||||
],
|
],
|
||||||
"category": "Utility",
|
"category": "Utility"
|
||||||
"icon": "assets/icon.png"
|
|
||||||
},
|
},
|
||||||
"deb": {
|
"deb": {
|
||||||
"depends": [
|
"depends": [
|
||||||
"pandoc"
|
"pandoc"
|
||||||
],
|
],
|
||||||
"description": "Markdown editor and converter using Pandoc",
|
"description": "Markdown editor and converter using Pandoc",
|
||||||
"maintainer": "Your Name <your.email@example.com>"
|
"maintainer": "Amit Haridas <amit.wh@gmail.com>"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,116 @@
|
|||||||
|
# PanConverter Windows Explorer Context Menu Integration
|
||||||
|
|
||||||
|
This directory contains scripts to add PanConverter to the Windows Explorer context menu, allowing you to right-click on files and convert them directly without opening the full application.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
### Context Menu Options
|
||||||
|
- **Convert with PanConverter**: Shows a format selection dialog for any supported file
|
||||||
|
- **PanConverter > Convert to...**: Direct conversion options (for Markdown files)
|
||||||
|
- PDF
|
||||||
|
- HTML
|
||||||
|
- DOCX
|
||||||
|
- LaTeX
|
||||||
|
- PowerPoint
|
||||||
|
|
||||||
|
### Supported File Types
|
||||||
|
- **Markdown**: `.md`, `.markdown`
|
||||||
|
- **HTML**: `.html`, `.htm`
|
||||||
|
- **Documents**: `.docx`, `.odt`, `.rtf`
|
||||||
|
- **LaTeX**: `.tex`
|
||||||
|
- **PDF**: `.pdf`
|
||||||
|
- **Presentations**: `.pptx`, `.ppt`, `.odp`
|
||||||
|
|
||||||
|
## Installation Methods
|
||||||
|
|
||||||
|
### Method 1: Automatic (During PanConverter Installation)
|
||||||
|
When installing PanConverter using the Windows installer, you'll be prompted to install context menu integration automatically.
|
||||||
|
|
||||||
|
### Method 2: Manual Installation
|
||||||
|
|
||||||
|
#### Using PowerShell (Recommended)
|
||||||
|
1. Right-click on `install-context-menu.ps1`
|
||||||
|
2. Select "Run with PowerShell"
|
||||||
|
3. Follow the prompts (will request administrator privileges)
|
||||||
|
|
||||||
|
#### Using Batch File
|
||||||
|
1. Right-click on `install-context-menu.bat`
|
||||||
|
2. Select "Run as administrator"
|
||||||
|
3. Follow the prompts
|
||||||
|
|
||||||
|
#### Using Registry File Directly
|
||||||
|
1. Right-click on `install-context-menu.reg`
|
||||||
|
2. Select "Merge"
|
||||||
|
3. Confirm the registry modification
|
||||||
|
|
||||||
|
## Uninstallation
|
||||||
|
|
||||||
|
### Using PowerShell
|
||||||
|
```powershell
|
||||||
|
.\install-context-menu.ps1 -Uninstall
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using Batch File
|
||||||
|
Run `uninstall-context-menu.bat` as administrator
|
||||||
|
|
||||||
|
### Using Registry File
|
||||||
|
Run `uninstall-context-menu.reg`
|
||||||
|
|
||||||
|
## How It Works
|
||||||
|
|
||||||
|
### Command Line Interface
|
||||||
|
The context menu integration works by passing command line arguments to PanConverter:
|
||||||
|
|
||||||
|
- `--convert <file>`: Shows conversion dialog for the specified file
|
||||||
|
- `--convert-to <format> <file>`: Directly converts to the specified format
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
```batch
|
||||||
|
# Show conversion dialog
|
||||||
|
PanConverter.exe --convert "document.md"
|
||||||
|
|
||||||
|
# Direct conversion to PDF
|
||||||
|
PanConverter.exe --convert-to pdf "document.md"
|
||||||
|
```
|
||||||
|
|
||||||
|
### Conversion Process
|
||||||
|
1. PanConverter reads the input file
|
||||||
|
2. Creates a temporary file if needed
|
||||||
|
3. Uses Pandoc to convert to the target format
|
||||||
|
4. Saves the output in the same directory as the input file
|
||||||
|
5. Shows a Windows notification when complete
|
||||||
|
|
||||||
|
## Requirements
|
||||||
|
|
||||||
|
- PanConverter must be installed in the default location: `%LOCALAPPDATA%\Programs\PanConverter\`
|
||||||
|
- Pandoc must be installed and accessible from the command line
|
||||||
|
- Administrator privileges required for registry modifications
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Context Menu Not Appearing
|
||||||
|
1. Ensure you ran the installation script as administrator
|
||||||
|
2. Try logging out and back in, or restart Windows Explorer
|
||||||
|
3. Check if PanConverter is installed in the expected location
|
||||||
|
|
||||||
|
### Conversion Failures
|
||||||
|
1. Verify Pandoc is installed: `pandoc --version`
|
||||||
|
2. Check if the input file is not corrupted or locked
|
||||||
|
3. Ensure you have write permissions in the output directory
|
||||||
|
|
||||||
|
### Permission Errors
|
||||||
|
- The installation scripts require administrator privileges to modify the registry
|
||||||
|
- If you get permission errors, right-click and "Run as administrator"
|
||||||
|
|
||||||
|
## File Descriptions
|
||||||
|
|
||||||
|
- `install-context-menu.reg`: Registry entries for context menu
|
||||||
|
- `uninstall-context-menu.reg`: Registry entries removal
|
||||||
|
- `install-context-menu.ps1`: PowerShell installation script
|
||||||
|
- `install-context-menu.bat`: Batch installation script
|
||||||
|
- `uninstall-context-menu.bat`: Batch uninstallation script
|
||||||
|
- `nsis-installer.nsh`: NSIS installer integration script
|
||||||
|
|
||||||
|
## Security Note
|
||||||
|
|
||||||
|
The scripts modify the Windows registry to add context menu entries. Only run these scripts if you trust the source and understand the changes being made to your system.
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
@echo off
|
||||||
|
echo PanConverter Context Menu Installation
|
||||||
|
echo =====================================
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM Check for administrator privileges
|
||||||
|
net session >nul 2>&1
|
||||||
|
if %errorLevel% == 0 (
|
||||||
|
echo Running with administrator privileges...
|
||||||
|
) else (
|
||||||
|
echo This script requires administrator privileges.
|
||||||
|
echo Please right-click and select "Run as administrator"
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
REM Check if PanConverter is installed
|
||||||
|
if not exist "%LOCALAPPDATA%\Programs\PanConverter\PanConverter.exe" (
|
||||||
|
echo Warning: PanConverter not found at the expected location.
|
||||||
|
echo Please ensure PanConverter is installed before continuing.
|
||||||
|
echo Expected location: %LOCALAPPDATA%\Programs\PanConverter\PanConverter.exe
|
||||||
|
echo.
|
||||||
|
set /p continue="Continue anyway? (y/N): "
|
||||||
|
if /i not "%continue%"=="y" exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Installing context menu entries...
|
||||||
|
reg import "%~dp0install-context-menu.reg"
|
||||||
|
|
||||||
|
if %errorLevel% == 0 (
|
||||||
|
echo.
|
||||||
|
echo Context menu integration installed successfully!
|
||||||
|
echo.
|
||||||
|
echo You can now right-click on supported files and select:
|
||||||
|
echo • "Convert with PanConverter" - Shows conversion dialog
|
||||||
|
echo • "PanConverter > Convert to..." - Direct conversion ^(for Markdown^)
|
||||||
|
echo.
|
||||||
|
echo Supported file types:
|
||||||
|
echo .md .markdown .html .htm .docx .odt .rtf .tex .pdf .pptx .ppt .odp
|
||||||
|
) else (
|
||||||
|
echo.
|
||||||
|
echo Failed to install context menu entries.
|
||||||
|
echo Please check that the registry file exists and try again.
|
||||||
|
)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# PanConverter Context Menu Installation Script
|
||||||
|
# This script installs PanConverter context menu integration for Windows Explorer
|
||||||
|
|
||||||
|
param(
|
||||||
|
[switch]$Uninstall = $false
|
||||||
|
)
|
||||||
|
|
||||||
|
# Check if running as administrator
|
||||||
|
if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||||
|
Write-Host "This script requires Administrator privileges. Restarting with elevated permissions..." -ForegroundColor Yellow
|
||||||
|
Start-Process PowerShell -Verb RunAs "-File `"$PSCommandPath`" $(if ($Uninstall) { '-Uninstall' })"
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
|
||||||
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||||||
|
$appPath = "${env:LOCALAPPDATA}\Programs\PanConverter\PanConverter.exe"
|
||||||
|
|
||||||
|
if ($Uninstall) {
|
||||||
|
Write-Host "Uninstalling PanConverter context menu integration..." -ForegroundColor Yellow
|
||||||
|
$regFile = Join-Path $scriptDir "uninstall-context-menu.reg"
|
||||||
|
|
||||||
|
if (Test-Path $regFile) {
|
||||||
|
reg import $regFile
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Host "PanConverter context menu has been successfully removed!" -ForegroundColor Green
|
||||||
|
} else {
|
||||||
|
Write-Host "Failed to remove context menu entries." -ForegroundColor Red
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Uninstall registry file not found: $regFile" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Installing PanConverter context menu integration..." -ForegroundColor Yellow
|
||||||
|
|
||||||
|
# Check if PanConverter is installed
|
||||||
|
if (-not (Test-Path $appPath)) {
|
||||||
|
Write-Host "Warning: PanConverter executable not found at: $appPath" -ForegroundColor Yellow
|
||||||
|
Write-Host "Please make sure PanConverter is installed before running this script." -ForegroundColor Yellow
|
||||||
|
$continue = Read-Host "Continue anyway? (y/N)"
|
||||||
|
if ($continue -ne 'y' -and $continue -ne 'Y') {
|
||||||
|
exit
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$regFile = Join-Path $scriptDir "install-context-menu.reg"
|
||||||
|
|
||||||
|
if (Test-Path $regFile) {
|
||||||
|
reg import $regFile
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Host "PanConverter context menu has been successfully installed!" -ForegroundColor Green
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "You can now right-click on supported files (MD, HTML, DOCX, PDF, etc.) and select:" -ForegroundColor Cyan
|
||||||
|
Write-Host "• 'Convert with PanConverter' - Shows conversion dialog" -ForegroundColor Cyan
|
||||||
|
Write-Host "• 'PanConverter > Convert to...' - Direct conversion options (for Markdown files)" -ForegroundColor Cyan
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Supported file types: .md, .markdown, .html, .htm, .docx, .odt, .rtf, .tex, .pdf, .pptx, .ppt, .odp" -ForegroundColor Gray
|
||||||
|
} else {
|
||||||
|
Write-Host "Failed to install context menu entries." -ForegroundColor Red
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "Install registry file not found: $regFile" -ForegroundColor Red
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host ""
|
||||||
|
Write-Host "Press any key to exit..."
|
||||||
|
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
Windows Registry Editor Version 5.00
|
||||||
|
|
||||||
|
; PanConverter Context Menu Integration
|
||||||
|
; This registry file adds context menu options for converting files using PanConverter
|
||||||
|
|
||||||
|
; Add context menu for Markdown files (.md, .markdown)
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.markdown\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.markdown\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for HTML files
|
||||||
|
[HKEY_CLASSES_ROOT\.html\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.html\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.htm\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.htm\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for DOCX files
|
||||||
|
[HKEY_CLASSES_ROOT\.docx\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.docx\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for ODT files
|
||||||
|
[HKEY_CLASSES_ROOT\.odt\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.odt\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for RTF files
|
||||||
|
[HKEY_CLASSES_ROOT\.rtf\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.rtf\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for LaTeX files
|
||||||
|
[HKEY_CLASSES_ROOT\.tex\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.tex\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for PDF files
|
||||||
|
[HKEY_CLASSES_ROOT\.pdf\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.pdf\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for PowerPoint files
|
||||||
|
[HKEY_CLASSES_ROOT\.pptx\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.pptx\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.ppt\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.ppt\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add context menu for OpenDocument Presentation files
|
||||||
|
[HKEY_CLASSES_ROOT\.odp\shell\PanConverter]
|
||||||
|
@="Convert with PanConverter"
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.odp\shell\PanConverter\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert \"%1\""
|
||||||
|
|
||||||
|
; Add submenu with specific conversion options for Markdown files
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu]
|
||||||
|
@="PanConverter"
|
||||||
|
"MUIVerb"="Convert to..."
|
||||||
|
"Icon"="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\""
|
||||||
|
"SubCommands"=""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\PDF]
|
||||||
|
@="PDF"
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\PDF\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert-to pdf \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\HTML]
|
||||||
|
@="HTML"
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\HTML\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert-to html \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\DOCX]
|
||||||
|
@="DOCX"
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\DOCX\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert-to docx \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\LaTeX]
|
||||||
|
@="LaTeX"
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\LaTeX\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert-to latex \"%1\""
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\PPTX]
|
||||||
|
@="PowerPoint"
|
||||||
|
|
||||||
|
[HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu\shell\PPTX\command]
|
||||||
|
@="\"%LOCALAPPDATA%\\Programs\\PanConverter\\PanConverter.exe\" --convert-to pptx \"%1\""
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
; PanConverter NSIS Installer Include File
|
||||||
|
; Handles context menu installation and uninstallation
|
||||||
|
|
||||||
|
!include "LogicLib.nsh"
|
||||||
|
!include "MUI2.nsh"
|
||||||
|
|
||||||
|
; Custom installation page for context menu option
|
||||||
|
Var ContextMenuCheckbox
|
||||||
|
Var ContextMenuState
|
||||||
|
|
||||||
|
Function ContextMenuPage
|
||||||
|
!insertmacro MUI_HEADER_TEXT "Additional Options" "Choose additional installation options"
|
||||||
|
|
||||||
|
nsDialogs::Create 1018
|
||||||
|
Pop $0
|
||||||
|
|
||||||
|
${If} $0 == error
|
||||||
|
Abort
|
||||||
|
${EndIf}
|
||||||
|
|
||||||
|
${NSD_CreateLabel} 0 0 100% 20u "Select additional features to install:"
|
||||||
|
Pop $0
|
||||||
|
|
||||||
|
${NSD_CreateCheckbox} 20u 30u 280u 15u "Add PanConverter to Windows Explorer context menu"
|
||||||
|
Pop $ContextMenuCheckbox
|
||||||
|
${NSD_SetState} $ContextMenuCheckbox ${BST_CHECKED}
|
||||||
|
|
||||||
|
${NSD_CreateLabel} 20u 50u 280u 30u "This will allow you to right-click on supported files and convert them directly using PanConverter."
|
||||||
|
Pop $0
|
||||||
|
|
||||||
|
nsDialogs::Show
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
Function ContextMenuPageLeave
|
||||||
|
${NSD_GetState} $ContextMenuCheckbox $ContextMenuState
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
; Install context menu entries
|
||||||
|
Function InstallContextMenu
|
||||||
|
${If} $ContextMenuState == ${BST_CHECKED}
|
||||||
|
DetailPrint "Installing context menu integration..."
|
||||||
|
|
||||||
|
; Create registry entries for context menu
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".markdown\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".markdown\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".markdown\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for HTML files
|
||||||
|
WriteRegStr HKCR ".html\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".html\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".html\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".htm\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".htm\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".htm\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for DOCX files
|
||||||
|
WriteRegStr HKCR ".docx\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".docx\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".docx\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for ODT files
|
||||||
|
WriteRegStr HKCR ".odt\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".odt\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".odt\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for RTF files
|
||||||
|
WriteRegStr HKCR ".rtf\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".rtf\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".rtf\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for LaTeX files
|
||||||
|
WriteRegStr HKCR ".tex\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".tex\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".tex\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for PDF files
|
||||||
|
WriteRegStr HKCR ".pdf\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".pdf\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".pdf\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for PowerPoint files
|
||||||
|
WriteRegStr HKCR ".pptx\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".pptx\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".pptx\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".ppt\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".ppt\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".ppt\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Context menu for ODP files
|
||||||
|
WriteRegStr HKCR ".odp\shell\PanConverter" "" "Convert with PanConverter"
|
||||||
|
WriteRegStr HKCR ".odp\shell\PanConverter" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".odp\shell\PanConverter\command" "" '"$INSTDIR\PanConverter.exe" --convert "%1"'
|
||||||
|
|
||||||
|
; Submenu for Markdown files with direct conversion options
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu" "" "PanConverter"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu" "MUIVerb" "Convert to..."
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu" "Icon" "$INSTDIR\PanConverter.exe"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu" "SubCommands" ""
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\PDF" "" "PDF"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\PDF\command" "" '"$INSTDIR\PanConverter.exe" --convert-to pdf "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\HTML" "" "HTML"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\HTML\command" "" '"$INSTDIR\PanConverter.exe" --convert-to html "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\DOCX" "" "DOCX"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\DOCX\command" "" '"$INSTDIR\PanConverter.exe" --convert-to docx "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\LaTeX" "" "LaTeX"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\LaTeX\command" "" '"$INSTDIR\PanConverter.exe" --convert-to latex "%1"'
|
||||||
|
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\PPTX" "" "PowerPoint"
|
||||||
|
WriteRegStr HKCR ".md\shell\PanConverterMenu\shell\PPTX\command" "" '"$INSTDIR\PanConverter.exe" --convert-to pptx "%1"'
|
||||||
|
|
||||||
|
DetailPrint "Context menu integration installed successfully!"
|
||||||
|
${EndIf}
|
||||||
|
FunctionEnd
|
||||||
|
|
||||||
|
; Uninstall context menu entries
|
||||||
|
Function un.RemoveContextMenu
|
||||||
|
DetailPrint "Removing context menu integration..."
|
||||||
|
|
||||||
|
; Remove context menu entries for all file types
|
||||||
|
DeleteRegKey HKCR ".md\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".md\shell\PanConverterMenu"
|
||||||
|
DeleteRegKey HKCR ".markdown\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".html\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".htm\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".docx\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".odt\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".rtf\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".tex\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".pdf\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".pptx\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".ppt\shell\PanConverter"
|
||||||
|
DeleteRegKey HKCR ".odp\shell\PanConverter"
|
||||||
|
|
||||||
|
DetailPrint "Context menu integration removed successfully!"
|
||||||
|
FunctionEnd
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
@echo off
|
||||||
|
echo PanConverter Context Menu Uninstallation
|
||||||
|
echo ========================================
|
||||||
|
echo.
|
||||||
|
|
||||||
|
REM Check for administrator privileges
|
||||||
|
net session >nul 2>&1
|
||||||
|
if %errorLevel% == 0 (
|
||||||
|
echo Running with administrator privileges...
|
||||||
|
) else (
|
||||||
|
echo This script requires administrator privileges.
|
||||||
|
echo Please right-click and select "Run as administrator"
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
echo Removing context menu entries...
|
||||||
|
reg import "%~dp0uninstall-context-menu.reg"
|
||||||
|
|
||||||
|
if %errorLevel% == 0 (
|
||||||
|
echo.
|
||||||
|
echo Context menu integration removed successfully!
|
||||||
|
echo PanConverter entries have been removed from the Windows Explorer context menu.
|
||||||
|
) else (
|
||||||
|
echo.
|
||||||
|
echo Failed to remove context menu entries.
|
||||||
|
echo Please check that the registry file exists and try again.
|
||||||
|
)
|
||||||
|
|
||||||
|
echo.
|
||||||
|
pause
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
Windows Registry Editor Version 5.00
|
||||||
|
|
||||||
|
; PanConverter Context Menu Uninstall Script
|
||||||
|
; This registry file removes PanConverter context menu entries
|
||||||
|
|
||||||
|
; Remove context menu for Markdown files (.md, .markdown)
|
||||||
|
[-HKEY_CLASSES_ROOT\.md\shell\PanConverter]
|
||||||
|
[-HKEY_CLASSES_ROOT\.md\shell\PanConverterMenu]
|
||||||
|
|
||||||
|
[-HKEY_CLASSES_ROOT\.markdown\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for HTML files
|
||||||
|
[-HKEY_CLASSES_ROOT\.html\shell\PanConverter]
|
||||||
|
[-HKEY_CLASSES_ROOT\.htm\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for DOCX files
|
||||||
|
[-HKEY_CLASSES_ROOT\.docx\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for ODT files
|
||||||
|
[-HKEY_CLASSES_ROOT\.odt\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for RTF files
|
||||||
|
[-HKEY_CLASSES_ROOT\.rtf\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for LaTeX files
|
||||||
|
[-HKEY_CLASSES_ROOT\.tex\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for PDF files
|
||||||
|
[-HKEY_CLASSES_ROOT\.pdf\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for PowerPoint files
|
||||||
|
[-HKEY_CLASSES_ROOT\.pptx\shell\PanConverter]
|
||||||
|
[-HKEY_CLASSES_ROOT\.ppt\shell\PanConverter]
|
||||||
|
|
||||||
|
; Remove context menu for OpenDocument Presentation files
|
||||||
|
[-HKEY_CLASSES_ROOT\.odp\shell\PanConverter]
|
||||||
+865
-4
@@ -4,12 +4,23 @@
|
|||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<title>PanConverter - Markdown Editor</title>
|
<title>PanConverter - Markdown Editor</title>
|
||||||
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
||||||
<link rel="stylesheet" href="styles.css">
|
<link rel="stylesheet" href="styles.css">
|
||||||
|
<link rel="stylesheet" href="styles-modern.css">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.css">
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/codemirror/6.65.7/codemirror.min.css">
|
||||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.9.0/styles/default.min.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div class="container">
|
<div class="container">
|
||||||
|
<div class="tab-bar" id="tab-bar">
|
||||||
|
<div class="tab active" data-tab-id="1">
|
||||||
|
<span class="tab-title">Untitled</span>
|
||||||
|
<button class="tab-close" title="Close tab">×</button>
|
||||||
|
</div>
|
||||||
|
<button class="new-tab-button" id="new-tab-btn" title="New tab">+</button>
|
||||||
|
</div>
|
||||||
<div class="toolbar">
|
<div class="toolbar">
|
||||||
<button id="btn-bold" title="Bold">
|
<button id="btn-bold" title="Bold">
|
||||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
@@ -59,6 +70,50 @@
|
|||||||
<path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z"></path>
|
<path d="M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z"></path>
|
||||||
</svg>
|
</svg>
|
||||||
</button>
|
</button>
|
||||||
|
<button id="btn-table" title="Insert Table">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<rect x="3" y="3" width="18" height="18" rx="2" ry="2"></rect>
|
||||||
|
<line x1="3" y1="9" x2="21" y2="9"></line>
|
||||||
|
<line x1="3" y1="15" x2="21" y2="15"></line>
|
||||||
|
<line x1="9" y1="3" x2="9" y2="21"></line>
|
||||||
|
<line x1="15" y1="3" x2="15" y2="21"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button id="btn-strikethrough" title="Strikethrough">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<path d="M16 4H9a3 3 0 0 0-2.83 4"></path>
|
||||||
|
<path d="M14 12a4 4 0 0 1 0 8H6"></path>
|
||||||
|
<line x1="4" y1="12" x2="20" y2="12"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button id="btn-code-block" title="Code Block">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<rect x="2" y="6" width="20" height="12" rx="2"></rect>
|
||||||
|
<path d="m10 10-2 2 2 2"></path>
|
||||||
|
<path d="m14 10 2 2-2 2"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button id="btn-horizontal-rule" title="Horizontal Rule">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<line x1="3" y1="12" x2="21" y2="12"></line>
|
||||||
|
<line x1="3" y1="6" x2="21" y2="6"></line>
|
||||||
|
<line x1="3" y1="18" x2="21" y2="18"></line>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<div class="toolbar-separator"></div>
|
||||||
|
<button id="btn-find" title="Find & Replace (Ctrl+F)">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<circle cx="11" cy="11" r="8"></circle>
|
||||||
|
<path d="m21 21-4.35-4.35"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button id="btn-line-numbers" title="Toggle Line Numbers">
|
||||||
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
|
<path d="M3 6h18"></path>
|
||||||
|
<path d="M3 12h18"></path>
|
||||||
|
<path d="M3 18h18"></path>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
<div class="toolbar-separator"></div>
|
<div class="toolbar-separator"></div>
|
||||||
<button id="btn-preview-toggle" title="Toggle Preview">
|
<button id="btn-preview-toggle" title="Toggle Preview">
|
||||||
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
|
||||||
@@ -68,12 +123,818 @@
|
|||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Find & Replace Dialog -->
|
||||||
|
<div id="find-dialog" class="find-dialog hidden">
|
||||||
|
<div class="find-controls">
|
||||||
|
<input type="text" id="find-input" placeholder="Find...">
|
||||||
|
<input type="text" id="replace-input" placeholder="Replace...">
|
||||||
|
<button id="btn-find-prev" title="Previous">↑</button>
|
||||||
|
<button id="btn-find-next" title="Next">↓</button>
|
||||||
|
<button id="btn-replace" title="Replace">Replace</button>
|
||||||
|
<button id="btn-replace-all" title="Replace All">All</button>
|
||||||
|
<button id="btn-find-close" title="Close">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="find-info">
|
||||||
|
<span id="find-count">0 matches</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Export Options Dialog -->
|
||||||
|
<div id="export-dialog" class="export-dialog hidden">
|
||||||
|
<div class="export-dialog-content">
|
||||||
|
<div class="export-dialog-header">
|
||||||
|
<h3 id="export-dialog-title">Export Options</h3>
|
||||||
|
<button id="export-dialog-close" title="Close">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-body">
|
||||||
|
<!-- Simple/Advanced Export Toggle -->
|
||||||
|
<div class="export-section export-mode-toggle">
|
||||||
|
<label class="checkbox-label">
|
||||||
|
<input type="checkbox" id="advanced-export-toggle">
|
||||||
|
<span class="checkmark"></span>
|
||||||
|
Show Advanced Options
|
||||||
|
</label>
|
||||||
|
<small class="export-help">Enable for templates, metadata, bibliography, and advanced PDF settings</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Advanced Export Options (hidden by default) -->
|
||||||
|
<div id="advanced-export-options" class="advanced-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="export-template">Template:</label>
|
||||||
|
<select id="export-template">
|
||||||
|
<option value="default">Default</option>
|
||||||
|
<option value="custom">Custom (Browse...)</option>
|
||||||
|
</select>
|
||||||
|
<input type="file" id="template-file-input" accept=".tex,.html,.docx,.odt" style="display: none;">
|
||||||
|
<input type="text" id="custom-template-path" placeholder="Template file path..." style="display: none;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Metadata:</label>
|
||||||
|
<div class="metadata-container">
|
||||||
|
<div class="metadata-field">
|
||||||
|
<input type="text" placeholder="title" class="metadata-key">
|
||||||
|
<input type="text" placeholder="Document title" class="metadata-value">
|
||||||
|
</div>
|
||||||
|
<div class="metadata-field">
|
||||||
|
<input type="text" placeholder="author" class="metadata-key">
|
||||||
|
<input type="text" placeholder="Author name" class="metadata-value">
|
||||||
|
</div>
|
||||||
|
<div class="metadata-field">
|
||||||
|
<input type="text" placeholder="date" class="metadata-key">
|
||||||
|
<input type="text" placeholder="Date" class="metadata-value">
|
||||||
|
</div>
|
||||||
|
<div class="metadata-field">
|
||||||
|
<input type="text" placeholder="subject" class="metadata-key">
|
||||||
|
<input type="text" placeholder="Subject" class="metadata-value">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<button id="add-metadata-field" type="button">+ Add Field</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Document Options:</label>
|
||||||
|
<div class="checkbox-group">
|
||||||
|
<label><input type="checkbox" id="export-toc"> Table of Contents</label>
|
||||||
|
<label><input type="checkbox" id="export-number-sections"> Number Sections</label>
|
||||||
|
<label><input type="checkbox" id="export-citeproc"> Process Citations</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="export-toc-depth">TOC Depth:</label>
|
||||||
|
<input type="number" id="export-toc-depth" min="1" max="6" value="3">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section pdf-only">
|
||||||
|
<label>PDF Options:</label>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="pdf-engine">PDF Engine:</label>
|
||||||
|
<select id="pdf-engine">
|
||||||
|
<option value="xelatex">XeLaTeX (Recommended)</option>
|
||||||
|
<option value="pdflatex">PDFLaTeX</option>
|
||||||
|
<option value="lualatex">LuaLaTeX</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<label for="pdf-geometry">Page Margins:</label>
|
||||||
|
<select id="pdf-geometry">
|
||||||
|
<option value="margin=1in">1 inch (Default)</option>
|
||||||
|
<option value="margin=0.75in">0.75 inch</option>
|
||||||
|
<option value="margin=1.25in">1.25 inch</option>
|
||||||
|
<option value="margin=2cm">2 cm</option>
|
||||||
|
<option value="margin=2.5cm">2.5 cm</option>
|
||||||
|
<option value="custom">Custom...</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" id="custom-geometry" placeholder="e.g., margin=1.5in" style="display: none;">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Bibliography:</label>
|
||||||
|
<div class="form-row">
|
||||||
|
<input type="text" id="bibliography-file" placeholder="Bibliography file (.bib, .yaml, .json)">
|
||||||
|
<button id="browse-bibliography">Browse</button>
|
||||||
|
</div>
|
||||||
|
<div class="form-row">
|
||||||
|
<input type="text" id="csl-file" placeholder="Citation style file (.csl)">
|
||||||
|
<button id="browse-csl">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div> <!-- End advanced-export-options -->
|
||||||
|
|
||||||
|
<!-- Basic Export Options (always visible) -->
|
||||||
|
<div class="export-section basic-options">
|
||||||
|
<label>Quick Export Settings:</label>
|
||||||
|
<div class="checkbox-group">
|
||||||
|
<label><input type="checkbox" id="basic-toc"> Include Table of Contents</label>
|
||||||
|
<label><input type="checkbox" id="basic-number-sections"> Number Sections</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-footer">
|
||||||
|
<button id="export-cancel">Cancel</button>
|
||||||
|
<button id="export-confirm" class="primary">Export</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Universal File Converter Dialog -->
|
||||||
|
<div id="universal-converter-dialog" class="export-dialog hidden">
|
||||||
|
<div class="export-dialog-content">
|
||||||
|
<div class="export-dialog-header">
|
||||||
|
<h3>Universal File Converter</h3>
|
||||||
|
<button id="converter-dialog-close" title="Close">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-body">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Select File to Convert:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="converter-file-path" placeholder="Browse for a file..." readonly>
|
||||||
|
<button id="browse-converter-file">Browse</button>
|
||||||
|
</div>
|
||||||
|
<small>Supported formats: Documents, Images, Media files</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="converter-tool">Conversion Tool:</label>
|
||||||
|
<select id="converter-tool">
|
||||||
|
<option value="libreoffice">LibreOffice (Documents)</option>
|
||||||
|
<option value="imagemagick">ImageMagick (Images)</option>
|
||||||
|
<option value="ffmpeg">FFmpeg (Media)</option>
|
||||||
|
<option value="pandoc">Pandoc (Markup)</option>
|
||||||
|
</select>
|
||||||
|
<small id="converter-tool-help">Documents: DOCX, PDF, ODT, RTF, TXT, HTML, XLSX, PPTX</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="converter-from">Input Format:</label>
|
||||||
|
<select id="converter-from">
|
||||||
|
<!-- Dynamically populated based on selected converter tool -->
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="converter-to">Output Format:</label>
|
||||||
|
<select id="converter-to">
|
||||||
|
<!-- Dynamically populated based on selected converter tool -->
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Batch Mode Toggle -->
|
||||||
|
<div class="export-section">
|
||||||
|
<label class="checkbox-label">
|
||||||
|
<input type="checkbox" id="converter-batch-mode">
|
||||||
|
<span class="checkmark"></span>
|
||||||
|
Batch Mode (Convert entire folder)
|
||||||
|
</label>
|
||||||
|
<small class="export-help">Enable to convert multiple files at once from a folder</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Batch Mode Options (hidden by default) -->
|
||||||
|
<div id="converter-batch-options" class="advanced-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Input Folder:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="converter-batch-input-folder" placeholder="Select folder..." readonly>
|
||||||
|
<button id="browse-converter-batch-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output Folder:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="converter-batch-output-folder" placeholder="Select output folder..." readonly>
|
||||||
|
<button id="browse-converter-batch-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="converter-batch-subfolders" checked>
|
||||||
|
Include subfolders (recursive)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Advanced Options Toggle -->
|
||||||
|
<div class="export-section export-mode-toggle">
|
||||||
|
<label class="checkbox-label">
|
||||||
|
<input type="checkbox" id="converter-advanced-toggle">
|
||||||
|
<span class="checkmark"></span>
|
||||||
|
Show Advanced Options
|
||||||
|
</label>
|
||||||
|
<small class="export-help">Tool-specific quality, compression, and conversion settings</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Advanced Converter Options (hidden by default) -->
|
||||||
|
<div id="converter-advanced-options" class="advanced-options hidden">
|
||||||
|
<!-- ImageMagick Advanced Options -->
|
||||||
|
<div class="converter-options imagemagick-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="imagemagick-quality">Quality (1-100):</label>
|
||||||
|
<input type="range" id="imagemagick-quality" min="1" max="100" value="85">
|
||||||
|
<span id="imagemagick-quality-value">85</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="imagemagick-dpi">Resolution (DPI):</label>
|
||||||
|
<input type="number" id="imagemagick-dpi" min="72" max="600" value="300" placeholder="300">
|
||||||
|
<small>Higher DPI = better quality, larger file size</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="imagemagick-resize">Resize (WxH):</label>
|
||||||
|
<input type="text" id="imagemagick-resize" placeholder="e.g., 1920x1080 or 50%">
|
||||||
|
<small>Examples: 1920x1080, 800x600, 50% (leave empty for no resize)</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="imagemagick-compression">Compression Type:</label>
|
||||||
|
<select id="imagemagick-compression">
|
||||||
|
<option value="">None (Default)</option>
|
||||||
|
<option value="JPEG">JPEG</option>
|
||||||
|
<option value="LZW">LZW</option>
|
||||||
|
<option value="Zip">Zip</option>
|
||||||
|
<option value="RLE">RLE</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- FFmpeg Advanced Options -->
|
||||||
|
<div class="converter-options ffmpeg-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="ffmpeg-video-codec">Video Codec:</label>
|
||||||
|
<select id="ffmpeg-video-codec">
|
||||||
|
<option value="">Default</option>
|
||||||
|
<option value="libx264">H.264 (libx264)</option>
|
||||||
|
<option value="libx265">H.265/HEVC (libx265)</option>
|
||||||
|
<option value="libvpx-vp9">VP9 (libvpx-vp9)</option>
|
||||||
|
<option value="copy">Copy (no re-encode)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="ffmpeg-audio-codec">Audio Codec:</label>
|
||||||
|
<select id="ffmpeg-audio-codec">
|
||||||
|
<option value="">Default</option>
|
||||||
|
<option value="aac">AAC</option>
|
||||||
|
<option value="libmp3lame">MP3 (libmp3lame)</option>
|
||||||
|
<option value="libopus">Opus (libopus)</option>
|
||||||
|
<option value="libvorbis">Vorbis (libvorbis)</option>
|
||||||
|
<option value="copy">Copy (no re-encode)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="ffmpeg-bitrate">Video Bitrate (kbps):</label>
|
||||||
|
<input type="number" id="ffmpeg-bitrate" min="100" max="50000" placeholder="e.g., 2000">
|
||||||
|
<small>Higher bitrate = better quality, larger file size</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="ffmpeg-preset">Encoding Preset:</label>
|
||||||
|
<select id="ffmpeg-preset">
|
||||||
|
<option value="">Default</option>
|
||||||
|
<option value="ultrafast">Ultra Fast</option>
|
||||||
|
<option value="fast">Fast</option>
|
||||||
|
<option value="medium" selected>Medium</option>
|
||||||
|
<option value="slow">Slow (Better Quality)</option>
|
||||||
|
<option value="veryslow">Very Slow (Best Quality)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="ffmpeg-framerate">Frame Rate (fps):</label>
|
||||||
|
<input type="number" id="ffmpeg-framerate" min="1" max="120" placeholder="e.g., 30">
|
||||||
|
<small>Common: 24, 30, 60</small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- LibreOffice Advanced Options -->
|
||||||
|
<div class="converter-options libreoffice-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="libreoffice-quality">Export Quality:</label>
|
||||||
|
<select id="libreoffice-quality">
|
||||||
|
<option value="">Default</option>
|
||||||
|
<option value="high">High</option>
|
||||||
|
<option value="medium" selected>Medium</option>
|
||||||
|
<option value="low">Low (Smaller file size)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label for="libreoffice-page-range">Page Range:</label>
|
||||||
|
<input type="text" id="libreoffice-page-range" placeholder="e.g., 1-5, 7, 9-12">
|
||||||
|
<small>Leave empty to convert all pages</small>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="libreoffice-export-bookmarks">
|
||||||
|
Export Bookmarks (PDF only)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Pandoc Advanced Options -->
|
||||||
|
<div class="converter-options pandoc-options hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<small>Pandoc conversions can use advanced export options from the Export menu.</small>
|
||||||
|
<button id="pandoc-show-export-options" type="button">Open Export Options Dialog...</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="converter-progress" class="batch-progress hidden">
|
||||||
|
<div class="progress-text">
|
||||||
|
<span id="converter-status">Converting...</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="export-section">
|
||||||
|
<small><strong>Installation Notes:</strong></small>
|
||||||
|
<small>• LibreOffice: Download from <a href="https://www.libreoffice.org/download" target="_blank">libreoffice.org</a></small>
|
||||||
|
<small>• ImageMagick: Download from <a href="https://imagemagick.org/script/download.php" target="_blank">imagemagick.org</a></small>
|
||||||
|
<small>• FFmpeg: Download from <a href="https://ffmpeg.org/download.html" target="_blank">ffmpeg.org</a></small>
|
||||||
|
<small>• Pandoc: Download from <a href="https://pandoc.org/installing.html" target="_blank">pandoc.org</a></small>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-footer">
|
||||||
|
<button id="converter-cancel">Cancel</button>
|
||||||
|
<button id="converter-convert" class="primary">Convert</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Batch Conversion Dialog -->
|
||||||
|
<div id="batch-dialog" class="batch-dialog hidden">
|
||||||
|
<div class="batch-dialog-content">
|
||||||
|
<div class="batch-dialog-header">
|
||||||
|
<h3>Batch File Conversion</h3>
|
||||||
|
<button id="batch-dialog-close" title="Close">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="batch-dialog-body">
|
||||||
|
<div class="batch-section">
|
||||||
|
<label>Input Folder:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="batch-input-folder" placeholder="Select folder containing markdown files..." readonly>
|
||||||
|
<button id="browse-input-folder">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-section">
|
||||||
|
<label>Output Folder:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="batch-output-folder" placeholder="Select output folder..." readonly>
|
||||||
|
<button id="browse-output-folder">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-section">
|
||||||
|
<label for="batch-format">Output Format:</label>
|
||||||
|
<select id="batch-format">
|
||||||
|
<option value="html">HTML</option>
|
||||||
|
<option value="pdf">PDF</option>
|
||||||
|
<option value="docx">DOCX</option>
|
||||||
|
<option value="latex">LaTeX</option>
|
||||||
|
<option value="rtf">RTF</option>
|
||||||
|
<option value="odt">ODT</option>
|
||||||
|
<option value="epub">EPUB</option>
|
||||||
|
<option value="pptx">PowerPoint (PPTX)</option>
|
||||||
|
<option value="odp">OpenDocument Presentation (ODP)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-section">
|
||||||
|
<label>
|
||||||
|
<input type="checkbox" id="batch-include-subfolders" checked>
|
||||||
|
Include subfolders (recursive)
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="batch-section">
|
||||||
|
<button id="batch-show-options" type="button">Advanced Export Options...</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="batch-progress" class="batch-progress hidden">
|
||||||
|
<div class="progress-bar">
|
||||||
|
<div class="progress-fill" id="batch-progress-fill"></div>
|
||||||
|
</div>
|
||||||
|
<div class="progress-text">
|
||||||
|
<span id="batch-progress-text">Processing...</span>
|
||||||
|
<span id="batch-progress-count">0 / 0</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="batch-dialog-footer">
|
||||||
|
<button id="batch-cancel">Cancel</button>
|
||||||
|
<button id="batch-start" class="primary" disabled>Start Conversion</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- PDF Editor Dialog -->
|
||||||
|
<div id="pdf-editor-dialog" class="export-dialog hidden">
|
||||||
|
<div class="export-dialog-content">
|
||||||
|
<div class="export-dialog-header">
|
||||||
|
<h3 id="pdf-editor-title">PDF Editor</h3>
|
||||||
|
<button id="pdf-editor-dialog-close" title="Close">×</button>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-body">
|
||||||
|
<!-- Merge PDFs Section -->
|
||||||
|
<div id="pdf-merge-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF Files to Merge:</label>
|
||||||
|
<div id="merge-files-list" class="file-list">
|
||||||
|
<!-- Dynamically added file entries -->
|
||||||
|
</div>
|
||||||
|
<button id="add-merge-file" type="button">+ Add PDF File</button>
|
||||||
|
<small>Files will be merged in the order shown. Drag to reorder.</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="merge-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-merge-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Split PDF Section -->
|
||||||
|
<div id="pdf-split-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File to Split:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="split-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-split-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Split Mode:</label>
|
||||||
|
<select id="split-mode">
|
||||||
|
<option value="pages">By Page Range</option>
|
||||||
|
<option value="interval">Every N Pages</option>
|
||||||
|
<option value="size">By File Size</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div id="split-pages-options" class="export-section">
|
||||||
|
<label>Page Ranges:</label>
|
||||||
|
<input type="text" id="split-page-ranges" placeholder="e.g., 1-5, 6-10, 11-15">
|
||||||
|
<small>Separate ranges with commas. Each range will create a new PDF.</small>
|
||||||
|
</div>
|
||||||
|
<div id="split-interval-options" class="export-section hidden">
|
||||||
|
<label>Split Every:</label>
|
||||||
|
<input type="number" id="split-interval" min="1" value="5" placeholder="5">
|
||||||
|
<small>pages (e.g., 5 = split every 5 pages)</small>
|
||||||
|
</div>
|
||||||
|
<div id="split-size-options" class="export-section hidden">
|
||||||
|
<label>Max File Size (MB):</label>
|
||||||
|
<input type="number" id="split-size" min="1" value="5" placeholder="5">
|
||||||
|
<small>Split when file size exceeds this limit</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output Folder:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="split-output-folder" placeholder="Select output folder..." readonly>
|
||||||
|
<button id="browse-split-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Compress PDF Section -->
|
||||||
|
<div id="pdf-compress-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File to Compress:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="compress-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-compress-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Compression Level:</label>
|
||||||
|
<select id="compress-level">
|
||||||
|
<option value="low">Low (Best Quality)</option>
|
||||||
|
<option value="medium" selected>Medium (Balanced)</option>
|
||||||
|
<option value="high">High (Smallest Size)</option>
|
||||||
|
</select>
|
||||||
|
<small>Higher compression = smaller file size, lower quality</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Compression Options:</label>
|
||||||
|
<div class="checkbox-group">
|
||||||
|
<label><input type="checkbox" id="compress-images" checked> Compress Images</label>
|
||||||
|
<label><input type="checkbox" id="compress-remove-duplicates" checked> Remove Duplicates</label>
|
||||||
|
<label><input type="checkbox" id="compress-optimize-fonts"> Optimize Fonts</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="compress-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-compress-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Rotate Pages Section -->
|
||||||
|
<div id="pdf-rotate-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="rotate-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-rotate-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Pages to Rotate:</label>
|
||||||
|
<input type="text" id="rotate-pages" placeholder="e.g., 1-5, 7, 9-12 (leave empty for all pages)">
|
||||||
|
<small>Separate page numbers/ranges with commas, or leave empty to rotate all pages</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Rotation Angle:</label>
|
||||||
|
<select id="rotate-angle">
|
||||||
|
<option value="90">90° Clockwise</option>
|
||||||
|
<option value="180">180°</option>
|
||||||
|
<option value="270">270° Clockwise (90° Counter-clockwise)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="rotate-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-rotate-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Delete Pages Section -->
|
||||||
|
<div id="pdf-delete-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="delete-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-delete-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Pages to Delete:</label>
|
||||||
|
<input type="text" id="delete-pages" placeholder="e.g., 1-5, 7, 9-12">
|
||||||
|
<small>Separate page numbers/ranges with commas</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="delete-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-delete-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Reorder Pages Section -->
|
||||||
|
<div id="pdf-reorder-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="reorder-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-reorder-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>New Page Order:</label>
|
||||||
|
<input type="text" id="reorder-pages" placeholder="e.g., 3, 1, 2, 5, 4">
|
||||||
|
<small>Enter page numbers in desired order, separated by commas</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<button id="load-current-order" type="button">Load Current Page Order</button>
|
||||||
|
<div id="current-page-order" class="info-display hidden">
|
||||||
|
Current order: <span id="current-order-display"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="reorder-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-reorder-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Watermark Section -->
|
||||||
|
<div id="pdf-watermark-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="watermark-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-watermark-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Watermark Text:</label>
|
||||||
|
<input type="text" id="watermark-text" placeholder="Enter watermark text...">
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Font Size:</label>
|
||||||
|
<input type="number" id="watermark-font-size" min="8" max="144" value="48" placeholder="48">
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Opacity (0-100):</label>
|
||||||
|
<input type="range" id="watermark-opacity" min="0" max="100" value="30">
|
||||||
|
<span id="watermark-opacity-value">30</span>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Position:</label>
|
||||||
|
<select id="watermark-position">
|
||||||
|
<option value="center">Center</option>
|
||||||
|
<option value="diagonal">Diagonal</option>
|
||||||
|
<option value="top-left">Top Left</option>
|
||||||
|
<option value="top-center">Top Center</option>
|
||||||
|
<option value="top-right">Top Right</option>
|
||||||
|
<option value="bottom-left">Bottom Left</option>
|
||||||
|
<option value="bottom-center">Bottom Center</option>
|
||||||
|
<option value="bottom-right">Bottom Right</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Color:</label>
|
||||||
|
<input type="color" id="watermark-color" value="#000000">
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Apply to:</label>
|
||||||
|
<select id="watermark-pages">
|
||||||
|
<option value="all">All Pages</option>
|
||||||
|
<option value="custom">Custom Pages</option>
|
||||||
|
</select>
|
||||||
|
<input type="text" id="watermark-custom-pages" placeholder="e.g., 1-5, 7, 9-12" class="hidden">
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="watermark-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-watermark-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Encrypt PDF Section (Password Protection) -->
|
||||||
|
<div id="pdf-encrypt-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File to Protect:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="encrypt-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-encrypt-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>User Password:</label>
|
||||||
|
<input type="password" id="encrypt-user-password" placeholder="Password to open the PDF">
|
||||||
|
<small>Required to open and view the PDF</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Owner Password:</label>
|
||||||
|
<input type="password" id="encrypt-owner-password" placeholder="Password to modify permissions">
|
||||||
|
<small>Optional: Required to change document permissions</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Encryption Level:</label>
|
||||||
|
<select id="encrypt-level">
|
||||||
|
<option value="128">128-bit (Standard)</option>
|
||||||
|
<option value="256" selected>256-bit (High Security)</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Document Permissions:</label>
|
||||||
|
<div class="checkbox-group">
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-printing" checked> Allow Printing</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-modify" checked> Allow Content Modification</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-copy" checked> Allow Content Copying</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-annotate" checked> Allow Annotations</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-forms" checked> Allow Form Filling</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-extract" checked> Allow Accessibility (Screen Readers)</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-assemble" checked> Allow Document Assembly</label>
|
||||||
|
<label><input type="checkbox" id="encrypt-allow-print-high" checked> Allow High-Quality Printing</label>
|
||||||
|
</div>
|
||||||
|
<small>These permissions apply when owner password is set</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="encrypt-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-encrypt-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Decrypt PDF Section (Remove Password) -->
|
||||||
|
<div id="pdf-decrypt-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Protected PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="decrypt-input-path" placeholder="Select protected PDF file..." readonly>
|
||||||
|
<button id="browse-decrypt-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Current Password:</label>
|
||||||
|
<input type="password" id="decrypt-password" placeholder="Enter PDF password">
|
||||||
|
<small>Enter the password to unlock and remove protection</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="decrypt-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-decrypt-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Permissions Section -->
|
||||||
|
<div id="pdf-permissions-section" class="pdf-operation-section hidden">
|
||||||
|
<div class="export-section">
|
||||||
|
<label>PDF File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="permissions-input-path" placeholder="Select PDF file..." readonly>
|
||||||
|
<button id="browse-permissions-input">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Current Password (if protected):</label>
|
||||||
|
<input type="password" id="permissions-current-password" placeholder="Leave empty if not protected">
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>New Owner Password:</label>
|
||||||
|
<input type="password" id="permissions-owner-password" placeholder="Password to modify permissions">
|
||||||
|
<small>Set a password required to change document permissions</small>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Document Permissions:</label>
|
||||||
|
<div class="checkbox-group">
|
||||||
|
<label><input type="checkbox" id="permissions-allow-printing" checked> Allow Printing</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-modify" checked> Allow Content Modification</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-copy" checked> Allow Content Copying</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-annotate" checked> Allow Annotations</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-forms" checked> Allow Form Filling</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-extract" checked> Allow Accessibility (Screen Readers)</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-assemble" checked> Allow Document Assembly</label>
|
||||||
|
<label><input type="checkbox" id="permissions-allow-print-high" checked> Allow High-Quality Printing</label>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-section">
|
||||||
|
<label>Output File:</label>
|
||||||
|
<div class="folder-input-group">
|
||||||
|
<input type="text" id="permissions-output-path" placeholder="Choose output location..." readonly>
|
||||||
|
<button id="browse-permissions-output">Browse</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Progress indicator -->
|
||||||
|
<div id="pdf-progress" class="batch-progress hidden">
|
||||||
|
<div class="progress-bar">
|
||||||
|
<div class="progress-fill" id="pdf-progress-fill"></div>
|
||||||
|
</div>
|
||||||
|
<div class="progress-text">
|
||||||
|
<span id="pdf-progress-text">Processing...</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="export-dialog-footer">
|
||||||
|
<button id="pdf-editor-cancel">Cancel</button>
|
||||||
|
<button id="pdf-editor-process" class="primary">Process</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="editor-container">
|
<div class="editor-container">
|
||||||
<div id="editor-pane" class="pane">
|
<div class="tab-content active" id="tab-content-1" data-tab-id="1">
|
||||||
<textarea id="editor"></textarea>
|
<div id="editor-pane-1" class="pane">
|
||||||
|
<div class="editor-wrapper">
|
||||||
|
<div id="line-numbers-1" class="line-numbers hidden"></div>
|
||||||
|
<textarea id="editor-1" class="editor-textarea"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="preview-pane-1" class="pane">
|
||||||
|
<div id="preview-1" class="preview-content"></div>
|
||||||
</div>
|
</div>
|
||||||
<div id="preview-pane" class="pane">
|
|
||||||
<div id="preview"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
+1830
-12
File diff suppressed because it is too large
Load Diff
+2391
-147
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,825 @@
|
|||||||
|
/* ========================================
|
||||||
|
PanConverter v1.7.1 - Modern UI
|
||||||
|
Glassmorphism, Gradients & Animations
|
||||||
|
======================================== */
|
||||||
|
|
||||||
|
/* Modern Color Palette */
|
||||||
|
:root {
|
||||||
|
/* Primary Brand Colors - Purple-Blue Gradient */
|
||||||
|
--primary-gradient: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
||||||
|
--primary-light: #8b9aff;
|
||||||
|
--primary-dark: #5661b3;
|
||||||
|
|
||||||
|
/* Accent Colors */
|
||||||
|
--accent-green: #10b981;
|
||||||
|
--accent-blue: #3b82f6;
|
||||||
|
--accent-purple: #8b5cf6;
|
||||||
|
--accent-pink: #ec4899;
|
||||||
|
|
||||||
|
/* Neutral Colors */
|
||||||
|
--gray-50: #f9fafb;
|
||||||
|
--gray-100: #f3f4f6;
|
||||||
|
--gray-200: #e5e7eb;
|
||||||
|
--gray-300: #d1d5db;
|
||||||
|
--gray-400: #9ca3af;
|
||||||
|
--gray-500: #6b7280;
|
||||||
|
--gray-600: #4b5563;
|
||||||
|
--gray-700: #374151;
|
||||||
|
--gray-800: #1f2937;
|
||||||
|
--gray-900: #111827;
|
||||||
|
|
||||||
|
/* Glassmorphism */
|
||||||
|
--glass-bg: rgba(255, 255, 255, 0.7);
|
||||||
|
--glass-border: rgba(255, 255, 255, 0.18);
|
||||||
|
--glass-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.15);
|
||||||
|
|
||||||
|
/* Effects */
|
||||||
|
--blur-amount: 10px;
|
||||||
|
--transition-speed: 0.3s;
|
||||||
|
--transition-ease: cubic-bezier(0.4, 0, 0.2, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Reset & Base */
|
||||||
|
* {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 100vh;
|
||||||
|
background: linear-gradient(135deg, #667eea 0%, #764ba2 50%, #f093fb 100%);
|
||||||
|
background-size: 200% 200%;
|
||||||
|
animation: gradientShift 15s ease infinite;
|
||||||
|
color: var(--gray-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes gradientShift {
|
||||||
|
0% { background-position: 0% 50%; }
|
||||||
|
50% { background-position: 100% 50%; }
|
||||||
|
100% { background-position: 0% 50%; }
|
||||||
|
}
|
||||||
|
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
height: 100vh;
|
||||||
|
padding: 12px;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Glass Container for main content */
|
||||||
|
.main-content-glass {
|
||||||
|
background: var(--glass-bg);
|
||||||
|
backdrop-filter: blur(var(--blur-amount));
|
||||||
|
-webkit-backdrop-filter: blur(var(--blur-amount));
|
||||||
|
border: 1px solid var(--glass-border);
|
||||||
|
border-radius: 20px;
|
||||||
|
box-shadow: var(--glass-shadow);
|
||||||
|
overflow: hidden;
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tab Bar - Modern Glassmorphism */
|
||||||
|
.tab-bar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
padding: 8px 12px;
|
||||||
|
min-height: 48px;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 8px 16px;
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
border-radius: 12px;
|
||||||
|
margin-right: 4px;
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
max-width: 200px;
|
||||||
|
min-width: 120px;
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab.active {
|
||||||
|
background: linear-gradient(135deg, rgba(102, 126, 234, 0.9), rgba(118, 75, 162, 0.9));
|
||||||
|
color: white;
|
||||||
|
border-color: rgba(255, 255, 255, 0.5);
|
||||||
|
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.4);
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-title {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-close {
|
||||||
|
background: rgba(255, 255, 255, 0.2);
|
||||||
|
border: none;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 4px;
|
||||||
|
margin-left: 8px;
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
border-radius: 6px;
|
||||||
|
color: currentColor;
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-close:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.4);
|
||||||
|
transform: rotate(90deg);
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-tab-button {
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
border-radius: 10px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: var(--gray-700);
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.new-tab-button:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
transform: scale(1.05);
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Toolbar - Modern Gradient Buttons */
|
||||||
|
.toolbar {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 16px;
|
||||||
|
background: rgba(255, 255, 255, 0.4);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
gap: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar button {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
border-radius: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
color: var(--gray-700);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar button:hover {
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
border-color: transparent;
|
||||||
|
color: white;
|
||||||
|
transform: translateY(-2px) scale(1.05);
|
||||||
|
box-shadow: 0 6px 16px rgba(102, 126, 234, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar button:active {
|
||||||
|
transform: translateY(0) scale(0.98);
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar-separator {
|
||||||
|
width: 1px;
|
||||||
|
height: 24px;
|
||||||
|
background: linear-gradient(180deg, transparent, rgba(255, 255, 255, 0.4), transparent);
|
||||||
|
margin: 0 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tab Content */
|
||||||
|
.tab-content {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.tab-content:not(.active) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Editor Container */
|
||||||
|
.editor-container {
|
||||||
|
display: flex;
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-radius: 0 0 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane {
|
||||||
|
flex: 1;
|
||||||
|
overflow: auto;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane:first-child {
|
||||||
|
border-right: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Custom Scrollbar */
|
||||||
|
.pane::-webkit-scrollbar,
|
||||||
|
.editor-textarea::-webkit-scrollbar {
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane::-webkit-scrollbar-track,
|
||||||
|
.editor-textarea::-webkit-scrollbar-track {
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
border-radius: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane::-webkit-scrollbar-thumb,
|
||||||
|
.editor-textarea::-webkit-scrollbar-thumb {
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
border-radius: 10px;
|
||||||
|
border: 2px solid rgba(255, 255, 255, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane::-webkit-scrollbar-thumb:hover,
|
||||||
|
.editor-textarea::-webkit-scrollbar-thumb:hover {
|
||||||
|
background: linear-gradient(135deg, #8b9aff, #9d6fd8);
|
||||||
|
}
|
||||||
|
|
||||||
|
.editor-textarea {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding: 24px;
|
||||||
|
font-family: 'JetBrains Mono', 'Fira Code', 'SF Mono', Monaco, 'Courier New', monospace;
|
||||||
|
font-size: 15px;
|
||||||
|
line-height: 1.7;
|
||||||
|
border: none;
|
||||||
|
outline: none;
|
||||||
|
resize: none;
|
||||||
|
background: transparent;
|
||||||
|
color: var(--gray-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane:last-child {
|
||||||
|
padding: 0;
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
backdrop-filter: blur(15px);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content {
|
||||||
|
max-width: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 24px 32px;
|
||||||
|
line-height: 1.8;
|
||||||
|
font-size: 15px;
|
||||||
|
color: var(--gray-900);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Status Bar - Glassmorphism */
|
||||||
|
.status-bar {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
align-items: center;
|
||||||
|
padding: 8px 20px;
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-top: 1px solid rgba(255, 255, 255, 0.2);
|
||||||
|
border-radius: 0 0 20px 20px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--gray-600);
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Preview Styles - Modern Typography */
|
||||||
|
.preview-content h1, .preview-content h2, .preview-content h3 {
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
-webkit-background-clip: text;
|
||||||
|
-webkit-text-fill-color: transparent;
|
||||||
|
background-clip: text;
|
||||||
|
font-weight: 700;
|
||||||
|
margin-top: 28px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
line-height: 1.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content h1 {
|
||||||
|
font-size: 2.5em;
|
||||||
|
border-bottom: 3px solid;
|
||||||
|
border-image: var(--primary-gradient) 1;
|
||||||
|
padding-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content h2 {
|
||||||
|
font-size: 2em;
|
||||||
|
border-bottom: 2px solid rgba(102, 126, 234, 0.3);
|
||||||
|
padding-bottom: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content p {
|
||||||
|
margin-bottom: 18px;
|
||||||
|
line-height: 1.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content code {
|
||||||
|
padding: 3px 8px;
|
||||||
|
margin: 0 2px;
|
||||||
|
font-size: 90%;
|
||||||
|
background: linear-gradient(135deg, rgba(102, 126, 234, 0.1), rgba(118, 75, 162, 0.1));
|
||||||
|
border: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
border-radius: 6px;
|
||||||
|
font-family: 'JetBrains Mono', 'Fira Code', monospace;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content pre {
|
||||||
|
padding: 20px;
|
||||||
|
overflow-x: auto;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.6;
|
||||||
|
background: rgba(255, 255, 255, 0.6);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
border-radius: 12px;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content pre code {
|
||||||
|
background: transparent;
|
||||||
|
border: none;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content blockquote {
|
||||||
|
padding: 16px 20px;
|
||||||
|
color: var(--gray-700);
|
||||||
|
border-left: 4px solid;
|
||||||
|
border-image: var(--primary-gradient) 1;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
background: rgba(255, 255, 255, 0.4);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
border-radius: 0 8px 8px 0;
|
||||||
|
font-style: italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content a {
|
||||||
|
color: #667eea;
|
||||||
|
text-decoration: none;
|
||||||
|
font-weight: 600;
|
||||||
|
position: relative;
|
||||||
|
transition: color var(--transition-speed);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content a::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
bottom: -2px;
|
||||||
|
width: 0;
|
||||||
|
height: 2px;
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
transition: width var(--transition-speed) var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content a:hover {
|
||||||
|
color: #764ba2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content a:hover::after {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content table {
|
||||||
|
border-collapse: separate;
|
||||||
|
border-spacing: 0;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
width: 100%;
|
||||||
|
border-radius: 12px;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content table th,
|
||||||
|
.preview-content table td {
|
||||||
|
padding: 12px 16px;
|
||||||
|
border: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content table th {
|
||||||
|
font-weight: 600;
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.preview-content table tr:nth-child(even) {
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Modern Dialogs */
|
||||||
|
.export-dialog,
|
||||||
|
.batch-dialog,
|
||||||
|
.find-dialog-overlay {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: rgba(0, 0, 0, 0.4);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
z-index: 1000;
|
||||||
|
animation: fadeIn 0.3s var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes fadeIn {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog.hidden,
|
||||||
|
.batch-dialog.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-content,
|
||||||
|
.batch-dialog-content {
|
||||||
|
background: rgba(255, 255, 255, 0.95);
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
border-radius: 20px;
|
||||||
|
box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
|
||||||
|
width: 90%;
|
||||||
|
max-width: 650px;
|
||||||
|
max-height: 90vh;
|
||||||
|
overflow-y: auto;
|
||||||
|
animation: slideUpFade 0.4s var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideUpFade {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateY(30px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateY(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-header,
|
||||||
|
.batch-dialog-header {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 20px 24px;
|
||||||
|
border-bottom: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
border-radius: 20px 20px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-header h3,
|
||||||
|
.batch-dialog-header h3 {
|
||||||
|
margin: 0;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-body,
|
||||||
|
.batch-dialog-body {
|
||||||
|
padding: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-section,
|
||||||
|
.batch-section {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-section label,
|
||||||
|
.batch-section label {
|
||||||
|
display: block;
|
||||||
|
font-weight: 600;
|
||||||
|
margin-bottom: 8px;
|
||||||
|
color: var(--gray-700);
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-section select,
|
||||||
|
.export-section input,
|
||||||
|
.batch-section select,
|
||||||
|
.batch-section input {
|
||||||
|
width: 100%;
|
||||||
|
padding: 10px 14px;
|
||||||
|
border: 2px solid rgba(102, 126, 234, 0.2);
|
||||||
|
border-radius: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
background: rgba(255, 255, 255, 0.8);
|
||||||
|
backdrop-filter: blur(5px);
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-section select:focus,
|
||||||
|
.export-section input:focus,
|
||||||
|
.batch-section select:focus,
|
||||||
|
.batch-section input:focus {
|
||||||
|
outline: none;
|
||||||
|
border-color: #667eea;
|
||||||
|
box-shadow: 0 0 0 4px rgba(102, 126, 234, 0.1);
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Modern Buttons */
|
||||||
|
.export-dialog-footer,
|
||||||
|
.batch-dialog-footer {
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 12px;
|
||||||
|
padding: 20px 24px;
|
||||||
|
border-top: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
background: rgba(255, 255, 255, 0.5);
|
||||||
|
backdrop-filter: blur(10px);
|
||||||
|
border-radius: 0 0 20px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-footer button,
|
||||||
|
.batch-dialog-footer button,
|
||||||
|
.folder-input-group button {
|
||||||
|
padding: 10px 24px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 10px;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: 600;
|
||||||
|
transition: all var(--transition-speed) var(--transition-ease);
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-footer button.primary,
|
||||||
|
.batch-dialog-footer button.primary {
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
color: white;
|
||||||
|
box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-footer button.primary:hover,
|
||||||
|
.batch-dialog-footer button.primary:hover {
|
||||||
|
transform: translateY(-2px);
|
||||||
|
box-shadow: 0 6px 20px rgba(102, 126, 234, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-footer button:not(.primary),
|
||||||
|
.batch-dialog-footer button:not(.primary),
|
||||||
|
.folder-input-group button {
|
||||||
|
background: rgba(255, 255, 255, 0.8);
|
||||||
|
color: var(--gray-700);
|
||||||
|
border: 2px solid rgba(102, 126, 234, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-footer button:not(.primary):hover,
|
||||||
|
.batch-dialog-footer button:not(.primary):hover,
|
||||||
|
.folder-input-group button:hover {
|
||||||
|
background: white;
|
||||||
|
border-color: #667eea;
|
||||||
|
transform: translateY(-2px);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Find Dialog - Floating Modern */
|
||||||
|
.find-dialog {
|
||||||
|
position: absolute;
|
||||||
|
top: 70px;
|
||||||
|
right: 24px;
|
||||||
|
background: rgba(255, 255, 255, 0.95);
|
||||||
|
backdrop-filter: blur(20px);
|
||||||
|
border: 1px solid rgba(255, 255, 255, 0.3);
|
||||||
|
border-radius: 16px;
|
||||||
|
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.2);
|
||||||
|
z-index: 1000;
|
||||||
|
min-width: 420px;
|
||||||
|
padding: 16px;
|
||||||
|
animation: slideInRight 0.3s var(--transition-ease);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes slideInRight {
|
||||||
|
from {
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(30px);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.find-dialog.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Progress Bars - Modern Gradient */
|
||||||
|
.progress-bar {
|
||||||
|
width: 100%;
|
||||||
|
height: 8px;
|
||||||
|
background: rgba(102, 126, 234, 0.1);
|
||||||
|
border-radius: 10px;
|
||||||
|
overflow: hidden;
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-fill {
|
||||||
|
height: 100%;
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
transition: width 0.4s var(--transition-ease);
|
||||||
|
width: 0%;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.progress-fill::after {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
background: linear-gradient(90deg,
|
||||||
|
transparent,
|
||||||
|
rgba(255, 255, 255, 0.3),
|
||||||
|
transparent
|
||||||
|
);
|
||||||
|
animation: shimmer 2s infinite;
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes shimmer {
|
||||||
|
0% {
|
||||||
|
transform: translateX(-100%);
|
||||||
|
}
|
||||||
|
100% {
|
||||||
|
transform: translateX(100%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Auto-save Indicator - Modern */
|
||||||
|
.auto-save-indicator {
|
||||||
|
position: fixed;
|
||||||
|
top: 24px;
|
||||||
|
right: 24px;
|
||||||
|
background: var(--primary-gradient);
|
||||||
|
color: white;
|
||||||
|
padding: 10px 20px;
|
||||||
|
border-radius: 12px;
|
||||||
|
font-size: 13px;
|
||||||
|
font-weight: 600;
|
||||||
|
z-index: 10000;
|
||||||
|
box-shadow: 0 4px 20px rgba(102, 126, 234, 0.4);
|
||||||
|
animation: slideInRight 0.3s ease-out;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.auto-save-indicator::before {
|
||||||
|
content: '✓';
|
||||||
|
display: inline-block;
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background: white;
|
||||||
|
color: #667eea;
|
||||||
|
border-radius: 50%;
|
||||||
|
font-size: 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Enhanced Statistics - Modern */
|
||||||
|
.enhanced-stats {
|
||||||
|
font-size: 11px;
|
||||||
|
color: var(--gray-600);
|
||||||
|
padding: 2px 0;
|
||||||
|
margin-left: 16px;
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Line Numbers - Modern */
|
||||||
|
.line-numbers {
|
||||||
|
min-width: 50px;
|
||||||
|
padding: 12px 8px;
|
||||||
|
background: rgba(255, 255, 255, 0.3);
|
||||||
|
backdrop-filter: blur(8px);
|
||||||
|
border-right: 1px solid rgba(102, 126, 234, 0.2);
|
||||||
|
font-family: 'JetBrains Mono', monospace;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 1.7;
|
||||||
|
color: var(--gray-500);
|
||||||
|
text-align: right;
|
||||||
|
user-select: none;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.line-numbers.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Animations & Transitions */
|
||||||
|
.toolbar button,
|
||||||
|
.tab,
|
||||||
|
.new-tab-button,
|
||||||
|
.export-dialog-footer button,
|
||||||
|
.batch-dialog-footer button {
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar button::before,
|
||||||
|
.tab::before,
|
||||||
|
.new-tab-button::before {
|
||||||
|
content: '';
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border-radius: 50%;
|
||||||
|
background: rgba(255, 255, 255, 0.4);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
transition: width 0.6s, height 0.6s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.toolbar button:hover::before,
|
||||||
|
.tab:hover::before,
|
||||||
|
.new-tab-button:hover::before {
|
||||||
|
width: 200px;
|
||||||
|
height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Responsive Design */
|
||||||
|
@media (max-width: 768px) {
|
||||||
|
.container {
|
||||||
|
padding: 8px;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.export-dialog-content,
|
||||||
|
.batch-dialog-content {
|
||||||
|
max-width: 95%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.find-dialog {
|
||||||
|
right: 12px;
|
||||||
|
min-width: 320px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Hide default elements */
|
||||||
|
.pane.hidden {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.pane.full-width {
|
||||||
|
border-right: none;
|
||||||
|
}
|
||||||
+1175
-48
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,49 @@
|
|||||||
|
// Test script to verify export functionality
|
||||||
|
const { exec } = require('child_process');
|
||||||
|
const fs = require('fs');
|
||||||
|
const path = require('path');
|
||||||
|
|
||||||
|
console.log('Testing export functionality...');
|
||||||
|
|
||||||
|
// Test 1: Check if pandoc is available
|
||||||
|
console.log('\n1. Checking Pandoc availability...');
|
||||||
|
exec('pandoc --version', (error, stdout, stderr) => {
|
||||||
|
if (error) {
|
||||||
|
console.log('❌ Pandoc not available:', error.message);
|
||||||
|
console.log('✅ Built-in HTML and PDF export should work');
|
||||||
|
} else {
|
||||||
|
console.log('✅ Pandoc is available');
|
||||||
|
console.log(' Version info:', stdout.split('\n')[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Test 2: Check if test markdown file exists
|
||||||
|
console.log('\n2. Checking test file...');
|
||||||
|
const testFile = path.join(__dirname, 'test-export.md');
|
||||||
|
if (fs.existsSync(testFile)) {
|
||||||
|
console.log('✅ Test markdown file exists:', testFile);
|
||||||
|
const content = fs.readFileSync(testFile, 'utf8');
|
||||||
|
console.log(' File size:', content.length, 'characters');
|
||||||
|
} else {
|
||||||
|
console.log('❌ Test markdown file not found');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test 3: Check marked library
|
||||||
|
console.log('\n3. Testing marked library...');
|
||||||
|
try {
|
||||||
|
const marked = require('marked');
|
||||||
|
const testMarkdown = '# Test\nThis is a **test** markdown.';
|
||||||
|
const html = marked.parse(testMarkdown);
|
||||||
|
console.log('✅ Marked library working');
|
||||||
|
console.log(' Sample output:', html.substring(0, 50) + '...');
|
||||||
|
} catch (error) {
|
||||||
|
console.log('❌ Marked library error:', error.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('\n✅ Export functionality test completed!');
|
||||||
|
console.log('\nHow to test exports:');
|
||||||
|
console.log('1. Open the application');
|
||||||
|
console.log('2. Open test-export.md file');
|
||||||
|
console.log('3. Try exporting to HTML (should work without Pandoc)');
|
||||||
|
console.log('4. Try exporting to PDF (should work without Pandoc)');
|
||||||
|
console.log('5. Try exporting to DOCX (requires Pandoc)');
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
# Test Document
|
||||||
|
|
||||||
|
This is a test markdown document for export testing.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- **Bold text**
|
||||||
|
- *Italic text*
|
||||||
|
- [Links](https://example.com)
|
||||||
|
|
||||||
|
## Code Example
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
function hello() {
|
||||||
|
console.log("Hello World!");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## Table
|
||||||
|
|
||||||
|
| Column 1 | Column 2 | Column 3 |
|
||||||
|
|----------|----------|----------|
|
||||||
|
| Value 1 | Value 2 | Value 3 |
|
||||||
|
| Value 4 | Value 5 | Value 6 |
|
||||||
|
|
||||||
|
This is a test document to verify export functionality.
|
||||||
Reference in New Issue
Block a user