Compare commits

...
7 Commits
Author SHA1 Message Date
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 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 0d21ddbf15 Update README.md with v1.2.0 features and remove CLAUDE.md 2025-09-01 20:07:47 +05:30
amitwh becfec5ae6 Update About dialog to version 1.2.0 with new features list 2025-09-01 20:03:36 +05:30
7 changed files with 1060 additions and 643 deletions
+303
View File
@@ -0,0 +1,303 @@
# PanConverter - Claude Development Guide
## Project Overview
**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.
**Current Version**: v1.2.1
**Author**: Amit Haridas (amit.wh@gmail.com)
**License**: MIT
**Repository**: https://github.com/amitwh/pan-converter
## Architecture & Technology Stack
### Core Technologies
- **Electron** - Cross-platform desktop application framework
- **Pandoc** - Universal document converter (required dependency)
- **marked** - Markdown parsing and rendering
- **highlight.js** - Syntax highlighting
- **XLSX** - Spreadsheet export functionality
- **DOMPurify** - HTML sanitization
### Application Structure
```
src/
├── main.js # Electron main process, menu system, IPC handlers
├── renderer.js # UI logic, editor functionality, event handling
├── index.html # Application layout and components
└── styles.css # Comprehensive styling with multi-theme support
assets/
└── icon.png # Application icon
package.json # Dependencies and build configuration
```
## Development Commands
### Prerequisites
```bash
# Install Node.js dependencies
npm install
# 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
# Build for current platform
npm run build
# Platform-specific builds
npm run build:win # Windows
npm run build:mac # macOS
npm run build:linux # Linux (AppImage, .deb, .snap)
# Build for all platforms
npm run dist:all
```
### 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
```
### 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.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`)
- **Menu System**: Comprehensive menu with file operations, editing, conversion, view options
- **IPC Handlers**: Communication between main and renderer processes
- **File Operations**: Open, save, import/export functionality
- **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`)
- **Editor Initialization**: CodeMirror-like functionality with custom implementation
- **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
- **Event Handling**: Keyboard shortcuts and UI interactions
- **Statistics Tracking**: Word/character counting
### 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
### HTML Structure (`src/index.html`)
- **Toolbar**: Feature buttons with SVG icons
- **Find Dialog**: Search and replace interface
- **Editor Container**: Line numbers and text editor
- **Preview Pane**: Rendered markdown display
- **Status Bar**: Statistics and application status
## Testing & Quality Assurance
### 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
- [ ] All themes render correctly for new components
- [ ] Export functions work with various document formats
- [ ] Table creation and export functionality
- [ ] Cross-platform compatibility
### 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
## Deployment & Distribution
### 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
### 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
## Contributing Guidelines
### 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
### 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
### Bug Reporting
- Include steps to reproduce
- Specify platform and version information
- Attach relevant screenshots or error logs
- Check existing issues before creating new ones
## Future Roadmap
### 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
### 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
---
**Last Updated**: September 1, 2025
**Claude Assistant**: Development completed for v1.2.1 comprehensive editor enhancements
+21 -7
View File
@@ -7,12 +7,14 @@ A cross-platform Markdown editor and converter powered by Pandoc.
## Features
### ✨ 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
@@ -20,9 +22,10 @@ A cross-platform Markdown editor and converter powered by Pandoc.
- 💾 **Auto-Save** - Never lose your work with automatic saving every 30 seconds
### 📤 Export & Conversion
- 📄 **Document Export** - Convert to HTML, PDF, DOCX, LaTeX, RTF, ODT, EPUB, PowerPoint (PPTX), and OpenDocument Presentation (ODP)
- 📄 **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 Excel (XLSX/XLS) and OpenDocument Spreadsheet (ODS) formats
- 📥 **Document Import & Conversion** - Import various document formats and convert between formats via Pandoc
- 📥 **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
@@ -36,13 +39,20 @@ A cross-platform Markdown editor and converter powered by 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/amitwh/pan-converter/releases) page.
#### Linux
- **AppImage**: `PanConverter-1.2.0.AppImage` (universal, may require `--no-sandbox` flag)
- **Debian Package**: `pan-converter_1.2.0_amd64.deb`
- **Snap Package**: `pan-converter_1.2.0_amd64.snap`
- **AppImage**: `PanConverter-1.3.0.AppImage` (universal, may require `--no-sandbox` flag)
- **Debian Package**: `pan-converter_1.3.0_amd64.deb`
- **Snap Package**: `pan-converter_1.3.0_amd64.snap`
### Install from Source
```bash
@@ -78,7 +88,10 @@ npm start
## Keyboard Shortcuts
### File Operations
- `Ctrl/Cmd + N` - New file
- `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
@@ -120,7 +133,8 @@ npm run dist:all
## Version History
- **v1.2.0** - Major editor enhancements: Find & Replace, Line Numbers, Undo/Redo, Auto-indentation, PowerPoint export, document conversion menu, table creation helper, spreadsheet export
- **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
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "pan-converter",
"version": "1.2.0",
"version": "1.3.0",
"description": "Cross-platform Markdown editor and converter using Pandoc",
"main": "src/main.js",
"scripts": {
+16 -7
View File
@@ -10,6 +10,13 @@
</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">
@@ -108,14 +115,16 @@
</div>
<div class="editor-container">
<div id="editor-pane" class="pane">
<div class="editor-wrapper">
<div id="line-numbers" class="line-numbers hidden"></div>
<textarea id="editor"></textarea>
<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 id="preview-pane" class="pane">
<div id="preview"></div>
</div>
</div>
+105 -76
View File
@@ -28,7 +28,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({
@@ -48,6 +48,14 @@ function createWindow() {
mainWindow.on('closed', () => {
mainWindow = null;
});
// Handle pending file from file association
if (app.pendingFile) {
mainWindow.webContents.once('dom-ready', () => {
openFileFromPath(app.pendingFile);
app.pendingFile = null;
});
}
}
function createMenu() {
@@ -76,6 +84,11 @@ function createMenu() {
click: saveAsFile
},
{ type: 'separator' },
{
label: 'Import Document...',
accelerator: 'CmdOrCtrl+I',
click: importDocument
},
{
label: 'Export',
submenu: [
@@ -121,32 +134,6 @@ function createMenu() {
}
]
},
{
label: 'Convert',
submenu: [
{
label: 'Import Document...',
accelerator: 'CmdOrCtrl+I',
click: importDocument
},
{ type: 'separator' },
{
label: 'Convert Current File',
submenu: [
{ label: 'To Markdown', click: () => convertToFormat('md') },
{ label: 'To HTML', click: () => convertToFormat('html') },
{ label: 'To PDF', click: () => convertToFormat('pdf') },
{ label: 'To DOCX', click: () => convertToFormat('docx') },
{ label: 'To LaTeX', click: () => convertToFormat('latex') },
{ label: 'To RTF', click: () => convertToFormat('rtf') },
{ label: 'To ODT', click: () => convertToFormat('odt') },
{ label: 'To EPUB', click: () => convertToFormat('epub') },
{ label: 'To PPTX', click: () => convertToFormat('pptx') },
{ label: 'To ODP', click: () => convertToFormat('odp') }
]
}
]
},
{
label: 'View',
submenu: [
@@ -184,7 +171,7 @@ function createMenu() {
type: 'info',
title: 'About PanConverter',
message: 'PanConverter',
detail: 'A cross-platform Markdown editor and converter using Pandoc.\n\nVersion: 1.2.0\nAuthor: Amit Haridas\nEmail: amit.wh@gmail.com\nLicense: MIT\n\nFeatures:\n• Advanced markdown editing with live preview\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 Excel/ODS spreadsheets\n• Document import & conversion\n• Table creation helper\n• Multiple themes support\n• Undo/redo functionality',
detail: 'A cross-platform Markdown editor and converter using Pandoc.\n\nVersion: 1.3.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• 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 Excel/ODS spreadsheets\n• Document import & conversion\n• Table creation helper\n• Multiple themes support\n• Undo/redo functionality',
buttons: ['OK']
});
}
@@ -246,23 +233,62 @@ function exportFile(format) {
});
if (outputFile) {
const pandocCmd = `pandoc "${currentFile}" -o "${outputFile}"`;
let pandocCmd = `pandoc "${currentFile}" -o "${outputFile}"`;
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
dialog.showErrorBox('Export Error', `Failed to export: ${error.message}\n\nMake sure Pandoc is installed.`);
} else {
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Export Complete',
message: `File exported successfully to ${outputFile}`,
buttons: ['OK']
});
}
});
// Add specific options for PDF export to ensure proper generation
if (format === 'pdf') {
pandocCmd = `pandoc "${currentFile}" --pdf-engine=xelatex -V geometry:margin=1in -o "${outputFile}"`;
// Try with different PDF engines if xelatex fails
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
// Fallback to pdflatex
const fallbackCmd = `pandoc "${currentFile}" --pdf-engine=pdflatex -V geometry:margin=1in -o "${outputFile}"`;
exec(fallbackCmd, (fallbackError, fallbackStdout, fallbackStderr) => {
if (fallbackError) {
// Final fallback to wkhtmltopdf
const htmlToPdfCmd = `pandoc "${currentFile}" -t html5 | wkhtmltopdf - "${outputFile}"`;
exec(htmlToPdfCmd, (finalError) => {
if (finalError) {
dialog.showErrorBox('PDF Export Error',
`Failed to export PDF. 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` +
`• wkhtmltopdf: sudo apt-get install wkhtmltopdf\n\n` +
`Error: ${finalError.message}`
);
} else {
showExportSuccess(outputFile);
}
});
} else {
showExportSuccess(outputFile);
}
});
} 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 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');
@@ -310,40 +336,6 @@ function importDocument() {
}
}
function convertToFormat(format) {
if (!currentFile) {
dialog.showErrorBox('Error', 'Please save or open a file first');
return;
}
const outputFile = dialog.showSaveDialogSync(mainWindow, {
defaultPath: currentFile.replace(/\.[^/.]+$/, `.${format}`),
filters: [
{ name: format.toUpperCase(), extensions: [format] }
]
});
if (outputFile) {
// For presentations, add slide level for better conversion
let pandocCmd = `pandoc "${currentFile}" -o "${outputFile}"`;
if (format === 'pptx' || format === 'odp') {
pandocCmd = `pandoc "${currentFile}" --slide-level=2 -o "${outputFile}"`;
}
exec(pandocCmd, (error, stdout, stderr) => {
if (error) {
dialog.showErrorBox('Conversion Error', `Failed to convert: ${error.message}\n\nMake sure Pandoc is installed.`);
} else {
dialog.showMessageBox(mainWindow, {
type: 'info',
title: 'Conversion Complete',
message: `File converted successfully to ${outputFile}`,
buttons: ['OK']
});
}
});
}
}
function setTheme(theme) {
store.set('theme', theme);
@@ -369,6 +361,11 @@ ipcMain.on('get-theme', (event) => {
event.reply('theme-changed', theme);
});
// Handle tab file tracking for exports
ipcMain.on('set-current-file', (event, filePath) => {
currentFile = filePath;
});
ipcMain.on('export-spreadsheet', (event, { content, format }) => {
const outputFile = dialog.showSaveDialogSync(mainWindow, {
defaultPath: currentFile.replace(/\.[^/.]+$/, `.${format}`),
@@ -452,7 +449,17 @@ function extractTablesFromMarkdown(markdown) {
return tables;
}
app.whenReady().then(createWindow);
app.whenReady().then(() => {
createWindow();
// Handle file association on app startup
if (process.argv.length > 1) {
const filePath = process.argv.find(arg => arg.endsWith('.md') || arg.endsWith('.markdown'));
if (filePath && fs.existsSync(filePath)) {
openFileFromPath(filePath);
}
}
});
app.on('window-all-closed', () => {
if (process.platform !== 'darwin') {
@@ -465,3 +472,25 @@ app.on('activate', () => {
createWindow();
}
});
// 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 });
}
}
}
+491 -550
View File
File diff suppressed because it is too large Load Diff
+121
View File
@@ -16,6 +16,93 @@ body {
height: 100vh;
}
/* Tab Bar */
.tab-bar {
display: flex;
align-items: center;
background: #f0f0f0;
border-bottom: 1px solid #ddd;
padding: 0 8px;
min-height: 36px;
}
.tab {
display: flex;
align-items: center;
padding: 6px 12px;
background: #e8e8e8;
border: 1px solid #ccc;
border-bottom: none;
border-radius: 6px 6px 0 0;
margin-right: 2px;
cursor: pointer;
user-select: none;
max-width: 200px;
min-width: 120px;
}
.tab.active {
background: #fff;
border-color: #999;
z-index: 1;
}
.tab-title {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px;
}
.tab-close {
background: none;
border: none;
font-size: 16px;
font-weight: bold;
cursor: pointer;
padding: 0;
margin-left: 8px;
width: 16px;
height: 16px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 3px;
color: #666;
}
.tab-close:hover {
background: #ddd;
color: #000;
}
.new-tab-button {
background: none;
border: 1px solid #ccc;
border-radius: 4px;
padding: 4px 8px;
cursor: pointer;
font-size: 14px;
margin-left: 8px;
color: #666;
}
.new-tab-button:hover {
background: #e8e8e8;
}
/* Tab Content */
.tab-content {
display: flex;
flex: 1;
overflow: hidden;
}
.tab-content:not(.active) {
display: none;
}
/* Toolbar */
.toolbar {
display: flex;
@@ -217,6 +304,40 @@ body.theme-dark {
color: #d4d4d4;
}
body.theme-dark .tab-bar {
background: #2d2d30;
border-bottom-color: #3e3e42;
}
body.theme-dark .tab {
background: #3c3c3c;
border-color: #555;
color: #d4d4d4;
}
body.theme-dark .tab.active {
background: #1e1e1e;
border-color: #666;
}
body.theme-dark .tab-close {
color: #ccc;
}
body.theme-dark .tab-close:hover {
background: #555;
color: #fff;
}
body.theme-dark .new-tab-button {
border-color: #555;
color: #ccc;
}
body.theme-dark .new-tab-button:hover {
background: #3c3c3c;
}
body.theme-dark .toolbar {
background: #2d2d30;
border-bottom-color: #3e3e42;