diff options
author | Ralph Amissah <ralph@amissah.com> | 2016-04-24 22:35:39 -0400 |
---|---|---|
committer | Ralph Amissah <ralph@amissah.com> | 2016-04-24 22:35:39 -0400 |
commit | 9c14b019a6f695b54a035605e3bb3fc76bf20aa6 (patch) | |
tree | 517169ec313d81aca54da3ddcb1f329b7caba695 /org/sdp.org | |
parent | step1 (diff) |
step2doc-reform_v0.0.2
Diffstat (limited to 'org/sdp.org')
-rw-r--r-- | org/sdp.org | 416 |
1 files changed, 238 insertions, 178 deletions
diff --git a/org/sdp.org b/org/sdp.org index e8e100a..e218b5c 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -12,12 +12,13 @@ #+FILETAGS: :sdp:rel:hub: #+TAGS: assert(a) class(c) debug(d) mixin(m) sdp(s) tangle(T) template(t) WEB(W) noexport(n) -* sdp.d sisu document parser [[../maker.org][maker.org makefile]] [[./][org/]] + +* sdp.d sisu document parser :sdp.d: Deal with imports. Take command line instructions and process files as instructed. -** TODO version, (version.txt) set version (with structure) :version: +** TODO version.txt: set version :version: #+NAME: version_txt #+BEGIN_SRC d @@ -29,36 +30,32 @@ struct Version { enum ver = Version(1, 0, 0); #+END_SRC -** imports :import: +** pre loop init +*** imports :import: [[./compile_time_info.org][compile time info]] [[./ao_abstract_doc_source.org][ao_abstract_doc_source]] -[[./ao_assertions.org][ao_assertions]] +[[./ao_ansi_colors.org][ao_ansi_colors]] [[./ao_defaults.org][ao_defaults]] -[[./ao_emitter.org][ao_emitter]] -[[./ao_read_markup_source.org][ao_read_markup_source]] -[[./ao_object_setter.org][ao_object_setter]] [[./ao_output_debugs.org][ao_output_debugs]] -[[./ao_rgx.org][ao_rgx]] -[[./ao_scan_inserts.org][ao_scan_inserts]] -[[./ao_structs.org][ao_structs]] -[[./ao_utils.org][ao_utils]] +[[./ao_read_source_files.org][ao_read_source_files]] -*** std :import:std: +**** std :import:std: #+NAME: sdp_imports #+BEGIN_SRC d /+ sdp sisu document parser +/ -import +private import + std.getopt, + std.process, + std.stdio, std.algorithm, std.array, std.container, - std.file, std.exception, std.json, // std.path, - std.process, std.range, std.regex, - std.stdio, + // std.stdio, std.string, std.traits, std.typecons, @@ -67,277 +64,255 @@ import std.conv : to; #+END_SRC -*** sdp :import:sdp: -**** TODO lib/sdp.d +**** sdp :import:sdp: +***** TODO lib/sdp.d + +├── lib_ +│ ├── sdp.d + ├── version.txt + └── sdp + ├── ao_abstract_doc_source.d + ├── ... + └── compile_time_info.d + #+NAME: sdp_imports_use #+BEGIN_SRC d /+ sdp sisu document parser +/ import lib.sdp.compile_time_info, // sdp/compile_time_info.d lib.sdp.ao_abstract_doc_source, // sdp/ao_abstract_doc_source.d - lib.sdp.ao_assertions, // sdp/ao_assertions.d lib.sdp.ao_defaults, // sdp/ao_defaults.d - lib.sdp.ao_emitter, // sdp/ao_emitter.d - lib.sdp.ao_read_markup_source, // sdp/ao_read_markup_source.d - lib.sdp.ao_object_setter, // sdp/ao_object_setter.d + lib.sdp.ao_read_source_files, // sdp/ao_read_source_files.d lib.sdp.ao_output_debugs, // sdp/ao_output_debugs.d lib.sdp.ao_rgx, // sdp/ao_rgx.d - lib.sdp.ao_scan_inserts, // sdp/ao_scan_inserts.d - lib.sdp.ao_structs, // sdp/ao_structs.d - lib.sdp.ao_utils; // sdp/ao_utils.d + lib.sdp.ao_ansi_colors; // sdp/ao_ansi_colors.d // std.conv; #+END_SRC -**** TODO lib/sdp/std.d (rdmd) :rdmd: +***** TODO lib/sdp/std.d (rdmd) :rdmd: + +├── lib_ +│ └── sdp + ├── ao_abstract_doc_source.d + ├── ... + ├── compile_time_info.d + ├── sdp.d + └── version.txt + #+NAME: sdp_imports_rdmd #+BEGIN_SRC d /+ sdp sisu document parser +/ import compile_time_info, // compile_time_info.d ao_abstract_doc_source, // ao_abstract_doc_source.d - ao_assertions, // ao_assertions.d ao_defaults, // ao_defaults.d - ao_emitter, // ao_emitter.d - ao_read_markup_source, // sdp/ao_read_markup_source.d - ao_object_setter, // ao_object_setter.d + ao_read_source_files, // ao_read_source_files.d ao_output_debugs, // ao_output_debugs.d ao_rgx, // ao_rgx.d - ao_scan_inserts, // ao_scan_inserts.d - ao_structs, // ao_structs.d - ao_utils; // ao_utils.d + ao_ansi_colors; // ao_ansi_colors.d // std.conv; #+END_SRC -*** version.txt :version: +**** version.txt :version: + #+NAME: sdp_version_mixin #+BEGIN_SRC d -// import std.stdio; mixin(import("version.txt")); #+END_SRC -** argv [+3] :argv: -*** argv mixins & init -#+NAME: sdp_argv +*** mixin :mixin: + +#+NAME: sdp_args #+BEGIN_SRC d mixin SiSUheader; mixin SiSUbiblio; mixin SiSUrgxInitFlags; mixin SiSUmarkupRaw; -mixin SiSUdocInserts; mixin SiSUdocAbstraction; mixin SiSUoutputDebugs; mixin ScreenTxtColors; -auto cli = CLI(); +#+END_SRC + +*** init :init: + +#+NAME: sdp_args +#+BEGIN_SRC d auto raw = MarkupRaw(); auto abs = Abstraction(); auto dbg = SDPoutputDebugs(); -// struct DocumentParts { -// string[string][] contents; -// JSONValue[string] metadata_json; -// JSONValue[string] make_json; -// string[][string][string] bookindex_unordered_hashes; -// JSONValue[] biblio; -// } +/+ +struct DocumentParts { + string[string][] contents; + JSONValue[string] metadata_json; + JSONValue[string] make_json; + string[][string][string] bookindex_unordered_hashes; + JSONValue[] biblio; +} ++/ string[] fns_src; string flag_action; -string[string] actions; -actions = [ - "assert" : "yes", -]; +string arg_unrecognized; auto rgx = Rgx(); +#+END_SRC + +*** scope :scope: + +#+NAME: sdp_args +#+BEGIN_SRC d scope(success) { debug(checkdoc) { writefln( "%s~ run complete, ok ~ %s (sdp-%s.%s.%s, %s v%s, %s %s)", - scr_txt_color["cyan"], - scr_txt_color["off"], - ver.major, - ver.minor, - ver.patch, - __VENDOR__, - __VERSION__, - bits, - os, + scr_txt_color["cyan"], scr_txt_color["off"], + ver.major, ver.minor, ver.patch, + __VENDOR__, __VERSION__, + bits, os, ); } // stderr.writeln("0"); } scope(failure) { - debug(checkdoc) { - writefln( - "%s~ run failure ~%s", - scr_txt_color["fuchsia"], - scr_txt_color["off"], - ); - } - // stderr.writeln("1"); -} -scope(exit) { debug(checkdoc) { - writefln( - "(%s v%s)", - __VENDOR__, - __VERSION__, + stderr.writefln( + "%s~ run failure ~%s", + scr_txt_color["fuchsia"], scr_txt_color["off"], ); } } #+END_SRC -*** argv loop -#+NAME: sdp_argv +*** getopt args for loop :args:getopt: + +look into using getopt +[[http://dlang.org/phobos/std_getopt.html][getopt]] +[[http://dlang.org/library/std/getopt.html][getopt]] + +#+NAME: sdp_args #+BEGIN_SRC d -foreach(cmdlnins; argv) { - if (match(cmdlnins, rgx.flag_action)) { - flag_action ~= " " ~ cmdlnins; - actions = cli.extract_actions(cmdlnins, actions); - } else if (match(cmdlnins, rgx.src_pth)) { - fns_src ~= cmdlnins; + +bool[string] opt_action_bool = [ + "assertions" : false, + "html" : false, + "no_obj_cite_number" : false, + "verbose" : false, +]; +auto helpInfo = getopt(args, + std.getopt.config.passThrough, + "assert", "--assert set optional assertions on", &opt_action_bool["assertions"], + "html", "--html process html output", &opt_action_bool["html"], + "no-ocn", "--no-ocn suppress object cite number output", &opt_action_bool["no_obj_cite_number"], + "verbose|v", "--verbose output to terminal", &opt_action_bool["verbose"], +); +if (helpInfo.helpWanted) { + defaultGetoptPrinter("Some information about the program.", helpInfo.options); +} +foreach(arg; args) { + if (match(arg, rgx.flag_action)) { + flag_action ~= " " ~ arg; // flags not taken by getopt + } else if (match(arg, rgx.src_pth)) { + fns_src ~= arg; // gather input markup source file names for processing + } else { // anything remaining, unused + arg_unrecognized ~= " " ~ arg; } } #+END_SRC -*** each file [+2] :file: -**** filename provided [+1] -***** scope :scope: +** loop each file [+2] :loop:files: +*** filename provided [+1] :file:process: +**** loop scope :scope: #+NAME: sdp_each_file_do #+BEGIN_SRC d scope(success) { debug(checkdoc) { writefln( - "%s~ document complete, ok ~%s %s", - scr_txt_color["green"], - scr_txt_color["off"], - fn_src + "%s~ document complete, ok ~%s", + scr_txt_color["green"], scr_txt_color["off"], ); } // stderr.writeln("0"); } scope(failure) { debug(checkdoc) { - writefln( + stderr.writefln( "%s~ document run failure ~%s (%s v%s)\n\t%s", - scr_txt_color["red"], - scr_txt_color["off"], - __VENDOR__, - __VERSION__, + scr_txt_color["red"], scr_txt_color["off"], + __VENDOR__, __VERSION__, fn_src ); } // stderr.writeln("1"); } -scope(exit) { - debug(checkdoc) { - writeln( - fn_src - ); - } -} enforce( match(fn_src, rgx.src_pth), "not a sisu markup filename" ); #+END_SRC -***** read file :file:read: +**** [#A] read file :file:read: [[./ao_markup_source_raw.org][ao_markup_source_raw]] #+NAME: sdp_each_file_do #+BEGIN_SRC d -auto markup_sourcefile_content = - raw.markupSourceContentRawLineArray(fn_src); // alternative call - // raw.markupSourceLineArray(raw.markupSourceString(fn_src)); // alternative calls (milliseconds faster?) -debug(insert) { - string[string] sysenv; - sysenv["pwd"] = shell("pwd"); - writeln(sysenv["pwd"]); - auto m = match(fn_src, rgx.src_pth); - // auto m = match(fn_src, rgx.src_pth); - auto markup_src_file_path = m.captures[1]; - writefln( - "markup source file path: %s", - markup_src_file_path - ); // writeln(m.captures[1]); - writeln(m.captures[2]); -} +/+ ↓ read file +/ +auto sourcefile_content = + raw.sourceContent(fn_src); #+END_SRC -****** incorporate any inserts -[[./ao_scan_inserts.org][ao_scan_inserts]] - +**** [#A] processing: document abstraction, tuple :processing: #+NAME: sdp_each_file_do #+BEGIN_SRC d -if (match(fn_src, rgx.src_fn_master)) { -/+ if master file .ssm - scan document source for document imports - (inserted sub-documents) -+/ - auto ins = Inserts(); - markup_sourcefile_content = - ins.scan_doc_source(markup_sourcefile_content, fn_src); -} else if (!match(fn_src, rgx.src_fn)) { - writeln("not a recognized filename"); -} -debug(raw) { - foreach (line; markup_sourcefile_content) { - writeln(line); - } -} -#+END_SRC - -***** send for processing :processing: -#+NAME: sdp_each_file_do -#+BEGIN_SRC d -/+ process document ao_abstract_doc_source - SiSUdocAbstraction::Abstraction - return abstraction as tuple -+/ +/+ ↓ porcess document, return abstraction as tuple +/ auto t = - abs.abstract_doc_source(markup_sourcefile_content); + abs.abstract_doc_source(sourcefile_content); static assert(!isTypeTuple!(t)); -auto contents = t[0]; -// static assert(!isIterable!(contents)); -auto metadata_json = t[1]; -auto make_json = t[2]; -auto bookindex_unordered_hashes = t[3]; -auto biblio = t[4]; +auto doc_ao_contents = t[0]; // contents ~ endnotes ~ bookindex; +// static assert(!isIterable!(doc_ao_contents)); +auto doc_ao_metadata_json = t[1]; +auto doc_ao_make_json = t[2]; +auto doc_ao_bookindex_unordered_hashes = t[3]; +auto doc_ao_biblio = t[4]; // destroy(t); #+END_SRC -***** debug document parts (checkdoc) +**** debug document parts (checkdoc) :debug: #+NAME: sdp_each_file_do #+BEGIN_SRC d -// DocumentParts -debug(checkdoc) { +/+ ↓ document parts +/ +debug(checkdoc) { // checkbook & dumpdoc dbg.abstract_doc_source_debugs( - contents, - make_json, - metadata_json, - bookindex_unordered_hashes, - biblio, + doc_ao_contents, + doc_ao_make_json, + doc_ao_metadata_json, + doc_ao_bookindex_unordered_hashes, + doc_ao_biblio, fn_src, - actions + opt_action_bool ); } -// compose abstract document markup state -// append book index #+END_SRC -***** on exit +**** on exit :scope:exit: #+NAME: sdp_each_file_do #+BEGIN_SRC d scope(exit) { - destroy(markup_sourcefile_content); + debug(checkdoc) { + writefln( + "processed file: %s", + fn_src + ); + } + destroy(sourcefile_content); destroy(t); - destroy(contents); - destroy(make_json); - destroy(metadata_json); - destroy(bookindex_unordered_hashes); + destroy(doc_ao_contents); + destroy(doc_ao_make_json); + destroy(doc_ao_metadata_json); + destroy(doc_ao_bookindex_unordered_hashes); + destroy(doc_ao_biblio); destroy(fn_src); - destroy(biblio); } #+END_SRC -**** no filename provided +*** no filename provided #+NAME: sdp_no_filename_provided #+BEGIN_SRC d /+ no recognized filename provided +/ @@ -346,9 +321,26 @@ break; // terminate, stop #+END_SRC -* tangles :tangle: -** sdp code structure :sdp.d: +* tangles (code structure) :tangle: +** sdp :sdp.d: *** TODO lib/sdp.d + +├── lib_ +│ ├── sdp.d + ├── version.txt + └── sdp + ├── ao_abstract_doc_source.d + ├── ... + └── compile_time_info.d + +├── lib_ +│ ├── sdp + │ ├── ao_abstract_doc_source.d + │ ├── ... + │ └── compile_time_info.d + ├── sdp.d + └── version.txt + #+BEGIN_SRC d :tangle ../lib/sdp.d :shebang #!/usr/bin/env rdmd /+ sdp @@ -358,10 +350,48 @@ break; <<sdp_imports_use>> <<sdp_version_mixin>> mixin CompileTimeInfo; -mixin RgxInit; mixin Emitters; -void main(string[] argv) { +mixin RgxInit; +void main(string[] args) { + <<sdp_compilation>> + <<sdp_args>> + foreach(fn_src; fns_src) { + // foreach(fn_src; fns_src) { + if (!empty(fn_src)) { + <<sdp_each_file_do>> + } else { + <<sdp_no_filename_provided>> + } + } +} +#+END_SRC + +*** TODO lib/sdp/sdp.d :rdmd: + +├── lib_ +│ └── sdp + ├── ao_abstract_doc_source.d + ├── ... + ├── compile_time_info.d + ├── sdp.d + └── version.txt + +rdmd needs different paths (simple structure) to build, this solution could be +used by both but so far I prefer the other for dmd & ldc + +#+BEGIN_SRC d :tangle ../lib/sdp/sdp.d :shebang #!/usr/bin/env rdmd +// [used by rdmd] +/+ + sdp + sdp.d ++/ +<<sdp_imports>> +<<sdp_imports_rdmd>> +<<sdp_version_mixin>> +mixin CompileTimeInfo; +mixin RgxInit; +void main(string[] args) { <<sdp_compilation>> - <<sdp_argv>> + <<sdp_args>> foreach(fn_src; fns_src) { if (!empty(fn_src)) { <<sdp_each_file_do>> @@ -370,7 +400,7 @@ void main(string[] argv) { } } } -#+end_src +#+END_SRC ** version.txt :version: @@ -386,3 +416,33 @@ void main(string[] argv) { // [used by rdmd] <<version_txt>> #+END_SRC +* TODO work on +- figure out best program dir structure, issue with rdmd + +|---------------------+------------------------------------------+------------------------+--------| +| header | sisu /header markup/ | markup | | +| - metadata | | | | +| - make instructions | | | | +|---------------------+------------------------------------------+------------------------+--------| +| table of contents | markup of headings | | output | +|---------------------+------------------------------------------+------------------------+--------| +| substantive content | sisu /content markup/ | markup | output | +| | headings (providing document structure), | (regular content) | | +| | paragraphs, blocks | | | +| | blocks (code, poem, group, table) | | | +|---------------------+------------------------------------------+------------------------+--------| +| endnotes | markup within substantive content | markup | output | +| | (extracted from sisu /content markup/) | (from regular content) | | +|---------------------+------------------------------------------+------------------------+--------| +| glossary | identify special section | markup | output | +| | regular /content markup/ | | | +|---------------------+------------------------------------------+------------------------+--------| +| bibliography | identify section, | markup (special) | output | +| | special /bibliography markup/ | | | +|---------------------+------------------------------------------+------------------------+--------| +| book index | extracted from markup attached to | markup | output | +| | related substantive content objects | | | +| | (special tags in sisu /content markup/) | (from regular content) | | +|---------------------+------------------------------------------+------------------------+--------| +| metadata | | (from regular header) | output | +|---------------------+------------------------------------------+------------------------+--------| |