diff --git a/examples/data/encoder.vsh b/examples/data/encoder.vsh index 88db1ea7..7b048c93 100755 --- a/examples/data/encoder.vsh +++ b/examples/data/encoder.vsh @@ -1,4 +1,4 @@ -#!/usr/bin/env -S v -n -w -gc none -cc tcc -d use_openssl -enable-globals run +#!/usr/bin/env -S v -n -w -cg -gc none -cc tcc -d use_openssl -enable-globals run import freeflowuniverse.herolib.data.encoder import crypto.ed25519 @@ -30,9 +30,9 @@ console.print_debug('${e.data}') // do decoding mut d := encoder.decoder_new(e.data) mut aa := AStruct{} -aa.items = d.get_list_string() -aa.nr = d.get_int() -aa.privkey = d.get_bytes() +aa.items = d.get_list_string()! +aa.nr = d.get_int()! +aa.privkey = d.get_bytes()! assert a == aa diff --git a/examples/develop/gittools/gittools_print.vsh b/examples/develop/gittools/gittools_print.vsh index 3befba73..552073e7 100755 --- a/examples/develop/gittools/gittools_print.vsh +++ b/examples/develop/gittools/gittools_print.vsh @@ -8,3 +8,5 @@ import freeflowuniverse.herolib.develop.gittools mut gs := gittools.get(reload: true)! gs.repos_print()! + + diff --git a/examples/web/docusaurus_example.vsh b/examples/web/docusaurus_example.vsh index bb3e0085..edd8f375 100755 --- a/examples/web/docusaurus_example.vsh +++ b/examples/web/docusaurus_example.vsh @@ -1,8 +1,16 @@ #!/usr/bin/env -S v -n -w -gc none -cg -cc tcc -d use_openssl -enable-globals run import freeflowuniverse.herolib.web.docusaurus +import os // Create a new docusaurus factory -mut docs := docusaurus.new( - build_path: '/tmp/docusaurus_build' +mut ds := docusaurus.new( + path_build: '/tmp/docusaurus_build' + path_publish: '/tmp/docusaurus_publish' )! + +mut site:=ds.get(path:"${os.home_dir()}/code/git.threefold.info/tfgrid/docs_tfgrid4/ebooks/tech",name:"atest")! + +println(site) + +site.generate()! \ No newline at end of file diff --git a/examples/web/docusaurus_example_cli.sh b/examples/web/docusaurus_example_cli.sh old mode 100755 new mode 100644 diff --git a/examples/web/markdown_renderer/markdown_render.vsh b/examples/web/markdown_renderer/markdown_render.vsh index e4ff64b5..39ac8b16 100755 --- a/examples/web/markdown_renderer/markdown_render.vsh +++ b/examples/web/markdown_renderer/markdown_render.vsh @@ -7,8 +7,7 @@ import os import markdown import freeflowuniverse.herolib.data.markdownparser2 -path2 := '${os.home_dir()}/code/github/freeflowuniverse/herolib/examples/webtools/mdbook_markdown/content/links.md' -path1 := '${os.home_dir()}/code/github/freeflowuniverse/herolib/examples/webtools/mdbook_markdown/content/test.md' +path1 := '${os.home_dir()}/code/github/freeflowuniverse/herolib/examples/web/mdbook_markdown/content/cybercity.md' text := os.read_file(path1)! @@ -17,11 +16,3 @@ println('=== PLAINTEXT RENDERING ===') println(markdown.to_plain(text)) println('') -// Example 2: Using our custom structure renderer to show markdown structure -println('=== STRUCTURE RENDERING ===') -println(markdownparser2.to_structure(text)) - -// // Example 3: Using a simple markdown example to demonstrate structure -// println('\n=== STRUCTURE OF A SIMPLE MARKDOWN EXAMPLE ===') -// simple_md := '# Heading 1\n\nThis is a paragraph with **bold** and *italic* text.\n\n- List item 1\n- List item 2\n\n```v\nfn main() {\n\tprintln("Hello, world!")\n}\n```\n\n[Link to V language](https://vlang.io)' -// println(markdown.to_structure(simple_md)) diff --git a/lib/web/docusaurus/dsite.v b/lib/web/docusaurus/dsite.v index 6b769114..36758356 100644 --- a/lib/web/docusaurus/dsite.v +++ b/lib/web/docusaurus/dsite.v @@ -16,8 +16,8 @@ pub mut: name string url string path_src pathlib.Path - path_build pathlib.Path - // path_publish pathlib.Path + // path_build pathlib.Path + path_publish pathlib.Path args DSiteGetArgs errors []SiteError config Configuration @@ -28,7 +28,7 @@ pub fn (mut s DocSite) build() ! { s.generate()! osal.exec( cmd: ' - cd ${s.path_build.path} + cd ${s.factory.path_build.path} exit 1 ' retry: 0 @@ -39,7 +39,7 @@ pub fn (mut s DocSite) build_dev_publish() ! { s.generate()! osal.exec( cmd: ' - cd ${s.path_build.path} + cd ${s.factory.path_build.path} exit 1 ' retry: 0 @@ -50,7 +50,7 @@ pub fn (mut s DocSite) build_publish() ! { s.generate()! osal.exec( cmd: ' - cd ${s.path_build.path} + cd ${s.factory.path_build.path} exit 1 ' retry: 0 @@ -74,7 +74,7 @@ pub fn (mut s DocSite) dev(args DevArgs) ! { s.generate()! osal.exec( cmd: ' - cd ${s.path_build.path} + cd ${s.factory.path_build.path} bun run start -p ${args.port} -h ${args.host} ' retry: 0 @@ -99,8 +99,8 @@ pub fn (mut s DocSite) dev_watch(args DevArgs) ! { )! // Send commands to the screen session - console.print_item('To view the server output:: cd ${s.path_build.path}') - scr.cmd_send('cd ${s.path_build.path}')! + console.print_item('To view the server output:: cd ${s.factory.path_build.path}') + scr.cmd_send('cd ${s.factory.path_build.path}')! // Start script recording in the screen session for log streaming log_file := '/tmp/docusaurus_${screen_name}.log' @@ -143,7 +143,7 @@ pub fn (mut s DocSite) dev_watch(args DevArgs) ! { if s.args.watch_changes { docs_path := '${s.path_src.path}/docs' - watch_docs(docs_path, s.path_src.path, s.path_build.path)! + watch_docs(docs_path, s.path_src.path, s.factory.path_build.path)! } } @@ -199,18 +199,3 @@ pub fn (mut site DocSite) error(args ErrorArgs) { console.print_stderr(args.msg) } -fn check_item(item string) ! { - item2 := item.trim_space().trim('/').trim_space().all_after_last('/') - if ['internal', 'infodev', 'info', 'dev', 'friends', 'dd', 'web'].contains(item2) { - return error('destination path is wrong, cannot be: ${item}') - } -} - -fn (mut site DocSite) check() ! { - for item in site.config.main.build_dest { - check_item(item)! - } - for item in site.config.main.build_dest_dev { - check_item(item)! - } -} diff --git a/lib/web/docusaurus/dsite_check.v b/lib/web/docusaurus/dsite_check.v new file mode 100644 index 00000000..b4cf9c86 --- /dev/null +++ b/lib/web/docusaurus/dsite_check.v @@ -0,0 +1,20 @@ +module docusaurus + + +//to avoid overwriting wrong locations + +fn check_item(item string) ! { + item2 := item.trim_space().trim('/').trim_space().all_after_last('/') + if ['internal', 'infodev', 'info', 'dev', 'friends', 'dd', 'web'].contains(item2) { + return error('destination path is wrong, cannot be: ${item}') + } +} + +fn (mut site DocSite) check() ! { + for item in site.config.main.build_dest { + check_item(item)! + } + for item in site.config.main.build_dest_dev { + check_item(item)! + } +} \ No newline at end of file diff --git a/lib/web/docusaurus/dsite_configuration.v b/lib/web/docusaurus/dsite_configuration.v new file mode 100644 index 00000000..02e1bfa0 --- /dev/null +++ b/lib/web/docusaurus/dsite_configuration.v @@ -0,0 +1,188 @@ +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: + main Main + navbar Navbar + footer Footer +} + +pub struct Main { +pub mut: + title string + tagline string + favicon string + url string + base_url string @[json: 'baseUrl'] + url_home string + image string + metadata Metadata + build_dest []string @[json: 'buildDest'] + build_dest_dev []string @[json: 'buildDestDev'] + copyright string + name string +} + +pub struct Metadata { +pub mut: + description string + image string + title string +} + +pub struct Navbar { +pub mut: + title string + logo Logo + items []NavbarItem +} + +pub struct Logo { +pub mut: + alt string + src string + src_dark string @[json: 'srcDark'] +} + +pub struct NavbarItem { +pub mut: + label string + href string + position string + to string +} + +pub struct Footer { +pub mut: + style string + links []FooterLink +} + +pub struct FooterLink { +pub mut: + title string + items []FooterItem +} + +pub struct FooterItem { +pub mut: + label string + href string + 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 +// } + +fn config_load(path string) !Configuration { + + // Use siteconfig.new from factory.v. This function handles PlayBook creation, playing, and Redis interaction. + site_cfg_ref := siteconfig.new(path)! + 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 + url: site_cfg_from_heroscript.url + base_url: site_cfg_from_heroscript.base_url + url_home: site_cfg_from_heroscript.url_home + image: site_cfg_from_heroscript.image // General site image + metadata: Metadata{ + title: site_cfg_from_heroscript.meta_title // Specific title for metadata + description: site_cfg_from_heroscript.description + image: site_cfg_from_heroscript.meta_image // Use the specific meta_image from siteconfig + } + build_dest: site_cfg_from_heroscript.build_dest.map(it.path) + build_dest_dev: site_cfg_from_heroscript.build_dest_dev.map(it.path) + copyright: site_cfg_from_heroscript.copyright + name: site_cfg_from_heroscript.name + } + navbar: Navbar{ + title: site_cfg_from_heroscript.menu.title + logo: Logo{ + alt: site_cfg_from_heroscript.menu.logo_alt + src: site_cfg_from_heroscript.menu.logo_src + src_dark: site_cfg_from_heroscript.menu.logo_src_dark + } + items: nav_items + } + footer: Footer{ + style: site_cfg_from_heroscript.footer.style + links: footer_links + } + } + return config_fix(cfg)! + +} + +fn config_fix(config Configuration) !Configuration { + return Configuration{ + ...config + 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 } + } + } +} diff --git a/lib/web/docusaurus/dsite_generate.v b/lib/web/docusaurus/dsite_generate.v new file mode 100644 index 00000000..c43e9bcf --- /dev/null +++ b/lib/web/docusaurus/dsite_generate.v @@ -0,0 +1,68 @@ +module docusaurus + +import freeflowuniverse.herolib.develop.gittools +import freeflowuniverse.herolib.core.pathlib +import json +import os +import freeflowuniverse.herolib.osal +import freeflowuniverse.herolib.ui.console + +pub fn (mut site DocSite) generate() ! { + console.print_header(' site generate: ${site.name} on ${site.factory.path_build.path}') + console.print_header(' site source on ${site.path_src.path}') + + //lets make sure we remove the cfg dir so we rebuild + cfg_path := os.join_path(site.factory.path_build.path, 'cfg') + osal.rm(cfg_path)! + + mut gs := gittools.new()! + + template_path := gs.get_path( + pull: false + reset: false + url: 'https://github.com/freeflowuniverse/docusaurus_template/src/branch/main/template/' + )! + + //we need to copy the template each time for these 2 items, otherwise there can be leftovers from other run + for item in ["src","static"]{ + mut template_src_path:=pathlib.get_dir(path:"${template_path}/${item}",create:true)! + template_src_path.copy(dest: '${site.factory.path_build.path}/${item}', delete: true)! + //now copy the info which can be overruled from source in relation to the template + if os.exists("${site.path_src.path}/${item}"){ + mut src_path:=pathlib.get_dir(path:"${site.path_src.path}/${item}",create:false)! + src_path.copy(dest: '${site.factory.path_build.path}/${item}', delete: false)! + } + } + + mut main_file := pathlib.get_file(path: '${cfg_path}/main.json', create: true)! + main_file.write(json.encode(site.config.main))! + + mut navbar_file := pathlib.get_file(path: '${cfg_path}/navbar.json', create: true)! + navbar_file.write(json.encode(site.config.navbar))! + + mut footer_file := pathlib.get_file(path: '${cfg_path}/footer.json', create: true)! + footer_file.write(json.encode(site.config.footer))! + + mut aa := site.path_src.dir_get("docs")! + aa.copy(dest: '${site.factory.path_build.path}/docs', delete: true)! + + site.download_collections()! + + +} + + +pub fn (mut site DocSite) download_collections() ! { + + // mut gs := gittools.new()! + // for item in site.config.import_sources { + // mypath := gs.get_path( + // pull: false + // reset: false + // url: item.url + // )! + // mut mypatho := pathlib.get(mypath) + // site.process_md(mut mypatho, item)! + // } + +} \ No newline at end of file diff --git a/lib/web/docusaurus/dsite_get.v b/lib/web/docusaurus/dsite_get.v index 1231cd0c..0548413f 100644 --- a/lib/web/docusaurus/dsite_get.v +++ b/lib/web/docusaurus/dsite_get.v @@ -5,6 +5,7 @@ import freeflowuniverse.herolib.core.pathlib import freeflowuniverse.herolib.core.texttools import freeflowuniverse.herolib.develop.gittools import freeflowuniverse.herolib.ui.console +import freeflowuniverse.herolib.osal @[params] pub struct DSiteGetArgs { @@ -13,27 +14,21 @@ pub mut: nameshort string path string url string - publish_path string - build_path string + path_publish string //default empty + // path_build string //default empty production bool watch_changes bool = true update bool open bool init bool // means create new one if needed deploykey string - config ?Configuration + // config ?Configuration } pub fn (mut f DocusaurusFactory) get(args_ DSiteGetArgs) !&DocSite { console.print_header(' Docusaurus: ${args_.name}') mut args := args_ - if args.build_path.len == 0 { - args.build_path = '${f.path_build.path}' - } - // if args.publish_path.len == 0 { - // args.publish_path = '${f.path_publish.path}/${args.name}' - // coderoot:"${os.home_dir()}/hero/var/publishcode" mut gs := gittools.new(ssh_key_path: args.deploykey)! @@ -46,52 +41,30 @@ pub fn (mut f DocusaurusFactory) get(args_ DSiteGetArgs) !&DocSite { } args.path = args.path.replace('~', os.home_dir()) - // First, check if the new site args provides a configuration - if cfg := args.config { - // Use the provided config - generate_configuration(args.path, cfg)! - } else if f.config.main.title != '' { - // Use the factory's config from heroscript if available - generate_configuration(args.path, f.config)! - // } else { - // // Then ensure cfg directory exists in src, - // if !os.exists('${args.path}/cfg') { - // if args.init { - // // else copy config from template - // mut template_cfg := template_path.dir_get('cfg')! - // template_cfg.copy(dest: '${args.path}/cfg')! - // } else { - // return error("Can't find cfg dir in chosen docusaurus location: ${args.path}") - // } - // } + configpath:='${args.path}/cfg' + if ! os.exists(configpath) { + return error("can't find config file in ${configpath}") } + + osal.rm("${args.path}/cfg/main.json")! + osal.rm("${args.path}/cfg/footer.json")! + osal.rm("${args.path}/cfg/navbar.json")! + osal.rm("${args.path}/build.sh")! + osal.rm("${args.path}/develop.sh")! + osal.rm("${args.path}/sync.sh")! + osal.rm("${args.path}/.DS_Store")! + if !os.exists('${args.path}/docs') { if args.init { // Create docs directory if it doesn't exist in template or site os.mkdir_all('${args.path}/docs')! - - // Create a default docs/intro.md file - intro_content := '--- -title: Introduction -slug: / -sidebar_position: 1 ---- - -# Introduction - -Welcome to the documentation site. - -This is a default page created by the Docusaurus site generator. -' - os.write_file('${args.path}/docs/intro.md', intro_content)! + panic("implement") } else { return error("Can't find docs dir in chosen docusaurus location: ${args.path}") } } - mut myconfig := load_configuration('${args.path}/cfg') or { - return error('Failed to load configuration from ${args.path}/cfg:\n${err.msg()}') - } + mut myconfig:=config_load(configpath)! if myconfig.main.name.len == 0 { myconfig.main.name = myconfig.main.base_url.trim_space().trim('/').trim_space() @@ -106,17 +79,19 @@ This is a default page created by the Docusaurus site generator. } args.nameshort = texttools.name_fix(args.nameshort) + if args.path_publish == ""{ + args.path_publish = "${f.path_publish}/${args.name}" + } + mut ds := DocSite{ name: args.name url: args.url path_src: pathlib.get_dir(path: args.path, create: false)! - path_build: f.path_build - // path_publish: pathlib.get_dir(path: args.publish_path, create: true)! + path_publish: pathlib.get_dir(path:args.path_publish)! args: args config: myconfig factory: &f } - ds.check()! f.sites << &ds diff --git a/lib/web/docusaurus/factory.v b/lib/web/docusaurus/factory.v index d1efa11e..cccdd6aa 100644 --- a/lib/web/docusaurus/factory.v +++ b/lib/web/docusaurus/factory.v @@ -13,7 +13,7 @@ pub struct DocusaurusFactory { pub mut: sites []&DocSite @[skip; str: skip] path_build pathlib.Path - // path_publish pathlib.Path + path_publish pathlib.Path args DocusaurusArgs config Configuration // Stores configuration from HeroScript if provided } @@ -21,8 +21,8 @@ pub mut: @[params] pub struct DocusaurusArgs { pub mut: - // publish_path string - build_path string + path_publish string + path_build string production bool update bool // heroscript string @@ -31,21 +31,21 @@ pub mut: pub fn new(args_ DocusaurusArgs) !&DocusaurusFactory { mut args := args_ - if args.build_path == '' { - args.build_path = '${os.home_dir()}/hero/var/docusaurus' + if args.path_build == '' { + args.path_build = '${os.home_dir()}/hero/var/docusaurus/build' + } + if args.path_publish == ""{ + args.path_publish = "${os.home_dir()}/hero/var/docusaurus/publish" } - // if args.publish_path == ""{ - // args.publish_path = "${os.home_dir()}/hero/var/docusaurus/publish" - // } // Create the factory instance - mut ds := &DocusaurusFactory{ + mut f := &DocusaurusFactory{ args: args_ - path_build: pathlib.get_dir(path: args.build_path, create: true)! - // path_publish: pathlib.get_dir(path: args_.publish_path, create: true)! + path_build: pathlib.get_dir(path: args.path_build, create: true)! + path_publish: pathlib.get_dir(path: args_.path_publish, create: true)! } - ds.template_install(install: true, template_update: args.update, delete: true)! + f.template_install(install: args.update, template_update: args.update)! - return ds + return f } diff --git a/lib/web/docusaurus/factory_generate_template.v b/lib/web/docusaurus/factory_generate_template.v new file mode 100644 index 00000000..be9ba46a --- /dev/null +++ b/lib/web/docusaurus/factory_generate_template.v @@ -0,0 +1,51 @@ +module docusaurus + +import freeflowuniverse.herolib.develop.gittools +import freeflowuniverse.herolib.osal +import freeflowuniverse.herolib.installers.web.bun +import freeflowuniverse.herolib.core.pathlib +import os + + +@[params] +struct TemplateInstallArgs { +mut: + template_update bool = true + install bool + delete bool +} + +//copy template in build location +fn (mut self DocusaurusFactory) template_install(args_ TemplateInstallArgs) ! { + mut gs := gittools.new()! + mut args:=args_ + + template_path := gs.get_path( + pull: args.template_update + reset: args.delete + url: 'https://github.com/freeflowuniverse/docusaurus_template/src/branch/main/template' + )! + + mut template_path0:=pathlib.get_dir(path:template_path,create:false)! + + template_path0.copy(dest: '${self.path_build.path}', delete: args.delete)! + + if ! os.exists("${self.path_build.path}/node_modules"){ + args.install = true + } + + if args.install { + // install bun + mut installer := bun.get()! + installer.install()! + osal.exec( + //always stay in the context of the build directory + cmd: ' + ${osal.profile_path_source_and()!} + export PATH=${self.path_build.path}/node_modules/.bin::??{HOME}/.bun/bin/:??PATH + cd ${self.path_build.path} + bun install + ' + )! + } +} diff --git a/lib/web/docusaurus/generate_site.v b/lib/web/docusaurus/generate_site.v deleted file mode 100644 index b4d2623b..00000000 --- a/lib/web/docusaurus/generate_site.v +++ /dev/null @@ -1,48 +0,0 @@ -module docusaurus - -import freeflowuniverse.herolib.develop.gittools -import freeflowuniverse.herolib.core.pathlib -import json -import os -import freeflowuniverse.herolib.ui.console - -@[params] -struct TemplateInstallArgs { - template_update bool = true - install bool = true - delete bool = true -} - -pub fn (mut site DocSite) generate() ! { - console.print_header(' site generate: ${site.name} on ${site.path_build.path}') - console.print_header(' site source on ${site.path_src.path}') - site.check()! - site.template_install()! - - site.config = fix_configuration(site.config)! - - cfg_path := os.join_path(site.path_build.path, 'cfg') - - mut main_file := pathlib.get_file(path: '${cfg_path}/main.json', create: true)! - main_file.write(json.encode(site.config.main))! - - mut navbar_file := pathlib.get_file(path: '${cfg_path}/navbar.json', create: true)! - navbar_file.write(json.encode(site.config.navbar))! - - mut footer_file := pathlib.get_file(path: '${cfg_path}/footer.json', create: true)! - footer_file.write(json.encode(site.config.footer))! - - mut aa := site.path_src.dir_get("docs")! - aa.copy(dest: '${site.path_build.path}/docs', delete: true)! - - // mut gs := gittools.new()! - // for item in site.config.import_sources { - // mypath := gs.get_path( - // pull: false - // reset: false - // url: item.url - // )! - // mut mypatho := pathlib.get(mypath) - // site.process_md(mut mypatho, item)! - // } -} diff --git a/lib/web/docusaurus/generate_template.v b/lib/web/docusaurus/generate_template.v deleted file mode 100644 index e44fedbb..00000000 --- a/lib/web/docusaurus/generate_template.v +++ /dev/null @@ -1,32 +0,0 @@ -module docusaurus - -import freeflowuniverse.herolib.develop.gittools -import freeflowuniverse.herolib.osal -import freeflowuniverse.herolib.installers.web.bun - - -fn (mut self DocusaurusFactory) template_install(args TemplateInstallArgs) ! { - mut gs := gittools.new()! - - mut r := gs.get_repo( - url: 'https://github.com/freeflowuniverse/docusaurus_template.git' - pull: args.template_update - )! - mut template_path := r.patho()! - template_path.copy(dest: '${self.path_build.path}/template/', delete: args.delete)! - - if args.install { - // install bun - mut installer := bun.get()! - installer.install()! - osal.exec( - //always stay in the context of the build directory - cmd: ' - ${osal.profile_path_source_and()!} - export PATH=${self.path_build}/node_modules/.bin::??{HOME}/.bun/bin/:??PATH - cd ${self.path_build.path} - bun install - ' - )! - } -} diff --git a/lib/web/docusaurus/model_configuration.v b/lib/web/docusaurus/model_configuration.v deleted file mode 100644 index 57d3e760..00000000 --- a/lib/web/docusaurus/model_configuration.v +++ /dev/null @@ -1,200 +0,0 @@ -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: - main Main - navbar Navbar - footer Footer -} - -pub struct Main { -pub mut: - title string - tagline string - favicon string - url string - base_url string @[json: 'baseUrl'] - url_home string - image string - metadata Metadata - build_dest []string @[json: 'buildDest'] - build_dest_dev []string @[json: 'buildDestDev'] - copyright string - name string -} - -pub struct Metadata { -pub mut: - description string - image string - title string -} - -pub struct Navbar { -pub mut: - title string - logo Logo - items []NavbarItem -} - -pub struct Logo { -pub mut: - alt string - src string - src_dark string @[json: 'srcDark'] -} - -pub struct NavbarItem { -pub mut: - label string - href string - position string - to string -} - -pub struct Footer { -pub mut: - style string - links []FooterLink -} - -pub struct FooterLink { -pub mut: - title string - items []FooterItem -} - -pub struct FooterItem { -pub mut: - label string - href string - 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 { - 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(hero_script_main_file_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 - url: site_cfg_from_heroscript.url - base_url: site_cfg_from_heroscript.base_url - url_home: site_cfg_from_heroscript.url_home - image: site_cfg_from_heroscript.image // General site image - metadata: Metadata{ - title: site_cfg_from_heroscript.meta_title // Specific title for metadata - description: site_cfg_from_heroscript.description - image: site_cfg_from_heroscript.meta_image // Use the specific meta_image from siteconfig - } - build_dest: site_cfg_from_heroscript.build_dest.map(it.path) - build_dest_dev: site_cfg_from_heroscript.build_dest_dev.map(it.path) - copyright: site_cfg_from_heroscript.copyright - name: site_cfg_from_heroscript.name - } - navbar: Navbar{ - title: site_cfg_from_heroscript.menu.title - logo: Logo{ - alt: site_cfg_from_heroscript.menu.logo_alt - src: site_cfg_from_heroscript.menu.logo_src - src_dark: site_cfg_from_heroscript.menu.logo_src_dark - } - 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 { - return Configuration{ - ...config - 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 } - } - } -} diff --git a/lib/web/docusaurus/process.v b/lib/web/docusaurus/process.v deleted file mode 100644 index 5a42dacf..00000000 --- a/lib/web/docusaurus/process.v +++ /dev/null @@ -1,34 +0,0 @@ -module docusaurus - -// fn (mut site DocSite) process_md(mut path pathlib.Path, args ImportSource) ! { -// if path.is_dir() { -// mut pathlist_images := path.list( -// regex: [r'.*\.png$', r'.*\.jpg$', r'.*\.svg$', r'.*\.jpeg$'] -// recursive: true -// )! -// for mut mypatho_img in pathlist_images.paths { -// // now copy the image to the dest -// dest := '${site.path_build.path}/docs/${args.dest}/img/${texttools.name_fix(mypatho_img.name())}' -// // println("image copy: ${dest}") -// mypatho_img.copy(dest: dest, rsync: false)! -// } - -// mut pathlist := path.list(regex: [r'.*\.md$'], recursive: true)! -// for mut mypatho2 in pathlist.paths { -// site.process_md(mut mypatho2, args)! -// } -// return -// } -// mydest := '${site.path_build.path}/docs/${args.dest}/${texttools.name_fix(path.name())}' -// mut mydesto := pathlib.get_file(path: mydest, create: true)! - -// mut mymd := markdownparser.new(path: path.path)! -// mut myfm := mymd.frontmatter2()! -// if !args.visible { -// myfm.args['draft'] = 'true' -// } -// // println(myfm) -// // println(mymd.markdown()!) -// mydesto.write(mymd.markdown()!)! -// // Note: exit(0) was removed to prevent unexpected program termination -// }