Merge branch 'development' into dev_docusaurus

This commit is contained in:
Mahmoud-Emad
2025-12-01 15:16:17 +02:00
49 changed files with 2884 additions and 1408 deletions

View File

@@ -2,37 +2,34 @@
The Site module provides a structured way to define website configurations, navigation menus, pages, and sections using HeroScript. It's designed to work with static site generators like Docusaurus.
## Purpose
The Site module allows you to:
- Define website structure and configuration in a declarative way using HeroScript
- Organize pages into sections/categories
- Configure navigation menus and footers
- Manage page metadata (title, description, slug, etc.)
- Support multiple content collections
- Define build and publish destinations
## Quick Start
### Minimal HeroScript Example
```heroscript
!!site.config
name: "my_docs"
title: "My Documentation"
!!site.page src: "docs:introduction"
title: "Getting Started"
!!site.page src: "setup"
title: "Installation"
```
### Processing with V Code
```v
#!/usr/bin/env -S v -n -w -gc none -cg -cc tcc -d use_openssl -enable-globals run
import incubaid.herolib.core.playbook
import incubaid.herolib.develop.gittools
import incubaid.herolib.web.site
import incubaid.herolib.ui.console
import incubaid.herolib.core.playcmds
// Process HeroScript file
mut plbook := playbook.new(path: './site_config.heroscript')!
// Clone or use existing repository with HeroScript files
mysitepath := gittools.path(
git_url: 'https://git.ourworld.tf/tfgrid/docs_tfgrid4/src/branch/main/ebooks/tech'
git_pull: true
)!
// Execute site configuration
site.play(mut plbook)!
// Process all HeroScript files in the path
playcmds.run(heroscript_path: mysitepath.path)!
// Access the configured site
mut mysite := site.get(name: 'my_docs')!
@@ -227,7 +224,7 @@ A logical group of pages. Pages reuse the collection once specified.
## HeroScript Syntax
### 1. Site Configuration (Required)
### Basic Configuration
```heroscript
!!site.config
@@ -240,49 +237,20 @@ A logical group of pages. Pages reuse the collection once specified.
copyright: "© 2024 My Organization"
url: "https://docs.example.com"
base_url: "/"
url_home: "/docs"
```
**Parameters:**
- `name` - Internal site identifier (default: 'default')
- `title` - Main site title (shown in browser tab)
- `description` - Site description for SEO
- `tagline` - Short tagline/subtitle
- `favicon` - Path to favicon image
- `image` - Default OG image for social sharing
- `copyright` - Copyright notice
- `url` - Full site URL for Docusaurus
- `base_url` - Base URL path (e.g., "/" or "/docs/")
- `url_home` - Home page path
### 2. Metadata Overrides (Optional)
```heroscript
!!site.config_meta
title: "My Docs - Technical Reference"
image: "img/tech-og.png"
description: "Technical documentation and API reference"
```
Overrides specific metadata for SEO without changing core config.
### 3. Navigation Bar
### Navigation Menu
```heroscript
!!site.navbar
title: "My Documentation"
title: "My Site"
logo_alt: "Site Logo"
logo_src: "img/logo.svg"
logo_src_dark: "img/logo-dark.svg"
!!site.navbar_item
label: "Documentation"
to: "intro"
position: "left"
!!site.navbar_item
label: "API Reference"
to: "docs/api"
to: "docs/intro"
position: "left"
!!site.navbar_item
@@ -291,13 +259,7 @@ Overrides specific metadata for SEO without changing core config.
position: "right"
```
**Parameters:**
- `label` - Display text (required)
- `to` - Internal link
- `href` - External URL
- `position` - "left" or "right" in navbar
### 4. Footer Configuration
### Footer Configuration
```heroscript
!!site.footer
@@ -311,20 +273,19 @@ Overrides specific metadata for SEO without changing core config.
!!site.footer_item
title: "Docs"
label: "Getting Started"
to: "getting-started"
href: "https://docs.example.com/getting-started"
!!site.footer_item
title: "Community"
label: "Discord"
href: "https://discord.gg/example"
!!site.footer_item
title: "Legal"
label: "Privacy"
href: "https://example.com/privacy"
```
### 5. Announcement Bar (Optional)
## Page Organization
### Example 1: Simple Pages Without Categories
When you don't need categories, pages are added sequentially. The collection only needs to be specified once, then it's reused for subsequent pages.
```heroscript
!!site.announcement
@@ -334,56 +295,34 @@ Overrides specific metadata for SEO without changing core config.
is_closeable: true
```
### 6. Pages and Categories
**Key Points:**
#### Simple: Pages Without Categories
- First page specifies collection as `tech:introduction` (collection:page_name format)
- Subsequent pages only need the page name (e.g., `vision`) - the `tech` collection is reused
- If `title` is not specified, it will be extracted from the markdown file itself
- Pages are ordered by their appearance in the HeroScript file
- `slug` can be used to customize the URL path (e.g., `"/"` for homepage)
```heroscript
!!site.page src: "guides:introduction"
title: "Getting Started"
description: "Introduction to the platform"
### Example 2: Pages with Categories
!!site.page src: "installation"
title: "Installation"
!!site.page src: "configuration"
title: "Configuration"
```
#### Advanced: Pages With Categories
Categories (sections) help organize pages into logical groups with their own navigation structure.
```heroscript
!!site.page_category
name: "basics"
label: "Getting Started"
name: "first_principle_thinking"
label: "First Principle Thinking"
!!site.page src: "guides:introduction"
title: "Introduction"
description: "Learn the basics"
!!site.page src: "first_principle_thinking:hardware_badly_used"
description: "Hardware is not used properly, why it is important to understand hardware"
!!site.page src: "installation"
title: "Installation"
!!site.page src: "internet_risk"
description: "Internet risk, how to mitigate it, and why it is important"
!!site.page src: "configuration"
title: "Configuration"
!!site.page_category
name: "advanced"
label: "Advanced Topics"
!!site.page src: "advanced:performance"
title: "Performance Tuning"
!!site.page src: "scaling"
title: "Scaling Guide"
!!site.page src: "onion_analogy"
description: "Compare onion with a computer, layers of abstraction"
```
**Page Parameters:**
- `src` - Source as `collection:page` (first page) or just `page_name` (reuse collection)
- `title` - Page title (optional, extracted from markdown if not provided)
- `description` - Page description
- `draft` - Hide from navigation (default: false)
- `hide_title` - Don't show title in page (default: false)
**Key Points:**
**Category Parameters:**
- `name` - Category identifier (required)
@@ -395,113 +334,78 @@ Overrides specific metadata for SEO without changing core config.
```heroscript
!!site.import
url: "https://github.com/example/external-docs"
path: "/local/path/to/repo"
dest: "external"
replace: "PROJECT_NAME:My Project,VERSION:1.0.0"
visible: true
```
### 8. Publishing Destinations
## Publish Destinations
```heroscript
!!site.publish
path: "/var/www/html/docs"
ssh_name: "production"
ssh_name: "production_server"
!!site.publish_dev
path: "/tmp/docs-preview"
```
---
## Factory Methods
## Common Patterns
### Create or Get a Site
### Pattern 1: Multi-Section Technical Documentation
```v
import incubaid.herolib.web.site
```heroscript
!!site.config
name: "tech_docs"
title: "Technical Documentation"
// Create a new site
mut mysite := site.new(name: 'my_docs')!
!!site.page_category
name: "getting_started"
label: "Getting Started"
// Get an existing site
mut mysite := site.get(name: 'my_docs')!
!!site.page src: "docs:intro"
title: "Introduction"
// Get default site
mut mysite := site.default()!
!!site.page src: "installation"
title: "Installation"
// Check if site exists
if site.exists(name: 'my_docs') {
println('Site exists')
}
!!site.page_category
name: "concepts"
label: "Core Concepts"
!!site.page src: "concepts:architecture"
title: "Architecture"
!!site.page src: "components"
title: "Components"
!!site.page_category
name: "api"
label: "API Reference"
!!site.page src: "api:rest"
title: "REST API"
!!site.page src: "graphql"
title: "GraphQL"
// List all sites
sites := site.list()
println(sites)
```
### Pattern 2: Simple Blog/Knowledge Base
### Using with PlayBook
```heroscript
!!site.config
name: "blog"
title: "Knowledge Base"
```v
import incubaid.herolib.core.playbook
import incubaid.herolib.web.site
!!site.page src: "articles:first_post"
title: "Welcome to Our Blog"
// Create playbook from path
mut plbook := playbook.new(path: '/path/to/heroscripts')!
!!site.page src: "second_post"
title: "Understanding the Basics"
// Process site configuration
site.play(mut plbook)!
!!site.page src: "third_post"
title: "Advanced Techniques"
// Access the configured site
mut mysite := site.get(name: 'my_site')!
```
### Pattern 3: Project with External Imports
## Data Structures
```heroscript
!!site.config
name: "project_docs"
title: "Project Documentation"
### Site
!!site.import
url: "https://github.com/org/shared-docs"
dest: "shared"
visible: true
!!site.page_category
name: "product"
label: "Product Guide"
!!site.page src: "docs:overview"
title: "Overview"
!!site.page src: "features"
title: "Features"
!!site.page_category
name: "resources"
label: "Shared Resources"
!!site.page src: "shared:common"
title: "Common Patterns"
```v
pub struct Site {
pub mut:
pages []Page
sections []Section
siteconfig SiteConfig
}
```
---
### Page
## File Organization