From 632a1c11c26836902e7e5c1ef6f215bd9edf8433 Mon Sep 17 00:00:00 2001 From: timurgordon Date: Thu, 29 May 2025 17:31:51 +0300 Subject: [PATCH] fix docusaurus to use siteconfig in heroscript --- lib/core/herocmds/docusaurus.v | 2 +- lib/web/docusaurus/dsite_get.v | 4 +- lib/web/docusaurus/model_configuration.v | 105 +++++++++++++++++++++-- 3 files changed, 100 insertions(+), 11 deletions(-) diff --git a/lib/core/herocmds/docusaurus.v b/lib/core/herocmds/docusaurus.v index d5ffdac4..85f0b766 100644 --- a/lib/core/herocmds/docusaurus.v +++ b/lib/core/herocmds/docusaurus.v @@ -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 diff --git a/lib/web/docusaurus/dsite_get.v b/lib/web/docusaurus/dsite_get.v index af7b6485..b9e8948e 100644 --- a/lib/web/docusaurus/dsite_get.v +++ b/lib/web/docusaurus/dsite_get.v @@ -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() diff --git a/lib/web/docusaurus/model_configuration.v b/lib/web/docusaurus/model_configuration.v index 26e8f984..aaddb489 100644 --- a/lib/web/docusaurus/model_configuration.v +++ b/lib/web/docusaurus/model_configuration.v @@ -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 {