@mdfriday/foundry
Version:
The core engine of MDFriday. Convert Markdown and shortcodes into fully themed static sites – Hugo-style, powered by TypeScript.
190 lines (189 loc) • 5.59 kB
TypeScript
import { Content } from "@internal/domain/markdown/vo/content";
export interface FrontMatterData {
params: Record<string, any>;
format: 'yaml' | 'toml' | 'json' | 'org';
}
export interface Shortcode {
name: string;
params: string[] | Record<string, any> | null;
pos: number;
length: number;
rawContent: string;
placeholder: string;
inline: boolean;
closed: boolean;
inner?: string | any[];
ordinal: number;
indentation?: string;
doMarkup: boolean;
}
export interface ParsedContentResult {
frontMatter?: FrontMatterData | undefined;
content: Content;
shortcodes: Shortcode[];
summary?: string;
wordCount: number;
readingTime: number;
}
export type ShortcodeRendererFunc = (shortcode: Shortcode) => Promise<string> | string;
export interface ContentResult {
frontMatter?: Record<string, any>;
renderedContent: string;
summary?: string;
wordCount: number;
readingTime: number;
}
export interface RenderableDocument {
frontMatter(): Record<string, any>;
toc(): TocFragments;
render(options: ParseAndRenderOptions): Promise<ContentResult>;
}
export interface ParseAndRenderOptions {
shortcodeRenderer?: ShortcodeRendererFunc;
maxSummaryLength?: number;
wordsPerMinute?: number;
}
export interface Markdown extends Highlighter {
render(rctx: RenderContext, dctx: DocumentContext): Promise<Result>;
parseContent(source: Uint8Array): Promise<ParsedContentResult>;
parseAndRenderContent(source: Uint8Array, options?: ParseAndRenderOptions): Promise<ContentResult>;
prepareRender(source: Uint8Array): Promise<RenderableDocument>;
}
export interface Result extends RenderingResult, ParsingResult {
}
export interface ParsingResult {
headers(): Header[];
tableOfContents(): TocFragments;
}
export interface RenderingResult {
bytes(): Uint8Array;
}
export interface Highlighter extends CodeBlockRenderer, IsDefaultCodeBlockRendererProvider {
highlight(code: string, lang: string, opts?: any): Promise<string>;
highlightCodeBlock(ctx: CodeblockContext, opts?: any): Promise<HighlightResult>;
}
export interface HighlightResult {
wrapped(): string;
inner(): string;
}
export interface AttributesOptionsSliceProvider {
attributesSlice(): Attribute[];
optionsSlice(): Attribute[];
}
export interface Attribute {
name(): string;
value(): any;
valueString(): string;
}
export interface RenderContext {
ctx: any;
src: Uint8Array;
renderTOC: boolean;
getRenderer: GetRendererFunc;
}
export interface DocumentContext {
document: any | null;
documentID: string;
documentName: string;
filename: string;
}
export declare enum RendererType {
LinkRendererType = 1,
ImageRendererType = 2,
HeadingRendererType = 3,
CodeBlockRendererType = 4
}
export type GetRendererFunc = (t: RendererType, id?: any) => any | null;
export declare const DefaultRendererFunc: GetRendererFunc;
export interface ContextData {
renderContext(): RenderContext;
documentContext(): DocumentContext;
}
export interface TableOfContentsProvider {
tableOfContents(): TocFragments;
}
export interface TocFragments {
toHTML(startLevel: number, stopLevel: number, ordered: boolean): string;
}
export interface LinkContext {
page(): any;
destination(): string;
title(): string;
text(): RenderedString;
plainText(): string;
}
export interface LinkRenderer {
renderLink(cctx: any, w: FlexiWriter, ctx: LinkContext): Promise<void>;
}
export interface AttributesProvider {
attributes(): Record<string, any>;
}
export interface HeadingContext extends AttributesProvider {
page(): any;
level(): number;
anchor(): string;
text(): RenderedString;
plainText(): string;
}
export interface HeadingRenderer {
renderHeading(cctx: any, w: FlexiWriter, ctx: HeadingContext): Promise<void>;
}
export interface IsDefaultCodeBlockRendererProvider {
isDefaultCodeBlockRenderer(): boolean;
}
export interface ElementPositionResolver {
resolvePosition(ctx: any): Position;
}
export interface Position {
line: number;
column: number;
offset: number;
}
export interface CodeblockContext extends AttributesProvider, AttributesOptionsSliceProvider, Positioner {
options(): Record<string, any>;
type(): string;
inner(): string;
ordinal(): number;
page(): any;
}
export interface Positioner {
position(): Position;
}
export interface CodeBlockRenderer {
renderCodeblock(cctx: any, w: FlexiWriter, ctx: CodeblockContext): Promise<void>;
}
export interface FlexiWriter {
write(data: Uint8Array): Promise<void>;
writeString(str: string): Promise<void>;
writeByte(b: number): Promise<void>;
}
export type RenderedString = string;
export interface Header {
name(): string;
level(): number;
links(): Link[];
paragraphs(): Paragraph[];
listParagraphs(): Paragraph[];
}
export interface Link {
text(): string;
url(): string;
}
export interface Paragraph {
text(): string;
}
export interface MarkdownRenderer {
render(source: string): Promise<string>;
parse(source: string): Promise<ParsingResult>;
}
export interface MarkdownConfig {
renderer?: MarkdownRenderer;
extensions?: MarkdownExtension[];
options?: Record<string, any>;
}
export interface MarkdownExtension {
name: string;
extend(md: any): void;
}
export type BasicMarkdownRenderFunc = (source: string) => Promise<string> | string;
export type BasicMarkdownParseFunc = (source: string) => Promise<any> | any;