aboutsummaryrefslogtreecommitdiff
path: root/lib/naming/config.mli
blob: 0dda906cd2b8536f8c5bf3840670d29e6cff5a9c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
(** The config file: what the user wants by default, and where each value came
    from.

    Owns precedence and provenance and nothing else. Never reads the filesystem
    -- callers hand it text -- so it is as testable as the language table.

    A config file is OPTIONAL. With none, colitur behaves exactly as it does
    without this feature, except that names resolve through the default
    language. *)

type t

val empty : t
val of_string : string -> (t, string) result

(** [lang], [template] and [format] are each set from a single field. A
    repeated key is LAST-WINS -- the opposite direction from
    {!Colitur_kernel.Overlay_ini.get}'s first-wins over the same [section]
    type -- because the natural reading of a config file a user edited by
    hand and appended to is "the bottom line is the one that took effect".
    This holds whether the repeat is within one [\[defaults\]] block or
    across two of them: every section named [defaults] is merged, not only
    the first, the same duplicate-section policy {!Lang.of_string} documents
    for its own sections -- the two modules read the same underlying format
    and must not disagree about what a repeated header means. *)
val lang : t -> string option

val overlays : t -> string list
val template : t -> string option
val format : t -> string option

(** The template ESCAPING flavour ([latex] | [typst] | [groff] | [html] |
    [xml] | [ics] | [none]).

    Only consulted when the flavour cannot be inferred from the template's
    own extension, which is the usual case -- a template named [.tex] needs
    no setting. It exists for the template whose extension says nothing,
    and getting it wrong produces output that is malformed rather than
    merely ugly, so there is deliberately no silent fallback. *)
val flavour : t -> string option

(** Which citation style to render a reference in: a language CODE, looked
    up the same way {!lang} is, or a path -- but a DIFFERENT axis from
    {!lang}: a language file's own [\[sigla\]] section IS a style
    ({!Colitur_citation.Render.style_of_fields}), and this key SELECTS
    which file's [\[sigla\]] section supplies it, independently of which
    file's other sections supply names elsewhere (a booklet may want
    Polish names but Latin-convention citations). Same last-wins duplicate
    policy as {!lang}. *)
val sigla_style : t -> string option

(** [full] or [abbr] -- overrides the style's own [book] setting rather than
    replacing the style outright, so a chosen style's punctuation survives
    even when the book form is overridden ({!Colitur_citation.Render.with_book}).
    Same last-wins duplicate policy as {!lang}. *)
val sigla_book : t -> string option

(** The name of a section in [lang/traditions.ini] -- which BOOK a reference
    DENOTES (Vulgate numbering by default), a different question again from
    both {!sigla_style} (how a reference is WRITTEN) and {!lang} (what
    everything else is CALLED): naming and numbering both vary by
    convention, but not together. Same last-wins duplicate policy as
    {!lang}. *)
val sigla_tradition : t -> string option

(** Keys present in the [\[defaults\]] section that this build does not
    understand. Reported, never fatal: a config written for a newer colitur
    must still work on an older one, but silently ignoring a line the user
    wrote is how a typo becomes invisible. *)
val unknown_keys : t -> string list

(** Section names other than [\[defaults\]], reported separately from
    {!unknown_keys} so the CLI can word the two warnings differently (a
    misspelled section, e.g. [\[deafults\]], versus a misspelled key inside a
    recognised one). Also never fatal, and never silent: a section this build
    does not recognise is exactly the highest-value typo this feature exists
    to catch, because it silently discards the whole section -- [lang] and
    everything else in it -- with no other way for the user to notice. *)
val unknown_sections : t -> string list

(** [resolve ~flag ~config ~default] returns [(value, source)] with source one of
    ["flag"], ["config"], ["default"]. Precedence is flag > config > default. *)
val resolve : flag:string option -> config:string option -> default:string -> string * string