feat: note transclusion (#475)
* basic transclude * feat: note transclusion
This commit is contained in:
		
							parent
							
								
									4461748a85
								
							
						
					
					
						commit
						cce389c81d
					
				
					 8 changed files with 91 additions and 16 deletions
				
			
		| 
						 | 
				
			
			@ -4,6 +4,8 @@ import HeaderConstructor from "./Header"
 | 
			
		|||
import BodyConstructor from "./Body"
 | 
			
		||||
import { JSResourceToScriptElement, StaticResources } from "../util/resources"
 | 
			
		||||
import { FullSlug, RelativeURL, joinSegments } from "../util/path"
 | 
			
		||||
import { visit } from "unist-util-visit"
 | 
			
		||||
import { Root, Element } from "hast"
 | 
			
		||||
 | 
			
		||||
interface RenderComponents {
 | 
			
		||||
  head: QuartzComponent
 | 
			
		||||
| 
						 | 
				
			
			@ -53,6 +55,40 @@ export function renderPage(
 | 
			
		|||
  components: RenderComponents,
 | 
			
		||||
  pageResources: StaticResources,
 | 
			
		||||
): string {
 | 
			
		||||
  // process transcludes in componentData
 | 
			
		||||
  visit(componentData.tree as Root, "element", (node, _index, _parent) => {
 | 
			
		||||
    if (node.tagName === "blockquote") {
 | 
			
		||||
      const classNames = (node.properties?.className ?? []) as string[]
 | 
			
		||||
      if (classNames.includes("transclude")) {
 | 
			
		||||
        const inner = node.children[0] as Element
 | 
			
		||||
        const blockSlug = inner.properties?.["data-slug"] as FullSlug
 | 
			
		||||
        const blockRef = node.properties!.dataBlock as string
 | 
			
		||||
 | 
			
		||||
        // TODO: avoid this expensive find operation and construct an index ahead of time
 | 
			
		||||
        let blockNode = componentData.allFiles.find((f) => f.slug === blockSlug)?.blocks?.[blockRef]
 | 
			
		||||
        if (blockNode) {
 | 
			
		||||
          if (blockNode.tagName === "li") {
 | 
			
		||||
            blockNode = {
 | 
			
		||||
              type: "element",
 | 
			
		||||
              tagName: "ul",
 | 
			
		||||
              children: [blockNode],
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          node.children = [
 | 
			
		||||
            blockNode,
 | 
			
		||||
            {
 | 
			
		||||
              type: "element",
 | 
			
		||||
              tagName: "a",
 | 
			
		||||
              properties: { href: inner.properties?.href, class: ["internal"] },
 | 
			
		||||
              children: [{ type: "text", value: `Link to original` }],
 | 
			
		||||
            },
 | 
			
		||||
          ]
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
  const {
 | 
			
		||||
    head: Head,
 | 
			
		||||
    header,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue