feat: support emitters defining external resources, emit link from contentindex directly
This commit is contained in:
		
							parent
							
								
									5a39719898
								
							
						
					
					
						commit
						5b13ff2199
					
				| @ -99,8 +99,6 @@ export const Latex: QuartzTransformerPlugin<Options> = (opts?: Options) => { | ||||
|             }, | ||||
|           ], | ||||
|         } | ||||
|       } else { | ||||
|         return {} | ||||
|       } | ||||
|     }, | ||||
|   } | ||||
|  | ||||
| @ -127,7 +127,7 @@ export default (() => { | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     const { css, js } = externalResources | ||||
|     const { css, js, additionalHead } = externalResources | ||||
| 
 | ||||
|     const url = new URL(`https://${cfg.baseUrl ?? "example.com"}`) | ||||
|     const path = url.pathname as FullSlug | ||||
| @ -177,7 +177,7 @@ export default (() => { | ||||
|             <link rel="stylesheet" href={googleFontHref(cfg.theme)} /> | ||||
|           </> | ||||
|         )} | ||||
|         <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossOrigin={"anonymous"} /> | ||||
|         <link rel="preconnect" href="https://cdnjs.cloudflare.com" crossOrigin="anonymous" /> | ||||
|         <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||
|         {/* OG/Twitter meta tags */} | ||||
|         <meta name="og:site_name" content={cfg.pageTitle}></meta> | ||||
| @ -213,6 +213,13 @@ export default (() => { | ||||
|         {js | ||||
|           .filter((resource) => resource.loadTime === "beforeDOMReady") | ||||
|           .map((res) => JSResourceToScriptElement(res, true))} | ||||
|         {additionalHead.map((resource) => { | ||||
|           if (typeof resource === "function") { | ||||
|             return resource(fileData) | ||||
|           } else { | ||||
|             return resource | ||||
|           } | ||||
|         })} | ||||
|       </head> | ||||
|     ) | ||||
|   } | ||||
|  | ||||
| @ -54,6 +54,7 @@ export function pageResources( | ||||
|       }, | ||||
|       ...staticResources.js, | ||||
|     ], | ||||
|     additionalHead: staticResources.additionalHead, | ||||
|   } | ||||
| 
 | ||||
|   if (fileData.hasMermaidDiagram) { | ||||
|  | ||||
| @ -182,6 +182,20 @@ export const ContentIndex: QuartzEmitterPlugin<Partial<Options>> = (opts) => { | ||||
| 
 | ||||
|       return emitted | ||||
|     }, | ||||
|     externalResources: (ctx) => { | ||||
|       if (opts?.enableRSS) { | ||||
|         return { | ||||
|           additionalHead: [ | ||||
|             <link | ||||
|               rel="alternate" | ||||
|               type="application/rss+xml" | ||||
|               title="RSS Feed" | ||||
|               href={`https://${ctx.cfg.configuration.baseUrl}/index.xml`} | ||||
|             />, | ||||
|           ], | ||||
|         } | ||||
|       } | ||||
|     }, | ||||
|     getQuartzComponents: () => [], | ||||
|   } | ||||
| } | ||||
| @ -6,9 +6,10 @@ export function getStaticResourcesFromPlugins(ctx: BuildCtx) { | ||||
|   const staticResources: StaticResources = { | ||||
|     css: [], | ||||
|     js: [], | ||||
|     additionalHead: [], | ||||
|   } | ||||
| 
 | ||||
|   for (const transformer of ctx.cfg.plugins.transformers) { | ||||
|   for (const transformer of [...ctx.cfg.plugins.transformers, ...ctx.cfg.plugins.emitters]) { | ||||
|     const res = transformer.externalResources ? transformer.externalResources(ctx) : {} | ||||
|     if (res?.js) { | ||||
|       staticResources.js.push(...res.js) | ||||
| @ -16,6 +17,9 @@ export function getStaticResourcesFromPlugins(ctx: BuildCtx) { | ||||
|     if (res?.css) { | ||||
|       staticResources.css.push(...res.css) | ||||
|     } | ||||
|     if (res?.additionalHead) { | ||||
|       staticResources.additionalHead.push(...res.additionalHead) | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
|   // if serving locally, listen for rebuilds and reload the page
 | ||||
|  | ||||
| @ -59,8 +59,6 @@ export const Latex: QuartzTransformerPlugin<Partial<Options>> = (opts) => { | ||||
|               }, | ||||
|             ], | ||||
|           } | ||||
|         default: | ||||
|           return { css: [], js: [] } | ||||
|       } | ||||
|     }, | ||||
|   } | ||||
|  | ||||
| @ -13,6 +13,7 @@ export interface PluginTypes { | ||||
| } | ||||
| 
 | ||||
| type OptionType = object | undefined | ||||
| type ExternalResourcesFn = (ctx: BuildCtx) => Partial<StaticResources> | undefined | ||||
| export type QuartzTransformerPlugin<Options extends OptionType = undefined> = ( | ||||
|   opts?: Options, | ||||
| ) => QuartzTransformerPluginInstance | ||||
| @ -21,7 +22,7 @@ export type QuartzTransformerPluginInstance = { | ||||
|   textTransform?: (ctx: BuildCtx, src: string) => string | ||||
|   markdownPlugins?: (ctx: BuildCtx) => PluggableList | ||||
|   htmlPlugins?: (ctx: BuildCtx) => PluggableList | ||||
|   externalResources?: (ctx: BuildCtx) => Partial<StaticResources> | ||||
|   externalResources?: ExternalResourcesFn | ||||
| } | ||||
| 
 | ||||
| export type QuartzFilterPlugin<Options extends OptionType = undefined> = ( | ||||
| @ -44,4 +45,5 @@ export type QuartzEmitterPluginInstance = { | ||||
|     content: ProcessedContent[], | ||||
|     resources: StaticResources, | ||||
|   ): Promise<DepGraph<FilePath>> | ||||
|   externalResources?: ExternalResourcesFn | ||||
| } | ||||
|  | ||||
| @ -1,5 +1,6 @@ | ||||
| import { randomUUID } from "crypto" | ||||
| import { JSX } from "preact/jsx-runtime" | ||||
| import { QuartzPluginData } from "../plugins/vfile" | ||||
| 
 | ||||
| export type JSResource = { | ||||
|   loadTime: "beforeDOMReady" | "afterDOMReady" | ||||
| @ -62,4 +63,5 @@ export function CSSResourceToStyleElement(resource: CSSResource, preserve?: bool | ||||
| export interface StaticResources { | ||||
|   css: CSSResource[] | ||||
|   js: JSResource[] | ||||
|   additionalHead: (JSX.Element | ((pageData: QuartzPluginData) => JSX.Element))[] | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user