import Nast from 'notajs-types/nast' import { NAST_BLOCK_TYPES } from './constants' import { renderChildren } from './render-utils' import { raiseWarning } from './log-utils' import renderAudio from './widgets/audio' import renderBookmark from './widgets/bookmark' import renderCallout from './widgets/callout' import renderCode from './widgets/code' import renderCollection from './widgets/collection' import renderColumnList from './widgets/column-helper' import renderDivider from './widgets/divider' import renderEmbed from './widgets/embed' import renderEquation from './widgets/equation' import renderHeading from './widgets/heading' import renderImage from './widgets/image' import renderList from './widgets/list' import renderQuote from './widgets/quote' import renderText from './widgets/text' import renderToDo from './widgets/to-do' import renderToggle from './widgets/toggle' /** * Render with given root node. */ function renderRoot(node: Nast.Block, elemClass = 'nast-document'): string { /** * The root node can be any type of block, if it's a "page" block it * will be treated specially. */ if (node.type === 'page') { /** * To solve the casting error: * If this was intentional, convert the expression to 'unknown' first. * The following is what that means. */ let pageNode = node as unknown as Nast.Page let title = pageNode.title let icon = pageNode.icon ? pageNode.icon : '' let cover = pageNode.cover let fullWidth = pageNode.fullWidth let coverPosition = (1 - pageNode.coverPosition) * 100 let containerClass = fullWidth ? `${elemClass}-full` : `${elemClass}` let coverDiv = '' if (pageNode.cover != null) { coverDiv = `\
` } return `\
${coverDiv}
${icon}

${title}

${renderChildren(node.children, renderNode)}
` } else { return `\
${renderNode(node)}
` } } function renderNode(node: Nast.Block): string { let html = '' switch (node.type) { case NAST_BLOCK_TYPES.text: html = renderText(node as Nast.Text, renderNode) break case NAST_BLOCK_TYPES.heading: html = renderHeading(node as Nast.Heading) break case NAST_BLOCK_TYPES.columnList: html = renderColumnList(node as Nast.ColumnList, renderNode) break case NAST_BLOCK_TYPES.bulletedList: case NAST_BLOCK_TYPES.numberedList: html = renderList(node, renderNode) break case NAST_BLOCK_TYPES.toggle: html = renderToggle(node as Nast.ToggleList, renderNode) break case NAST_BLOCK_TYPES.toDo: html = renderToDo(node as Nast.ToDoList, renderNode) break case NAST_BLOCK_TYPES.divider: html = renderDivider(node as Nast.Divider) break case NAST_BLOCK_TYPES.quote: html = renderQuote(node as Nast.Quote) break case NAST_BLOCK_TYPES.callout: html = renderCallout(node as Nast.Callout) break case NAST_BLOCK_TYPES.image: html = renderImage(node as Nast.Image) break case NAST_BLOCK_TYPES.bookmark: html = renderBookmark(node as Nast.WebBookmark) break case NAST_BLOCK_TYPES.embed: case NAST_BLOCK_TYPES.video: html = renderEmbed(node as Nast.Embed) break case NAST_BLOCK_TYPES.audio: html = renderAudio(node as Nast.Audio) break case NAST_BLOCK_TYPES.code: html = renderCode(node as Nast.Code) break case NAST_BLOCK_TYPES.equation: html = renderEquation(node as Nast.Equation) break case NAST_BLOCK_TYPES.collection: html = renderCollection(node as Nast.Collection) break default: raiseWarning(`No render function for block "${node.type}".`) } return html } export { renderRoot, renderNode }