Compare commits

...
Author SHA1 Message Date
amitwhandClaude f50ffe8ed2 Release v1.5.0: Enhanced Features and Open Source Compatibility
Major improvements including optional advanced export options, removed proprietary dependencies for better open-source compatibility, and comprehensive new features for enhanced user experience.

🔧 Export Functions & Advanced Options:
• Fixed export function issues after advanced options integration
• Added optional advanced export checkbox (unchecked by default)
• Clean UI separation between simple and advanced export workflows

🏗️ Open Source Compatibility:
• Removed bundled Pandoc binaries - requires system installation
• Replaced proprietary XLSX with open-source CSV export
• Eliminated licensing concerns with bundled dependencies

 Advanced User Experience Features:
• Auto-save system with visual indicators every 30 seconds
• Enhanced document statistics (lines, paragraphs, sentences, reading time)
• Recent files menu with persistent storage (last 10 files)
• Mathematical expression support with KaTeX rendering
• Improved export dialog with better user experience

📚 Updated documentation with new dependency requirements and features

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-15 16:36:23 +05:30
amitwhandClaude 5376bddc59 Release v1.4.0: Advanced Export Options and Batch Conversion
Major Features:
• Fixed file association loading issue with proper timing
• Advanced export options dialog with templates and metadata support
• Batch file conversion system with progress tracking
• Enhanced UI with professional modal dialogs

Technical Improvements:
• Fixed renderer initialization timing for file association
• Added comprehensive Pandoc options support (templates, metadata, variables)
• Implemented recursive folder processing for batch operations
• Enhanced error handling and user feedback systems
• Theme-aware styling for all new components

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-14 22:42:53 +05:30
amitwhandClaude d3b67b1388 Bump version to v1.3.7
- Updated package.json version to 1.3.7
- Updated version in About dialog to 1.3.7
- Prepared for new release with Linux packages

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-01 23:34:38 +05:30
amitwhandClaude aac496923e Add font size adjustment menu and fix theme styling
Features:
• Added Font Size menu in View with increase/decrease/reset options
• Keyboard shortcuts: Ctrl+Shift+Plus/Minus/0 for font adjustment
• Font size persists between sessions using localStorage
• Font sizes adjustable from 10px to 24px

Theme Fixes:
• Fixed missing Monokai theme styles for tabs and editor
• Added complete tab styling for Solarized theme
• Added complete tab styling for GitHub theme
• All themes now have consistent tab bar appearance

