import { SOURCE_LOADING, SOURCE_MISSING, SOURCE_SERVED_LEAD } from "#configuration/strings/walk.strings"; import { enableSourceNavigation, markReferences } from "#presentation/components/source.component"; import { SOURCE_LOADED_EVENT } from "#configuration/constants/anatomy.constants"; import type { SourceBlock } from "#types/block.types"; import { TEXT_LANGUAGE } from "#configuration/constants/code.constants"; import { createElement } from "#core/factories/element.factory"; import { createLink } from "#presentation/components/link.component"; import { createPlainCodeBlock } from "#presentation/components/code.component"; import { isStaticRender } from "#core/predicates/document.predicate"; import { loadSource } from "#core/loaders/walk.loader"; import { sourceLocation } from "#assets/walk.assets"; const NO_CLASS = ""; export const renderServedSource = function renderServedSource(lead: string, href: string, label: string): Element { return createElement("p", { children: [lead, createLink(href, NO_CLASS, [label])], className: "source-served" }); }; export const renderSource = function renderSource(block: SourceBlock): Element { if (isStaticRender()) { return renderServedSource(SOURCE_SERVED_LEAD, sourceLocation(block.source), block.title); } const holder = createElement("div", { children: [createPlainCodeBlock(SOURCE_LOADING, block.title, TEXT_LANGUAGE)], className: "source-holder", }); enableSourceNavigation(holder); void loadSource(block.source).then((text) => { const code = createPlainCodeBlock( text ?? SOURCE_MISSING, block.title, text === null ? TEXT_LANGUAGE : block.language, ); if (text !== null) { markReferences(code, block.path); } holder.replaceChildren(code); holder.dispatchEvent(new Event(SOURCE_LOADED_EVENT, { bubbles: true })); }); return holder; };