mirror of
https://github.com/go-i2p/go-gh-page.git
synced 2025-06-16 06:14:42 -04:00
minor updates
This commit is contained in:
67
README.md
67
README.md
@ -1,2 +1,67 @@
|
|||||||
# go-gh-page
|
# go-gh-page
|
||||||
Generate github pages from the repository, keep the page in a branch, push to the branch
|
|
||||||
|
A tool that automatically generates GitHub Pages static websites from repository content. It converts your repository's Markdown files to HTML with a consistent layout, handles navigation, and preserves your documentation structure.
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Generates a complete static website from your repository's content
|
||||||
|
- Converts Markdown files to HTML with proper rendering
|
||||||
|
- Creates navigation structure based on your documentation
|
||||||
|
- Displays repository information (commits, contributors, license)
|
||||||
|
- Preserves images and handles relative links
|
||||||
|
- Supports custom templates and styles
|
||||||
|
- Includes GitHub Actions workflow for automatic deployment
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
```bash
|
||||||
|
go install github.com/go-i2p/go-gh-page/cmd/github-site-gen@latest
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Basic Usage
|
||||||
|
|
||||||
|
Generate a site for a GitHub repository:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
github-site-gen -repo owner/repo-name -output ./site
|
||||||
|
```
|
||||||
|
|
||||||
|
### Command Line Options
|
||||||
|
|
||||||
|
| Flag | Description | Default |
|
||||||
|
|------|-------------|---------|
|
||||||
|
| `-repo` | GitHub repository in format 'owner/repo-name' | (Required) |
|
||||||
|
| `-output` | Output directory for generated site | `./output` |
|
||||||
|
| `-branch` | Branch to use | `main` |
|
||||||
|
| `-workdir` | Working directory for cloning | (Temporary directory) |
|
||||||
|
| `-githost` | Git host to use | `github.com` |
|
||||||
|
| `-main-template` | Path to custom main template | (Built-in template) |
|
||||||
|
| `-doc-template` | Path to custom documentation template | (Built-in template) |
|
||||||
|
| `-style-template` | Path to custom style template | (Built-in template) |
|
||||||
|
|
||||||
|
### Using with GitHub Actions
|
||||||
|
|
||||||
|
The repository includes a GitHub Actions workflow file that can automatically generate and deploy your documentation to GitHub Pages.
|
||||||
|
|
||||||
|
1. Copy the `.github/workflows/page.yml` file to your repository
|
||||||
|
2. Enable GitHub Pages on your repository (Settings → Pages → Source: gh-pages branch)
|
||||||
|
3. Customize the workflow as needed
|
||||||
|
|
||||||
|
The workflow runs hourly by default and on pushes to the main branch, automatically updating your GitHub Pages.
|
||||||
|
|
||||||
|
## Custom Templates
|
||||||
|
|
||||||
|
You can provide custom templates for different components of the generated site:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
github-site-gen -repo owner/repo-name -output ./site \
|
||||||
|
-main-template path/to/main.html \
|
||||||
|
-doc-template path/to/doc.html \
|
||||||
|
-style-template path/to/style.css
|
||||||
|
```
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT License
|
@ -105,6 +105,8 @@ func (g *Generator) GenerateSite() (*GenerationResult, error) {
|
|||||||
|
|
||||||
// Prepare the list of documentation pages for navigation
|
// Prepare the list of documentation pages for navigation
|
||||||
var docsPages []utils.DocPage
|
var docsPages []utils.DocPage
|
||||||
|
var docsByDirectory = make(map[string][]utils.DocPage)
|
||||||
|
|
||||||
for path := range g.repoData.MarkdownFiles {
|
for path := range g.repoData.MarkdownFiles {
|
||||||
// Skip README as it's on the main page
|
// Skip README as it's on the main page
|
||||||
if isReadmeFile(filepath.Base(path)) {
|
if isReadmeFile(filepath.Base(path)) {
|
||||||
@ -117,13 +119,23 @@ func (g *Generator) GenerateSite() (*GenerationResult, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
outputPath := utils.GetOutputPath(path, "docs")
|
outputPath := utils.GetOutputPath(path, "docs")
|
||||||
docsPages = append(docsPages, utils.DocPage{
|
docPage := utils.DocPage{
|
||||||
Title: title,
|
Title: title,
|
||||||
Path: outputPath,
|
Path: outputPath,
|
||||||
})
|
}
|
||||||
|
|
||||||
|
// Add to main list
|
||||||
|
docsPages = append(docsPages, docPage)
|
||||||
|
|
||||||
|
// Add to directory-specific list for structured navigation
|
||||||
|
dirPath := filepath.Dir(path)
|
||||||
|
if dirPath == "." {
|
||||||
|
dirPath = "root"
|
||||||
|
}
|
||||||
|
docsByDirectory[dirPath] = append(docsByDirectory[dirPath], docPage)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sort docsPages by title for consistent navigation
|
// Sort docsPages by path for consistent navigation
|
||||||
utils.SortDocPagesByTitle(docsPages)
|
utils.SortDocPagesByTitle(docsPages)
|
||||||
|
|
||||||
// Generate main index page
|
// Generate main index page
|
||||||
@ -132,6 +144,9 @@ func (g *Generator) GenerateSite() (*GenerationResult, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Generate documentation pages
|
// Generate documentation pages
|
||||||
|
processedCount := 0
|
||||||
|
var processedFiles []string
|
||||||
|
|
||||||
for path, content := range g.repoData.MarkdownFiles {
|
for path, content := range g.repoData.MarkdownFiles {
|
||||||
// Skip README as it's on the main page
|
// Skip README as it's on the main page
|
||||||
if isReadmeFile(filepath.Base(path)) {
|
if isReadmeFile(filepath.Base(path)) {
|
||||||
@ -142,9 +157,17 @@ func (g *Generator) GenerateSite() (*GenerationResult, error) {
|
|||||||
return nil, fmt.Errorf("failed to generate doc page for %s: %w", path, err)
|
return nil, fmt.Errorf("failed to generate doc page for %s: %w", path, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result.DocsCount++
|
processedFiles = append(processedFiles, path)
|
||||||
|
processedCount++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Processed %d markdown files:\n", processedCount)
|
||||||
|
for _, file := range processedFiles {
|
||||||
|
fmt.Printf(" - %s\n", file)
|
||||||
|
}
|
||||||
|
|
||||||
|
result.DocsCount = processedCount
|
||||||
|
|
||||||
// Generate site structure summary
|
// Generate site structure summary
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
buffer.WriteString(g.outputDir + "/\n")
|
buffer.WriteString(g.outputDir + "/\n")
|
||||||
@ -254,6 +277,11 @@ func (g *Generator) generateDocPage(path, content string, docsPages []utils.DocP
|
|||||||
currentDocsPages := make([]utils.DocPage, len(docsPages))
|
currentDocsPages := make([]utils.DocPage, len(docsPages))
|
||||||
copy(currentDocsPages, docsPages)
|
copy(currentDocsPages, docsPages)
|
||||||
outputPath := utils.GetOutputPath(path, "docs")
|
outputPath := utils.GetOutputPath(path, "docs")
|
||||||
|
// Ensure output directory exists
|
||||||
|
outPath := filepath.Join(g.outputDir, outputPath)
|
||||||
|
if err := os.MkdirAll(filepath.Dir(outPath), 0755); err != nil {
|
||||||
|
return fmt.Errorf("failed to create directory for %s: %w", outPath, err)
|
||||||
|
}
|
||||||
|
|
||||||
for i := range currentDocsPages {
|
for i := range currentDocsPages {
|
||||||
if currentDocsPages[i].Path == outputPath {
|
if currentDocsPages[i].Path == outputPath {
|
||||||
@ -287,7 +315,7 @@ func (g *Generator) generateDocPage(path, content string, docsPages []utils.DocP
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Ensure output directory exists
|
// Ensure output directory exists
|
||||||
outPath := filepath.Join(g.outputDir, outputPath)
|
outPath = filepath.Join(g.outputDir, outputPath)
|
||||||
if err := os.MkdirAll(filepath.Dir(outPath), 0o755); err != nil {
|
if err := os.MkdirAll(filepath.Dir(outPath), 0o755); err != nil {
|
||||||
return fmt.Errorf("failed to create directory for %s: %w", outPath, err)
|
return fmt.Errorf("failed to create directory for %s: %w", outPath, err)
|
||||||
}
|
}
|
||||||
|
@ -106,7 +106,18 @@ func ProcessRelativeLinks(content, filePath, owner, repo string) string {
|
|||||||
resolvedPath = resolvedPath[1:]
|
resolvedPath = resolvedPath[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlPath := "../" + GetOutputPath(resolvedPath, "docs")
|
outputPath := GetOutputPath(resolvedPath, baseDir)
|
||||||
|
|
||||||
|
// Calculate the correct relative path based on the source and target file locations
|
||||||
|
htmlPath := outputPath
|
||||||
|
if baseDir != "." {
|
||||||
|
// If source file is in a subdirectory, calculate relative path
|
||||||
|
relPath, err := filepath.Rel(baseDir, filepath.Dir(resolvedPath))
|
||||||
|
if err == nil && relPath != "." {
|
||||||
|
// Need to adjust the link based on directory depth
|
||||||
|
htmlPath = filepath.Join("../", relPath, filepath.Base(htmlPath))
|
||||||
|
}
|
||||||
|
}
|
||||||
return "[" + linkText + "](" + htmlPath + anchor + ")"
|
return "[" + linkText + "](" + htmlPath + anchor + ")"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user