Other Changes:
• Updated CLAUDE.md with v1.3.x features documentation
• Version bumped to 1.3.4

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-01 21:41:28 +05:30
amitwhandClaude 256f944b88 Increase editor and preview font sizes to 15px
Enhanced font sizes for improved readability:
• Editor font size increased from 14px to 15px
• Preview font size set to 15px for both #preview and .preview-content
• Better visual experience across all themes and content types

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-01 21:30:57 +05:30
amitwh dbe57d2fad Fix v1.3.2: Restore proper preview text spacing and typography
- Restored ideal preview text spacing from earlier versions
- Extended all preview styles to work with new .preview-content class
- Added proper margins, padding, and line-height for readability
- Updated theme support for all preview elements across all themes
- Improved typography with balanced font size and spacing
- Fixed double padding issue with better container structure
- Enhanced readability with proper heading margins and paragraph spacing
- Updated to version 1.3.2 with improved preview typography
2025-09-01 21:24:40 +05:30
amitwh 9a45849003 Update README.md for v1.3.1 release 2025-09-01 21:08:29 +05:30
amitwh dfb603c2ea Fix v1.3.1: File associations and 50/50 pane layout
- Enhanced file association handling for double-clicking .md files
- Added proper file associations in package.json build config
- Fixed preview/source pane layout to be equally distributed 50/50
- Updated CSS for tab-content structure with proper flex layout
- Added theme support for new pane selectors
- Improved command line argument processing for file opening
- Updated version to 1.3.1 with file association feature
2025-09-01 21:05:01 +05:30
amitwh fda173d9a1 Merge branch 'master' into macos 2025-09-01 20:58:00 +05:30
amitwh ddababf284 Update README.md for v1.3.0 with tabbed interface and enhanced PDF export features 2025-09-01 20:54:47 +05:30
amitwh 376fa00b08 Merge branch 'master' into windows 2025-09-01 20:53:36 +05:30
amitwh 5cbcfa466d Merge branch 'master' into macos 2025-09-01 20:53:29 +05:30
amitwh 328451f88d Major v1.3.0 update: Fix PDF export, file associations, remove converter menu, and implement tabbed interface
- Enhanced PDF export with multiple LaTeX engine fallbacks
- Fixed file association and direct file opening from OS
- Removed redundant converter menu, moved import to File menu
- Implemented comprehensive tabbed interface for multiple files
- Added tab management with keyboard shortcuts (Ctrl+N, Ctrl+W, Ctrl+Tab)
- Enhanced UI with tab bar and improved navigation
- Updated to version 1.3.0 with new features
- Improved main process and renderer architecture for multi-file support
2025-09-01 20:53:17 +05:30
amitwh 1b10a39b15 Update to v1.2.1 with comprehensive editor enhancements 2025-09-01 20:36:57 +05:30
amitwh 7fe53b4b9c Merge master with comprehensive v1.2.0 editor enhancements 2025-09-01 20:29:29 +05:30
amitwh edb163eab4 Merge master with comprehensive v1.2.0 editor enhancements 2025-09-01 20:29:13 +05:30
amitwh 7131d1a38e Merge master with comprehensive v1.2.0 editor enhancements 2025-09-01 20:28:49 +05:30
amitwhandClaude 6d3813e5e9 Major v1.2.0 editor enhancements
- Add comprehensive Find & Replace with match highlighting
- Add toggleable line numbers with theme support
- Implement full undo/redo functionality with keyboard shortcuts
- Add smart auto-indentation for lists and code blocks
- Enhanced keyboard shortcuts for productivity
- Advanced tab handling for indentation/outdentation
- Updated About dialog with v1.2.0 and complete feature list
- Add Find & Replace to Edit menu
- Updated README.md with comprehensive feature documentation

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-01 20:26:58 +05:30
amitwh bfe362245d Update README.md with v1.2.0 features and remove CLAUDE.md 2025-09-01 20:08:14 +05:30
amitwh 0d21ddbf15 Update README.md with v1.2.0 features and remove CLAUDE.md 2025-09-01 20:07:47 +05:30
amitwh 7b5165bcb1 Update README.md with v1.2.0 features and remove CLAUDE.md 2025-09-01 20:07:13 +05:30
amitwh 5c5cffed83 Update README.md with v1.2.0 features and remove CLAUDE.md 2025-09-01 20:06:31 +05:30
amitwh becfec5ae6 Update About dialog to version 1.2.0 with new features list 2025-09-01 20:03:36 +05:30
amitwh bd38c5342d Update About dialog to version 1.2.0 with new features list 2025-09-01 20:03:08 +05:30
amitwh f3e829ca63 Update About dialog to version 1.2.0 with new features list 2025-09-01 20:02:44 +05:30
amitwhandClaude b0a96f680a Release v1.2.0: Major feature additions
- Add PowerPoint export (PPTX/ODP) with slide-level formatting
- Add comprehensive document conversion menu with import/export
- Add interactive table creation helper in markdown editor
- Update documentation with all new features and version history
- Improve menu organization for better user experience

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-09-01 19:54:19 +05:30
amitwh a6da95b057 Add spreadsheet export, update author info, rename to PanConverter
- Added Excel (XLS/XLSX) and ODS export functionality
- Updated author to Amit Haridas (amit.wh@gmail.com)
- Renamed app from 'Pan Converter' to 'PanConverter'
- Version bump to 1.1.0
2025-09-01 19:44:48 +05:30
13 changed files with 4073 additions and 412 deletions
+382 -149
View File
@@ -1,189 +1,422 @@
# Pan Converter
# PanConverter - Claude Development Guide
## 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.
## Project Overview
## Features
- **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
**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.
## Requirements
- **Pandoc**: Must be installed on the system for export functionality
- Ubuntu/Debian: `sudo apt-get install pandoc`
- macOS: `brew install pandoc`
- Windows: Download from https://pandoc.org/installing.html
**Current Version**: v1.5.0
**Author**: Amit Haridas (amit.wh@gmail.com)
**License**: MIT
**Repository**: https://github.com/amitwh/pan-converter
## Development Setup
## Architecture & Technology Stack
### Core Technologies
- **Electron** - Cross-platform desktop application framework
- **Pandoc** - Universal document converter (required system dependency)
- **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 # Comprehensive styling with multi-theme support
assets/
└── icon.png # Application icon
package.json # Dependencies and build configuration
CLAUDE.md # Development documentation for AI assistants
```
## Development Commands
### Prerequisites
- Node.js (v14 or higher)
- npm or yarn
- Pandoc (for export features)
### Installation
```bash
# Clone the repository
git clone <repository-url>
cd pan-converter
# Install dependencies
# Install Node.js dependencies
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
# Start the application
npm start
```
## Building
### Build for Current Platform
```bash
# Build for current platform
npm run build
```
### Build for Specific Platforms
```bash
# Windows
npm run build:win
# Platform-specific builds
npm run build:win # Windows
npm run build:mac # macOS
npm run build:linux # Linux (AppImage, .deb, .snap)
# macOS
npm run build:mac
# Linux (generates .deb, .AppImage, and .snap)
npm run build:linux
```
### Build for All Platforms
```bash
# Build for all platforms
npm run dist:all
```
## Project Structure
```
pan-converter/
├── src/
│ ├── main.js # Main process
│ ├── renderer.js # Renderer process
│ ├── index.html # Main window HTML
│ └── styles.css # Application styles
├── assets/
│ ├── icon.svg # Source icon
│ └── icon.png # Generated icons
├── scripts/
│ └── generate-icons.js # Icon generation script
├── package.json # Project configuration
└── CLAUDE.md # This file
### Git Branch Management
```bash
# Switch to platform-specific branches
git checkout linux # Linux development
git checkout macos # macOS development
git checkout windows # Windows development
git checkout master # Main development branch
# Update all branches with latest changes
git checkout master
git push origin master
git checkout linux && git merge master && git push origin linux
git checkout macos && git merge master && git push origin macos
git checkout windows && git merge master && git push origin windows
```
## 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.5.0 Enhanced Features & Open Source Compatibility (Latest)
#### 🔧 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`)
- Manages application lifecycle
- Creates and manages windows
- Handles file operations
- Manages menu bar
- Communicates with renderer via IPC
- **Menu System**: Comprehensive menu with file operations, editing, conversion, view options, batch processing
- **IPC Handlers**: Communication between main and renderer processes
- **File Operations**: Open, save, import/export functionality with file association support
- **Export System**: Advanced export with templates, metadata, and Pandoc integration
- **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`)
- Handles UI interactions
- Manages editor state
- Renders markdown preview
- Handles theme switching
- Communicates with main process via IPC
- **Editor Initialization**: CodeMirror-like functionality with custom implementation
- **TabManager System**: Multi-file editing with state management
- **Find & Replace Engine**: Search algorithms with regex support
- **Undo/Redo Manager**: History stack management
- **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
- **Electron**: Desktop application framework
- **marked**: Markdown parsing
- **highlight.js**: Syntax highlighting
- **DOMPurify**: HTML sanitization
- **electron-store**: Persistent storage
- **electron-builder**: Application packaging
### Styling (`src/styles.css`)
- **Base Styles**: Application layout and typography
- **Component Styles**: Toolbar, editor, preview, dialogs
- **Theme Implementations**: Complete styling for all themes
- **Responsive Design**: Flexible layouts and proper spacing
- **Animation Support**: Smooth transitions and hover effects
## 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
- 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
## Testing & Quality Assurance
### Live Preview
- Updates in real-time as you type
- Sanitized HTML output for security
- Syntax highlighting for code blocks
- GitHub-flavored markdown support
### Manual Testing Checklist
- [ ] All keyboard shortcuts work correctly
- [ ] Find & replace functions properly with edge cases
- [ ] Line numbers sync correctly with content
- [ ] 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
- Themes stored in user preferences
- Applied via CSS classes on body element
- Persists across application restarts
- Five built-in themes
### Known Issues & Limitations
- AppImage may require `--no-sandbox` flag on some Linux systems
- Large files (>1MB) may cause performance issues
- Windows/Mac builds require platform-specific environments
- Pandoc must be installed separately for export functionality
### Export System
- Uses Pandoc command-line tool
- Supports multiple output formats
- Maintains original file structure
- Shows error messages if Pandoc not installed
## Deployment & Distribution
## 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:
- `master`: Main development branch
- `linux`: Linux-specific configurations
- `macos`: macOS-specific configurations
- `windows`: Windows-specific configurations
### Release Process
1. Update version in `package.json`, `src/main.js`, and `README.md`
2. Commit changes and push to all platform branches
3. Build platform-specific packages
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:
```bash
npm run build:linux
```
### Code Style
- Use consistent indentation (2 spaces)
- 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:
- Install to `/opt/pan-converter`
- Create desktop entry for application menu
- Set up proper file associations
- Declare Pandoc as dependency
### Adding New Features
1. Plan feature implementation and UI integration
2. Update relevant files (main.js, renderer.js, styles.css)
3. Test across all supported themes
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
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
## Future Roadmap
### Platform Testing
Test on:
- Windows 10/11
- macOS 11+ (Big Sur and later)
- Ubuntu 20.04+, Debian 11+
### Planned Features
- [ ] Collaborative editing capabilities
- [ ] Plugin system for extensions
- [ ] Advanced markdown extensions (math, diagrams)
- [ ] Cloud synchronization options
- [ ] Mobile companion app
- [ ] Advanced export templates
- [ ] Spell check and grammar checking
- [ ] Version control integration
## Known Issues
- ICO and ICNS icons need manual conversion from PNG
- Pandoc must be installed separately
- Large files may cause performance issues
### Technical Improvements
- [ ] Performance optimization for large files
- [ ] Memory usage optimization
- [ ] 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
MIT License
## Support
For issues or feature requests, please open an issue on the GitHub repository.
**Last Updated**: September 15, 2025
**Claude Assistant**: Development completed for v1.5.0 with optional advanced export options, removed proprietary dependencies for open-source compatibility, enhanced auto-save functionality, comprehensive document statistics, recent files management, and mathematical expression support using KaTeX.
+21
View File
@@ -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
View File
@@ -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}
+113 -16
View File
@@ -1,29 +1,65 @@
# Pan Converter
# PanConverter
A cross-platform Markdown editor and converter powered by Pandoc.
![Pan Converter](assets/icon.png)
![PanConverter](assets/icon.png)
## Features
- 📝 **Rich Markdown Editor** - Full-featured editor with syntax highlighting
- 👁 **Live Preview** - See your markdown rendered in real-time
### ✨ Advanced Markdown Editor
- 🗂 **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
- 📤 **Export to Multiple Formats** - Convert to HTML, PDF, DOCX, LaTeX, RTF, ODT, and EPUB
- 💾 **Auto-Save** - Never lose your work with automatic saving
- 🖥️ **Cross-Platform** - Works on Windows, macOS, and Linux
- 💾 **Auto-Save** - Never lose your work with automatic saving every 30 seconds
- 📊 **Enhanced Statistics** - Detailed document statistics including word count, character count, lines, paragraphs, sentences, and estimated reading time
- 🕒 **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
### Prerequisites
- [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 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.0_amd64.deb`
- **Snap Package**: `pan-converter_1.5.0_amd64.snap`
### Install from Source
```bash
git clone https://github.com/yourusername/pan-converter.git
git clone https://github.com/amitwh/pan-converter.git
cd pan-converter
npm install
npm start
@@ -31,45 +67,106 @@ npm start
## Usage
### Basic Workflow
1. **Write** - Use the editor to write your Markdown content
2. **Preview** - Toggle the preview pane to see rendered output
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
- `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 + S` - Save file
- `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 + Enter` - Toggle preview (alternative)
- `Escape` - Close find dialog
## Building
```bash
# Install dependencies
npm install
# Generate icons
npm run generate-icons
# Build for current platform
npm run build
# Build for specific platform
npm run build:win
npm run build:mac
npm run build:linux
npm run build:win # Windows
npm run build:mac # macOS
npm run build:linux # Linux (generates .deb, .AppImage, and .snap)
# Build for all platforms
npm run dist:all
```
## Version History
- **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
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
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
- Built with [Electron](https://www.electronjs.org/)
- Markdown parsing by [marked](https://marked.js.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
View File
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 8.6 KiB

BIN
View File
Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

+66 -8
View File
@@ -1,23 +1,30 @@
{
"name": "pan-converter",
"version": "1.0.0",
"version": "1.5.0",
"description": "Cross-platform Markdown editor and converter using Pandoc",
"main": "src/main.js",
"scripts": {
"start": "electron .",
"test": "echo \"Error: no test specified\" && exit 1",
"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:linux": "electron-builder --linux",
"dist": "electron-builder --publish=never",
"dist:all": "electron-builder -mwl",
"generate-icons": "node scripts/generate-icons.js"
},
"keywords": ["markdown", "pandoc", "converter", "editor"],
"author": "Your Name",
"keywords": [
"markdown",
"pandoc",
"converter",
"editor"
],
"author": "Amit Haridas <amit.wh@gmail.com>",
"license": "MIT",
"devDependencies": {
"cross-env": "^10.0.0",
"electron": "^37.4.0",
"electron-builder": "^26.0.12",
"sharp": "^0.34.3"
@@ -31,7 +38,7 @@
},
"build": {
"appId": "com.panconverter.app",
"productName": "Pan Converter",
"productName": "PanConverter",
"directories": {
"output": "dist"
},
@@ -41,13 +48,64 @@
"node_modules/**/*",
"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": {
"category": "public.app-category.productivity",
"icon": "assets/icon.icns"
},
"win": {
"target": "nsis",
"icon": "assets/icon.ico"
"target": [
{
"target": "nsis",
"arch": ["x64"]
},
{
"target": "portable",
"arch": ["x64"]
},
{
"target": "zip",
"arch": ["x64"]
}
],
"icon": "assets/icon.png",
"artifactName": "${productName}-${version}-${arch}.${ext}",
"requestedExecutionLevel": "asInvoker",
"signAndEditExecutable": true
},
"nsis": {
"oneClick": false,
"perMachine": false,
"allowToChangeInstallationDirectory": true,
"displayLanguageSelector": true,
"installerIcon": "assets/icon-proper.ico",
"uninstallerIcon": "assets/icon-proper.ico",
"installerHeaderIcon": "assets/icon-proper.ico",
"createDesktopShortcut": true,
"createStartMenuShortcut": true,
"shortcutName": "PanConverter",
"runAfterFinish": true,
"menuCategory": "Productivity",
"license": "LICENSE",
"warningsAsErrors": false,
"artifactName": "${productName}-Setup-${version}.${ext}",
"deleteAppDataOnUninstall": false,
"differentialPackage": true
},
"linux": {
"target": [
@@ -63,7 +121,7 @@
"pandoc"
],
"description": "Markdown editor and converter using Pandoc",
"maintainer": "Your Name <your.email@example.com>"
"maintainer": "Amit Haridas <amit.wh@gmail.com>"
}
}
}
+243 -6
View File
@@ -3,13 +3,20 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Pan Converter - Markdown Editor</title>
<title>PanConverter - Markdown Editor</title>
<link rel="stylesheet" href="styles.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">
</head>
<body>
<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">
<button id="btn-bold" title="Bold">
<svg width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
@@ -59,6 +66,29 @@
<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>
</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>
<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>
<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">
@@ -68,12 +98,219 @@
</button>
</div>
<div class="editor-container">
<div id="editor-pane" class="pane">
<textarea id="editor"></textarea>
<!-- 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 id="preview-pane" class="pane">
<div id="preview"></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>
<!-- 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>
<div class="editor-container">
<div class="tab-content active" id="tab-content-1" data-tab-id="1">
<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>
+598 -13
View File
@@ -3,6 +3,21 @@ const path = require('path');
const fs = require('fs');
const { exec } = require('child_process');
// Get the system Pandoc path
function getPandocPath() {
// Always use system pandoc - no bundled binaries
return 'pandoc';
}
// Check if Pandoc is available
function checkPandocAvailable() {
return new Promise((resolve) => {
exec('pandoc --version', (error) => {
resolve(!error);
});
});
}
// Simple storage implementation to replace electron-store
const settingsPath = path.join(app.getPath('userData'), 'settings.json');
const store = {
@@ -27,7 +42,7 @@ const store = {
};
let mainWindow;
let currentFile = null;
let currentFile = null; // This will now represent the active tab's file
function createWindow() {
mainWindow = new BrowserWindow({
@@ -47,6 +62,55 @@ function createWindow() {
mainWindow.on('closed', () => {
mainWindow = null;
});
// Handle pending file from file association will be handled by renderer-ready event
}
function buildRecentFilesMenu() {
const recentFiles = getRecentFiles();
if (recentFiles.length === 0) {
return [
{
label: 'No recent files',
enabled: false
}
];
}
const recentFileItems = recentFiles.map(filePath => ({
label: filePath.split(/[\\/]/).pop(), // Get filename only
click: () => {
if (fs.existsSync(filePath)) {
currentFile = filePath;
const content = fs.readFileSync(filePath, 'utf-8');
mainWindow.webContents.send('file-opened', { path: filePath, content });
} else {
dialog.showErrorBox('File Not Found', `The file "${filePath}" could not be found.`);
}
},
toolTip: filePath // Show full path in tooltip
}));
return [
...recentFileItems,
{ type: 'separator' },
{
label: 'Clear Recent Files',
click: () => {
mainWindow.webContents.send('clear-recent-files');
}
}
];
}
function getRecentFiles() {
try {
const recentFiles = JSON.parse(fs.readFileSync(path.join(app.getPath('userData'), 'recent-files.json'), 'utf-8'));
return recentFiles.filter(file => fs.existsSync(file));
} catch (e) {
return [];
}
}
function createMenu() {
@@ -75,6 +139,16 @@ function createMenu() {
click: saveAsFile
},
{ type: 'separator' },
{
label: 'Recent Files',
submenu: buildRecentFilesMenu()
},
{ type: 'separator' },
{
label: 'Import Document...',
accelerator: 'CmdOrCtrl+I',
click: importDocument
},
{
label: 'Export',
submenu: [
@@ -84,7 +158,12 @@ function createMenu() {
{ label: 'LaTeX', click: () => exportFile('latex') },
{ label: 'RTF', click: () => exportFile('rtf') },
{ label: 'ODT', click: () => exportFile('odt') },
{ label: 'EPUB', click: () => exportFile('epub') }
{ label: 'EPUB', click: () => exportFile('epub') },
{ type: 'separator' },
{ label: 'PowerPoint (PPTX)', click: () => exportFile('pptx') },
{ label: 'OpenDocument Presentation (ODP)', click: () => exportFile('odp') },
{ type: 'separator' },
{ label: 'CSV (Tables)', click: () => exportSpreadsheet('csv') }
]
},
{ type: 'separator' },
@@ -99,12 +178,18 @@ function createMenu() {
label: 'Edit',
submenu: [
{ label: 'Undo', accelerator: 'CmdOrCtrl+Z', role: 'undo' },
{ label: 'Redo', accelerator: 'CmdOrCtrl+Y', role: 'redo' },
{ label: 'Redo', accelerator: 'CmdOrCtrl+Shift+Z', role: 'redo' },
{ type: 'separator' },
{ label: 'Cut', accelerator: 'CmdOrCtrl+X', role: 'cut' },
{ label: 'Copy', accelerator: 'CmdOrCtrl+C', role: 'copy' },
{ label: 'Paste', accelerator: 'CmdOrCtrl+V', role: 'paste' },
{ label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectAll' }
{ label: 'Select All', accelerator: 'CmdOrCtrl+A', role: 'selectAll' },
{ type: 'separator' },
{
label: 'Find & Replace',
accelerator: 'CmdOrCtrl+F',
click: () => mainWindow.webContents.send('toggle-find')
}
]
},
{
@@ -126,6 +211,27 @@ function createMenu() {
]
},
{ type: 'separator' },
{
label: 'Font Size',
submenu: [
{
label: 'Increase Font Size',
accelerator: 'CmdOrCtrl+Shift+Plus',
click: () => mainWindow.webContents.send('adjust-font-size', 'increase')
},
{
label: 'Decrease Font Size',
accelerator: 'CmdOrCtrl+Shift+-',
click: () => mainWindow.webContents.send('adjust-font-size', 'decrease')
},
{
label: 'Reset Font Size',
accelerator: 'CmdOrCtrl+Shift+0',
click: () => mainWindow.webContents.send('adjust-font-size', 'reset')
}
]
},
{ type: 'separator' },
{ label: 'Reload', accelerator: 'CmdOrCtrl+R', role: 'reload' },
{ label: 'Toggle DevTools', accelerator: 'F12', role: 'toggleDevTools' },
{ type: 'separator' },
@@ -134,6 +240,15 @@ function createMenu() {
{ label: 'Reset Zoom', accelerator: 'CmdOrCtrl+0', role: 'resetZoom' }
]
},
{
label: 'Batch',
submenu: [
{
label: 'Convert Folder...',
click: () => showBatchConversionDialog()
}
]
},
{
label: 'Help',
submenu: [
@@ -142,16 +257,16 @@ function createMenu() {
click: () => {
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'About Pan Converter',
message: 'Pan Converter',
detail: 'A cross-platform Markdown editor and converter using Pandoc.\n\nVersion: 1.0.0\nLicense: MIT',
title: 'About PanConverter',
message: 'PanConverter',
detail: 'A cross-platform Markdown editor and converter using Pandoc.\n\nVersion: 1.5.0\nAuthor: Amit Haridas\nEmail: amit.wh@gmail.com\nLicense: MIT\n\nFeatures:\n• Tabbed interface for multiple files\n• Advanced markdown editing with live preview\n• Enhanced PDF export with LaTeX engines\n• Optional advanced export options\n• Advanced export options with templates and metadata\n• Batch file conversion with progress tracking\n• Improved preview typography and spacing\n• Adjustable font sizes via menu (Ctrl+Shift+Plus/Minus)\n• Complete theme support including Monokai fixes\n• Find & replace with match highlighting\n• Line numbers and auto-indentation\n• Export to multiple formats via Pandoc\n• PowerPoint & presentation export\n• Export tables to CSV format\n• Document import & conversion\n• Table creation helper\n• Multiple themes support\n• Undo/redo functionality\n• Live word count and statistics',
buttons: ['OK']
});
}
},
{
label: 'Documentation',
click: () => shell.openExternal('https://github.com/yourusername/pan-converter')
click: () => shell.openExternal('https://github.com/amitwh/pan-converter')
}
]
}
@@ -198,6 +313,19 @@ function exportFile(format) {
return;
}
// Show export options dialog
showExportOptionsDialog(format);
}
function showExportOptionsDialog(format) {
mainWindow.webContents.send('show-export-dialog', format);
}
function showBatchConversionDialog() {
mainWindow.webContents.send('show-batch-dialog');
}
function performExportWithOptions(format, options) {
const outputFile = dialog.showSaveDialogSync(mainWindow, {
defaultPath: currentFile.replace(/\.[^/.]+$/, `.${format}`),
filters: [
@@ -206,16 +334,154 @@ function exportFile(format) {
});
if (outputFile) {
const pandocCmd = `pandoc "${currentFile}" -o "${outputFile}"`;
let pandocCmd = `${getPandocPath()} "${currentFile}" -o "${outputFile}"`;
// Add template if specified
if (options.template && options.template !== 'default') {
pandocCmd += ` --template="${options.template}"`;
}
// Add metadata
if (options.metadata) {
for (const [key, value] of Object.entries(options.metadata)) {
if (value.trim()) {
pandocCmd += ` -M ${key}="${value.replace(/"/g, '\\"')}"`;
}
}
}
// Add variables
if (options.variables) {
for (const [key, value] of Object.entries(options.variables)) {
if (value.trim()) {
pandocCmd += ` -V ${key}="${value.replace(/"/g, '\\"')}"`;
}
}
}
// Add other options
if (options.toc) pandocCmd += ' --toc';
if (options.tocDepth) pandocCmd += ` --toc-depth=${options.tocDepth}`;
if (options.numberSections) pandocCmd += ' --number-sections';
if (options.citeproc) pandocCmd += ' --citeproc';
if (options.bibliography) pandocCmd += ` --bibliography="${options.bibliography}"`;
if (options.csl) pandocCmd += ` --csl="${options.csl}"`;
// Add specific options for PDF export to ensure proper generation
if (format === 'pdf') {
const pdfEngine = options.pdfEngine || 'xelatex';
const geometry = options.geometry || 'margin=1in';
pandocCmd += ` --pdf-engine=${pdfEngine} -V geometry:${geometry}`;
// Try with specified PDF engine
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
// Try fallback engines if the specified one fails
const fallbackEngines = ['pdflatex', 'lualatex'];
tryPdfFallback(currentFile, outputFile, fallbackEngines, 0, options, error);
} else {
showExportSuccess(outputFile);
}
});
} else {
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
dialog.showErrorBox('Export Error', `Failed to export: ${error.message}\n\nMake sure Pandoc is installed.`);
} else {
showExportSuccess(outputFile);
}
});
}
}
}
function tryPdfFallback(inputFile, outputFile, engines, index, options, lastError) {
if (index >= engines.length) {
dialog.showErrorBox('PDF Export Error',
`Failed to export PDF with all available engines. Please ensure you have one of the following installed:\n` +
`• XeLaTeX (recommended): sudo apt-get install texlive-xetex\n` +
`• PDFLaTeX: sudo apt-get install texlive-latex-base\n` +
`• LuaLaTeX: sudo apt-get install texlive-luatex\n\n` +
`Last error: ${lastError.message}`
);
return;
}
const engine = engines[index];
const geometry = options.geometry || 'margin=1in';
let pandocCmd = `${getPandocPath()} "${inputFile}" --pdf-engine=${engine} -V geometry:${geometry} -o "${outputFile}"`;
// Add all other options
if (options.template && options.template !== 'default') {
pandocCmd += ` --template="${options.template}"`;
}
if (options.metadata) {
for (const [key, value] of Object.entries(options.metadata)) {
if (value.trim()) {
pandocCmd += ` -M ${key}="${value.replace(/"/g, '\\"')}"`;
}
}
}
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
tryPdfFallback(inputFile, outputFile, engines, index + 1, options, error);
} else {
showExportSuccess(outputFile);
}
});
}
function showExportSuccess(outputFile) {
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Export Complete',
message: `File exported successfully to ${outputFile}`,
buttons: ['OK']
});
}
function exportSpreadsheet(format) {
if (!currentFile) {
dialog.showErrorBox('Error', 'Please save the file first');
return;
}
// Request content from renderer
mainWindow.webContents.send('get-content-for-spreadsheet', format);
}
function importDocument() {
const files = dialog.showOpenDialogSync(mainWindow, {
properties: ['openFile'],
filters: [
{ name: 'Documents', extensions: ['docx', 'odt', 'rtf', 'html', 'tex', 'epub', 'pdf'] },
{ name: 'Presentations', extensions: ['pptx', 'odp'] },
{ name: 'All Files', extensions: ['*'] }
]
});
if (files && files[0]) {
const inputFile = files[0];
const outputFile = inputFile.replace(/\.[^/.]+$/, '.md');
// Convert to markdown using pandoc
const pandocCmd = `${getPandocPath()} "${inputFile}" -t markdown -o "${outputFile}"`;
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
dialog.showErrorBox('Export Error', `Failed to export: ${error.message}\n\nMake sure Pandoc is installed.`);
dialog.showErrorBox('Import Error', `Failed to import: ${error.message}\n\nMake sure Pandoc is installed.`);
} else {
// Open the converted markdown file
currentFile = outputFile;
const content = fs.readFileSync(outputFile, 'utf-8');
mainWindow.webContents.send('file-opened', { path: outputFile, content });
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Export Complete',
message: `File exported successfully to ${outputFile}`,
title: 'Import Complete',
message: `Document imported successfully as ${outputFile}`,
buttons: ['OK']
});
}
@@ -223,6 +489,7 @@ function exportFile(format) {
}
}
function setTheme(theme) {
store.set('theme', theme);
mainWindow.webContents.send('theme-changed', theme);
@@ -247,7 +514,279 @@ ipcMain.on('get-theme', (event) => {
event.reply('theme-changed', theme);
});
app.whenReady().then(createWindow);
// Handle tab file tracking for exports
ipcMain.on('set-current-file', (event, filePath) => {
currentFile = filePath;
});
// Handle renderer ready for file association
ipcMain.on('renderer-ready', (event) => {
if (app.pendingFile) {
openFileFromPath(app.pendingFile);
app.pendingFile = null;
}
});
// Handle export with options
ipcMain.on('export-with-options', (event, { format, options }) => {
performExportWithOptions(format, options);
});
// Handle batch conversion
ipcMain.on('batch-convert', (event, { inputFolder, outputFolder, format, options }) => {
performBatchConversion(inputFolder, outputFolder, format, options);
});
// Handle folder selection for batch conversion
ipcMain.on('select-folder', (event, type) => {
const folder = dialog.showOpenDialogSync(mainWindow, {
properties: ['openDirectory']
});
if (folder && folder[0]) {
event.reply('folder-selected', { type, path: folder[0] });
}
});
ipcMain.on('export-spreadsheet', (event, { content, format }) => {
const outputFile = dialog.showSaveDialogSync(mainWindow, {
defaultPath: currentFile.replace(/\.[^/.]+$/, `.${format}`),
filters: [
{ name: format.toUpperCase(), extensions: [format] }
]
});
if (outputFile) {
try {
// Parse markdown content to extract tables
const tables = extractTablesFromMarkdown(content);
if (tables.length === 0) {
dialog.showErrorBox('Export Error', 'No tables found in the markdown content');
return;
}
// Convert tables to CSV format
let csvContent = '';
tables.forEach((table, index) => {
if (index > 0) csvContent += '\n\n'; // Separate multiple tables
if (tables.length > 1) csvContent += `"Table ${index + 1}"\n`;
table.forEach(row => {
const csvRow = row.map(cell => {
// Escape quotes and wrap in quotes if necessary
const cleanCell = cell.replace(/"/g, '""');
return cleanCell.includes(',') || cleanCell.includes('"') || cleanCell.includes('\n')
? `"${cleanCell}"` : cleanCell;
}).join(',');
csvContent += csvRow + '\n';
});
});
// Write CSV file
fs.writeFileSync(outputFile, csvContent, 'utf-8');
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Export Complete',
message: `CSV exported successfully to ${outputFile}`,
buttons: ['OK']
});
} catch (error) {
dialog.showErrorBox('Export Error', `Failed to export: ${error.message}`);
}
}
});
// Helper function to extract tables from markdown
function extractTablesFromMarkdown(markdown) {
const tables = [];
const lines = markdown.split('\n');
let currentTable = [];
let inTable = false;
for (const line of lines) {
if (line.includes('|')) {
if (!inTable) {
inTable = true;
currentTable = [];
}
// Skip separator lines (|---|---|)
if (!line.match(/^\s*\|?\s*:?-+:?\s*\|/)) {
const cells = line.split('|')
.map(cell => cell.trim())
.filter(cell => cell !== '');
if (cells.length > 0) {
currentTable.push(cells);
}
}
} else if (inTable && line.trim() === '') {
// End of table
if (currentTable.length > 0) {
tables.push(currentTable);
}
currentTable = [];
inTable = false;
}
}
// Add last table if exists
if (currentTable.length > 0) {
tables.push(currentTable);
}
return tables;
}
function performBatchConversion(inputFolder, outputFolder, format, options) {
if (!fs.existsSync(inputFolder)) {
dialog.showErrorBox('Error', 'Input folder does not exist');
return;
}
// Create output folder if it doesn't exist
if (!fs.existsSync(outputFolder)) {
try {
fs.mkdirSync(outputFolder, { recursive: true });
} catch (error) {
dialog.showErrorBox('Error', `Failed to create output folder: ${error.message}`);
return;
}
}
// Find all markdown files in input folder
const markdownFiles = [];
function findMarkdownFiles(dir) {
const files = fs.readdirSync(dir);
for (const file of files) {
const fullPath = path.join(dir, file);
const stat = fs.statSync(fullPath);
if (stat.isDirectory()) {
findMarkdownFiles(fullPath); // Recursive search
} else if (file.match(/\.(md|markdown)$/i)) {
markdownFiles.push(fullPath);
}
}
}
findMarkdownFiles(inputFolder);
if (markdownFiles.length === 0) {
dialog.showErrorBox('No Files Found', 'No markdown files found in the selected folder');
return;
}
// Show progress dialog
let completedCount = 0;
const totalCount = markdownFiles.length;
// Process each file
const processNextFile = (index) => {
if (index >= markdownFiles.length) {
// All files processed
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Batch Conversion Complete',
message: `Successfully converted ${completedCount} out of ${totalCount} files to ${format.toUpperCase()}.`,
buttons: ['OK']
});
return;
}
const inputFile = markdownFiles[index];
const relativePath = path.relative(inputFolder, inputFile);
const baseName = path.basename(relativePath, path.extname(relativePath));
const outputFile = path.join(outputFolder, relativePath.replace(/\.(md|markdown)$/i, `.${format}`));
// Create subdirectories in output folder if needed
const outputDir = path.dirname(outputFile);
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir, { recursive: true });
}
// Build pandoc command
let pandocCmd = `${getPandocPath()} "${inputFile}" -o "${outputFile}"`;
// Add template if specified
if (options.template && options.template !== 'default') {
pandocCmd += ` --template="${options.template}"`;
}
// Add metadata
if (options.metadata) {
for (const [key, value] of Object.entries(options.metadata)) {
if (value.trim()) {
pandocCmd += ` -M ${key}="${value.replace(/"/g, '\\"')}"`;
}
}
}
// Add variables
if (options.variables) {
for (const [key, value] of Object.entries(options.variables)) {
if (value.trim()) {
pandocCmd += ` -V ${key}="${value.replace(/"/g, '\\"')}"`;
}
}
}
// Add other options
if (options.toc) pandocCmd += ' --toc';
if (options.tocDepth) pandocCmd += ` --toc-depth=${options.tocDepth}`;
if (options.numberSections) pandocCmd += ' --number-sections';
if (options.citeproc) pandocCmd += ' --citeproc';
if (options.bibliography) pandocCmd += ` --bibliography="${options.bibliography}"`;
if (options.csl) pandocCmd += ` --csl="${options.csl}"`;
// Add PDF-specific options
if (format === 'pdf') {
const pdfEngine = options.pdfEngine || 'xelatex';
const geometry = options.geometry || 'margin=1in';
pandocCmd += ` --pdf-engine=${pdfEngine} -V geometry:${geometry}`;
}
// Execute conversion
exec(pandocCmd, (error, stdout, stderr) => {
if (!error) {
completedCount++;
}
// Update progress (you could send this to renderer for a progress bar)
mainWindow.webContents.send('batch-progress', {
completed: index + 1,
total: totalCount,
currentFile: path.basename(inputFile),
success: !error
});
// Process next file
processNextFile(index + 1);
});
};
// Start processing
processNextFile(0);
}
app.whenReady().then(() => {
createWindow();
// Handle file association on app startup
// Process all command line arguments except the first two (node and script path)
const fileArgs = process.argv.slice(2);
for (const arg of fileArgs) {
if ((arg.endsWith('.md') || arg.endsWith('.markdown')) && fs.existsSync(arg)) {
// Store the file to open after window is ready
app.pendingFile = arg;
break;
}
}
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
@@ -260,3 +799,49 @@ app.on('activate', () => {
createWindow();
}
});
// IPC handlers for recent files
ipcMain.on('save-recent-files', (event, recentFiles) => {
try {
const userDataPath = app.getPath('userData');
const recentFilesPath = path.join(userDataPath, 'recent-files.json');
fs.writeFileSync(recentFilesPath, JSON.stringify(recentFiles, null, 2));
} catch (error) {
console.error('Error saving recent files:', error);
}
});
ipcMain.on('clear-recent-files', (event) => {
try {
const userDataPath = app.getPath('userData');
const recentFilesPath = path.join(userDataPath, 'recent-files.json');
fs.writeFileSync(recentFilesPath, JSON.stringify([], null, 2));
// Rebuild menu to reflect changes
createMenu();
event.reply('recent-files-cleared');
} catch (error) {
console.error('Error clearing recent files:', error);
}
});
// Handle file opening on macOS
app.on('open-file', (event, filePath) => {
event.preventDefault();
if (mainWindow) {
openFileFromPath(filePath);
} else {
// Store the file path to open after window is created
app.pendingFile = filePath;
}
});
// Handle file opening from command line or file association
function openFileFromPath(filePath) {
if (fs.existsSync(filePath)) {
currentFile = filePath;
const content = fs.readFileSync(filePath, 'utf-8');
if (mainWindow && mainWindow.webContents) {
mainWindow.webContents.send('file-opened', { path: filePath, content });
}
}
}
+1096 -168
View File
File diff suppressed because it is too large Load Diff
+1172 -48
View File
File diff suppressed because it is too large Load Diff