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:
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user