summaryrefslogtreecommitdiffhomepage
path: root/dlang/src/read/report_unknown.d
blob: 4cc8368f8ff0cec5b15a63f2b5f39fb4c065dfe4 (plain)
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
84
85
86
87
88
89
90
/+
- Name: SisuDoc Spine, Doc Reform [a part of]
  - Description: documents, structuring, processing, publishing, search
    - static content generator

  - Author: Ralph Amissah
    [ralph.amissah@gmail.com]

  - Copyright: (C) 2015 (continuously updated, current 2026) Ralph Amissah, All Rights Reserved.

  - License: AGPL 3 or later:

    Spine (SiSU), a framework for document structuring, publishing and
    search

    Copyright (C) Ralph Amissah

    This program is free software: you can redistribute it and/or modify it
    under the terms of the GNU AFERO General Public License as published by the
    Free Software Foundation, either version 3 of the License, or (at your
    option) any later version.

    This program is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
    more details.

    You should have received a copy of the GNU General Public License along with
    this program. If not, see [https://www.gnu.org/licenses/].

    If you have Internet connection, the latest version of the AGPL should be
    available at these locations:
    [https://www.fsf.org/licensing/licenses/agpl.html]
    [https://www.gnu.org/licenses/agpl.html]

  - Spine (by Doc Reform, related to SiSU) uses standard:
    - docReform markup syntax
      - standard SiSU markup syntax with modified headers and minor modifications
    - docReform object numbering
      - standard SiSU object citation numbering & system

  - Homepages:
    [https://www.sisudoc.org]
    [https://www.doc-reform.org]

  - Git
    [https://git.sisudoc.org/]

+/
module read.report_unknown;

import std.algorithm : sort;
import std.array : array;
import std.stdio : writeln, writefln;
import ocda.model;

/+ ↓ say what was read and not understood.
     This is what makes the reader usable as a check on the format
     specification: a reader that ignores what it does not know is
     conforming, but one that cannot say what it ignored cannot tell you
     whether the specification it was written from was complete. Silence
     and understanding look the same from outside.
+/
void reportUnknown(ref OcdaDocument doc) {
  if (!doc.unknown.any) {
    writeln("\nread and understood: every property, block and line was known");
    return;
  }
  writeln("\nread and NOT understood:");
  if (doc.unknown.property.length > 0) {
    writeln("  properties ignored (", doc.unknown.property.length, " distinct):");
    foreach (name; doc.unknown.property.keys.sort) {
      writefln("    .%-26s %8d", name, doc.unknown.property[name]);
    }
  }
  if (doc.unknown.block.length > 0) {
    writeln("  blocks ignored (", doc.unknown.block.length, " distinct):");
    foreach (name; doc.unknown.block.keys.sort) {
      writefln("    @%-26s %8d", name, doc.unknown.block[name]);
    }
  }
  if (doc.unknown.line.length > 0) {
    writeln("  lines of no known shape, by first character:");
    foreach (c; doc.unknown.line.keys.sort) {
      writefln("    %-27s %8d", "\"" ~ c ~ "\"", doc.unknown.line[c]);
    }
  }
  writeln("  (ignoring these is conforming within a major version;",
    " the count is so that it is not silent)");
}