aboutsummaryrefslogtreecommitdiffhomepage
path: root/org/sdp.org
diff options
context:
space:
mode:
authorRalph Amissah <ralph@amissah.com>2016-04-24 22:35:39 -0400
committerRalph Amissah <ralph@amissah.com>2016-04-24 22:35:39 -0400
commit9c14b019a6f695b54a035605e3bb3fc76bf20aa6 (patch)
tree517169ec313d81aca54da3ddcb1f329b7caba695 /org/sdp.org
parentstep1 (diff)
Diffstat (limited to 'org/sdp.org')
-rw-r--r--org/sdp.org416
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 |
+|---------------------+------------------------------------------+------------------------+--------|