From 697c500e357844b93e2d7a8fc143bc6c727ce13d Mon Sep 17 00:00:00 2001 From: Mahmoud-Emad Date: Thu, 31 Jul 2025 14:42:36 +0300 Subject: [PATCH] refactor: adapt docusaurus to use generic site module - Introduce a new generic `site` module for web generation - Update `herocmds` to use the new site creation flow - Simplify docusaurus playbook logic with a `docusaurus.play` fn - Refactor site generation to act on `Site` struct directly - Fix playbook find filter to use wildcard `*` --- lib/core/herocmds/docusaurus.v | 34 +++++++++--------- lib/core/playcmds/play_docusaurus.v | 38 ++------------------- lib/data/paramsparser/params_reflection.v | 2 +- lib/threefold/grid4/farmingsimulator/play.v | 2 +- lib/threefold/grid4/gridsimulator/play.v | 6 ++-- lib/web/docusaurus/dsite_generate.v | 8 ++--- lib/web/site/generator_docusaurus.v | 14 ++++---- 7 files changed, 35 insertions(+), 69 deletions(-) diff --git a/lib/core/herocmds/docusaurus.v b/lib/core/herocmds/docusaurus.v index fcd9de2a..94f2bed3 100644 --- a/lib/core/herocmds/docusaurus.v +++ b/lib/core/herocmds/docusaurus.v @@ -1,6 +1,7 @@ module herocmds import freeflowuniverse.herolib.web.docusaurus +import freeflowuniverse.herolib.web.site import freeflowuniverse.herolib.core.pathlib import os import cli { Command, Flag } @@ -154,32 +155,31 @@ fn cmd_docusaurus_execute(cmd Command) ! { mut builddevpublish := cmd.flags.get_bool('builddevpublish') or { false } mut dev := cmd.flags.get_bool('dev') or { false } - mut docs := docusaurus.new( - template_update: update // Changed 'update' to 'template_update' - path_build: build_path - heroscript_path: heroscript_config_dir // Pass the directory path - )! + // Create a site first using the new API + mut generic_site := site.new(name: 'cli_site')! - mut site := docs.add( - git_url: url // Map CLI 'url' flag to DSiteGetArgs 'git_url' - update: update - path_publish: publish_path // Map CLI 'publish' flag to DSiteGetArgs 'path_publish' - init: init - open: open - // Removed build_path and deploykey as they are not in DSiteGetArgs + // Add docusaurus site + mut dsite := docusaurus.add( + site: generic_site + path_src: url // Use URL as source path for now + path_build: build_path + path_publish: publish_path + reset: false + template_update: update + install: init )! // Conditional site actions based on flags if buildpublish { - site.build_publish()! + dsite.build_publish()! } else if builddevpublish { - site.build_dev_publish()! + dsite.build_dev_publish()! } else if dev { - site.dev(host: 'localhost', port: 3000)! + dsite.dev(host: 'localhost', port: 3000, open: open)! } else if open { - site.open()! + dsite.open('localhost', 3000)! } else { // If no specific action (build/dev/open) is requested, just generate the site - site.generate()! + dsite.generate()! } } diff --git a/lib/core/playcmds/play_docusaurus.v b/lib/core/playcmds/play_docusaurus.v index 26acecf4..ac81ce16 100644 --- a/lib/core/playcmds/play_docusaurus.v +++ b/lib/core/playcmds/play_docusaurus.v @@ -1,44 +1,10 @@ module playcmds - - import freeflowuniverse.herolib.core.playbook { PlayBook } // import freeflowuniverse.herolib.ui.console import freeflowuniverse.herolib.web.docusaurus fn play(mut plbook PlayBook) ! { - - mut ds := docusaurus.new()! - - mut action0 := plbook.get(filter: 'docusaurus.define')! - - mut p0 := action0.params - path_publish := p0.get_default('path_publish', '')! - path_build := p0.get_default('path_build', '')! // don't do heroscript here because this could already be done before - ds = docusaurus.new( - path_publish: path_publish - path_build: path_build - install: plbook.exists(filter: 'docusaurus.reset') || plbook.exists(filter: 'docusaurus.update') - reset: plbook.exists(filter: 'docusaurus.reset') - template_update: plbook.exists(filter: 'docusaurus.reset') || plbook.exists(filter: 'docusaurus.update') - )! - - actions := plbook.find(filter: 'docusaurus.generate')! - for action in actions { - mut p := action.params - - mut site := ds.add( - name: p.get('name') or {return error("can't find name in params for docusaurus.add in action:\n${action.heroscript}")} - nameshort: p.get_default('nameshort', p.get('name')!)! - path: p.get_default('path', '')! - git_url: p.get_default('git_url', '')! - git_reset: p.get_default_false('git_reset') - git_root: p.get_default('git_root', '')! - git_pull: p.get_default_false('git_pull') - )! - - } - - - + // Use the new docusaurus.play() function which handles the new API structure + docusaurus.play(mut plbook)! } diff --git a/lib/data/paramsparser/params_reflection.v b/lib/data/paramsparser/params_reflection.v index 64be657a..a95e6662 100644 --- a/lib/data/paramsparser/params_reflection.v +++ b/lib/data/paramsparser/params_reflection.v @@ -14,7 +14,7 @@ pub fn (params Params) decode_struct[T](start T) !T { mut t := T{} $for field in T.fields { $if field.is_enum { - t.$(field.name) = params.get_int(field.name) or { t.$(field.name) } + t.$(field.name) = params.get_int(field.name) or { int(t.$(field.name)) } } $else { // super annoying didn't find other way, then to ignore options $if field.is_option { diff --git a/lib/threefold/grid4/farmingsimulator/play.v b/lib/threefold/grid4/farmingsimulator/play.v index 5d47cabb..990a48d9 100644 --- a/lib/threefold/grid4/farmingsimulator/play.v +++ b/lib/threefold/grid4/farmingsimulator/play.v @@ -110,7 +110,7 @@ pub fn (mut s Simulator) play(mut plbook PlayBook) ! { } // now do the simulation, run it - mut actions4 := plbook.filter(find: 'tfgridsimulation_farming.')! + mut actions4 := plbook.find(filter: 'tfgridsimulation_farming.*')! for action_ri in actions4 { if action_ri.name == 'regional_internet_add' { mut iname := action_ri.params.get('name')! diff --git a/lib/threefold/grid4/gridsimulator/play.v b/lib/threefold/grid4/gridsimulator/play.v index 5c90074d..197e3a5d 100644 --- a/lib/threefold/grid4/gridsimulator/play.v +++ b/lib/threefold/grid4/gridsimulator/play.v @@ -5,7 +5,7 @@ import freeflowuniverse.herolib.threefold.grid4.cloudslices pub fn play(mut plbook PlayBook) ! { // first make sure we find a run action to know the name - mut my_actions := plbook.find(filter: 'tfgrid_simulator.')! + mut my_actions := plbook.find(filter: 'tfgrid_simulator.*')! if my_actions.len == 0 { return @@ -33,7 +33,7 @@ pub fn play(mut plbook PlayBook) ! { pub fn (mut self Simulator) play(mut plbook PlayBook) ! { // make sure we know the inca price - mut actions4 := plbook.find(filter: 'tfgrid_simulator.')! + mut actions4 := plbook.find(filter: 'tfgrid_simulator.*')! if actions4.len == 0 { return @@ -61,7 +61,7 @@ pub fn (mut self Simulator) play(mut plbook PlayBook) ! { return error("can't find incaprice_define action for tfgrid_simulator, needs to define INCA price.") } - mut actions2 := plbook.find(filter: 'tfgrid_simulator.')! + mut actions2 := plbook.find(filter: 'tfgrid_simulator.*')! for action in actions2 { if action.name == 'node_growth_define' { mut node_name := action.params.get_default('node_name', '')! diff --git a/lib/web/docusaurus/dsite_generate.v b/lib/web/docusaurus/dsite_generate.v index 7ff273cb..84d0f52c 100644 --- a/lib/web/docusaurus/dsite_generate.v +++ b/lib/web/docusaurus/dsite_generate.v @@ -50,9 +50,9 @@ pub fn (mut self DocSite) generate() ! { osal.dir_ensure(docs_dest)! // Generate pages defined in site.heroscript (!!site.page ...) - self.site.siteconfig.generate( - path: docs_dest, - flat: true, + self.site.generate( + path: docs_dest + flat: true )! self.process_imports()! @@ -76,7 +76,7 @@ pub fn (mut self DocSite) process_imports() ! { for key, val in item.replace { ri.add_item('\{${key}\}', val)! } - + ri.replace_in_dir( path: dest_path extensions: ['md'] diff --git a/lib/web/site/generator_docusaurus.v b/lib/web/site/generator_docusaurus.v index 2e35fe5f..be2a311a 100644 --- a/lib/web/site/generator_docusaurus.v +++ b/lib/web/site/generator_docusaurus.v @@ -8,10 +8,10 @@ import os pub struct SiteGenerator { pub mut: - siteconfig_name string - path pathlib.Path - client &doctreeclient.DocTreeClient - flat bool // if flat then won't use sitenames as subdir's + siteconfig_name string + path pathlib.Path + client &doctreeclient.DocTreeClient + flat bool // if flat then won't use sitenames as subdir's } @[params] @@ -22,7 +22,7 @@ pub mut: } // new creates a new siteconfig and stores it in redis, or gets an existing one -pub fn (siteconfig SiteConfig)generate(args SiteGeneratorArgs) ! { +pub fn (site Site) generate(args SiteGeneratorArgs) ! { mut path := args.path if path == '' { path = '${os.home_dir()}/hero/var/sitegen' @@ -33,11 +33,11 @@ pub fn (siteconfig SiteConfig)generate(args SiteGeneratorArgs) ! { flat: args.flat } - for section in siteconfig.sections { + for section in site.sections { factory.section_generate(section)! } - for page in siteconfig.pages { + for page in site.pages { factory.page_generate(page)! } }