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