feat: add multi-site support and playbook enhancements

- Refactor `site` module to process multiple configurations
- Add environment variable templating for playbook actions
- Activate playbook actions for setting coderoot and params
- Improve docusaurus config with metadata fallbacks
- Fix docusaurus navbar generation when logo is not defined
This commit is contained in:
Mahmoud-Emad
2025-08-03 12:14:55 +03:00
parent 198a394be8
commit d747977185
11 changed files with 136 additions and 160 deletions

View File

@@ -2,7 +2,6 @@ module docusaurus
import freeflowuniverse.herolib.web.site
pub struct Configuration {
pub mut:
main Main
@@ -73,6 +72,7 @@ pub mut:
href string @[omitempty]
to string @[omitempty]
}
// ... (struct definitions remain the same) ...
// This function is now a pure transformer: site.SiteConfig -> docusaurus.Configuration
@@ -105,7 +105,7 @@ pub fn new_configuration(site_cfg site.SiteConfig) !Configuration {
}
cfg := Configuration{
main: Main{
main: Main{
title: site_cfg.title
tagline: site_cfg.tagline
favicon: site_cfg.favicon
@@ -114,9 +114,21 @@ pub fn new_configuration(site_cfg site.SiteConfig) !Configuration {
url_home: site_cfg.url_home
image: site_cfg.image
metadata: Metadata{
title: site_cfg.meta_title
description: site_cfg.description
image: site_cfg.meta_image
title: if site_cfg.meta_title == '' {
site_cfg.title
} else {
site_cfg.meta_title
}
description: if site_cfg.description == '' {
site_cfg.tagline
} else {
site_cfg.description
}
image: if site_cfg.meta_image == '' {
site_cfg.image
} else {
site_cfg.meta_image
}
}
build_dest: site_cfg.build_dest.map(it.path)
build_dest_dev: site_cfg.build_dest_dev.map(it.path)
@@ -141,14 +153,27 @@ pub fn new_configuration(site_cfg site.SiteConfig) !Configuration {
}
fn config_fix(config Configuration) !Configuration {
// Fix empty logo sources by removing logo entirely if all fields are empty
mut navbar_fixed := config.navbar
if config.navbar.logo.src == '' && config.navbar.logo.src_dark == ''
&& config.navbar.logo.alt == '' {
// Create navbar without logo if all logo fields are empty
navbar_fixed = Navbar{
title: config.navbar.title
items: config.navbar.items
// logo field omitted entirely
}
}
return Configuration{
...config
main: Main{
main: Main{
...config.main
title: if config.main.title == '' { 'Docusaurus' } else { config.main.title }
favicon: if config.main.favicon == '' { 'img/favicon.ico' } else { config.main.favicon }
url: if config.main.url == '' { 'https://example.com' } else { config.main.url }
base_url: if config.main.base_url == '' { '/' } else { config.main.base_url }
}
} // ... (no changes needed here) ...
navbar: navbar_fixed
}
}

View File

@@ -1,33 +1,64 @@
module site
import freeflowuniverse.herolib.core.playbook { PlayBook }
import freeflowuniverse.herolib.core.playbook { Action, PlayBook }
import freeflowuniverse.herolib.core.texttools
import time
pub fn play(mut plbook PlayBook)! {
pub fn play(mut plbook PlayBook) ! {
// Handle multiple site configurations
config_actions := plbook.find(filter: 'site.config')!
mut website := play_config(mut plbook)!
if config_actions.len == 0 {
return error('No site.config actions found')
}
// Process each site configuration separately
for config_action in config_actions {
mut website := play_config_single(config_action)!
mut config := &website.siteconfig
play_import(mut plbook, mut config)!
play_menu(mut plbook, mut config)!
play_footer(mut plbook, mut config)!
play_build_dest(mut plbook, mut config)!
play_build_dest_dev(mut plbook, mut config)!
play_pages(mut plbook, mut website)!
}
}
fn play_config_single(action Action) !&Site {
mut p := action.params
name := p.get('name') or {
// If name is not specified, try to derive it from title or use a default
title := p.get_default('title', 'default-site')!
texttools.name_fix(title)
}
mut website := new(name: name)!
mut config := &website.siteconfig
play_import(mut plbook,mut config)!
play_menu(mut plbook,mut config)!
play_footer(mut plbook,mut config)!
play_build_dest(mut plbook,mut config)!
play_build_dest_dev(mut plbook,mut config)!
play_pages(mut plbook,mut website)!
config.title = p.get_default('title', config.title)!
config.description = p.get_default('description', config.description)!
config.tagline = p.get_default('tagline', config.tagline)!
config.favicon = p.get_default('favicon', config.favicon)!
config.image = p.get_default('image', config.image)!
config.copyright = p.get_default('copyright', config.copyright)!
config.url = p.get_default('url', config.url)!
config.base_url = p.get_default('base_url', config.base_url)!
config.url_home = p.get_default('url_home', config.url_home)!
return website
}
fn play_config(mut plbook PlayBook) !&Site {
mut action := plbook.get(filter: 'site.config')!
mut p:= action.params
name := p.get('name') or {return error("need to specify name in site.config")}
mut p := action.params
name := p.get('name') or { return error('need to specify name in site.config') }
mut website := new(name: name)!
mut config:= &website.siteconfig
mut config := &website.siteconfig
config.name = texttools.name_fix(name)
config.title = p.get_default('title', 'Documentation Site')!
@@ -49,7 +80,7 @@ fn play_config(mut plbook PlayBook) !&Site {
config.meta_title = p_meta.get_default('title', config.title)!
// If 'image' is present in site.config_meta, it overrides. Otherwise, meta_image remains empty or uses site.config.image logic.
config.meta_image = p_meta.get_default('image', config.image)!
// 'description' from site.config_meta can also be parsed here if a separate meta_description field is added to
// 'description' from site.config_meta can also be parsed here if a separate meta_description field is added to
// For now, config.description (from site.config) is used as the primary source or fallback.
return website
@@ -123,7 +154,7 @@ fn play_menu(mut plbook PlayBook, mut config SiteConfig) ! {
}
}
fn play_footer(mut plbook PlayBook , mut config SiteConfig) ! {
fn play_footer(mut plbook PlayBook, mut config SiteConfig) ! {
footer_actions := plbook.find(filter: 'site.footer')!
for action in footer_actions {
mut p := action.params
@@ -180,4 +211,3 @@ fn play_build_dest_dev(mut plbook PlayBook, mut config SiteConfig) ! {
config.build_dest_dev << dest_dev
}
}