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)");
}
|