From e55d72544fe23edb9aed19672d147eaf2a26b03b Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 09:56:15 +0200 Subject: [PATCH 1/8] chore: scaffold the extension and mirror the brand (#2) Minimal owd-typst format with Quarto's default partials, the brand mirror in _brand/ from quarto use brand openwashdata/brand, a spike document and the ignore file. Spike findings: Quarto 1.9 discovers _brand/ on its own, 1.8 needs an explicit brand key, so the floor is 1.8.0. logo: false does not suppress the page background logo, so the typst format will override page.typ. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- .gitignore | 14 +++++++ _brand/_brand.yml | 69 +++++++++++++++++++++++++++++++++ _brand/logos/OWD-logo-01.png | Bin 0 -> 2423 bytes _brand/logos/OWD-logo-01.svg | 35 +++++++++++++++++ _brand/logos/OWD-logo-18.png | Bin 0 -> 2644 bytes _extensions/owd/_extension.yml | 8 ++++ template.qmd | 24 ++++++++++++ 7 files changed, 150 insertions(+) create mode 100644 .gitignore create mode 100644 _brand/_brand.yml create mode 100644 _brand/logos/OWD-logo-01.png create mode 100644 _brand/logos/OWD-logo-01.svg create mode 100644 _brand/logos/OWD-logo-18.png create mode 100644 _extensions/owd/_extension.yml create mode 100644 template.qmd diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f7d729 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Quarto render artefacts +.quarto/ +/.quarto/ +template.pdf +template.docx +template.typ +template_files/ +*_files/ + +# OS and editors +.DS_Store +.Rproj.user/ +*.Rproj +.Rhistory diff --git a/_brand/_brand.yml b/_brand/_brand.yml new file mode 100644 index 0000000..a9e50aa --- /dev/null +++ b/_brand/_brand.yml @@ -0,0 +1,69 @@ +meta: + name: openwashdata + link: + home: https://openwashdata.org + github: https://github.com/openwashdata + +color: + palette: + # Purple family: the navbar and announcement identity. + owd-purple: "#5b195b" + owd-purple-light: "#c8a3c8" + owd-purple-dark: "#2d0e2d" + # Very light tint of owd-purple, used as a slide/page background. + owd-purple-bg: "#f5eef5" + # High-contrast darkening of the peach family, for strokes, chart + # accents, and text emphasis where peach itself is too light. + owd-orange: "#c14a09" + # Core text and surface tokens. + ink: "#1e1e1e" + paper: "#f4f4f4" + # Link blue. + owd-blue: "#272bd1" + # Highlight and accent set. + mint: "#3EB489" + peach: "#FEBC94" + sand: "#FAE3B4" + rose: "#FFC0CB" + # Bootstrap-name aliases so brand-aware tools pick these up. + purple: owd-purple + blue: owd-blue + green: mint + orange: owd-orange + yellow: sand + pink: rose + foreground: ink + background: paper + primary: owd-purple + success: mint + warning: sand + info: owd-blue + +typography: + fonts: + - family: Atkinson Hyperlegible + source: google + weight: [400, 700] + style: [normal, italic] + - family: Source Code Pro + source: google + weight: [400, 500] + base: + family: Atkinson Hyperlegible + line-height: 1.5 + headings: + family: Atkinson Hyperlegible + weight: 700 + monospace: + family: Source Code Pro + link: + color: owd-blue + +logo: + images: + icon: logos/OWD-logo-18.png + full-png: logos/OWD-logo-01.png + full-svg: logos/OWD-logo-01.svg + small: icon + medium: full-png + large: full-svg diff --git a/_brand/logos/OWD-logo-01.png b/_brand/logos/OWD-logo-01.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3fc1c424560f9c766f814882e1f5ef327a3100 GIT binary patch literal 2423 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 literal 0 HcmV?d00001 diff --git a/_brand/logos/OWD-logo-01.svg b/_brand/logos/OWD-logo-01.svg new file mode 100644 index 0000000..4462c8c --- /dev/null +++ b/_brand/logos/OWD-logo-01.svg @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/_brand/logos/OWD-logo-18.png b/_brand/logos/OWD-logo-18.png new file mode 100644 index 0000000000000000000000000000000000000000..6aa48c0a9b93ab7fe1a7c52be373c605e522aa34 GIT binary patch literal 2644 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.8.0" +contributes: + formats: + typst: + papersize: a4 diff --git a/template.qmd b/template.qmd new file mode 100644 index 0000000..a18528b --- /dev/null +++ b/template.qmd @@ -0,0 +1,24 @@ +--- +title: "openwashdata report" +subtitle: "Spike document" +author: + - name: Lars Schöbitz + affiliations: + - name: Global Health Engineering, ETH Zurich +date: today +format: + owd-typst: + keep-typ: true +--- + +## Heading two + +Body text with a [link](https://openwashdata.org) and `inline code`. + +```r +library(washr) +``` + +### Heading three + +More text. From ca0c32c703a7a53fdd331c593a1a40c75875d3ac Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 10:01:28 +0200 Subject: [PATCH 2/8] feat: owd-typst format with brand-driven partials (#3) typst-template.typ defines article() with white pages, headings and the title rule in the brand primary colour, the medium logo once in the title block, a footer with the site and page numbers, and code blocks tinted with the primary background. typst-show.typ resolves the brand dictionaries and typography variables and passes them as arguments, with font fallbacks appended. page.typ is Quarto 1.9's partial without the page background logo. Empty brand dictionaries and own string helpers keep the template compiling on Quarto 1.8 and without a brand. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- _extensions/owd/_extension.yml | 11 ++ _extensions/owd/page.typ | 34 +++++ _extensions/owd/typst-show.typ | 107 +++++++++++++++ _extensions/owd/typst-template.typ | 209 +++++++++++++++++++++++++++++ template.qmd | 78 +++++++++-- 5 files changed, 431 insertions(+), 8 deletions(-) create mode 100644 _extensions/owd/page.typ create mode 100644 _extensions/owd/typst-show.typ create mode 100644 _extensions/owd/typst-template.typ diff --git a/_extensions/owd/_extension.yml b/_extensions/owd/_extension.yml index b3f5656..73ddac2 100644 --- a/_extensions/owd/_extension.yml +++ b/_extensions/owd/_extension.yml @@ -4,5 +4,16 @@ version: 0.1.0 quarto-required: ">=1.8.0" contributes: formats: + common: + toc: false + number-sections: false typst: papersize: a4 + margin: + x: 25mm + y: 25mm + footer-text: openwashdata.org + template-partials: + - typst-template.typ + - typst-show.typ + - page.typ diff --git a/_extensions/owd/page.typ b/_extensions/owd/page.typ new file mode 100644 index 0000000..07d4026 --- /dev/null +++ b/_extensions/owd/page.typ @@ -0,0 +1,34 @@ +// Quarto 1.9's page.typ without the logo block: Quarto would otherwise paint +// the small brand logo as a page background on every page. The owd-typst +// format places the medium logo once, in the title block (typst-template.typ). +#set page( + paper: $if(papersize)$"$papersize$"$else$"a4"$endif$, +$if(margin-geometry)$ + // Margins handled by marginalia.setup below +$elseif(margin)$ + margin: ($for(margin/pairs)$$margin.key$: $margin.value$,$endfor$), +$else$ + margin: (x: 25mm, y: 25mm), +$endif$ + numbering: $if(page-numbering)$"$page-numbering$"$else$none$endif$, + columns: $if(columns)$$columns$$else$1$endif$, +) +$if(margin-geometry)$ +// Configure marginalia page geometry (functions defined in definitions.typ) +#show: marginalia.setup.with( + inner: ( + far: $margin-geometry.inner.far$, + width: $margin-geometry.inner.width$, + sep: $margin-geometry.inner.separation$, + ), + outer: ( + far: $margin-geometry.outer.far$, + width: $margin-geometry.outer.width$, + sep: $margin-geometry.outer.separation$, + ), + top: $if(margin.top)$$margin.top$$else$25mm$endif$, + bottom: $if(margin.bottom)$$margin.bottom$$else$25mm$endif$, + book: false, + clearance: $margin-geometry.clearance$, +) +$endif$ diff --git a/_extensions/owd/typst-show.typ b/_extensions/owd/typst-show.typ new file mode 100644 index 0000000..a4b5a91 --- /dev/null +++ b/_extensions/owd/typst-show.typ @@ -0,0 +1,107 @@ +// Maps Pandoc metadata to article() arguments. Brand values are resolved +// here, after Quarto's header-includes defined the brand dictionaries. +#show: doc => article( +$if(title)$ + title: [$title$], +$endif$ +$if(subtitle)$ + subtitle: [$subtitle$], +$endif$ +$if(by-author)$ + authors: ( +$for(by-author)$ +$if(it.name.literal)$ + ( name: [$it.name.literal$], + affiliation: [$for(it.affiliations)$$it.name$$sep$, $endfor$], + email: [$it.email$] ), +$endif$ +$endfor$ + ), +$endif$ +$if(date)$ + date: [$date$], +$endif$ +$if(lang)$ + lang: "$lang$", +$endif$ +$if(region)$ + region: "$region$", +$endif$ +$if(abstract)$ + abstract: [$abstract$], + abstract-title: "$labels.abstract$", +$endif$ +$if(mainfont)$ + font: ("$mainfont$", "Libertinus Serif"), +$elseif(brand.typography.base.family)$ + font: $brand.typography.base.family$ + ("Libertinus Serif",), +$endif$ +$if(fontsize)$ + fontsize: $fontsize$, +$elseif(brand.typography.base.size)$ + fontsize: $brand.typography.base.size$, +$endif$ +$if(brand.typography.headings.family)$ + heading-family: $brand.typography.headings.family$ + ("Libertinus Serif",), +$elseif(mainfont)$ + heading-family: ("$mainfont$", "Libertinus Serif"), +$endif$ +$if(brand.typography.headings.weight)$ + heading-weight: $brand.typography.headings.weight$, +$endif$ +$if(brand.typography.headings.style)$ + heading-style: "$brand.typography.headings.style$", +$endif$ +$if(brand.typography.headings.line-height)$ + heading-line-height: $brand.typography.headings.line-height$, +$endif$ +$if(section-numbering)$ + sectionnumbering: "$section-numbering$", +$endif$ +$if(mathfont)$ + mathfont: ($for(mathfont)$"$mathfont$",$endfor$), +$endif$ +$if(codefont)$ + codefont: ($for(codefont)$"$codefont$",$endfor$), +$elseif(brand.typography.monospace.family)$ + codefont: $brand.typography.monospace.family$ + ("DejaVu Sans Mono",), +$endif$ +$if(linestretch)$ + linestretch: $linestretch$, +$endif$ +$if(thanks)$ + thanks: [$thanks$], +$endif$ +$if(linkcolor)$ + linkcolor: [$linkcolor$], +$endif$ +$if(citecolor)$ + citecolor: [$citecolor$], +$endif$ +$if(filecolor)$ + filecolor: [$filecolor$], +$endif$ +$if(keywords)$ + keywords: ($for(keywords)$"$keywords$",$endfor$), +$endif$ +$if(toc)$ + toc: $toc$, +$endif$ +$if(toc-title)$ + toc_title: [$toc-title$], +$endif$ +$if(toc-indent)$ + toc_indent: $toc-indent$, +$endif$ + toc_depth: $toc-depth$, + primary: brand-color.at("primary", default: black), + code-fill: brand-color-background.at("primary", default: luma(230)), + logo: brand-logo.at("medium", default: (:)).at("path", default: none), +$if(logo-width)$ + logo-width: $logo-width$, +$endif$ +$if(footer-text)$ + footer-text: "$footer-text$", +$endif$ + doc, +) diff --git a/_extensions/owd/typst-template.typ b/_extensions/owd/typst-template.typ new file mode 100644 index 0000000..9d6ea5f --- /dev/null +++ b/_extensions/owd/typst-template.typ @@ -0,0 +1,209 @@ +// owd-typst: the openwashdata article layout. +// +// This partial is concatenated before Quarto's header-includes, where the +// brand dictionaries (brand-color, brand-color-background, brand-logo) are +// defined. Typst closures capture their scope at definition time, so +// article() never reads those dictionaries itself: typst-show.typ resolves +// every brand value and passes it in as an argument. +// +// The empty dictionaries below make the template compile when Quarto emits +// no brand at all (Quarto 1.8 without a brand key). With a brand present, +// Quarto's header-includes redefine them. +#let brand-color = (:) +#let brand-color-background = (:) +#let brand-logo = (:) + +// Own helpers, so the template does not depend on what a given Quarto +// version defines in definitions.typ (Quarto 1.8 lacks a string helper). +#let owd-to-string(content) = { + if type(content) == str { + content + } else if content.has("text") { + content.text + } else if content.has("children") { + content.children.map(owd-to-string).join("") + } else if content.has("body") { + owd-to-string(content.body) + } else if content == [ ] { + " " + } else { + "" + } +} + +#let owd-empty(v) = { + if v == none { return true } + let s = owd-to-string(v) + s == none or s.trim() == "" +} + +#let article( + title: none, + subtitle: none, + authors: none, + keywords: (), + date: none, + abstract-title: none, + abstract: none, + thanks: none, + cols: 1, + lang: "en", + region: "US", + font: none, + fontsize: 11pt, + title-size: 2em, + subtitle-size: 1.25em, + heading-family: none, + heading-weight: "bold", + heading-style: "normal", + heading-line-height: 0.65em, + mathfont: none, + codefont: none, + linestretch: 1, + sectionnumbering: none, + linkcolor: none, + citecolor: none, + filecolor: none, + toc: false, + toc_title: none, + toc_depth: none, + toc_indent: 1.5em, + // openwashdata additions, resolved from the brand in typst-show.typ + primary: black, + code-fill: luma(230), + logo: none, + logo-width: 40mm, + footer-text: none, + page-fill: white, + doc, +) = { + set document(title: title, keywords: keywords) + set document( + author: authors.map(author => owd-to-string(author.name)).join(", ", last: " & "), + ) if authors != none and authors != () + + // The brand background (paper) is a screen token; printed pages stay white. + // The footer replaces Typst's default page number line. + set page( + fill: page-fill, + footer: context { + set text(size: 9pt, fill: luma(110)) + grid( + columns: (1fr, auto), + align: (left, right), + if footer-text != none { footer-text } else { [] }, + counter(page).display("1 / 1", both: true), + ) + }, + ) + + set par( + justify: true, + leading: linestretch * 0.65em + ) + set text(lang: lang, + region: region, + size: fontsize) + set text(font: font) if font != none + show math.equation: set text(font: mathfont) if mathfont != none + show raw: set text(font: codefont) if codefont != none + show raw.where(block: true): set block(fill: code-fill) + + set heading(numbering: sectionnumbering) + show heading: set text(fill: primary) + show heading.where(level: 1): set block(above: 1.6em, below: 0.8em) + + show link: set text(fill: rgb(owd-to-string(linkcolor))) if linkcolor != none + show ref: set text(fill: rgb(owd-to-string(citecolor))) if citecolor != none + show link: this => { + if filecolor != none and type(this.dest) == label { + text(this, fill: rgb(owd-to-string(filecolor))) + } else { + text(this) + } + } + + let has-title-block = title != none or (authors != none and authors != ()) or date != none or abstract != none + if has-title-block { + let logo-path = if logo == none { + none + } else if logo.starts-with("/") or logo.starts-with("http") { + logo + } else { + "/" + logo + } + let title-column = [ + #set par(justify: false) + #if title != none { + set par(leading: heading-line-height) if heading-line-height != none + set text(font: heading-family) if heading-family != none + set text(weight: heading-weight) + set text(style: heading-style) if heading-style != "normal" + text(size: title-size, fill: primary)[#title #if thanks != none { + footnote(thanks, numbering: "*") + counter(footnote).update(n => n - 1) + }] + if subtitle != none { + v(0.5em) + text(size: subtitle-size, weight: "regular", fill: luma(70))[#subtitle] + } + } + #if authors != none and authors != () { + v(1.2em) + for author in authors { + block(below: 0.6em)[ + #text(weight: "semibold")[#author.name] + #if not owd-empty(author.affiliation) [\ #author.affiliation] + #if not owd-empty(author.email) [\ #link("mailto:" + owd-to-string(author.email))[#author.email]] + ] + } + } + #if date != none { + v(0.4em) + text(fill: luma(70))[#date] + } + ] + block(width: 100%, below: 2em)[ + #if logo-path != none { + grid( + columns: (1fr, logo-width), + column-gutter: 1.5em, + align: (left + top, right + top), + title-column, + image(logo-path, width: logo-width), + ) + } else { + title-column + } + #v(0.8em) + #line(length: 100%, stroke: 0.75pt + primary) + ] + if abstract != none { + block(inset: (x: 0em, y: 0.5em), below: 1.5em)[ + #text(weight: "semibold")[#abstract-title] #h(1em) #abstract + ] + } + } + + if toc { + let title = if toc_title == none { + auto + } else { + toc_title + } + block(above: 0em, below: 2em)[ + #outline( + title: toc_title, + depth: toc_depth, + indent: toc_indent + ); + ] + } + + doc +} + +#set table( + inset: 6pt, + stroke: none +) diff --git a/template.qmd b/template.qmd index a18528b..04676e3 100644 --- a/template.qmd +++ b/template.qmd @@ -1,24 +1,86 @@ --- -title: "openwashdata report" -subtitle: "Spike document" +title: "Household water costs in Accra" +subtitle: "A sample report rendered with the openwashdata Quarto extension" author: - name: Lars Schöbitz affiliations: - name: Global Health Engineering, ETH Zurich + email: lschoebitz@ethz.ch date: today +abstract: | + This document exercises the owd-typst and owd-docx formats: headings to + level three, a link, inline and block code, a table, a figure with a + caption, a footnote, a callout and lists. Replace its content with your + own; the front matter is the part to keep. format: - owd-typst: - keep-typ: true + owd-typst: default + owd-docx: default --- -## Heading two +## Background -Body text with a [link](https://openwashdata.org) and `inline code`. +openwashdata publishes water, sanitation and hygiene data as R data +packages. Each package carries a data dictionary, a website and a +citation, all set up with the [washr](https://openwashdata.github.io/washr/) +package. This report shows what a document about one of those datasets +looks like when it renders with the openwashdata brand.^[The brand +definition lives in openwashdata/brand; this document reads it at +render time.] + +The `washr` package exposes ten functions. The first three set up the +package structure: ```r library(washr) +setup_rawdata() +setup_dictionary() +setup_roxygen() ``` -### Heading three +### Data sources + +Household survey data were collected in three neighbourhoods of Accra +between March and May 2023. @tbl-summary summarises the sample. + +| Neighbourhood | Households | Median monthly cost (GHS) | +|:--------------|-----------:|--------------------------:| +| Madina | 212 | 48.5 | +| Nima | 187 | 61.0 | +| Teshie | 164 | 39.2 | + +: Sample size and median monthly water cost by neighbourhood {#tbl-summary} + +### Methods + +Costs were converted to Ghana cedi at the exchange rate of the survey +month. Missing values were not imputed. + +::: {.callout-note} +The data package documents every variable in `data-raw/dictionary.csv`. +Run `?watercostaccra` after installing the package to read it. +::: + +## Results + +Two out of three households pay a vendor for at least part of their +water. The share is highest in Nima, where piped supply is intermittent. + +- Vendor water costs about three times the utility tariff per litre. +- Households with a storage tank pay less per month on average. +- Reported costs vary more within neighbourhoods than between them. + +![The openwashdata mark, standing in for a figure. Replace with a plot.](_brand/logos/OWD-logo-01.png){#fig-logo width="45%"} + +@fig-logo shows where a plot would go. + +## Recommendations + +1. Publish the cleaned survey as an R data package with `washr`. +2. Cite the package DOI in every derived report. +3. Refresh the brand with `quarto use brand openwashdata/brand` when it changes. + +## Session information -More text. +Rendered with Quarto and the `owd-typst` format of the openwashdata +extension. Fonts: Atkinson Hyperlegible for text and Source Code Pro +for code, both downloaded by Quarto from Google Fonts at render time. From 204ad0b11154581e80e617fe0dadeec578362777 Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 10:08:20 +0200 Subject: [PATCH 3/8] feat: owd-docx format with a reference.docx generated from the brand (#4) tools/bootstrap-reference-docx.R creates the reference document once from pandoc's default on A4 with 25 mm margins. tools/make-reference-docx.R rewrites word/styles.xml and word/theme/theme1.xml from _brand/_brand.yml: brand fonts as explicit run fonts with every theme reference removed, headings and title in the primary colour, links in the link colour, a Source Code style with Source Code Pro and shading, italic captions, a tinted bold first table row, and single spacing where the 1.5 body line height would look wrong. Edits set attributes in schema order, so outline levels and keep-with-next survive and a header or footer added in Word is left alone. The zip step fixes timestamps and the timezone, so two runs give identical bytes. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- _extensions/owd/_extension.yml | 2 + _extensions/owd/reference.docx | Bin 0 -> 10957 bytes tools/bootstrap-reference-docx.R | 37 +++++++++ tools/docx-utils.R | 136 +++++++++++++++++++++++++++++++ tools/make-reference-docx.R | 130 +++++++++++++++++++++++++++++ 5 files changed, 305 insertions(+) create mode 100644 _extensions/owd/reference.docx create mode 100644 tools/bootstrap-reference-docx.R create mode 100644 tools/docx-utils.R create mode 100644 tools/make-reference-docx.R diff --git a/_extensions/owd/_extension.yml b/_extensions/owd/_extension.yml index 73ddac2..c1960fd 100644 --- a/_extensions/owd/_extension.yml +++ b/_extensions/owd/_extension.yml @@ -17,3 +17,5 @@ contributes: - typst-template.typ - typst-show.typ - page.typ + docx: + reference-doc: reference.docx diff --git a/_extensions/owd/reference.docx b/_extensions/owd/reference.docx new file mode 100644 index 0000000000000000000000000000000000000000..f8a0a38cec86d3a2ce5f7ab2991ff7aff54c6277 GIT binary patch literal 10957 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 literal 0 HcmV?d00001 diff --git a/tools/bootstrap-reference-docx.R b/tools/bootstrap-reference-docx.R new file mode 100644 index 0000000..6b2fdc6 --- /dev/null +++ b/tools/bootstrap-reference-docx.R @@ -0,0 +1,37 @@ +#!/usr/bin/env Rscript +# Run once, from the repository root, to create _extensions/owd/reference.docx +# from pandoc's default reference document, on A4 with 25 mm margins: +# +# Rscript tools/bootstrap-reference-docx.R [--force] +# +# Afterwards only tools/make-reference-docx.R touches the file, and only its +# styles and theme fonts. A header or footer added in Word survives. +source("tools/docx-utils.R") + +out <- "_extensions/owd/reference.docx" +force <- "--force" %in% commandArgs(trailingOnly = TRUE) +if (file.exists(out) && !force) { + stop(out, " exists. Pass --force to start over from pandoc's default.", call. = FALSE) +} + +quarto <- find_quarto() +default_docx <- tempfile(fileext = ".docx") +status <- system2(quarto, c("pandoc", "-o", shQuote(default_docx), + "--print-default-data-file", "reference.docx")) +if (status != 0 || !file.exists(default_docx)) stop("pandoc did not write the default reference.docx") + +dir <- tempfile("bootstrap") +zip::unzip(default_docx, exdir = dir) + +# A4 and 25 mm margins (twentieths of a point: 25 mm = 1417). +document <- xml2::read_xml(file.path(dir, "word", "document.xml")) +sect <- xml2::xml_find_first(document, "//w:sectPr") +set_attrs(ensure_child(sect, "w:pgSz", c("w:footnotePr", "w:endnotePr", "w:type", "w:pgSz", "w:pgMar")), + "w:w" = "11906", "w:h" = "16838") +set_attrs(ensure_child(sect, "w:pgMar", c("w:footnotePr", "w:endnotePr", "w:type", "w:pgSz", "w:pgMar")), + "w:top" = "1417", "w:right" = "1417", "w:bottom" = "1417", "w:left" = "1417", + "w:header" = "709", "w:footer" = "709", "w:gutter" = "0") +xml2::write_xml(document, file.path(dir, "word", "document.xml")) + +zip_docx(dir, out) +message("Wrote ", out, " (A4, 25 mm margins). Now run: Rscript tools/make-reference-docx.R") diff --git a/tools/docx-utils.R b/tools/docx-utils.R new file mode 100644 index 0000000..859ed02 --- /dev/null +++ b/tools/docx-utils.R @@ -0,0 +1,136 @@ +# Shared helpers for the reference.docx scripts. Sourced from the repository +# root by tools/bootstrap-reference-docx.R and tools/make-reference-docx.R. + +# Quarto binary: PATH, QUARTO_PATH, or the RStudio and Positron bundles. +find_quarto <- function() { + candidates <- c( + Sys.getenv("QUARTO_PATH"), + unname(Sys.which("quarto")), + "/Applications/RStudio.app/Contents/Resources/app/quarto/bin/quarto", + "/Applications/Positron.app/Contents/Resources/app/quarto/bin/quarto" + ) + candidates <- candidates[nzchar(candidates) & file.exists(candidates)] + if (length(candidates) == 0) { + stop("Quarto not found. Put it on PATH or set QUARTO_PATH.", call. = FALSE) + } + candidates[[1]] +} + +# Re-zip an unpacked docx deterministically: fixed timestamps, sorted entries, +# [Content_Types].xml first. Two runs over identical content give identical bytes. +zip_docx <- function(dir, out) { + # Zip entries carry local DOS timestamps; a fixed zone keeps the bytes the + # same on a laptop in Zurich and a CI runner in UTC. + old_tz <- Sys.getenv("TZ", unset = NA) + Sys.setenv(TZ = "UTC") + on.exit(if (is.na(old_tz)) Sys.unsetenv("TZ") else Sys.setenv(TZ = old_tz), add = TRUE) + files <- list.files(dir, recursive = TRUE, all.files = TRUE, include.dirs = FALSE) + files <- files[order(files != "[Content_Types].xml", files, method = "radix")] + Sys.setFileTime(file.path(dir, files), as.POSIXct("1980-01-01 00:00:00", tz = "UTC")) + # zip() changes into `root`, so the target must be absolute; normalizePath() + # leaves a path that does not exist yet untouched, hence the two steps. + out <- file.path(normalizePath(dirname(out), mustWork = TRUE), basename(out)) + if (file.exists(out)) unlink(out) + zip::zip(out, files, root = dir, mode = "mirror", + include_directories = FALSE, compression_level = 6) + invisible(out) +} + +# Element order inside the WordprocessingML containers we edit. Word rejects +# files whose children are out of schema order, so new children are inserted +# at their place rather than appended. +ORDER_RPR <- c("w:rStyle", "w:rFonts", "w:b", "w:bCs", "w:i", "w:iCs", "w:caps", + "w:smallCaps", "w:strike", "w:dstrike", "w:outline", "w:shadow", "w:emboss", + "w:imprint", "w:noProof", "w:snapToGrid", "w:vanish", "w:webHidden", "w:color", + "w:spacing", "w:w", "w:kern", "w:position", "w:sz", "w:szCs", "w:highlight", + "w:u", "w:effect", "w:bdr", "w:shd", "w:fitText", "w:vertAlign", "w:rtl", + "w:cs", "w:em", "w:lang", "w:eastAsianLayout", "w:specVanish", "w:oMath") +ORDER_PPR <- c("w:pStyle", "w:keepNext", "w:keepLines", "w:pageBreakBefore", + "w:framePr", "w:widowControl", "w:numPr", "w:suppressLineNumbers", "w:pBdr", + "w:shd", "w:tabs", "w:suppressAutoHyphens", "w:kinsoku", "w:wordWrap", + "w:overflowPunct", "w:topLinePunct", "w:autoSpaceDE", "w:autoSpaceDN", "w:bidi", + "w:adjustRightInd", "w:snapToGrid", "w:spacing", "w:ind", "w:contextualSpacing", + "w:mirrorIndents", "w:suppressOverlap", "w:jc", "w:textDirection", + "w:textAlignment", "w:textboxTightWrap", "w:outlineLvl", "w:divId", "w:cnfStyle", + "w:rPr", "w:sectPr", "w:pPrChange") +ORDER_STYLE <- c("w:name", "w:aliases", "w:basedOn", "w:next", "w:link", + "w:autoRedefine", "w:hidden", "w:uiPriority", "w:semiHidden", "w:unhideWhenUsed", + "w:qFormat", "w:locked", "w:personal", "w:personalCompose", "w:personalReply", + "w:rsid", "w:pPr", "w:rPr", "w:tblPr", "w:trPr", "w:tcPr", "w:tblStylePr") + +# Return the child `tag` of `parent`, creating it in schema order when absent. +ensure_child <- function(parent, tag, order) { + node <- xml2::xml_find_first(parent, paste0("./", tag)) + if (!inherits(node, "xml_missing")) return(node) + ns <- xml2::xml_ns(xml2::xml_root(parent)) + kids <- xml2::xml_children(parent) + ranks <- match(xml2::xml_name(kids, ns), order) + later <- which(!is.na(ranks) & ranks > match(tag, order)) + if (length(later) > 0) { + xml2::xml_add_sibling(kids[[later[1]]], tag, .where = "before") + } else { + xml2::xml_add_child(parent, tag) + } + xml2::xml_find_first(parent, paste0("./", tag)) +} + +set_attrs <- function(node, ...) { + attrs <- list(...) + for (name in names(attrs)) xml2::xml_set_attr(node, name, attrs[[name]]) + invisible(node) +} + +# Removing a namespaced attribute needs the namespace map; setting one does not. +drop_attrs <- function(node, names) { + ns <- xml2::xml_ns(xml2::xml_root(node)) + for (name in names) xml2::xml_set_attr(node, name, NULL, ns = ns) + invisible(node) +} + +remove_child <- function(parent, tag) { + node <- xml2::xml_find_first(parent, paste0("./", tag)) + if (!inherits(node, "xml_missing")) xml2::xml_remove(node) + invisible(parent) +} + +# Run properties: explicit fonts (theme references removed), bold, italic, +# colour and size. NULL leaves a property alone; FALSE removes bold or italic. +set_run_props <- function(rpr, font = NULL, bold = NULL, italic = NULL, + color = NULL, size_halfpt = NULL) { + if (!is.null(font)) { + rf <- ensure_child(rpr, "w:rFonts", ORDER_RPR) + set_attrs(rf, "w:ascii" = font, "w:hAnsi" = font, "w:cs" = font) + drop_attrs(rf, c("w:asciiTheme", "w:hAnsiTheme", "w:cstheme", "w:eastAsiaTheme")) + } + if (isTRUE(bold)) { + ensure_child(rpr, "w:b", ORDER_RPR) + ensure_child(rpr, "w:bCs", ORDER_RPR) + } else if (isFALSE(bold)) { + remove_child(rpr, "w:b"); remove_child(rpr, "w:bCs") + } + if (isTRUE(italic)) { + ensure_child(rpr, "w:i", ORDER_RPR) + ensure_child(rpr, "w:iCs", ORDER_RPR) + } else if (isFALSE(italic)) { + remove_child(rpr, "w:i"); remove_child(rpr, "w:iCs") + } + if (!is.null(color)) { + col <- ensure_child(rpr, "w:color", ORDER_RPR) + set_attrs(col, "w:val" = color) + drop_attrs(col, c("w:themeColor", "w:themeShade", "w:themeTint")) + } + if (!is.null(size_halfpt)) { + set_attrs(ensure_child(rpr, "w:sz", ORDER_RPR), "w:val" = as.character(size_halfpt)) + set_attrs(ensure_child(rpr, "w:szCs", ORDER_RPR), "w:val" = as.character(size_halfpt)) + } + invisible(rpr) +} + +# Mix a hex colour with white; share is the white proportion (0 to 1). +mix_with_white <- function(hex, share = 0.85) { + rgb <- grDevices::col2rgb(paste0("#", sub("^#", "", hex))) + mixed <- round(share * 255 + (1 - share) * rgb) + toupper(sprintf("%02X%02X%02X", mixed[1], mixed[2], mixed[3])) +} + +hex_clean <- function(hex) toupper(sub("^#", "", hex)) diff --git a/tools/make-reference-docx.R b/tools/make-reference-docx.R new file mode 100644 index 0000000..f1ca90a --- /dev/null +++ b/tools/make-reference-docx.R @@ -0,0 +1,130 @@ +#!/usr/bin/env Rscript +# Regenerate the styles of _extensions/owd/reference.docx from _brand/_brand.yml. +# Run from the repository root: +# +# Rscript tools/make-reference-docx.R +# +# Only word/styles.xml and word/theme/theme1.xml change. Every edit sets an +# attribute or replaces a child in place, so running twice gives the same +# file, and a header or footer added in Word is left alone. +source("tools/docx-utils.R") + +brand_path <- "_brand/_brand.yml" +docx <- "_extensions/owd/reference.docx" +if (!file.exists(docx)) stop(docx, " missing. Run tools/bootstrap-reference-docx.R first.", call. = FALSE) +if (!file.exists(brand_path)) stop(brand_path, " missing. Run: quarto use brand openwashdata/brand", call. = FALSE) + +`%||%` <- function(a, b) if (is.null(a)) b else a + +# Brand values ---------------------------------------------------------------- +brand <- brand.yml::read_brand_yml(brand_path) +color <- function(name) hex_clean(brand.yml::brand_color_pluck(brand, name)) +typography <- brand$typography +base_font <- typography$base$family %||% stop("brand has no typography.base.family") +heading_font <- typography$headings$family %||% base_font +mono_font <- typography$monospace$family %||% "Courier New" +heading_weight <- as.numeric(typography$headings$weight %||% 700) +line_height <- as.numeric(typography$base[["line-height"]] %||% typography$base$line_height %||% 1.5) + +primary <- color("primary") +ink <- color("foreground") +link_color <- if (is.null(typography$link$color)) color("info") else hex_clean(typography$link$color) +table_head_fill <- mix_with_white(primary, share = 0.85) +code_fill <- "F2F2F2" + +message("Brand: ", base_font, " / ", heading_font, " ", heading_weight, " / ", mono_font, + "; primary #", primary, ", ink #", ink, ", link #", link_color) + +# Unpack ---------------------------------------------------------------------- +dir <- tempfile("refdocx") +zip::unzip(docx, exdir = dir) +styles_path <- file.path(dir, "word", "styles.xml") +theme_path <- file.path(dir, "word", "theme", "theme1.xml") +styles <- xml2::read_xml(styles_path) + +style <- function(id) { + node <- xml2::xml_find_first(styles, sprintf("//w:style[@w:styleId='%s']", id)) + if (inherits(node, "xml_missing")) stop("style ", id, " not found in reference.docx") + node +} +rpr_of <- function(node) ensure_child(node, "w:rPr", ORDER_STYLE) +ppr_of <- function(node) ensure_child(node, "w:pPr", ORDER_STYLE) +set_line <- function(ppr, twentieths) { + set_attrs(ensure_child(ppr, "w:spacing", ORDER_PPR), + "w:line" = as.character(twentieths), "w:lineRule" = "auto") +} + +# Document defaults: explicit brand fonts, ink text --------------------------- +defaults <- xml2::xml_find_first(styles, "//w:docDefaults/w:rPrDefault/w:rPr") +set_run_props(defaults, font = base_font, color = ink) + +# No style may point at theme fonts: a theme reference beats an explicit font, +# and a later edit in Word would silently reintroduce Aptos. +for (rf in xml2::xml_find_all(styles, "//w:rFonts")) { + drop_attrs(rf, c("w:asciiTheme", "w:hAnsiTheme", "w:cstheme", "w:eastAsiaTheme")) +} + +# Body: line height on Normal; single spacing where 1.5 would look wrong ----- +set_line(ppr_of(style("Normal")), round(240 * line_height)) +set_line(ppr_of(style("Compact")), 240) + +# Headings and title block --------------------------------------------------- +bold_headings <- heading_weight >= 600 +for (id in c(paste0("Heading", 1:9), paste0("Heading", 1:9, "Char"), "Title", "TitleChar", "TOCHeading")) { + set_run_props(rpr_of(style(id)), font = heading_font, color = primary, bold = bold_headings) +} +for (id in c("Subtitle", "SubtitleChar")) { + set_run_props(rpr_of(style(id)), font = heading_font, color = ink, bold = FALSE) +} + +# Links and code ------------------------------------------------------------- +set_run_props(rpr_of(style("Hyperlink")), color = link_color) +set_run_props(rpr_of(style("VerbatimChar")), font = mono_font) + +source_code <- xml2::xml_find_first(styles, "//w:style[@w:styleId='SourceCode']") +if (inherits(source_code, "xml_missing")) { + w_ns <- xml2::xml_ns(styles)[["w"]] + fragment <- xml2::read_xml(sprintf( + ' + + + + + ', w_ns)) + xml2::xml_add_child(styles, fragment) + source_code <- xml2::xml_find_first(styles, "//w:style[@w:styleId='SourceCode']") +} +code_ppr <- ppr_of(source_code) +set_attrs(ensure_child(code_ppr, "w:wordWrap", ORDER_PPR), "w:val" = "0") +set_attrs(ensure_child(code_ppr, "w:shd", ORDER_PPR), "w:val" = "clear", "w:color" = "auto", "w:fill" = code_fill) +set_attrs(ensure_child(code_ppr, "w:spacing", ORDER_PPR), + "w:before" = "120", "w:after" = "120", "w:line" = "240", "w:lineRule" = "auto") +set_run_props(rpr_of(source_code), font = mono_font, size_halfpt = 20) + +# Captions ------------------------------------------------------------------- +for (id in c("Caption", "ImageCaption", "TableCaption")) { + set_run_props(rpr_of(style(id)), italic = TRUE, size_halfpt = 20) +} + +# Tables: bold first row on a light primary tint ----------------------------- +table_style <- style("Table") +old <- xml2::xml_find_all(table_style, "./w:tblStylePr[@w:type='firstRow']") +xml2::xml_remove(old) +w_ns <- xml2::xml_ns(styles)[["w"]] +first_row <- xml2::read_xml(sprintf( + ' + + + ', w_ns, table_head_fill)) +xml2::xml_add_child(table_style, first_row) + +xml2::write_xml(styles, styles_path) + +# Theme fonts, for styles a maintainer adds in Word later -------------------- +theme <- xml2::read_xml(theme_path) +xml2::xml_set_attr(xml2::xml_find_first(theme, "//a:majorFont/a:latin"), "typeface", heading_font) +xml2::xml_set_attr(xml2::xml_find_first(theme, "//a:minorFont/a:latin"), "typeface", base_font) +xml2::write_xml(theme, theme_path) + +zip_docx(dir, docx) +message("Wrote ", docx) From d5053e5d364942103bb3816d82a95eb886de4a3f Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 10:10:27 +0200 Subject: [PATCH 4/8] docs: README, NEWS, .quartoignore and the sample page image (#5) The README covers install for a new document and an existing project, the two update commands and why they differ, fonts, Quarto 1.8, the layout washr data packages already have, how the brand flows, and how maintainers regenerate reference.docx. .quartoignore keeps repository files out of projects created with quarto use template. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- .quartoignore | 10 +++ NEWS.md | 15 ++++ README.md | 151 ++++++++++++++++++++++++++++++++++++- images/template-page-1.png | Bin 0 -> 177263 bytes 4 files changed, 175 insertions(+), 1 deletion(-) create mode 100644 .quartoignore create mode 100644 NEWS.md create mode 100644 images/template-page-1.png diff --git a/.quartoignore b/.quartoignore new file mode 100644 index 0000000..adcddd9 --- /dev/null +++ b/.quartoignore @@ -0,0 +1,10 @@ +# Not copied into a new project by `quarto use template openwashdata/quarto-owd`. +# The extension, the brand mirror and template.qmd are what a new document needs. +.github/ +tools/ +images/ +README.md +NEWS.md +LICENSE +.gitignore +.quartoignore diff --git a/NEWS.md b/NEWS.md new file mode 100644 index 0000000..7316816 --- /dev/null +++ b/NEWS.md @@ -0,0 +1,15 @@ +# quarto-owd 0.1.0 + +First release. + +- `owd-typst`: PDF through Typst. Reads the brand at render time: brand + fonts, headings and the title rule in the primary colour, links in the + link colour, code blocks tinted from the primary colour, the medium logo + once in the title block, white pages, A4 with 25 mm margins, a footer + with `footer-text` and page numbers. +- `owd-docx`: Word through a `reference.docx` whose styles are generated + from the brand by `tools/make-reference-docx.R`. +- `_brand/` mirrors openwashdata/brand; `template.qmd` is the starter + document and the CI smoke test. +- Works on Quarto 1.8 with an explicit `brand:` key and on Quarto 1.9 + without one. diff --git a/README.md b/README.md index 27f7a61..ae3b27a 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,151 @@ # quarto-owd -Quarto extension: openwashdata brand for Typst (PDF) and DOCX documents (formats owd-typst, owd-docx) + +[![render](https://github.com/openwashdata/quarto-owd/actions/workflows/render.yaml/badge.svg)](https://github.com/openwashdata/quarto-owd/actions/workflows/render.yaml) + +A Quarto extension that renders documents in the openwashdata brand. It +provides two formats: + +- `owd-typst`: PDF, through Typst +- `owd-docx`: Word + +Both take their colours, fonts and logo from the brand definition in +[openwashdata/brand](https://github.com/openwashdata/brand). The Typst +format reads the brand file at render time. The Word format uses a +reference document whose styles are generated from the same file. + +![First page of the sample document rendered with owd-typst](images/template-page-1.png) + +## Requirements + +- Quarto 1.9 or later. RStudio and Positron bundle it; check with + `quarto --version`. Quarto 1.8 works too, with one extra line in the + document header (see [Quarto 1.8](#quarto-18)). +- Nothing else for rendering. R is only needed to regenerate the Word + reference document (see [Maintaining](#maintaining)). + +## Install + +For a new document, in an empty directory: + +```sh +quarto use template openwashdata/quarto-owd +``` + +This copies the extension, the brand mirror in `_brand/` and a starter +document named after the directory. Render it with: + +```sh +quarto render mydoc.qmd --to owd-typst +``` + +For an existing project: + +```sh +quarto add openwashdata/quarto-owd +quarto use brand openwashdata/brand +``` + +Then list the formats in the document header: + +```yaml +format: + owd-typst: default + owd-docx: default +``` + +## Options + +Everything Quarto offers for `typst` and `docx` works as usual, for +example `toc`, `number-sections`, `fontsize`, `papersize` and `margin`. +The Typst format adds two options: + +```yaml +format: + owd-typst: + footer-text: openwashdata.org # left side of the footer + logo-width: 40mm # width of the logo in the title block +``` + +## Update + +```sh +quarto update openwashdata/quarto-owd +quarto use brand openwashdata/brand +``` + +The two commands do different things. `quarto use brand` refreshes +`_brand/`, and the Typst format picks the change up at the next render. +The Word styles are baked into the extension's `reference.docx`, so a +brand change reaches Word documents only through `quarto update`, once +this repository has regenerated the file. + +## Fonts + +The brand uses Atkinson Hyperlegible for text and Source Code Pro for +code. + +- Typst: Quarto downloads both from Google Fonts into + `.quarto/typst/fonts` on the first render. That first render needs a + network connection. +- Word: the fonts have to be installed on the machine that opens the + document, or Word substitutes another font. Both are free: + [Atkinson Hyperlegible](https://fonts.google.com/specimen/Atkinson+Hyperlegible) + and [Source Code Pro](https://fonts.google.com/specimen/Source+Code+Pro). + +## Quarto 1.8 + +Quarto 1.8 does not look for `_brand/` on its own and has no +`quarto use brand` command. Copy `_brand.yml` and `logos/` from +openwashdata/brand into `_brand/` by hand and name the file in the +document header: + +```yaml +brand: _brand/_brand.yml +``` + +## For washr data package authors + +After `washr::use_brand()`, a data package already has `_brand.yml` and +`logos/` at its root. In the package root: + +```sh +quarto add openwashdata/quarto-owd +``` + +Do not run `quarto use brand` as well; two brand copies in one project +are one too many. Add `^_extensions$` to `.Rbuildignore`. A `.qmd` in the +package root finds `_brand.yml` on its own with Quarto 1.9; a document in +a subfolder needs `brand: ../_brand.yml` in its header. + +## How the brand flows + +Values change in openwashdata/brand first. A weekly workflow in this +repository copies the brand into `_brand/`, regenerates `reference.docx` +and opens a pull request when anything changed. After the next release, +`quarto update` brings the Word styles to your project, and +`quarto use brand` brings the brand file itself. + +## Maintaining + +The Word reference document lives at `_extensions/owd/reference.docx`. +Regenerate its styles from the brand with R (packages xml2, zip, yaml and +brand.yml): + +```sh +quarto use brand openwashdata/brand --force +Rscript tools/make-reference-docx.R +``` + +The script rewrites `word/styles.xml` and `word/theme/theme1.xml` and +nothing else, so a header or footer added in Word survives. Running it +twice gives identical bytes; CI checks that the committed file matches +the current brand. + +`tools/bootstrap-reference-docx.R --force` starts over from pandoc's +default document on A4. It discards any edits made in Word. + +## License + +MIT for the extension code (see `LICENSE`). The brand assets in `_brand/` +belong to openwashdata; their license is tracked in +[openwashdata/brand#2](https://github.com/openwashdata/brand/issues/2). diff --git a/images/template-page-1.png b/images/template-page-1.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf58afa5348179ad22250f50388fba7f1f70b6c GIT binary patch literal 177263 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

}UwWER~+Yc3^ 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 Date: Thu, 3 Sep 2026 10:11:29 +0200 Subject: [PATCH 5/8] ci: render smoke test, reference.docx staleness check and brand-sync (#6, #7) render.yaml renders template.qmd to both formats on push and pull request, caches the Typst font download, uploads the outputs, and fails when the committed reference.docx differs from what the generator produces from the current brand. brand-sync.yaml runs weekly and on request: refreshes _brand/ with quarto use brand --force, regenerates reference.docx, renders as a gate and opens a pull request into dev when anything changed. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- .github/workflows/brand-sync.yaml | 76 +++++++++++++++++++++++++++++++ .github/workflows/render.yaml | 62 +++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 .github/workflows/brand-sync.yaml create mode 100644 .github/workflows/render.yaml diff --git a/.github/workflows/brand-sync.yaml b/.github/workflows/brand-sync.yaml new file mode 100644 index 0000000..4f4ed75 --- /dev/null +++ b/.github/workflows/brand-sync.yaml @@ -0,0 +1,76 @@ +# Keep _brand/ and the generated reference.docx in step with +# openwashdata/brand. Runs weekly and on request; opens a pull request +# into dev when anything changed, none otherwise. +name: brand-sync + +on: + schedule: + - cron: "0 6 * * 1" + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + sync: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: dev + + - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: 1.9.38 + + - name: Refresh _brand/ from openwashdata/brand + run: quarto use brand openwashdata/brand --force + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + packages: any::xml2, any::zip, any::yaml, any::brand.yml + + - name: Regenerate reference.docx + run: Rscript tools/make-reference-docx.R + + # A pull request opened with GITHUB_TOKEN does not trigger render.yaml, + # so the render gate runs here before the PR exists. + - name: Render both formats as a gate + run: quarto render template.qmd --to owd-typst,owd-docx + + - name: Summarise changes + id: changes + run: | + { + echo "files<> "$GITHUB_OUTPUT" + + # The openwashdata org does not let GITHUB_TOKEN open pull requests. + # Until that setting changes, a fine-grained PAT with contents and + # pull-requests write on this repo goes into the BRAND_SYNC_TOKEN + # secret; a PR opened with it also triggers render.yaml. + - uses: peter-evans/create-pull-request@v7 + with: + token: ${{ secrets.BRAND_SYNC_TOKEN || github.token }} + base: dev + branch: brand-sync + add-paths: | + _brand + _extensions/owd/reference.docx + commit-message: "chore: sync the brand from openwashdata/brand" + title: "chore: sync the brand from openwashdata/brand" + labels: brand + body: | + Automated refresh of `_brand/` from openwashdata/brand and of the + generated `reference.docx`. Both formats rendered in this run. + + Changed files: + + ${{ steps.changes.outputs.files }} diff --git a/.github/workflows/render.yaml b/.github/workflows/render.yaml new file mode 100644 index 0000000..ac15c52 --- /dev/null +++ b/.github/workflows/render.yaml @@ -0,0 +1,62 @@ +# Smoke test on every push and pull request: render template.qmd in both +# formats, and check that the committed reference.docx matches what the +# generator produces from the current brand. +name: render + +on: + push: + branches: [main, dev] + pull_request: + branches: [main, dev] + workflow_dispatch: + +jobs: + render: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: quarto-dev/quarto-actions/setup@v2 + with: + version: 1.9.38 + + # Quarto downloads the brand fonts from Google Fonts on the first + # Typst render; keep them between runs until the brand changes. + - uses: actions/cache@v4 + with: + path: .quarto/typst/fonts + key: typst-fonts-${{ hashFiles('_brand/_brand.yml') }} + + - name: Render template.qmd to owd-typst and owd-docx + run: quarto render template.qmd --to owd-typst,owd-docx + + - uses: actions/upload-artifact@v4 + with: + name: template + path: | + template.pdf + template.docx + if-no-files-found: error + + reference-docx: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + packages: any::xml2, any::zip, any::yaml, any::brand.yml + + - name: Regenerate reference.docx from _brand/_brand.yml + run: Rscript tools/make-reference-docx.R + + - name: Fail when the committed reference.docx is stale + run: | + git diff --stat --exit-code -- _extensions/owd/reference.docx || { + echo "::error::_extensions/owd/reference.docx does not match _brand/_brand.yml. Run Rscript tools/make-reference-docx.R and commit." + exit 1 + } From a25149b1997a51ecbf5f137b4fc9ad7096448c39 Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 11:30:11 +0200 Subject: [PATCH 6/8] fix: name substitutes for the brand fonts in the docx font table Without an entry in word/fontTable.xml Word falls back to Times New Roman when a brand font is not installed. The generator now writes one entry per brand font with an alternate name (Arial for text, Courier New for code), family, pitch and the OS/2 unicode and codepage ranges read from the font files. pandoc copies the table into every rendered document. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- README.md | 3 ++- _extensions/owd/reference.docx | Bin 10957 -> 11060 bytes tools/make-reference-docx.R | 46 ++++++++++++++++++++++++++++++--- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index ae3b27a..4d3924a 100644 --- a/README.md +++ b/README.md @@ -88,7 +88,8 @@ code. `.quarto/typst/fonts` on the first render. That first render needs a network connection. - Word: the fonts have to be installed on the machine that opens the - document, or Word substitutes another font. Both are free: + document. Without them Word falls back to Arial and Courier New, which + the reference document names as alternates. Both brand fonts are free: [Atkinson Hyperlegible](https://fonts.google.com/specimen/Atkinson+Hyperlegible) and [Source Code Pro](https://fonts.google.com/specimen/Source+Code+Pro). diff --git a/_extensions/owd/reference.docx b/_extensions/owd/reference.docx index f8a0a38cec86d3a2ce5f7ab2991ff7aff54c6277..49d168d359826528c3751906f7c4ec7542b9b2ba 100644 GIT binary patch delta 685 zcmV;e0#g0WRkT*HFb;pvhVS_mmhab?Bz%fc0VUeas%h(ffC&z<=8woWr2P9iPN1pUrY)UPO&VN~yvO+C z$$QSp?E0QFa3D%kDI(avLJ$y<$SoDS2>!Z@zl)DF8%vMOX&6P}u)^@L)Rr7I71)TQ)s5c0TsleRsdyyNdUBtz5ETkrV8$MtbLFA() zLMXJqr*8Z z%tu2Mpn-)pu-Czbz?56&GGObH*E)_LfUT@D8V{CFfK7j12Nquh%=rr3P@OY;{O_;V zaIG-k*iC|O*kof$lDoy5plDUxIG*@T=`r%pWf|lGXN>rJTZLmfb(Zrc*;Lu$L zi_0xhFVafsJ=wP9;o@l?hCz3ESR3n~^HiyH>nY5rCDjHhc0O`N>I0xYQmUSJlpl^d zsO*2|9pq%8L73lEXeq$gV@?z!J6az5d}_?htsQsbvancK=eWlX$vS@A8SH~!zR#C_ zB?O;{`=>3L2>~lx%)oagUj*GOtzK)}E^BL0XM*2(ZLOMi+-%xb3dZkk+QT=OjMJ5# z_x=F0DG=Ql3gGSc&prYG03HmJ5Gharkdt94KLSS*lcFg;0sNEUDLw(<{R0001YZ*pWWW^ZnERAFLlWiEJaZ0(fG zZlf?1hWB|2%lj$jlIEh2syB8si&5tR95BI>FUZFU&D)Q0NQO~cTBT~LN`(dZ|BZe4 z^dB#-9;HBAW`Jvz;_!lC#8j>euGT63^N{_RVg#0|f(orzig$ku@YQm(Xy&C>7LfZ~ z!Q7;{vbLTF0pt~v6fShll=Dh$B(-j6)`2cdp0hihZzNMThzPk13=`D4t)b#I;BK|% zEvq%!6t&Sg18}uUv0qP8uJCe%P*)&o=88&J_jPSGc*lD+RT^06>@5{3CK0(Ige2~H zxDy;4XXh0)!0dly*iKeDeg@>~&z-Nx*-6uFxHaTF~8hzFxz1OXbQH ziGEUB4bf^twGUStvgnh-MWTMV5(h9!j>5bvcwEZ{)YvK^ie5l4A-D$9-E|__d zR>>b(G1Q0GPx~;5&)0`tu)bWTTIIZ%qJle8L!dIBBY#M}1Jrwts^=3GC6f<3*$;29 z9Q_4QO9Qi$5ZV|DK3rg3*8u', panose) + sig_xml <- if (is.null(usb)) "" else sprintf( + '', + usb[1], usb[2], usb[3], usb[4], csb[1], csb[2]) + node <- xml2::read_xml(sprintf( + '%s%s', + ft_ns, name, alt, panose_xml, family, pitch, sig_xml)) + xml2::xml_add_child(font_table, node) +} +font_entry <- function(name, mono = FALSE) { + known <- KNOWN_FONTS[[name]] + if (is.null(known)) { + known <- if (mono) list(family = "modern", pitch = "fixed", alt = "Courier New") + else list(family = "swiss", pitch = "variable", alt = "Arial") + } + do.call(upsert_font, c(list(name = name), known)) +} +for (font in unique(c(base_font, heading_font))) font_entry(font) +font_entry(mono_font, mono = TRUE) +xml2::write_xml(font_table, font_table_path) + # Theme fonts, for styles a maintainer adds in Word later -------------------- theme <- xml2::read_xml(theme_path) xml2::xml_set_attr(xml2::xml_find_first(theme, "//a:majorFont/a:latin"), "typeface", heading_font) From cd541b7449a8ebe036c8ff540466eed192e9d7b1 Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 11:42:34 +0200 Subject: [PATCH 7/8] fix: denser Word layout and bordered data tables From the review notes in template.docx: headings sit on a single line height with space above and a little below by level, body paragraphs get 6 pt after and nothing before, the line height is Word's 1.15 instead of the brand's screen value of 1.5, and the margins are 20 mm. Data tables get all borders in ink and a tinted bold first row through a new OwdTable style that docx-tables.lua assigns to Table elements; Quarto's caption and figure wrappers and callouts stay on the border free Table style. The generator now also sets the page margins in document.xml. Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- NEWS.md | 5 +- _extensions/owd/_extension.yml | 2 + _extensions/owd/docx-tables.lua | 10 ++++ _extensions/owd/reference.docx | Bin 11060 -> 11147 bytes tools/bootstrap-reference-docx.R | 6 +-- tools/make-reference-docx.R | 77 +++++++++++++++++++++++++------ 6 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 _extensions/owd/docx-tables.lua diff --git a/NEWS.md b/NEWS.md index 7316816..77e9abb 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,7 +8,10 @@ First release. once in the title block, white pages, A4 with 25 mm margins, a footer with `footer-text` and page numbers. - `owd-docx`: Word through a `reference.docx` whose styles are generated - from the brand by `tools/make-reference-docx.R`. + from the brand by `tools/make-reference-docx.R`. A4 with 20 mm margins, + 1.15 line height, data tables with all borders and a tinted header row + (style `OwdTable`, assigned by a filter), brand fonts with Arial and + Courier New as substitutes when they are not installed. - `_brand/` mirrors openwashdata/brand; `template.qmd` is the starter document and the CI smoke test. - Works on Quarto 1.8 with an explicit `brand:` key and on Quarto 1.9 diff --git a/_extensions/owd/_extension.yml b/_extensions/owd/_extension.yml index c1960fd..3f20c4f 100644 --- a/_extensions/owd/_extension.yml +++ b/_extensions/owd/_extension.yml @@ -19,3 +19,5 @@ contributes: - page.typ docx: reference-doc: reference.docx + filters: + - docx-tables.lua diff --git a/_extensions/owd/docx-tables.lua b/_extensions/owd/docx-tables.lua new file mode 100644 index 0000000..56fd9c4 --- /dev/null +++ b/_extensions/owd/docx-tables.lua @@ -0,0 +1,10 @@ +-- Give data tables the bordered OwdTable style from reference.docx. +-- Quarto's own docx wrappers (caption and figure containers, callouts) are +-- raw OOXML on the plain Table style and are not touched, so only real +-- tables get borders. A table that already carries a custom-style keeps it. +function Table(tbl) + if not tbl.attr.attributes["custom-style"] then + tbl.attr.attributes["custom-style"] = "OwdTable" + end + return tbl +end diff --git a/_extensions/owd/reference.docx b/_extensions/owd/reference.docx index 49d168d359826528c3751906f7c4ec7542b9b2ba..fcba4ca9f67a63463cbbd3fd788a89e382caf0d8 100644 GIT binary patch delta 3363 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 delta 3257 zcmV;q3`X;dSF~2J+6e_;$~{yklivv*e_eB%I24BO^D7wcW5D0`)akUzcH5cVnM~~6 zds&E&4ML2N?Ph;{B|tU;*R?>IHZ#plB%|}{JV)XP4)5N7#fh~?G>=KTvb}+8TPTIZ zkJE5v|FijYJGbB8-Ml+2eFAqFrOe_6X}&zH?1-^!={Pxz5C-{xWGLm=0zxrhf4oaW z=Rl~RQ36q(b3L3mL)V=;7{sYv$>3{bND#yjJyZ@z5f(`i+Es+21TYSsM{$-*HL|jI zG+kCww>XBBG4&MoH7Q+q-+=}h! z5$}+7&`_8Dp}c6{-B=diOIzZ0?7Kutr9Zr;AaFxs`f59xFzHn1NyvXfHH0v`zw3sf7!g10?fUP zN{!pP$dy>t^p^KMF2#XAQvWo)V+4Gt4L)px54(d8b-{;*z(?BPqc-@cJNQT!d}IiG ztPMVHgO9s|k9EPvhQKG<;FC7^q&xUT7kpv}e5wsTZG%s{gHLtAr-s01+TgP`_^dnl zOc#7+2z;&$K5v81yMxblf5GR5z!%!!i#GV8JNQBue9;&DQ%rOA2q*|C$fDlQS%sW+ z)Ek(7-ulSjTsG)y{|7=LWC^8#b!=Mq5uk&MOK_F8r6EDQ1p@^n#Ad|MT<>NzxX59R-@L8nHt42ar`Vrf9pX!6UK{osnk&1 zZvr?qf?qDS*WJW~u#_+~Fu0GU<`W7K8!T_+XUT%Ow`Ky*I$H~1xvLnU1i&(HVyAJGtV|@JFKj5G3GCRfbk)LI3%73FJXG^ zF%_nwbo5q*SNtfgfB&ShUq5|W!_W3Mg=rvNulptE_uSK8bIY<;0*1{*0?#BS20!xR z954B*SE?hPF@ojfqI9Rm@i_H)4X&{Nki_9Je5GDH=QSOxZ^zRwP3O;S&3l3~r9e{~ z`5%;{5)`m=7}>eJeMafhR&FF?DNUQmS!40w@1=Y5OIO~7e;4j|`1T{^z0wAMgP|B2 z-7wV=(&0S*f9|dt53*`->xPOgbk$XL74LbTeqCY31If6`?MLy6s z98P!m3FTEurEnSn7_CwBqfgsh(1z>(xtVxk^A>JVc8qv?Iv=Ukr!4#%P=1jS{w>uT zdqtg&#$m)xE#30GJ@rKnJM~0y2k{TxGqIVP-#8vXiDs^7kT`to#tipjGDutM2weCnR5YeJmURtuYJ zurcsw0gf`t(3oVz>1Q*EkHozt=UDNt47gz?Nufl8SU^N=;smf?i$Xz%t zG6BX^wv82zw=tlte*L5pwGQ^qrR{!?u=Vudx~s=m8Vk!n-HF< zWAXrhZH#Q?^4S5d1y*ow0hQ9%V;hU;Cgu@a%nMCqA(!$$8Wy$rcmFTPf&av0y}L!4 zU@p-z>{Uzz_R0Os7Yi7ej4?FM)IaN!$&KGNhYPBR;hxOK=?Gt18QVk+#(MMxPLV;K zoI$Z;m@p8;SQ0?NLVd-)#>u{h9nrA*B3dgU{ujQ#m9=-q(5Yc9Xw&z9 zclv>xe&eTS(GJ5SC>bubv;S`(P`MU~+~;WVd9%xlNc0trGAkDHGQ=iE&d7 zn>GdHtYzdVG(j6`PL6+LVjT@?JFnA!&-gBEgt*qb&EfhE5*m;Tl@3YO0bSy$lk_6y)UJ|lP;ETJnuP;piT|3h7$yzM zz%B4hKGD8#n)RK>G$xqUE|Y+J=j~DNoOw1)zrB8rkS5=hlu4XoM4A);bXHM+i;1UZ ziWWXjl^mLKV2$!;5{rD}i?CT8mnASfI=xaDnt5}=k3)*W7YQ&;=@bYlfmKKg| zZKP1hs1(psW;f6Uz-?-{Ev=pM7!ZUN+_J87D8Kw5R7Ne7~!|Cv*H$#U#y_TnLmOwVNA)~;Gz0>iH;w~IA@T8C7n-OScI zetGF~cO-4KyH7ajXHhz2A%{HT@7b@@m2*W9zsqe{mp|XSvgTU^4qc2)y-{T9wUCLE za(3nkrkwo-P~5JE;`RZfxTAAXoRZ|AxFbe!r%@DlK0J!`14eO!Th=^^yJ8e~8%1&V z@KDTrA?ucbxbyBn44FoMWq`{8YflW;UZY^`eRQyP4=Lix0c2kc$bO@M>>nN=yZq|T zHXeJ&;8_Q&12I+yjbe51!Liyu#?Cw*hhjVq8^z=BaPU|WfrDeTtb@*x7@ea=(K-5X z=p25?_*nJF1WZxA5SN#6RbSq(36jqURdIOuKUI=jBd_Uwz1;hMx^(aBdqttcM}*vZ zb4^5a$`R3#j)=|?5ieM~t%-5!5z+mSh-i9sTGR8ra?kgqd%ky!1ux^>ez|x1 z(!JY1&g<8o*MoA;52Sm3aGcjK=>f`e##r#g407_$xi@%lv@1t+AyKX!}rD`X_L&gF}wt5l65jv=kD4R(9cP z9ksS=d%IYBiV(380epkU9Cgo1XD!aWMW)sFQMm+YiQZKZ$5HS_Z1Coh$3$_?9Rr1N zx6m&UXL?3m$;If3rF*f=#E3#AN8Y=DUMOHl;zA`LZ_So}y}mb)xy87jwyy$@K1H4k zbz1y37_U>d39zic4E9(fL5}#*FcVU6gluhXC}Nx=LeqAI5d(yk4e5I=FL%_J`M^P2 z!8+mAm2^Q%B1|wxexfHeo0fCuLgzUHWHV#^w6T{&P5EHBWuEOOgWm$^JQF=umi8djxefBH}_Ch-c97?IRw;6;p z;r&|dYGbU#77I9bvDo`D!W6DN7w~TA323sTg6NumozRkCArdQLQpyC}qE|(-oLT`B znhI4(ZibRqD`2;rauoRoxO0QR4PTL%qeKr*uol-IX2^3*It|eRD7P-kR2>Q^e!U^z z&6#h_ec+t|(?{ryx0wUp^${V967kfqSPc=kHljbl61c!NLCHom<=fAdkH95k3$Bu< zutzI@K-hGlL-wI?uY*cM+_R= 600 for (id in c(paste0("Heading", 1:9), paste0("Heading", 1:9, "Char"), "Title", "TitleChar", "TOCHeading")) { set_run_props(rpr_of(style(id)), font = heading_font, color = primary, bold = bold_headings) } +# Headings sit on a single line height (the body value would inflate the +# line box) with space above and a little below, by level. +heading_space <- list(c(360, 120), c(240, 80), c(200, 60)) +for (level in 1:9) { + space <- heading_space[[min(level, length(heading_space))]] + if (level > 3) space <- c(160, 40) + set_attrs(ensure_child(ppr_of(style(paste0("Heading", level))), "w:spacing", ORDER_PPR), + "w:before" = as.character(space[1]), "w:after" = as.character(space[2]), + "w:line" = "240", "w:lineRule" = "auto") +} for (id in c("Subtitle", "SubtitleChar")) { set_run_props(rpr_of(style(id)), font = heading_font, color = ink, bold = FALSE) } @@ -106,17 +127,36 @@ for (id in c("Caption", "ImageCaption", "TableCaption")) { set_run_props(rpr_of(style(id)), italic = TRUE, size_halfpt = 20) } -# Tables: bold first row on a light primary tint ----------------------------- +# Tables --------------------------------------------------------------------- +# Data tables use OwdTable, assigned by docx-tables.lua: all borders in ink +# and a bold first row on a light primary tint. The plain Table style stays +# border free because Quarto's caption and figure wrappers use it too. table_style <- style("Table") -old <- xml2::xml_find_all(table_style, "./w:tblStylePr[@w:type='firstRow']") -xml2::xml_remove(old) +xml2::xml_remove(xml2::xml_find_all(table_style, "./w:tblStylePr[@w:type='firstRow']")) w_ns <- xml2::xml_ns(styles)[["w"]] -first_row <- xml2::read_xml(sprintf( - ' - - - ', w_ns, table_head_fill)) -xml2::xml_add_child(table_style, first_row) +xml2::xml_remove(xml2::xml_find_all(styles, "//w:style[@w:styleId='OwdTable']")) +border <- function(side) sprintf('', side, ink) +owd_table <- xml2::read_xml(sprintf( + ' + + + + %s + + + + + + + + + + + + ', w_ns, + paste(vapply(c("top", "left", "bottom", "right", "insideH", "insideV"), border, ""), collapse = ""), + table_head_fill)) +xml2::xml_add_child(styles, owd_table) xml2::write_xml(styles, styles_path) @@ -166,5 +206,14 @@ xml2::xml_set_attr(xml2::xml_find_first(theme, "//a:majorFont/a:latin"), "typefa xml2::xml_set_attr(xml2::xml_find_first(theme, "//a:minorFont/a:latin"), "typeface", base_font) xml2::write_xml(theme, theme_path) +# Page margins --------------------------------------------------------------- +document_path <- file.path(dir, "word", "document.xml") +document <- xml2::read_xml(document_path) +for (margin in xml2::xml_find_all(document, "//w:sectPr/w:pgMar")) { + set_attrs(margin, "w:top" = as.character(margin_twips), "w:right" = as.character(margin_twips), + "w:bottom" = as.character(margin_twips), "w:left" = as.character(margin_twips)) +} +xml2::write_xml(document, document_path) + zip_docx(dir, docx) message("Wrote ", docx) From 5eedb2e987e793077cc3279466781065cff4952f Mon Sep 17 00:00:00 2001 From: larnsce Date: Thu, 3 Sep 2026 11:57:47 +0200 Subject: [PATCH 8/8] docs: note Word TOC update and font restart Two questions came up in review: whether the formats compute a table of contents, and why Word kept showing a serif after the brand fonts were installed. Neither format adds a TOC unless the document sets toc: true; Typst computes it at render time, Word fills its TOC field on the update prompt. Word reads the font list at start, so it needs a restart after a font install. Refs #5 Assisted-by: Claude claude-fable-5-1 Claude-Session: https://claude.ai/code/session_01YZGMkJRUtmXRukGv5PLhEx --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index 4d3924a..d55208a 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,16 @@ code. the reference document names as alternates. Both brand fonts are free: [Atkinson Hyperlegible](https://fonts.google.com/specimen/Atkinson+Hyperlegible) and [Source Code Pro](https://fonts.google.com/specimen/Source+Code+Pro). + Word reads the font list when it starts, so restart it after installing. + +## Table of contents + +Neither format adds one on its own. Set `toc: true` in the document +header (with `toc-depth` and `toc-title` as usual). The Typst format +computes it at render time. In Word the table of contents is a field: +Word asks whether to update fields when the document opens, and answering +Yes fills it in. Otherwise right-click the heading and choose Update +Field. ## Quarto 1.8