@@ -30,6 +30,7 @@ import {
3030 kMergeIncludes ,
3131 kOutputDivs ,
3232 kPdfEngine ,
33+ kQuartoFilters ,
3334 kReferenceLocation ,
3435 kShortcodes ,
3536 kTblColwidths ,
@@ -45,12 +46,8 @@ import { Metadata } from "../../config/types.ts";
4546import { kProjectType } from "../../project/types.ts" ;
4647import { bibEngine } from "../../config/pdf.ts" ;
4748import { resourcePath } from "../../core/resources.ts" ;
48- import {
49- crossrefFilter ,
50- crossrefFilterActive ,
51- crossrefFilterParams ,
52- } from "./crossref.ts" ;
53- import { layoutFilter , layoutFilterParams } from "./layout.ts" ;
49+ import { crossrefFilterActive , crossrefFilterParams } from "./crossref.ts" ;
50+ import { layoutFilterParams } from "./layout.ts" ;
5451import { pandocMetadataPath } from "./render-paths.ts" ;
5552import { removePandocArgs } from "./flags.ts" ;
5653import { mergeConfigs } from "../../core/config.ts" ;
@@ -63,10 +60,7 @@ import {
6360 filterExtensions ,
6461} from "../../extension/extension.ts" ;
6562import { quartoConfig } from "../../core/quarto.ts" ;
66- import {
67- metadataNormalizationFilter ,
68- metadataNormalizationFilterActive ,
69- } from "./normalize.ts" ;
63+ import { metadataNormalizationFilterActive } from "./normalize.ts" ;
7064
7165const kQuartoParams = "quarto-params" ;
7266
@@ -81,7 +75,10 @@ const kTimingFile = "timings-file";
8175
8276const kHasBootstrap = "has-bootstrap" ;
8377
78+ const kActiveFilters = "active-filters" ;
79+
8480const kQuartoVersion = "quarto-version" ;
81+
8582const kQuartoSource = "quarto-source" ;
8683
8784export async function filterParamsJson (
@@ -102,6 +99,11 @@ export async function filterParamsJson(
10299 )
103100 : { } ;
104101
102+ // extract the filter spec from pandoc options
103+ const filterSpec = extractFilterSpecParams (
104+ options . format . metadata ,
105+ ) ;
106+
105107 // Extract any column params
106108 const quartoColumnParams = extractColumnParams (
107109 args ,
@@ -122,6 +124,11 @@ export async function filterParamsJson(
122124 ...filterParams ,
123125 [ kResultsFile ] : pandocMetadataPath ( resultsFile ) ,
124126 [ kTimingFile ] : pandocMetadataPath ( timingFile ) ,
127+ [ kQuartoFilters ] : filterSpec ,
128+ [ kActiveFilters ] : {
129+ normalization : metadataNormalizationFilterActive ( options ) ,
130+ crossref : crossrefFilterActive ( options ) ,
131+ } ,
125132 } ;
126133 return JSON . stringify ( params ) ;
127134}
@@ -130,20 +137,17 @@ export function removeFilterParams(metadata: Metadata) {
130137 delete metadata [ kQuartoParams ] ;
131138}
132139
133- export function quartoInitFilter ( ) {
134- return resourcePath ( "filters/quarto-init/quarto-init.lua" ) ;
135- }
136-
137- export function quartoPreFilter ( ) {
138- return resourcePath ( "filters/quarto-pre/quarto-pre.lua" ) ;
139- }
140-
141- export function quartoPostFilter ( ) {
142- return resourcePath ( "filters/quarto-post/quarto-post.lua" ) ;
140+ export function quartoMainFilter ( ) {
141+ return resourcePath ( "filters/main.lua" ) ;
143142}
144143
145- export function quartoFinalizeFilter ( ) {
146- return resourcePath ( "filters/quarto-finalize/quarto-finalize.lua" ) ;
144+ function extractFilterSpecParams (
145+ metadata : Metadata ,
146+ ) {
147+ // pull out the filter spec that resolveFilters created
148+ const filterSpec = metadata [ kQuartoFilters ] ;
149+ delete metadata [ kQuartoFilters ] ;
150+ return filterSpec ;
147151}
148152
149153function extractIncludeParams (
@@ -540,28 +544,25 @@ function initFilterParams(dependenciesFile: string) {
540544const kQuartoFilterMarker = "quarto" ;
541545const kQuartoCiteProcMarker = "citeproc" ;
542546
547+ export type QuartoFilterSpec = {
548+ // these are filters that will be sent to pandoc directly
549+ quartoFilters : QuartoFilter [ ] ;
550+
551+ beforeQuartoFilters : QuartoFilter [ ] ;
552+ afterQuartoFilters : QuartoFilter [ ] ;
553+ } ;
554+
543555export async function resolveFilters (
544556 filters : QuartoFilter [ ] ,
545557 options : PandocOptions ,
546- ) : Promise < QuartoFilter [ ] | undefined > {
558+ ) : Promise < QuartoFilterSpec | undefined > {
547559 // build list of quarto filters
548560
549- // The default order of filters will be
550- // quarto-init
551- // quarto-authors
552- // user filters
553- // extension filters
554- // quarto-filters <quarto>
555- // quarto-finalizer
556- // citeproc
561+ const beforeQuartoFilters : QuartoFilter [ ] = [ ] ;
562+ const afterQuartoFilters : QuartoFilter [ ] = [ ] ;
557563
558564 const quartoFilters : string [ ] = [ ] ;
559- quartoFilters . push ( quartoPreFilter ( ) ) ;
560- if ( crossrefFilterActive ( options ) ) {
561- quartoFilters . push ( crossrefFilter ( ) ) ;
562- }
563- quartoFilters . push ( layoutFilter ( ) ) ;
564- quartoFilters . push ( quartoPostFilter ( ) ) ;
565+ quartoFilters . push ( quartoMainFilter ( ) ) ;
565566
566567 // Resolve any filters that are provided by an extension
567568 filters = await resolveFilterExtension ( options , filters ) ;
@@ -574,26 +575,13 @@ export async function resolveFilters(
574575 filter === kQuartoFilterMarker
575576 ) ;
576577 if ( quartoLoc !== - 1 ) {
577- filters = [
578- ...filters . slice ( 0 , quartoLoc ) ,
579- ...quartoFilters ,
580- ...filters . slice ( quartoLoc + 1 ) ,
581- ] ;
578+ beforeQuartoFilters . push ( ...filters . slice ( 0 , quartoLoc ) ) ;
579+ afterQuartoFilters . push ( ...filters . slice ( quartoLoc + 1 ) ) ;
582580 } else {
583- filters . push ( ...quartoFilters ) ;
581+ beforeQuartoFilters . push ( ...filters ) ;
582+ // afterQuartoFilters remains empty.
584583 }
585584
586- // The author filter, if enabled
587- if ( metadataNormalizationFilterActive ( options ) ) {
588- filters . unshift ( metadataNormalizationFilter ( ) ) ;
589- }
590-
591- // The initializer for Quarto
592- filters . unshift ( quartoInitFilter ( ) ) ;
593-
594- // The finalizer for Quarto
595- filters . push ( quartoFinalizeFilter ( ) ) ;
596-
597585 // citeproc at the very end so all other filters can interact with citations
598586 filters = filters . filter ( ( filter ) => filter !== kQuartoCiteProcMarker ) ;
599587 const citeproc = citeMethod ( options ) === kQuartoCiteProcMarker ;
@@ -605,12 +593,22 @@ export async function resolveFilters(
605593 delete options . format . pandoc . citeproc ;
606594 }
607595
608- filters . push ( kQuartoCiteProcMarker ) ;
596+ quartoFilters . push ( kQuartoCiteProcMarker ) ;
609597 }
610598
611599 // return filters
612- if ( filters . length > 0 ) {
613- return filters ;
600+ if (
601+ [
602+ quartoFilters ,
603+ beforeQuartoFilters ,
604+ afterQuartoFilters ,
605+ ] . some ( ( x ) => x . length )
606+ ) {
607+ return {
608+ quartoFilters,
609+ beforeQuartoFilters,
610+ afterQuartoFilters,
611+ } ;
614612 } else {
615613 return undefined ;
616614 }
0 commit comments