diff --git a/lib/data/doctree/collection/data/process_link.v b/lib/data/doctree/collection/data/process_link.v index 8909b026..127b2021 100644 --- a/lib/data/doctree/collection/data/process_link.v +++ b/lib/data/doctree/collection/data/process_link.v @@ -1,6 +1,7 @@ module data import freeflowuniverse.herolib.core.texttools +import freeflowuniverse.herolib.core.base import freeflowuniverse.herolib.data.markdown.elements import freeflowuniverse.herolib.data.doctree.pointer @@ -32,11 +33,27 @@ pub fn (page Page) process_links(paths map[string]string) ![]string { doc.linked_pages << ptr.str() } - if ptr.collection == page.collection_name { - // same directory - path = './' + path.all_after_first('/') + // Check if Docusaurus-specific paths are available in Redis + mut context := base.context() or { base.context_new()! } + mut redis := context.redis() or { panic('Redis not available') } + + // Try to get Docusaurus-specific path from Redis + if docusaurus_path := redis.hget('doctree_docusaurus_paths', ptr.str()) { + // Use Docusaurus path (already without .md extension) + // Ensure it starts with / for absolute path + if docusaurus_path.starts_with('/') { + path = docusaurus_path + } else { + path = '/' + docusaurus_path + } } else { - path = '../${path}' + // Fall back to default behavior: relative paths with .md + if ptr.collection == page.collection_name { + // same directory + path = './' + path.all_after_first('/') + } else { + path = '../${path}' + } } if ptr.cat == .image && element.extra.trim_space() != '' { diff --git a/lib/web/docusaurus/dsite.v b/lib/web/docusaurus/dsite.v index d992ca37..3cb75bf7 100644 --- a/lib/web/docusaurus/dsite.v +++ b/lib/web/docusaurus/dsite.v @@ -1,7 +1,9 @@ module docusaurus import freeflowuniverse.herolib.core.pathlib -import freeflowuniverse.herolib.web.site as sitemodule +import freeflowuniverse.herolib.core.base +import freeflowuniverse.herolib.core.texttools +import freeflowuniverse.herolib.web.site { Site, SiteConfig } import freeflowuniverse.herolib.osal.core as osal import freeflowuniverse.herolib.ui.console @@ -15,7 +17,7 @@ pub mut: path_build pathlib.Path errors []SiteError config Configuration - website sitemodule.Site + website site.Site generated bool } @@ -101,13 +103,13 @@ pub mut: cat ErrorCat } -pub fn (mut site DocSite) error(args ErrorArgs) { +pub fn (mut s DocSite) error(args ErrorArgs) { // path2 := pathlib.get(args.path) e := SiteError{ path: args.path msg: args.msg cat: args.cat } - site.errors << e + s.errors << e console.print_stderr(args.msg) } diff --git a/lib/web/docusaurus/dsite_generate.v b/lib/web/docusaurus/dsite_generate.v index 26a8cf7a..295d72e0 100644 --- a/lib/web/docusaurus/dsite_generate.v +++ b/lib/web/docusaurus/dsite_generate.v @@ -14,6 +14,9 @@ pub fn (mut docsite DocSite) generate() ! { console.print_header(' docsite generate: ${docsite.name} on ${c.path_build.path}') + // Store Docusaurus site structure in Redis for link processing + docsite.store_site_structure()! + osal.rm('${c.path_build.path}/docs')! cfg_path := '${c.path_build.path}/cfg' diff --git a/lib/web/docusaurus/dsite_store_structure.v b/lib/web/docusaurus/dsite_store_structure.v new file mode 100644 index 00000000..ed59afc8 --- /dev/null +++ b/lib/web/docusaurus/dsite_store_structure.v @@ -0,0 +1,40 @@ +module docusaurus + +import freeflowuniverse.herolib.core.base +import freeflowuniverse.herolib.core.texttools + +// Store the Docusaurus site structure in Redis for link processing +// This maps collection:page to their actual Docusaurus paths +pub fn (mut docsite DocSite) store_site_structure() ! { + mut context := base.context()! + mut redis := context.redis()! + + // Store mapping of collection:page to docusaurus path (without .md extension) + for page in docsite.website.pages { + parts := page.src.split(':') + if parts.len != 2 { + continue + } + collection_name := texttools.name_fix(parts[0]) + page_name := texttools.name_fix(parts[1]) + + // Calculate the docusaurus path (without .md extension for URLs) + mut doc_path := page.path + + // Handle empty or root path + if doc_path.trim_space() == '' || doc_path == '/' { + doc_path = page_name + } else if doc_path.ends_with('/') { + doc_path += page_name + } + + // Remove .md extension if present for URL paths + if doc_path.ends_with('.md') { + doc_path = doc_path[..doc_path.len - 3] + } + + // Store in Redis with key format: collection:page.md + key := '${collection_name}:${page_name}.md' + redis.hset('doctree_docusaurus_paths', key, doc_path)! + } +}