| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- // ==========================================
- // PROFILE: НАУЧНО-ТЕХНИЧЕСКИЙ ОТЧЁТ
- // ==========================================
- #import "../../domain/document.typ": document-profile, fail
- #import "../../domain/attachments.typ": attachment-set
- #import "../../report.typ": report
- #import "../../appendices.typ": make_appendices
- #import "../references.typ": render-bibliographies
- #let placeholder-path(kind) = {
- if kind == "signature" {
- path("../../assets/placeholders/signature.svg")
- } else if kind == "stamp" {
- path("../../assets/placeholders/stamp.svg")
- } else {
- path("../../assets/placeholders/logo.svg")
- }
- }
- #let report-company-summary(company) = {
- let summary = company.contacts.at("summary", default: none)
- if summary != none {
- summary
- } else {
- let lines = (company.legal.name,)
- let ids = ()
- for key in ("inn", "kpp", "ogrn", "bin", "kbe") {
- let value = company.legal.at(key, default: none)
- if value != none { ids.push(upper(key) + " " + value) }
- }
- if ids.len() > 0 { lines.push(ids.join(" ")) }
- for key in ("address", "phone", "email", "website") {
- let value = company.contacts.at(key, default: none)
- if value != none { lines.push(value) }
- }
- lines.join("\n")
- }
- }
- #let resolve-signing-resource(resource, kind, ctx) = {
- if ctx.options.mode != "final" {
- none
- } else if resource != none {
- resource
- } else if ctx.options.at("media-policy") == "placeholder" {
- placeholder-path(kind)
- } else {
- none
- }
- }
- #let render-report-attachments(attachments) = {
- if attachments.items.len() > 0 {
- make_appendices([
- #for item in attachments.items [
- // Метка для ссылок из глав: #ref(<app-...>, supplement: [приложении]).
- #if item.at("label", default: none) != none [
- #heading(level: 1, outlined: item.outlined)[#item.title] #item.at("label")
- ] else [
- #heading(level: 1, outlined: item.outlined)[#item.title]
- ]
- #if item.subtitle != none {
- align(center)[#text(weight: "bold")[#item.subtitle]]
- v(0.5cm)
- }
- #if type(item.body) == function { (item.body)() } else { item.body }
- ]
- ])
- }
- }
- #let normalize-report(metadata) = {
- if type(metadata.attachments) == array {
- metadata.insert(
- "attachments",
- attachment-set(items: metadata.attachments, numbering: "cyrillic"),
- )
- }
- metadata
- }
- #let validate-report(metadata) = {
- if type(metadata.title) != str or metadata.title.trim() == "" {
- fail("report.title", "название отчёта обязательно")
- }
- if type(metadata.year) != int {
- fail("report.year", "ожидалось целое число")
- }
- if type(metadata.executors) != array {
- fail("report.executors", "ожидался array")
- }
- if type(metadata.attachments) != dictionary or metadata.attachments.at("kind", default: none) != "attachment-set" {
- fail("report.attachments", "ожидался attachment-set")
- }
- metadata
- }
- #let render-report(body, ctx) = {
- let company = ctx.company
- let data = ctx.metadata
- let mode = if ctx.options.mode == "final" { "default" } else { "draft" }
- let watermark = if ctx.options.mode == "draft" and ctx.options.watermark == none {
- "DRAFT"
- } else {
- ctx.options.watermark
- }
- let signature = resolve-signing-resource(company.resources.signature, "signature", ctx)
- let stamp = resolve-signing-resource(company.resources.stamp, "stamp", ctx)
- let logo = if company.resources.logo != none {
- company.resources.logo
- } else if ctx.options.at("media-policy") == "placeholder" {
- placeholder-path("logo")
- } else {
- none
- }
- let composed = [
- #body
- #if ctx.bibliographies.len() > 0 {
- pagebreak()
- render-bibliographies(ctx.bibliographies)
- }
- #if ctx.attachments.items.len() > 0 {
- render-report-attachments(ctx.attachments)
- }
- ]
- report(
- composed,
- company_info: report-company-summary(company),
- udk: data.udk,
- director_company: company.director.title + " " + company.legal.name,
- director_name: company.director.name,
- director_date: data.at("director-date"),
- sign_image: signature,
- stamp_image: stamp,
- logo_image: logo,
- is_research: data.at("is-research"),
- is_intermediate: data.at("is-intermediate"),
- stage_num: data.at("stage-number"),
- vol_num: data.at("volume-number"),
- title: data.title,
- theme: data.theme,
- contract_num: data.at("contract-number"),
- contract_date: data.at("contract-date"),
- city: data.city,
- year: data.year,
- executors: data.executors,
- figure-before: data.at("figure-before"),
- figure-after: data.at("figure-after"),
- table-before: data.at("table-before"),
- table-after: data.at("table-after"),
- figure-caption-before: data.at("figure-caption-before"),
- figure-caption-after: data.at("figure-caption-after"),
- table-caption-before: data.at("table-caption-before"),
- table-caption-after: data.at("table-caption-after"),
- report_mode: mode,
- watermark: watermark,
- )
- }
- #let report-profile(
- title: "Название работы",
- theme: none,
- udk: none,
- director_date: none,
- is_research: false,
- is_intermediate: false,
- stage_number: none,
- volume_number: none,
- contract_number: none,
- contract_date: none,
- city: "Екатеринбург",
- year: datetime.today().year(),
- executors: (),
- attachments: attachment-set(numbering: "cyrillic"),
- bibliographies: (),
- figure_before: 0.75em,
- figure_after: 0.75em,
- table_before: 0.75em,
- table_after: 0.75em,
- figure_caption_before: 0pt,
- figure_caption_after: 0pt,
- table_caption_before: 0pt,
- table_caption_after: 0pt,
- ) = {
- document-profile(
- "report",
- render-report,
- metadata: (
- title: title,
- theme: theme,
- udk: udk,
- director-date: director_date,
- is-research: is_research,
- is-intermediate: is_intermediate,
- stage-number: stage_number,
- volume-number: volume_number,
- contract-number: contract_number,
- contract-date: contract_date,
- city: city,
- year: year,
- executors: executors,
- parties: (),
- attachments: attachments,
- bibliographies: bibliographies,
- figure-before: figure_before,
- figure-after: figure_after,
- table-before: table_before,
- table-after: table_after,
- figure-caption-before: figure_caption_before,
- figure-caption-after: figure_caption_after,
- table-caption-before: table_caption_before,
- table-caption-after: table_caption_after,
- ),
- normalize: normalize-report,
- validate: validate-report,
- )
- }
|