diff --git a/src/core/brand/brand.ts b/src/core/brand/brand.ts index 2a881a3de8c..d291fd4348a 100644 --- a/src/core/brand/brand.ts +++ b/src/core/brand/brand.ts @@ -51,7 +51,12 @@ type CanonicalLogoInfo = { type ProcessedBrandData = { color: Record; typography: BrandTypography; - logo: Record; + logo: { + small?: CanonicalLogoInfo; + medium?: CanonicalLogoInfo; + large?: CanonicalLogoInfo; + images: Record; + }; }; export class Brand { @@ -139,7 +144,7 @@ export class Brand { }; } - const logo: Record = {}; + const logo: ProcessedBrandData["logo"] = { images: {} }; for ( const size of [ "small", @@ -151,6 +156,13 @@ export class Brand { if (v) { logo[size] = v; } + for (const [key, value] of Object.entries(data.logo?.images ?? {})) { + if (typeof value === "string") { + logo.images[key] = { path: value }; + } else { + logo.images[key] = value; + } + } } return { diff --git a/src/format/reveal/format-reveal.ts b/src/format/reveal/format-reveal.ts index acc212ae964..f9cbd681990 100644 --- a/src/format/reveal/format-reveal.ts +++ b/src/format/reveal/format-reveal.ts @@ -379,8 +379,9 @@ export function revealjsFormat() { const determineRevealLogo = (format: Format): string | undefined => { const brandData = format.render.brand?.processedData; if (brandData?.logo) { + const keys: ("medium" | "small" | "large")[] = ["medium", "small", "large"] // add slide logo if we have one - for (const size of ["medium", "small", "large"]) { + for (const size of keys) { const logoInfo = brandData.logo[size]; if (!logoInfo) { continue; diff --git a/src/resources/filters/modules/brand/brand.lua b/src/resources/filters/modules/brand/brand.lua index 83109abed96..ddb2d5b1e71 100644 --- a/src/resources/filters/modules/brand/brand.lua +++ b/src/resources/filters/modules/brand/brand.lua @@ -56,7 +56,7 @@ local function get_logo(name) local brand = param("brand") brand = brand and brand.processedData -- from src/core/brand/brand.ts if not brand then return nil end - return brand.logo and brand.logo[name] + return brand.logo and (brand.logo[name] or brand.logo.images[name]) end return { diff --git a/src/resources/filters/quarto-pre/shortcodes-handlers.lua b/src/resources/filters/quarto-pre/shortcodes-handlers.lua index e66feb79e7e..a6189d097ee 100644 --- a/src/resources/filters/quarto-pre/shortcodes-handlers.lua +++ b/src/resources/filters/quarto-pre/shortcodes-handlers.lua @@ -115,21 +115,73 @@ function initShortcodeHandlers() return { pandoc.RawInline('quarto-internal', quarto.json.encode(data)) } end - local function handle_brand(args) + local function handle_brand(args, _kwargs, _meta, _raw_args, context) local brand = require("modules/brand/brand") local brandCommand = read_arg(args, 1) - if brandCommand ~= "color" then + + local warn_bad_brand_command = function() warn("Unknown brand command " .. brandCommand .. " specified in a brand shortcode.") - return { pandoc.Strong({pandoc.Str("?brand:" .. brandCommand)}) } + if context == "block" then + return pandoc.Blocks { pandoc.Strong({pandoc.Str("?brand:" .. table.concat(args, " "))}) } + elseif context == "inline" then + return pandoc.Inlines { pandoc.Strong({pandoc.Str("?brand:" .. table.concat(args, " "))}) } + elseif context == "text" then + return "?brand:" .. table.concat(args, " ") + else + warn("Unknown context for brand shortcode error: " .. context) + return { } + end end - local brandName = read_arg(args, 2) - local brandValue = brand.get_color(brandName) - if brandValue ~= nil then - return { pandoc.Str(brandValue) } - else - warn("Unknown brand " .. brandName .. " specified in a brand shortcode.") - return { pandoc.Strong({pandoc.Str("?brand:" .. brandName)}) } + + if brandCommand == "color" then + local color_name = read_arg(args, 2) + local color_value = brand.get_color(color_name) + if color_value == nil then + return warn_bad_brand_command() + else + return pandoc.Inlines { pandoc.Str(color_value) } + end end + + if brandCommand == "logo" then + local logo_name = read_arg(args, 2) + local logo_value = brand.get_logo(logo_name) + local entry = { path = nil } + + if type(logo_value) ~= "table" then + warn("unexpected logo value entry: " .. type(logo_value)) + return warn_bad_brand_command() + end + + quarto.utils.dump(logo_value) + + -- does this have light/dark variants? + -- TODO handle light-dark theme switching + if logo_value.light then + entry = logo_value.light + else + entry = logo_value + end + + if type(entry.path) ~= "string" then + warn("unexpected type in logo light entry: " .. type(entry.path)) + return warn_bad_brand_command() + end + + -- TODO fix alt text handling + if context == "block" then + return pandoc.Blocks { pandoc.Image(pandoc.Inlines {}, entry.path) } + elseif context == "inline" then + return pandoc.Inlines { pandoc.Image(pandoc.Inlines {}, entry.path) } + elseif context == "text" then + return entry.path + else + warn("unexpected context for logo shortcode: " .. context) + return warn_bad_brand_command() + end + end + + return warn_bad_brand_command() end -- built in handlers (these override any user handlers)