#!/usr/bin/env rdmd /+ sdp: sisu document parser a SiSU document parser writen in D see http://sisudoc.org. +/ module sdp.sisu_document_parser; import sdp.conf.compile_time_info, sdp.meta.metadoc; import std.getopt, std.process; import sdp.meta, sdp.meta.metadoc_summary, sdp.meta.metadoc_from_src, sdp.meta.conf_make_meta, // sdp.meta.conf_make_meta_native, sdp.meta.conf_make_meta_sdlang, sdp.meta.conf_make_meta_composite, sdp.meta.defaults, sdp.meta.doc_debugs, sdp.meta.read_config_files, sdp.meta.read_source_files, sdp.meta.rgx, sdp.output.hub, sdp.output.paths_source; mixin(import("version.txt")); mixin CompileTimeInfo; /++ A SiSU document parser writen in D. +/ void main(string[] args) { mixin SiSUrgxInit; mixin SiSUregisters; mixin SiSUextractSDLang; mixin SiSUnode; mixin SiSUbiblio; mixin SiSUrgxInitFlags; mixin outputHub; string[] fns_src; string flag_action; string arg_unrecognized; enum dAM { abstraction, matters } static auto rgx = Rgx(); scope(success) { debug(checkdoc) { writefln( "~ run complete, ok ~ (sdp-%s.%s.%s, %s v%s, %s %s)", ver.major, ver.minor, ver.patch, __VENDOR__, __VERSION__, bits, os, ); } } scope(failure) { debug(checkdoc) { stderr.writefln( "run failure", ); } } bool[string] opts = [ "assertions" : false, "concordance" : false, "debug" : false, "digest" : false, "docbook" : false, "epub" : false, "html" : false, "html-seg" : false, "html-scroll" : false, "manifest" : false, "ocn" : true, "odt" : false, "pdf" : false, "postgresql" : false, "qrcode" : false, "sisupod" : false, "source" : false, "sqlite-discrete" : false, "sqlite-update" : false, "sqlite-create" : false, "sqlite-drop" : false, "text" : false, "verbose" : false, "xhtml" : false, "xml-dom" : false, "xml-sax" : false, "section_toc" : true, "section_body" : true, "section_endnotes" : true, "section_glossary" : true, "section_biblio" : true, "section_bookindex" : true, "section_blurb" : true, "backmatter" : true, "skip-output" : false, ]; auto helpInfo = getopt(args, std.getopt.config.passThrough, "assert", "--assert set optional assertions on", &opts["assertions"], "concordance", "--concordance file for document", &opts["concordance"], "debug", "--debug only relevant when debug options compiled in", &opts["debug"], "digest", "--digest hash digest for each object", &opts["digest"], "docbook", "--docbook process docbook output", &opts["docbook"], "epub", "--epub process epub output", &opts["epub"], "html", "--html process html output", &opts["html"], "html-seg", "--html-seg process html output", &opts["html-seg"], "html-scroll", "--html-seg process html output", &opts["html-scroll"], "manifest", "--manifest process manifest output", &opts["manifest"], "ocn", "--ocn object cite numbers (default)", &opts["ocn"], "odf", "--odf process odf:odt output", &opts["odt"], "odt", "--odt process odf:odt output", &opts["odt"], "pdf", "--pdf process pdf output", &opts["pdf"], "pg", "--pg process postgresql output", &opts["postgresql"], "postgresql", "--postgresql process postgresql output", &opts["postgresql"], "qrcode", "--qrcode with document metadata", &opts["qrcode"], "sisupod", "--sisupod sisupod source content bundled", &opts["sisupod"], "source", "--source markup source text content", &opts["source"], "sqlite-discrete", "--sqlite process discrete sqlite output", &opts["sqlite-discrete"], "sqlite-create", "--sqlite-create create db, create tables", &opts["sqlite-create"], "sqlite-drop", "--sqlite-drop drop tables & db", &opts["sqlite-drop"], "sqlite-update", "--sqlite process sqlite output", &opts["sqlite-update"], "text", "--text process text output", &opts["text"], "txt", "--txt process text output", &opts["text"], "verbose|v", "--verbose output to terminal", &opts["verbose"], "xhtml", "--xhtml process xhtml output", &opts["xhtml"], "xml-dom", "--xml-dom process xml dom output", &opts["xml-dom"], "xml-sax", "--xml-sax process xml sax output", &opts["xml-sax"], "section-toc", "--section-toc process table of contents (default)", &opts["section_toc"], "section-body", "--section-body process document body (default)", &opts["section_body"], "section-endnotes", "--section-endnotes process document endnotes (default)", &opts["section_endnotes"], "section-glossary", "--section-glossary process document glossary (default)", &opts["section_glossary"], "section-biblio", "--section-biblio process document biblio (default)", &opts["section_biblio"], "section-bookindex", "--section-bookindex process document bookindex (default)", &opts["section_bookindex"], "section-blurb", "--section-blurb process document blurb (default)", &opts["section_blurb"], "backmatter", "--section-backmatter process document backmatter (default)", &opts["backmatter"], "skip-output", "--skip-output", &opts["skip-output"], ); if (helpInfo.helpWanted) { defaultGetoptPrinter("Some information about the program.", helpInfo.options); } foreach(arg; args[1..$]) { if (arg.match(rgx.flag_action)) { flag_action ~= " " ~ arg; // flags not taken by getopt } else if (arg.match(rgx.src_pth)) { fns_src ~= arg; // gather input markup source file names for processing } else { // anything remaining, unused arg_unrecognized ~= " " ~ arg; } } auto env = [ "pwd" : environment["PWD"], "home" : environment["HOME"], ]; if (!(opts["skip-output"])) { outputHubOp!()(opts); } if (fns_src.length > 0) { foreach(fn_src; fns_src) { if (!empty(fn_src)) { scope(success) { debug(checkdoc) { writefln( "%s\n%s", "~ document complete, ok ~", "------------------------------------------------------------------", ); } } scope(failure) { debug(checkdoc) { stderr.writefln( "~ document run failure ~ (%s v%s)\n\t%s", __VENDOR__, __VERSION__, fn_src ); } } enforce( fn_src.match(rgx.src_pth), "not a sisu markup filename" ); auto t = SiSUabstraction!()(fn_src, opts, env); static assert(!isTypeTuple!(t)); static assert(t.length==2); auto doc_abstraction = t[dAM.abstraction]; auto doc_matters = t[dAM.matters]; /+ ↓ debugs +/ if (doc_matters.opt_action["verbose"]) { SiSUabstractionSummary!()(doc_abstraction, doc_matters); } /+ ↓ debugs +/ if ((doc_matters.opt_action["debug"]) || (doc_matters.opt_action["verbose"]) ) { SiSUdebugs!()(doc_abstraction, doc_matters); } /+ ↓ output hub +/ if (!(opts["skip-output"])) { outputHub!()(doc_abstraction, doc_matters); } scope(exit) { debug(checkdoc) { writefln( "processed file: %s", fn_src ); } destroy(fn_src); } } else { /+ no recognized filename provided +/ writeln("no recognized filename"); break; // terminate, stop } } } } unittest { /++ name "sdp" description "A SiSU document parser writen in D." homepage "http://sisudoc.org" +/ }