Upload files to "docs"
This commit is contained in:
parent
4587ab01b3
commit
2d543fe68c
5 changed files with 842 additions and 0 deletions
223
docs/api.md
Normal file
223
docs/api.md
Normal file
|
|
@ -0,0 +1,223 @@
|
||||||
|
# API Documentation
|
||||||
|
|
||||||
|
This document provides detailed documentation for the GemReader application's internal APIs and code structure.
|
||||||
|
|
||||||
|
## Package Structure
|
||||||
|
|
||||||
|
- `main` (cmd/gemreader/main.go): Application entry point and command-line interface
|
||||||
|
- `config` (internal/config/config.go): Configuration loading and management
|
||||||
|
- `tui` (internal/tui/tui.go): Terminal user interface implementation
|
||||||
|
|
||||||
|
## Main Package
|
||||||
|
|
||||||
|
### main.go
|
||||||
|
|
||||||
|
#### Execute() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func Execute()
|
||||||
|
```
|
||||||
|
|
||||||
|
- Initializes and executes the Cobra command
|
||||||
|
- Handles command execution errors
|
||||||
|
- Exits the application with appropriate error code if execution fails
|
||||||
|
|
||||||
|
#### rootCmd variable
|
||||||
|
|
||||||
|
```go
|
||||||
|
var rootCmd = &cobra.Command
|
||||||
|
```
|
||||||
|
|
||||||
|
- Main Cobra command for the application
|
||||||
|
- Uses format: `gemreader [file]`
|
||||||
|
- Allows 0 or 1 arguments (the markdown file to view)
|
||||||
|
- Handles file reading and TUI initialization
|
||||||
|
- If no file is provided, attempts to use the default file from config
|
||||||
|
|
||||||
|
#### validateFilePath() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func validateFilePath(inputPath string) (string, error)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Validates file paths to prevent directory traversal attacks
|
||||||
|
- Cleans and resolves absolute paths
|
||||||
|
- Ensures the resolved path is within the current working directory
|
||||||
|
- Returns error if path traversal is detected
|
||||||
|
|
||||||
|
#### validateFile() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func validateFile(filePath string) error
|
||||||
|
```
|
||||||
|
|
||||||
|
- Performs security checks on files before loading
|
||||||
|
- Validates file size (max 10MB)
|
||||||
|
- Ensures file is a supported type (.md, .markdown, .txt, or no extension)
|
||||||
|
|
||||||
|
## Config Package
|
||||||
|
|
||||||
|
### config.go
|
||||||
|
|
||||||
|
#### Config struct
|
||||||
|
|
||||||
|
```go
|
||||||
|
type Config struct {
|
||||||
|
Title string `mapstructure:"title"`
|
||||||
|
DefaultFile string `mapstructure:"default_file"`
|
||||||
|
ShowTOC bool `mapstructure:"show_toc"`
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Stores application configuration
|
||||||
|
- Supports Title, DefaultFile, and ShowTOC fields
|
||||||
|
- Tagged for Viper configuration mapping
|
||||||
|
|
||||||
|
#### LoadConfig() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func LoadConfig() (config Config, err error)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Loads configuration from config.toml file
|
||||||
|
- Searches for config file in current directory
|
||||||
|
- Supports TOML format
|
||||||
|
- Returns Config struct and error if any
|
||||||
|
- Uses Viper for configuration management
|
||||||
|
- Returns defaults if config file doesn't exist
|
||||||
|
|
||||||
|
## TUI Package
|
||||||
|
|
||||||
|
### tui.go
|
||||||
|
|
||||||
|
#### model struct
|
||||||
|
|
||||||
|
```go
|
||||||
|
type model struct {
|
||||||
|
content string
|
||||||
|
rawLines []string
|
||||||
|
toc []tocEntry
|
||||||
|
selectedTocIndex int
|
||||||
|
|
||||||
|
tocViewport viewport.Model
|
||||||
|
contentViewport viewport.Model
|
||||||
|
|
||||||
|
activePane pane
|
||||||
|
helpVisible bool
|
||||||
|
config config.Config
|
||||||
|
windowWidth int
|
||||||
|
windowHeight int
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
The model struct contains all state information for the TUI:
|
||||||
|
|
||||||
|
- `content`: Original markdown content as string
|
||||||
|
- `rawLines`: Original content split by newlines for TOC generation
|
||||||
|
- `toc`: Table of contents entries
|
||||||
|
- `selectedTocIndex`: Index of currently selected TOC entry
|
||||||
|
- `tocViewport`: Bubble Tea viewport for TOC pane
|
||||||
|
- `contentViewport`: Bubble Tea viewport for content pane
|
||||||
|
- `activePane`: Currently active pane (TOC or content)
|
||||||
|
- `helpVisible`: Whether help text is visible
|
||||||
|
- `config`: Application configuration
|
||||||
|
- `windowWidth`, `windowHeight`: Terminal dimensions
|
||||||
|
|
||||||
|
#### pane type
|
||||||
|
|
||||||
|
```go
|
||||||
|
type pane int
|
||||||
|
|
||||||
|
const (
|
||||||
|
tocPane pane = iota
|
||||||
|
contentPane
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Represents the two panes in the UI
|
||||||
|
- `tocPane`: Left pane showing table of contents
|
||||||
|
- `contentPane`: Right pane showing markdown content
|
||||||
|
|
||||||
|
#### tocEntry struct
|
||||||
|
|
||||||
|
```go
|
||||||
|
type tocEntry struct {
|
||||||
|
level int
|
||||||
|
text string
|
||||||
|
line int
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
- Represents a single entry in the table of contents
|
||||||
|
- `level`: Header level (1 for #, 2 for ##, etc.)
|
||||||
|
- `text`: Text content of the header
|
||||||
|
- `line`: Line number in the original document
|
||||||
|
|
||||||
|
#### NewModel() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func NewModel(content string, cfg config.Config) model
|
||||||
|
```
|
||||||
|
|
||||||
|
- Creates a new TUI model with the given content and configuration
|
||||||
|
- Splits content into lines for TOC generation
|
||||||
|
- Generates table of contents from headers
|
||||||
|
- Initializes viewport models
|
||||||
|
- Sets up initial state with content pane as active
|
||||||
|
|
||||||
|
#### generateTOC() function
|
||||||
|
|
||||||
|
```go
|
||||||
|
func generateTOC(lines []string) []tocEntry
|
||||||
|
```
|
||||||
|
|
||||||
|
- Scans content lines for markdown headers
|
||||||
|
- Creates tocEntry for each header found
|
||||||
|
- Determines header level based on number of # characters
|
||||||
|
- Returns list of all headers in document order
|
||||||
|
|
||||||
|
#### (m model) Init() method
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (m model) Init() tea.Cmd
|
||||||
|
```
|
||||||
|
|
||||||
|
- Bubble Tea initialization method
|
||||||
|
- Returns nil command (no initial command needed)
|
||||||
|
|
||||||
|
#### (m model) Update() method
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd)
|
||||||
|
```
|
||||||
|
|
||||||
|
- Bubble Tea update method for handling messages and user input
|
||||||
|
- Handles window resize events and recalculates pane dimensions
|
||||||
|
- Processes keyboard input for navigation
|
||||||
|
- Switches between TOC and content panes with Tab key
|
||||||
|
- Handles TOC navigation and jumping to selected entries
|
||||||
|
- Updates both viewport models
|
||||||
|
- Supports all navigation commands
|
||||||
|
|
||||||
|
#### (m model) View() method
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (m model) View() string
|
||||||
|
```
|
||||||
|
|
||||||
|
- Bubble Tea view method for rendering the UI
|
||||||
|
- Applies styles to active and inactive panes
|
||||||
|
- Renders both TOC and content panes side by side
|
||||||
|
- Shows help text at the bottom if visible
|
||||||
|
- Returns string representation of current UI state
|
||||||
|
|
||||||
|
#### (m model) renderTOC() method
|
||||||
|
|
||||||
|
```go
|
||||||
|
func (m model) renderTOC() string
|
||||||
|
```
|
||||||
|
|
||||||
|
- Renders the table of contents view
|
||||||
|
- Shows headers with proper indentation based on level
|
||||||
|
- Highlights the currently selected entry with '>'
|
||||||
|
- Shows "No table of contents found." if no headers exist
|
||||||
161
docs/architecture.md
Normal file
161
docs/architecture.md
Normal file
|
|
@ -0,0 +1,161 @@
|
||||||
|
# Project Architecture
|
||||||
|
|
||||||
|
This document describes the architecture and structure of the GemReader application.
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
|
||||||
|
GemReader is a terminal-based markdown viewer built with Go using the Bubble Tea framework for the terminal user interface. The application reads markdown files, renders them for terminal display, and provides navigation capabilities.
|
||||||
|
|
||||||
|
## Architecture Pattern
|
||||||
|
|
||||||
|
The application follows a modular architecture with clear separation of concerns:
|
||||||
|
|
||||||
|
- **Presentation Layer**: Bubble Tea-based TUI in the `tui` package
|
||||||
|
- **Business Logic**: Navigation and content handling in the `tui` package
|
||||||
|
- **Configuration**: Viper-based configuration loading in the `config` package
|
||||||
|
- **Entry Point**: Command-line interface in the `main` package
|
||||||
|
|
||||||
|
## Package Structure
|
||||||
|
|
||||||
|
### `cmd/gemreader/main.go`
|
||||||
|
|
||||||
|
The main entry point of the application that:
|
||||||
|
|
||||||
|
- Defines the command-line interface using Cobra
|
||||||
|
- Handles command-line argument validation
|
||||||
|
- Reads the markdown file specified by the user
|
||||||
|
- Loads application configuration
|
||||||
|
- Initializes and runs the TUI
|
||||||
|
|
||||||
|
### `internal/config/config.go`
|
||||||
|
|
||||||
|
Configuration management that:
|
||||||
|
|
||||||
|
- Defines the application configuration structure
|
||||||
|
- Loads configuration from config.toml using Viper
|
||||||
|
- Provides configuration data to other parts of the application
|
||||||
|
- Handles configuration loading errors gracefully
|
||||||
|
|
||||||
|
### `internal/tui/tui.go`
|
||||||
|
|
||||||
|
Terminal user interface implementation that:
|
||||||
|
|
||||||
|
- Implements the Bubble Tea model for TUI functionality
|
||||||
|
- Handles all user interactions and navigation
|
||||||
|
- Manages dual-pane interface (TOC and content)
|
||||||
|
- Renders content for terminal display using viewports
|
||||||
|
- Generates and manages table of contents from markdown headers
|
||||||
|
- Provides pane switching functionality
|
||||||
|
|
||||||
|
## Design Patterns
|
||||||
|
|
||||||
|
### Model-View-Update (MVU) Pattern
|
||||||
|
|
||||||
|
The TUI uses the Bubble Tea framework which implements the MVU pattern:
|
||||||
|
|
||||||
|
- **Model**: The state of the application (model struct)
|
||||||
|
- **Update**: Functions that modify the state based on messages (keyboard input, etc.)
|
||||||
|
- **View**: Function that renders the current state to the terminal
|
||||||
|
|
||||||
|
### Viewport Pattern
|
||||||
|
|
||||||
|
The TUI uses dual viewports for the split-screen interface:
|
||||||
|
|
||||||
|
- **TOC Viewport**: Dedicated scrolling region for table of contents
|
||||||
|
- **Content Viewport**: Dedicated scrolling region for markdown content
|
||||||
|
- Both viewports are managed by the Bubble Tea framework
|
||||||
|
|
||||||
|
### Dependency Management
|
||||||
|
|
||||||
|
The application uses Go modules for dependency management with the following key dependencies:
|
||||||
|
|
||||||
|
- `github.com/charmbracelet/bubbletea`: TUI framework
|
||||||
|
- `github.com/charmbracelet/lipgloss`: Styling library for terminal interfaces
|
||||||
|
- `github.com/charmbracelet/bubbles/viewport`: Viewport component for scrolling
|
||||||
|
- `github.com/spf13/cobra`: Command-line interface framework
|
||||||
|
- `github.com/spf13/viper`: Configuration management
|
||||||
|
- `github.com/MichaelMure/go-term-markdown`: Markdown rendering for terminals
|
||||||
|
|
||||||
|
## Data Flow
|
||||||
|
|
||||||
|
1. **Initialization**: `main.go` parses command-line arguments and loads configuration
|
||||||
|
2. **Content Loading**: Markdown file is read and rendered for terminal display
|
||||||
|
3. **Model Creation**: TUI model is created with content and configuration
|
||||||
|
4. **Event Loop**: Bubble Tea enters event loop handling user input
|
||||||
|
5. **State Updates**: User actions update the model state via the Update method
|
||||||
|
6. **Rendering**: Changes to model trigger View method to refresh display
|
||||||
|
|
||||||
|
## File Organization
|
||||||
|
|
||||||
|
```
|
||||||
|
gemreader/
|
||||||
|
├── cmd/
|
||||||
|
│ └── gemreader/
|
||||||
|
│ └── main.go # Application entry point
|
||||||
|
├── internal/
|
||||||
|
│ ├── config/
|
||||||
|
│ │ └── config.go # Configuration loading
|
||||||
|
│ └── tui/
|
||||||
|
│ └── tui.go # Terminal user interface
|
||||||
|
├── docs/ # Documentation files
|
||||||
|
│ ├── configuration.md
|
||||||
|
│ ├── navigation.md
|
||||||
|
│ ├── api.md
|
||||||
|
│ └── architecture.md
|
||||||
|
├── config.toml # Default configuration
|
||||||
|
├── sample.md # Sample markdown file
|
||||||
|
├── go.mod # Go module file
|
||||||
|
├── go.sum # Go module checksums
|
||||||
|
├── README.md # Main documentation file
|
||||||
|
└── CONTRIBUTING.md # Contribution guide
|
||||||
|
```
|
||||||
|
|
||||||
|
## Component Responsibilities
|
||||||
|
|
||||||
|
### Main Component
|
||||||
|
|
||||||
|
- Command-line argument parsing and validation
|
||||||
|
- File loading and error handling
|
||||||
|
- Configuration loading
|
||||||
|
- TUI initialization and execution
|
||||||
|
|
||||||
|
### Config Component
|
||||||
|
|
||||||
|
- Loading configuration from TOML file
|
||||||
|
- Providing configuration to other components
|
||||||
|
- Handling configuration errors gracefully
|
||||||
|
|
||||||
|
### TUI Component
|
||||||
|
|
||||||
|
- Managing application state
|
||||||
|
- Handling user input and navigation
|
||||||
|
- Rendering the dual-pane interface
|
||||||
|
- Managing pane switching between TOC and content
|
||||||
|
- Content display and positioning using viewports
|
||||||
|
- Generating and displaying table of contents
|
||||||
|
|
||||||
|
## Security Considerations
|
||||||
|
|
||||||
|
- The application only reads files specified by the user
|
||||||
|
- No network connections are made during normal operation
|
||||||
|
- Configuration loading is restricted to local files
|
||||||
|
- Input validation is handled by the underlying libraries
|
||||||
|
|
||||||
|
## Performance Characteristics
|
||||||
|
|
||||||
|
- Content is loaded entirely into memory at startup
|
||||||
|
- Navigation operations are performed in memory without file access
|
||||||
|
- Markdown rendering happens once at startup
|
||||||
|
- TOC generation happens once at startup
|
||||||
|
- Dual viewport system provides efficient scrolling in both panes
|
||||||
|
|
||||||
|
## Extensibility Points
|
||||||
|
|
||||||
|
The architecture supports extension through:
|
||||||
|
|
||||||
|
- Configuration options (new fields in Config struct)
|
||||||
|
- Enhanced dual-pane functionality
|
||||||
|
- Additional keyboard controls (in Update method)
|
||||||
|
- New content processing features (in TUI package)
|
||||||
|
- Enhanced viewport behaviors and styling
|
||||||
|
- Additional TOC features and navigation options
|
||||||
353
docs/building.md
Normal file
353
docs/building.md
Normal file
|
|
@ -0,0 +1,353 @@
|
||||||
|
# Building GemReader
|
||||||
|
|
||||||
|
This document provides detailed instructions on how to build the GemReader application for different platforms, with a focus on creating executable files (especially .exe files for Windows).
|
||||||
|
|
||||||
|
## Prerequisites
|
||||||
|
|
||||||
|
Before building GemReader, ensure you have the following installed:
|
||||||
|
|
||||||
|
- Go 1.24 or higher
|
||||||
|
- Git (for cloning the repository)
|
||||||
|
- A terminal/command prompt
|
||||||
|
- For Windows: A modern version of Windows that supports Go compilation
|
||||||
|
|
||||||
|
## Building for Windows (.exe)
|
||||||
|
|
||||||
|
### Basic Build
|
||||||
|
|
||||||
|
To build the application for Windows and create an .exe file, run the following command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
This will create a `gemreader.exe` file in your current directory.
|
||||||
|
|
||||||
|
### Cross-compilation from Other Platforms
|
||||||
|
|
||||||
|
If you're building from a non-Windows platform (Linux or macOS) and want to create a Windows executable, use these commands:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
GOOS=windows GOARCH=amd64 go build -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
### Advanced Build Options
|
||||||
|
|
||||||
|
#### Building with release flags (optimized)
|
||||||
|
|
||||||
|
For a more optimized build with smaller file size:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -ldflags "-s -w" -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
- `-s`: Omit the symbol table and debug information
|
||||||
|
- `-w`: Omit the DWARF symbol table
|
||||||
|
|
||||||
|
#### Building with version information
|
||||||
|
|
||||||
|
To embed version information in the executable:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build -ldflags "-X main.Version=1.0.0 -s -w" -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
## Building for Other Platforms
|
||||||
|
|
||||||
|
This section covers building the application on Windows for other operating systems using Go's cross-compilation feature.
|
||||||
|
|
||||||
|
### From Windows to Linux
|
||||||
|
|
||||||
|
To build for Linux from a Windows machine, you have several options:
|
||||||
|
|
||||||
|
**Option 1: Using PowerShell (Recommended)**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# For 64-bit Linux
|
||||||
|
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o gemreader-linux cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# For 32-bit Linux
|
||||||
|
$env:GOOS="linux"; $env:GOARCH="386"; go build -o gemreader-linux-386 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# For ARM64 Linux
|
||||||
|
$env:GOOS="linux"; $env:GOARCH="arm64"; go build -o gemreader-linux-arm64 cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 2: Using Command Prompt (CMD)**
|
||||||
|
In Command Prompt, you need to set the environment variables persistently for the session:
|
||||||
|
|
||||||
|
```batch
|
||||||
|
go env -w GOOS=linux
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
go build -o gemreader-linux cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# Reset to default after building
|
||||||
|
go env -w GOOS=windows
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
**Option 3: Temporary environment variables in PowerShell (One-liner)**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$env:GOOS="linux"; $env:GOARCH="amd64"; go build -o gemreader-linux cmd/gemreader/main.go; $env:GOOS="windows"; $env:GOARCH="amd64"
|
||||||
|
```
|
||||||
|
|
||||||
|
### From Windows to macOS
|
||||||
|
|
||||||
|
To build for macOS from a Windows machine:
|
||||||
|
|
||||||
|
**Using PowerShell:**
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# For Intel-based Macs
|
||||||
|
$env:GOOS="darwin"; $env:GOARCH="amd64"; go build -o gemreader-mac cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# For Apple Silicon Macs (M1/M2/M3)
|
||||||
|
$env:GOOS="darwin"; $env:GOARCH="arm64"; go build -o gemreader-mac-arm64 cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
**Using Command Prompt:**
|
||||||
|
|
||||||
|
```batch
|
||||||
|
go env -w GOOS=darwin
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
go build -o gemreader-mac cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# Reset to default after building
|
||||||
|
go env -w GOOS=windows
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
```
|
||||||
|
|
||||||
|
### Using PowerShell
|
||||||
|
|
||||||
|
If you're using PowerShell instead of Command Prompt, the syntax is slightly different:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
# For Linux ARM64
|
||||||
|
$env:GOOS="linux"; $env:GOARCH="arm64"; go build -o gemreader-linux-arm64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# For macOS
|
||||||
|
$env:GOOS="darwin"; $env:GOARCH="arm64"; go build -o gemreader-mac-arm64 cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
### Common GOOS and GOARCH Values
|
||||||
|
|
||||||
|
| GOOS | GOARCH | Platform |
|
||||||
|
| ------- | ------ | ---------------------------- |
|
||||||
|
| windows | amd64 | 64-bit Windows |
|
||||||
|
| windows | 386 | 32-bit Windows |
|
||||||
|
| windows | arm64 | 64-bit Windows on ARM |
|
||||||
|
| linux | amd64 | 64-bit Linux |
|
||||||
|
| linux | 386 | 32-bit Linux |
|
||||||
|
| linux | arm64 | 64-bit Linux on ARM |
|
||||||
|
| darwin | amd64 | 64-bit macOS (Intel) |
|
||||||
|
| darwin | arm64 | 64-bit macOS (Apple Silicon) |
|
||||||
|
|
||||||
|
### Building for Multiple Platforms
|
||||||
|
|
||||||
|
You can create a batch script to build for multiple platforms at once. Here's an example `build-all.bat`:
|
||||||
|
|
||||||
|
```batch
|
||||||
|
@echo off
|
||||||
|
echo Building GemReader for multiple platforms...
|
||||||
|
|
||||||
|
REM Create dist directory if it doesn't exist
|
||||||
|
if not exist dist mkdir dist
|
||||||
|
|
||||||
|
echo Building for Windows (64-bit)...
|
||||||
|
go env -w GOOS=windows
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-windows-amd64.exe cmd/gemreader/main.go
|
||||||
|
|
||||||
|
echo Building for Linux (64-bit)...
|
||||||
|
go env -w GOOS=linux
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-linux-amd64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
echo Building for macOS (Intel)...
|
||||||
|
go env -w GOOS=darwin
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-darwin-amd64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
echo Building for macOS (Apple Silicon)...
|
||||||
|
go env -w GOOS=darwin
|
||||||
|
go env -w GOARCH=arm64
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-darwin-arm64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
echo Resetting GOOS and GOARCH to default...
|
||||||
|
go env -w GOOS=windows
|
||||||
|
go env -w GOARCH=amd64
|
||||||
|
|
||||||
|
echo Build process completed!
|
||||||
|
pause
|
||||||
|
```
|
||||||
|
|
||||||
|
Alternatively, you can create a PowerShell script `build-all.ps1` for more reliable cross-platform building:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
Write-Host "Building GemReader for multiple platforms..."
|
||||||
|
|
||||||
|
# Create dist directory if it doesn't exist
|
||||||
|
if (!(Test-Path dist)) {
|
||||||
|
New-Item -ItemType Directory -Path dist
|
||||||
|
}
|
||||||
|
|
||||||
|
# Build for Windows
|
||||||
|
Write-Host "Building for Windows (64-bit)..."
|
||||||
|
$env:GOOS="windows"
|
||||||
|
$env:GOARCH="amd64"
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-windows-amd64.exe cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# Build for Linux
|
||||||
|
Write-Host "Building for Linux (64-bit)..."
|
||||||
|
$env:GOOS="linux"
|
||||||
|
$env:GOARCH="amd64"
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-linux-amd64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# Build for macOS Intel
|
||||||
|
Write-Host "Building for macOS (Intel)..."
|
||||||
|
$env:GOOS="darwin"
|
||||||
|
$env:GOARCH="amd64"
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-darwin-amd64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
# Build for macOS Apple Silicon
|
||||||
|
Write-Host "Building for macOS (Apple Silicon)..."
|
||||||
|
$env:GOOS="darwin"
|
||||||
|
$env:GOARCH="arm64"
|
||||||
|
go build -ldflags "-s -w" -o dist/gemreader-darwin-arm64 cmd/gemreader/main.go
|
||||||
|
|
||||||
|
Write-Host "Build process completed!"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Using Build Scripts
|
||||||
|
|
||||||
|
For more complex builds, you can create a build script. Here's an example `build.bat` for Windows:
|
||||||
|
|
||||||
|
```batch
|
||||||
|
@echo off
|
||||||
|
echo Building GemReader for Windows...
|
||||||
|
|
||||||
|
REM Build the application
|
||||||
|
go build -ldflags "-s -w" -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
|
||||||
|
if %ERRORLEVEL% == 0 (
|
||||||
|
echo Build successful! gemreader.exe has been created.
|
||||||
|
) else (
|
||||||
|
echo Build failed!
|
||||||
|
exit /b %ERRORLEVEL%
|
||||||
|
)
|
||||||
|
```
|
||||||
|
|
||||||
|
And a `build.sh` script for Unix-like systems:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
echo "Building GemReader..."
|
||||||
|
|
||||||
|
# Build the application
|
||||||
|
go build -ldflags "-s -w" -o gemreader cmd/gemreader/main.go
|
||||||
|
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
echo "Build successful! gemreader has been created."
|
||||||
|
else
|
||||||
|
echo "Build failed!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Targets with Go Releaser (Alternative Approach)
|
||||||
|
|
||||||
|
If the project uses GoReleaser or similar tools, you can use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Install GoReleaser if not already installed
|
||||||
|
go install github.com/goreleaser/goreleaser@latest
|
||||||
|
|
||||||
|
# Build all targets defined in .goreleaser.yml
|
||||||
|
goreleaser build --single-target --snapshot
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting Build Issues
|
||||||
|
|
||||||
|
### Common Issues
|
||||||
|
|
||||||
|
#### Missing Dependencies
|
||||||
|
|
||||||
|
If you encounter dependency issues, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go mod tidy
|
||||||
|
```
|
||||||
|
|
||||||
|
This will ensure all dependencies are downloaded and the go.mod file is updated.
|
||||||
|
|
||||||
|
#### CGO Issues
|
||||||
|
|
||||||
|
If your build fails due to CGO issues (uncommon for this project), you can disable CGO:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
CGO_ENABLED=0 go build -o gemreader.exe cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Large Executable Size
|
||||||
|
|
||||||
|
If the resulting executable is too large, consider these options:
|
||||||
|
|
||||||
|
1. Use the `-ldflags "-s -w"` options as mentioned above
|
||||||
|
|
||||||
|
2. Use UPX to compress the executable (third-party tool):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
upx --best gemreader.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
### Checking Build Information
|
||||||
|
|
||||||
|
To verify your build information, you can use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go version -m gemreader.exe
|
||||||
|
```
|
||||||
|
|
||||||
|
This will show build information about the executable.
|
||||||
|
|
||||||
|
## Production Builds
|
||||||
|
|
||||||
|
For production releases, consider using these flags to create a minimal executable:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go build \
|
||||||
|
-ldflags="-s -w -X main.Version=1.0.0" \
|
||||||
|
-o gemreader.exe \
|
||||||
|
cmd/gemreader/main.go
|
||||||
|
```
|
||||||
|
|
||||||
|
## Verifying the Build
|
||||||
|
|
||||||
|
After building, you can test your executable by running:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# On Windows
|
||||||
|
.\gemreader.exe sample.md
|
||||||
|
|
||||||
|
# Or with a different markdown file
|
||||||
|
.\gemreader.exe path\to\your\markdown\file.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## Build Artifacts
|
||||||
|
|
||||||
|
The build process will create:
|
||||||
|
|
||||||
|
- `gemreader.exe` (or platform-specific executable)
|
||||||
|
- The executable is self-contained and doesn't require additional files to run
|
||||||
|
- Configuration files like `config.toml` and `sample.md` can be distributed separately if needed
|
||||||
|
|
||||||
|
## Creating an Installer (Optional)
|
||||||
|
|
||||||
|
For distribution purposes, you may want to create an installer for Windows using tools like:
|
||||||
|
|
||||||
|
- NSIS (Nullsoft Scriptable Install System)
|
||||||
|
- Inno Setup
|
||||||
|
- GoReleaser with nfpm for cross-platform packaging
|
||||||
|
|
||||||
|
This is outside the scope of this document but worth considering for production releases.
|
||||||
63
docs/configuration.md
Normal file
63
docs/configuration.md
Normal file
|
|
@ -0,0 +1,63 @@
|
||||||
|
# Configuration Guide
|
||||||
|
|
||||||
|
GemReader uses a TOML-based configuration file to customize the application behavior. The configuration file is named `config.toml` and should be placed in the same directory where you run the application.
|
||||||
|
|
||||||
|
## Default Configuration File
|
||||||
|
|
||||||
|
The default `config.toml` file looks like this:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
title = "GemReader"
|
||||||
|
```
|
||||||
|
|
||||||
|
## Available Configuration Options
|
||||||
|
|
||||||
|
### title
|
||||||
|
|
||||||
|
- **Type**: String
|
||||||
|
- **Default**: "GemReader"
|
||||||
|
- **Description**: Sets the title displayed at the top of the application interface
|
||||||
|
|
||||||
|
### default_file
|
||||||
|
|
||||||
|
- **Type**: String
|
||||||
|
- **Default**: "" (empty)
|
||||||
|
- **Description**: Sets the default markdown file to open when no file is provided as a command-line argument
|
||||||
|
|
||||||
|
## Configuration Loading
|
||||||
|
|
||||||
|
The application attempts to load the configuration file when it starts. If the file is not found or contains errors, the application will continue to run with default settings.
|
||||||
|
|
||||||
|
The configuration is loaded using the [Viper](https://github.com/spf13/viper) library, which supports:
|
||||||
|
|
||||||
|
1. Loading from `config.toml` in the current directory
|
||||||
|
2. Environment variable overrides (with `GEMREADER_` prefix)
|
||||||
|
3. Default fallback values
|
||||||
|
|
||||||
|
## Example Advanced Configuration
|
||||||
|
|
||||||
|
While the current version only supports the title configuration, future versions may support additional options:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
title = "My Markdown Viewer"
|
||||||
|
|
||||||
|
# These options are planned for future releases:
|
||||||
|
# theme = "dark" # Color theme (dark/light)
|
||||||
|
# toc_enabled = true # Whether to generate table of contents
|
||||||
|
# line_numbers = false # Show line numbers
|
||||||
|
# wrap_text = true # Wrap long lines
|
||||||
|
```
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Configuration File Not Found
|
||||||
|
|
||||||
|
If the application starts but the custom title isn't displayed, ensure that:
|
||||||
|
|
||||||
|
1. The `config.toml` file exists in the current working directory
|
||||||
|
2. The file has the correct format and valid TOML syntax
|
||||||
|
3. The application has read permissions for the file
|
||||||
|
|
||||||
|
### Invalid Configuration
|
||||||
|
|
||||||
|
If the configuration file contains invalid TOML syntax, the application will log an error and use default values instead.
|
||||||
42
docs/index.md
Normal file
42
docs/index.md
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# GemReader Documentation
|
||||||
|
|
||||||
|
Welcome to the GemReader documentation. This collection of documents provides comprehensive information about the application.
|
||||||
|
|
||||||
|
## Table of Contents
|
||||||
|
|
||||||
|
### Getting Started
|
||||||
|
|
||||||
|
- [README](../README.md) - Main project overview, installation, and usage
|
||||||
|
- [Configuration Guide](configuration.md) - How to configure the application
|
||||||
|
|
||||||
|
### User Guides
|
||||||
|
|
||||||
|
- [Navigation & Controls](navigation.md) - Detailed keyboard controls and navigation
|
||||||
|
|
||||||
|
### Development & Building
|
||||||
|
|
||||||
|
- [Building Guide](building.md) - Instructions for building the application for different platforms
|
||||||
|
|
||||||
|
### Technical Documentation
|
||||||
|
|
||||||
|
- [API Documentation](api.md) - Internal API and code structure
|
||||||
|
- [Architecture](architecture.md) - Project architecture and design patterns
|
||||||
|
|
||||||
|
### Contributing
|
||||||
|
|
||||||
|
- [Contribution Guide](../CONTRIBUTING.md) - How to contribute to the project
|
||||||
|
|
||||||
|
## Quick Links
|
||||||
|
|
||||||
|
- [Report an Issue](https://github.com/your-repo/gemreader/issues)
|
||||||
|
- [Source Code](https://github.com/your-repo/gemreader)
|
||||||
|
- [Go Documentation](https://pkg.go.dev/gemreader)
|
||||||
|
|
||||||
|
## Need Help?
|
||||||
|
|
||||||
|
If you can't find what you're looking for in these documents:
|
||||||
|
|
||||||
|
1. Check the [README](../README.md) for basic usage information
|
||||||
|
2. Review the [Navigation Guide](navigation.md) for help with controls
|
||||||
|
3. Look at the [Building Guide](building.md) for compilation instructions
|
||||||
|
4. Open an issue in the GitHub repository
|
||||||
Loading…
Add table
Add a link
Reference in a new issue