func main() '[io, alloc, panic] -> ()Generates deterministic package, module-summary, and symbol-reference pages.
Test files are excluded and only public declarations are rendered. --only limits page writes but still indexes every module for stable navigation. When configured, Core declarations join symbol resolution but link to the supplied Core documentation base instead of rendering into this package. The output directory must already exist; unreadable sources are skipped.
View Source
pub func main() '[io, alloc, panic] -> () {
#unsafe {
let root = strip_suffix(s: argument(index: 1, fallback: "."), suffix: "/")
let out_dir = strip_suffix(s: argument(index: 2, fallback: "docs"), suffix: "/")
let source_root = strip_suffix(
s: argument(index: 3, fallback: root + "/src"),
suffix: "/"
)
let display_name = argument(index: 4, fallback: package_name(root: root))
let core_source_root = ""
let core_docs_base = "/docs/core/"
let restricted = false
let selected: [String] = []
let arguments = OS.args()
let argument_index = 5
loop argument_index < arguments.count {
let value = arguments[argument_index].to_string()
if value == "--core-source" && argument_index + 1 < arguments.count {
core_source_root = strip_suffix(s: arguments[argument_index + 1].to_string(), suffix: "/")
argument_index = argument_index + 2
continue
}
if value == "--core-docs-base" && argument_index + 1 < arguments.count {
core_docs_base = strip_suffix(s: arguments[argument_index + 1].to_string(), suffix: "/") + "/"
argument_index = argument_index + 2
continue
}
if value == "--only" {
restricted = true
argument_index = argument_index + 1
continue
}
if restricted { selected.push(value) }
argument_index = argument_index + 1
}
let builtin_source_root = if core_source_root.byte_count > 0 {
core_source_root
} else if display_name == "core" {
source_root
} else {
""
}
let paths: [String] = []
collect_tlk_paths(directory: Directory(path: Path(source_root)), paths: paths)
let sorted = sort_paths(paths: paths)
let modules: [SourceModule] = []
for path in sorted {
if let .some(source) = read_source(path: path) {
let collection = DocumentableCollection()
collection.collect_public(source: source)
if collection.items.is_empty() { continue }
let name = module_name(path: path, source_root: source_root)
modules.push(SourceModule(
path: path,
name: name,
page: name + ".html",
collection: collection
))
}
}
if builtin_source_root == source_root {
modules.push(builtin_module(core_source_root: builtin_source_root))
}
let wrote_all = true
let links: [ModuleLink] = []
let symbols: [SymbolLink] = []
for module in modules {
let module_documentation: [String] = []
for line in module.collection.module_documentation {
module_documentation.push(line.to_string())
}
let module_wip: String? = match module.collection.module_wip {
.some(value) -> .some(value.to_string()),
.none -> .none
}
links.push(ModuleLink(
name: module.name,
file: module.page,
declarations: module.collection.items.count,
documentation: module_documentation,
wip: module_wip
))
for symbol in symbol_links(module: module.name, page: module.page, collection: module.collection) {
symbols.push(symbol.clone())
}
}
if builtin_source_root.byte_count > 0 && builtin_source_root != source_root {
append_external_symbols(source_root: builtin_source_root, page_base: core_docs_base, symbols: symbols)
}
// One `page<TAB>first documentation paragraph` line per module, for
// consumers (the site's docs index) that list modules without
// re-parsing sources. Written on every generator run; cached runs
// keep the file from the last generation, like the pages themselves.
let summaries = StringBuilder()
for link in links {
let first = summary_documentation(documentation: link.documentation)
let joined = ""
for line in first {
if joined.byte_count > 0 { joined = joined + " " }
joined = joined + line
}
summaries.append(string: link.file + "\t" + joined + "\n")
}
if write_page(dir: out_dir, file: ".module-summaries", contents: summaries.finish()) == false {
wrote_all = false
}
for module in modules {
if restricted && selected_path(paths: selected, path: module.path) == false { continue }
let page = render_module_page(
package: display_name,
module: module.name,
collection: module.collection,
modules: links,
symbols: symbols
)
if write_page(dir: out_dir, file: module.page, contents: page) == false {
wrote_all = false
}
for symbol in render_symbol_pages(
package: display_name,
module: module.name,
module_page: module.page,
collection: module.collection,
modules: links,
symbols: symbols
) {
if write_page(dir: out_dir, file: symbol.file, contents: symbol.contents) == false {
wrote_all = false
}
}
}
let index = render_index_page_with_symbols(package: display_name, modules: links, symbols: symbols)
if write_page(dir: out_dir, file: "index.html", contents: index) == false {
wrote_all = false
}
if wrote_all == false {
print("error: could not write every page; create the output directory `" + out_dir + "` first")
'panic(message: "talk-doc: output directory is not writable")
}
}
}