@@ -8,11 +8,17 @@ import { existsSync } from "../../deno_ral/fs.ts";
88import { dirname , isAbsolute , join } from "../../deno_ral/path.ts" ;
99import { kDateFormat , kTocLocation } from "../../config/constants.ts" ;
1010import { Format , Metadata , PandocFlags } from "../../config/types.ts" ;
11- import { Document } from "../../core/deno-dom.ts" ;
11+ import { Document , Element } from "../../core/deno-dom.ts" ;
1212import { formatResourcePath } from "../../core/resources.ts" ;
1313import { sassLayer } from "../../core/sass.ts" ;
1414import { TempContext } from "../../core/temp-types.ts" ;
1515import { MarkdownPipeline } from "../../core/markdown-pipeline.ts" ;
16+ import {
17+ HtmlPostProcessResult ,
18+ PandocInputTraits ,
19+ RenderedFormat ,
20+ } from "../../command/render/types.ts" ;
21+ import { InternalError } from "../../core/lib/error.ts" ;
1622
1723export const kTitleBlockStyle = "title-block-style" ;
1824const kTitleBlockBanner = "title-block-banner" ;
@@ -177,6 +183,45 @@ export function documentTitlePartial(
177183 }
178184}
179185
186+ export async function canonicalizeTitlePostprocessor (
187+ doc : Document ,
188+ _options : {
189+ inputMetadata : Metadata ;
190+ inputTraits : PandocInputTraits ;
191+ renderedFormats : RenderedFormat [ ] ;
192+ quiet ?: boolean ;
193+ } ,
194+ ) : Promise < HtmlPostProcessResult > {
195+ // https://github.com/quarto-dev/quarto-cli/issues/10567
196+ const titleBlock = doc . querySelector ( "header.quarto-title-block" ) ;
197+ if ( ! titleBlock ) {
198+ const main = doc . querySelector ( "main" ) ;
199+ if ( ! main ) {
200+ throw new InternalError ( "No main element found in document" ) ;
201+ }
202+ const header = doc . createElement ( "header" ) ;
203+ header . id = "title-block-header" ;
204+ header . classList . add ( "quarto-title-block" ) ;
205+ main . insertBefore ( header , main . firstChild ) ;
206+ const h1s = Array . from ( doc . querySelectorAll ( "h1" ) ) ;
207+ for ( const h1n of h1s ) {
208+ const h1 = h1n as Element ;
209+ if ( ! h1 . classList . contains ( "quarto-secondary-nav-title" ) ) {
210+ const div = doc . createElement ( "div" ) ;
211+ div . classList . add ( "quarto-title-banner" ) ;
212+ h1 . classList . add ( "title" ) ;
213+ header . appendChild ( h1 ) ;
214+ break ;
215+ }
216+ }
217+ }
218+
219+ return {
220+ resources : [ ] ,
221+ supporting : [ ] ,
222+ } ;
223+ }
224+
180225export function processDocumentTitle (
181226 input : string ,
182227 format : Format ,
0 commit comments