fix docusaurus to use siteconfig in heroscript

This commit is contained in:
timurgordon
2025-05-29 17:31:51 +03:00
parent a1404584d6
commit 632a1c11c2
3 changed files with 100 additions and 11 deletions

View File

@@ -186,7 +186,7 @@ fn cmd_docusaurus_execute(cmd Command) ! {
mut site := docs.get(
url: url
build_path: build_path
build_path: build_path
update: update
publish_path: publish_path
deploykey: deploykey

View File

@@ -95,7 +95,9 @@ This is a default page created by the Docusaurus site generator.
}
}
mut myconfig := load_configuration('${args.path}/cfg')!
mut myconfig := load_configuration('${args.path}/cfg') or {
return error("Failed to load configuration from ${args.path}/cfg:\n${err.msg()}")
}
if myconfig.main.name.len == 0 {
myconfig.main.name = myconfig.main.base_url.trim_space().trim('/').trim_space()

View File

@@ -3,6 +3,9 @@ module docusaurus
import os
import json
import freeflowuniverse.herolib.core.pathlib
import freeflowuniverse.herolib.web.siteconfig // For siteconfig.SiteConfig and siteconfig.new
// import strings // No longer needed as we are not concatenating
// import freeflowuniverse.herolib.core.playbook // No longer directly needed here
pub struct Configuration {
pub mut:
@@ -75,16 +78,100 @@ pub struct FooterItem {
to string
}
// Private helper function for JSON loading logic
fn load_configuration_from_json(cfg_path string) !Configuration {
mut main_json_path := os.join_path(cfg_path, 'main.json')
mut navbar_json_path := os.join_path(cfg_path, 'navbar.json')
mut footer_json_path := os.join_path(cfg_path, 'footer.json')
if !os.exists(main_json_path) || !os.exists(navbar_json_path) || !os.exists(footer_json_path) {
return error('Missing one or more required JSON configuration files (main.json, navbar.json, footer.json) in ${cfg_path} and no primary HeroScript file was successfully processed.')
}
mut main_json_content := pathlib.get_file(path: main_json_path)!
mut navbar_json_content := pathlib.get_file(path: navbar_json_path)!
mut footer_json_content := pathlib.get_file(path: footer_json_path)!
main_data := json.decode(Main, main_json_content.read()!)!
navbar_data := json.decode(Navbar, navbar_json_content.read()!)!
footer_data := json.decode(Footer, footer_json_content.read()!)!
mut cfg := Configuration{
main: main_data,
navbar: navbar_data,
footer: footer_data,
}
return cfg
}
pub fn load_configuration(cfg_path string) !Configuration {
mut main_json := pathlib.get_file(path: os.join_path(cfg_path, 'main.json'))!
mut navbar_json := pathlib.get_file(path: os.join_path(cfg_path, 'navbar.json'))!
mut footer_json := pathlib.get_file(path: os.join_path(cfg_path, 'footer.json'))!
mut cfg := Configuration{
main: json.decode(Main, main_json.read()!)!,
navbar: json.decode(Navbar, navbar_json.read()!)!,
footer: json.decode(Footer, footer_json.read()!)!
}
return cfg
primary_heroscript_filename := 'config.heroscript' // Define the primary HeroScript file to look for
hero_script_main_file_path := os.join_path(cfg_path, primary_heroscript_filename)
if os.exists(hero_script_main_file_path) {
println('Found primary HeroScript file: ${hero_script_main_file_path}. Attempting to load configuration.')
// Use siteconfig.new from factory.v. This function handles PlayBook creation, playing, and Redis interaction.
site_cfg_ref := siteconfig.new(cfg_path) or {
eprintln('Error loading configuration from HeroScript file ${hero_script_main_file_path}: ${err}. Falling back to JSON.')
return load_configuration_from_json(cfg_path) // Fallback to JSON private helper
}
site_cfg_from_heroscript := *site_cfg_ref // Dereference to get the actual SiteConfig struct
// Transform siteconfig.SiteConfig to docusaurus.Configuration
mut nav_items := []NavbarItem{}
for item in site_cfg_from_heroscript.menu.items {
nav_items << NavbarItem{
label: item.label,
href: item.href,
position: item.position,
to: item.to,
}
}
mut footer_links := []FooterLink{}
for link in site_cfg_from_heroscript.footer.links {
mut footer_items_mapped := []FooterItem{}
for item in link.items {
footer_items_mapped << FooterItem{
label: item.label,
href: item.href,
to: item.to,
}
}
footer_links << FooterLink{
title: link.title,
items: footer_items_mapped,
}
}
cfg := Configuration{
main: Main{
title: site_cfg_from_heroscript.title,
tagline: site_cfg_from_heroscript.tagline,
favicon: site_cfg_from_heroscript.favicon,
copyright: site_cfg_from_heroscript.copyright,
name: site_cfg_from_heroscript.name,
// url, base_url, url_home, image, metadata, build_dest etc. from site_cfg_from_heroscript.main if available
// or leave to fix_configuration. siteconfig.SiteConfig doesn't have a direct 'Main' substruct.
// These fields are top-level in siteconfig.SiteConfig.
},
navbar: Navbar{
title: site_cfg_from_heroscript.menu.title,
// logo: site_cfg_from_heroscript.menu.logo, // siteconfig.Menu doesn't have a direct logo struct like docusaurus.Logo
items: nav_items,
},
footer: Footer{
style: site_cfg_from_heroscript.footer.style,
links: footer_links,
},
}
return cfg
} else {
println('Primary HeroScript file (${primary_heroscript_filename}) not found in ${cfg_path}. Falling back to JSON configuration.')
return load_configuration_from_json(cfg_path)
}
}
pub fn fix_configuration(config Configuration) !Configuration {