@@ -47,7 +47,7 @@ import { normalizeNewlines } from "../core/lib/text.ts";
4747import { DirectiveCell } from "../core/lib/break-quarto-md-types.ts" ;
4848import { QuartoJSONSchema , readYamlFromMarkdown } from "../core/yaml.ts" ;
4949import { refSchema } from "../core/lib/yaml-schema/common.ts" ;
50- import { Brand as BrandJson } from "../resources/types/schema-types.ts" ;
50+ import { Brand as BrandJson , BrandPathBoolLightDark } from "../resources/types/schema-types.ts" ;
5151import { Brand } from "../core/brand/brand.ts" ;
5252import { warnOnce } from "../core/log.ts" ;
5353import { assert } from "testing/asserts" ;
@@ -512,7 +512,24 @@ export const ensureFileInformationCache = (
512512export async function projectResolveBrand (
513513 project : ProjectContext ,
514514 fileName ?: string ,
515- ) {
515+ ) : Promise < { light ?: Brand , dark ?: Brand } | undefined > {
516+ async function loadBrand ( brandPath : string ) : Promise < Brand > {
517+ const brand = await readAndValidateYamlFromFile (
518+ brandPath ,
519+ refSchema ( "brand" , "Format-independent brand configuration." ) ,
520+ "Brand validation failed for " + brandPath + "." ,
521+ ) as BrandJson ;
522+ return new Brand ( brand , dirname ( brandPath ) , project . dir ) ;
523+ }
524+ async function loadLocalBrand ( brandPath : string ) : Promise < Brand > {
525+ let resolved : string = "" ;
526+ if ( brandPath . startsWith ( "/" ) ) {
527+ resolved = join ( project . dir , brandPath ) ;
528+ } else {
529+ resolved = join ( dirname ( fileName ! ) , brandPath ) ;
530+ }
531+ return await loadBrand ( resolved ) ;
532+ }
516533 if ( fileName === undefined ) {
517534 if ( project . brandCache ) {
518535 return project . brandCache . brand ;
@@ -538,46 +555,59 @@ export async function projectResolveBrand(
538555 refSchema ( "brand" , "Format-independent brand configuration." ) ,
539556 "Brand validation failed for " + brandPath + "." ,
540557 ) as BrandJson ;
541- project . brandCache . brand = new Brand (
558+ project . brandCache . brand = { light : new Brand (
542559 brand ,
543560 dirname ( brandPath ) ,
544561 project . dir ,
545- ) ;
562+ ) } ;
546563 }
547564 return project . brandCache . brand ;
548565 } else {
549566 const metadata = await project . fileMetadata ( fileName ) ;
550- if ( metadata . brand === false ) {
567+ const brand = metadata . brand as BrandPathBoolLightDark ;
568+ if ( brand === false ) {
551569 return undefined ;
552570 }
553- if ( metadata . brand === true || metadata . brand === undefined ) {
571+ if ( brand === true || brand === undefined ) {
554572 return project . resolveBrand ( ) ;
555573 }
556574 const fileInformation = ensureFileInformationCache ( project , fileName ) ;
557575 if ( fileInformation . brand ) {
558576 return fileInformation . brand ;
559577 }
560- if ( typeof metadata . brand === "string" ) {
561- let brandPath : string = "" ;
562- if ( brandPath . startsWith ( "/" ) ) {
563- brandPath = join ( project . dir , metadata . brand ) ;
564- } else {
565- brandPath = join ( dirname ( fileName ) , metadata . brand ) ;
566- }
567- const brand = await readAndValidateYamlFromFile (
568- brandPath ,
569- refSchema ( "brand" , "Format-independent brand configuration." ) ,
570- "Brand validation failed for " + brandPath + "." ,
571- ) as BrandJson ;
572- fileInformation . brand = new Brand ( brand , dirname ( brandPath ) , project . dir ) ;
578+ if ( typeof brand === "string" ) {
579+ fileInformation . brand = { light : await loadLocalBrand ( brand ) } ;
573580 return fileInformation . brand ;
574581 } else {
575- assert ( typeof metadata . brand === "object" ) ;
576- fileInformation . brand = new Brand (
577- metadata . brand as BrandJson ,
578- dirname ( fileName ) ,
579- project . dir ,
580- ) ;
582+ assert ( typeof brand === "object" ) ;
583+ if ( "light" in brand || "dark" in brand ) {
584+ let light , dark ;
585+ if ( typeof brand . light === "string" ) {
586+ light = await loadLocalBrand ( brand . light )
587+ } else {
588+ light = new Brand (
589+ brand . light ! ,
590+ dirname ( fileName ) ,
591+ project . dir
592+ ) ;
593+ }
594+ if ( typeof brand . dark === "string" ) {
595+ dark = await loadLocalBrand ( brand . dark )
596+ } else {
597+ dark = new Brand (
598+ brand . dark ! ,
599+ dirname ( fileName ) ,
600+ project . dir
601+ ) ;
602+ }
603+ fileInformation . brand = { light, dark} ;
604+ } else {
605+ fileInformation . brand = { light : new Brand (
606+ brand as BrandJson ,
607+ dirname ( fileName ) ,
608+ project . dir ,
609+ ) } ;
610+ }
581611 return fileInformation . brand ;
582612 }
583613 }
0 commit comments