Gi rapporten plass til kildene, og la den følge egne dokumenter
Kolonnen «Kilde» i forutsetningstabellen fikk for liten plass, fordi de to første kolonnene tok det de ville. Kolonnene har nå faste bredder, og tabellen leses på én linje per rad. En ny [rapport]-tabell i bygningsbeskrivelsen setter logo, aksentfarge, avsenderlinje og skrift for overskrifter, slik at energirapporten kan se ut som firmaets øvrige rapporter. Logoen kopieres til utdatakatalogen; mangler filen, lages rapporten uten den. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015GeH3y8fwTaTudaD88P57o
This commit is contained in:
+48
-6
@@ -66,6 +66,12 @@ fn rad(celler: &[String]) -> String {
|
||||
pub fn skriv(r: &Resultat, katalog: &Path, scenarier: &[(String, Resultat)]) -> Result<()> {
|
||||
std::fs::create_dir_all(katalog)?;
|
||||
std::fs::write(katalog.join("stil.typ"), STIL)?;
|
||||
// Logoen følger med, slik at rapporten kan kompileres for seg selv senere. Mangler
|
||||
// filen, lages rapporten uten den.
|
||||
if let (Some(logo), Some(navn)) = (&r.bygning.rapport.logo, logo_navn(r)) {
|
||||
std::fs::copy(logo, katalog.join(navn))
|
||||
.with_context(|| format!("kopierer logoen {}", logo.display()))?;
|
||||
}
|
||||
std::fs::write(katalog.join("fig-maaned.svg"), svg::maanedsdiagram(r))?;
|
||||
std::fs::write(katalog.join("fig-varighet.svg"), svg::varighetskurve(r))?;
|
||||
std::fs::write(katalog.join("fig-karakter.svg"), svg::karakterstige(r))?;
|
||||
@@ -100,13 +106,30 @@ fn kilde(r: &Resultat, scenarier: &[(String, Resultat)]) -> String {
|
||||
let mut s = String::new();
|
||||
|
||||
s.push_str("#import \"stil.typ\": *\n\n");
|
||||
s.push_str(&format!(
|
||||
"#show: oppsett.with(tittel: \"{} — energirapport\", bunntekst: \"{}\")\n\n",
|
||||
e(&l.navn),
|
||||
e(&bunntekst(r))
|
||||
));
|
||||
let rap = &r.bygning.rapport;
|
||||
let mut valg = format!(
|
||||
"tittel: \"{} — energirapport\", bunntekst: \"{}\"",
|
||||
streng(&l.navn),
|
||||
streng(&bunntekst(r))
|
||||
);
|
||||
if let Some(a) = &rap.avsender {
|
||||
valg.push_str(&format!(", avsender: \"{}\"", streng(a)));
|
||||
}
|
||||
if let Some(f) = &rap.farge {
|
||||
valg.push_str(&format!(", farge: rgb(\"{}\")", streng(f)));
|
||||
}
|
||||
if let Some(sk) = &rap.skrift_overskrift {
|
||||
valg.push_str(&format!(", skrift: \"{}\"", streng(sk)));
|
||||
}
|
||||
s.push_str(&format!("#show: oppsett.with({valg})\n\n"));
|
||||
|
||||
// ── forside ─────────────────────────────────────────────────────
|
||||
if let Some(navn) = logo_navn(r) {
|
||||
s.push_str(&format!(
|
||||
"#align(right, image(\"{}\", height: 1.7cm))\n\n#v(-0.9cm)\n",
|
||||
streng(&navn)
|
||||
));
|
||||
}
|
||||
s.push_str(&format!(
|
||||
"#v(1.2cm)\n#text(size: 26pt, weight: \"bold\")[Energirapport]\n\n\
|
||||
#v(-0.3em)\n#text(size: 15pt, fill: mid)[{}]\n\n",
|
||||
@@ -473,7 +496,8 @@ fn kilde(r: &Resultat, scenarier: &[(String, Resultat)]) -> String {
|
||||
if l.forutsetninger.is_empty() {
|
||||
s.push_str("Alle inndata er oppgitt i bygningsbeskrivelsen.\n\n");
|
||||
} else {
|
||||
s.push_str("#tabell(\n kolonner: (auto, auto, 1fr),\n justering: (left, left, left),\n overskrift: (\"Felt\", \"Verdi\", \"Kilde\"),\n rader: (\n");
|
||||
// Faste bredder, ellers spiser de to første kolonnene plassen kilden trenger.
|
||||
s.push_str("#tabell(\n kolonner: (1.15fr, 0.85fr, 1.6fr),\n justering: (left, left, left),\n overskrift: (\"Felt\", \"Verdi\", \"Kilde\"),\n rader: (\n");
|
||||
for f in &l.forutsetninger {
|
||||
s.push_str(&format!(
|
||||
" {}\n",
|
||||
@@ -539,6 +563,24 @@ fn kilde(r: &Resultat, scenarier: &[(String, Resultat)]) -> String {
|
||||
s
|
||||
}
|
||||
|
||||
/// Tekst i en Typst-strengliteral: bare omvendt skråstrek og anførselstegn skal ut.
|
||||
fn streng(s: &str) -> String {
|
||||
s.replace('\\', "\\\\").replace('"', "\\\"")
|
||||
}
|
||||
|
||||
/// Filnavnet på logoen, når den er oppgitt og finnes.
|
||||
fn logo_navn(r: &Resultat) -> Option<String> {
|
||||
let logo = r.bygning.rapport.logo.as_ref()?;
|
||||
if !logo.exists() {
|
||||
eprintln!(
|
||||
" ! rapport.logo: fant ikke {}; rapporten lages uten logo.",
|
||||
logo.display()
|
||||
);
|
||||
return None;
|
||||
}
|
||||
Some(logo.file_name()?.to_str()?.to_string())
|
||||
}
|
||||
|
||||
fn bunntekst(r: &Resultat) -> String {
|
||||
let b = &r.bygning.bygning;
|
||||
let mut deler = Vec::new();
|
||||
|
||||
Reference in New Issue
Block a user