aboutsummaryrefslogtreecommitdiff
path: root/lib/citation/parse.mli
blob: ea38d2460fd7b9593b77fd3af2c4abdd90684106 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
(* SPDX-License-Identifier: AGPL-3.0-or-later *)

(** A citation, parsed. Never raises; an unrecognised string is an [Error]
    naming what could not be read, never a silent pass-through.

    The shape is a book and a LIST of chapter-parts, not one chapter and one
    verse range, because the shipped data really does cite across chapters
    ([John 18:1-40; 19:1-42]) and really does list disjoint verse ranges
    within a chapter ([Dan 13:1-9, 15-17, 19-30, 33-62]). *)

(** A verse number, plus an optional trailing sub-verse letter run ([""] for
    the overwhelming majority -- see parse.ml's own citation): ["11a"] is
    [{ n = 11; suffix = "a" }], preserved through parsing and rendering
    rather than dropped, so a reader never loses precision the source text
    actually carried. *)
type verse_num = { n : int; suffix : string }

type verse_range = { first : verse_num; last : verse_num option }
type part = { chapter : int; verses : verse_range list }
type t = { book : Book.id; parts : part list }

val parse : string -> (t, string) result