#+TITLE: Emacs config file written in org-mode
#+AUTHOR: Ralph Amissah
#+EMAIL: ralph.amissah@gmail.com
#+STARTUP: indent
#+LANGUAGE: en
#+OPTIONS: H:3 num:nil toc:t \n:nil @:t ::t |:t ^:nil -:t f:t *:t <:t
#+OPTIONS: TeX:t LaTeX:t skip:nil d:nil todo:t pri:nil tags:not-in-toc
#+OPTIONS: author:nil email:nil creator:nil timestamp:nil
#+OPTIONS: ^:nil _:nil#+OPTIONS: ^:nil _:nil
#+EXPORT_SELECT_TAGS: export
#+EXPORT_EXCLUDE_TAGS: noexport
#+TAGS: Amissah(A) Class(c) WEB(W) noexport(n)

* sdp.d
Deal with imports.
Take command line instructions and process files as instructed.
** imports
#+name: sdp_imports
#+BEGIN_SRC d                                                  :exports none
import
  std.stdio,
  std.file,
  std.exception,
  // std.path,
  std.regex,
  std.utf,
  std.string,
  std.array,
  std.json,
  std.process,
  std.typecons,
  std.algorithm,
  std.range,
  std.container,
  std.traits,
  // std.variant,
  lib.sdp.ao_output_debugs,        // ao_output_debugs.d       ao_output_debugs.org
  lib.sdp.ao_defaults,             // ao_defaults.d            ao_defaults.arg
  lib.sdp.ao_rgx,                  // ao_rgx.d                 ao_rgx.org
  lib.sdp.ao_interface,            // ao_interface.d           ao_interface.arg
  lib.sdp.ao_emitter,              // ao_emitter.d             ao_emitter.org
  lib.sdp.ao_scan_inserts,         // ao_scan_inserts.d        ao_scan_inserts.org
  lib.sdp.ao_markup_source_raw,    // ao_markup_source_raw.d   ao_markup_source_raw.org
  lib.sdp.ao_abstract_doc_source,  // ao_abstract_doc_source.d ao_abstract_doc_source.org
  lib.sdp.ao_assertions,           // ao_assertions.d          ao_assertions.org
  lib.sdp.ao_object_setter,        // ao_object_setter.d       ao_object_setter.org
  lib.sdp.ao_utils;                // ao_utils.d               ao_utils.org
  // std.conv;
import std.conv : to;
#+end_src
** argv [+3]
*** argv mixins
#+name: sdp_argv
#+BEGIN_SRC d                                                  :exports none
mixin SiSUheader;
mixin SiSUbiblio;
mixin SiSUrgxInitFlags;
mixin SiSUmarkupRaw;
mixin SiSUdocInserts;
mixin SiSUdocAbstraction;
mixin SiSUoutputDebugs;
mixin ScreenTxtColors;
auto cli = new CLI();
auto raw = new MarkupRaw();
auto abs = new Abstraction();
auto dbg = new SDPoutputDebugs();
// struct DocumentParts {
//   string[string][] contents;
//   JSONValue[string] metadata_json;
//   JSONValue[string] make_json;
//   string[][string][string] bookindex_unordered_hashes;
//   JSONValue[] biblio;
// }
char[][] msc;
string[1000] fns_src;
string flag_action;
string[string] actions;
int file_count;
actions = [
  "assert"  : "yes",
];
auto rgx = new Rgx();
scope(success) {
  debug(checkdoc) {
    writeln(
      scr_txt_color["cyan"],
      "~ run complete, ok ~ ",
      scr_txt_color["off"],
    );
  }
  // writeln("0");
}
scope(failure) {
  debug(checkdoc) {
    writeln(
      scr_txt_color["fucshia"],
      "~ run failure ~",
      scr_txt_color["off"],
    );
  }
  // writeln("1");
}
#+end_src
*** argv loop
#+name: sdp_argv
#+BEGIN_SRC d                                                  :exports none
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[file_count] = cmdlnins;
    file_count++;
  }
}
#+end_src
*** each file [+2]
**** filename provided [+1]
***** scope
#+name: sdp_each_file_do
#+BEGIN_SRC d                                                  :exports none
scope(success) {
  debug(checkdoc) {
    writeln(
      scr_txt_color["green"],
      "~ document complete, ok ~ ",
      scr_txt_color["off"],
      fn_src
    );
  }
  // writeln("0");
}
scope(failure) {
  debug(checkdoc) {
    writeln(
      scr_txt_color["red"],
      "~ document run failure ~",
      scr_txt_color["off"],
      fn_src
    );
  }
  // writeln("1");
}
enforce(
  match(fn_src, rgx.src_pth),
  "not a sisu markup filename"
);
#+end_src
***** send for processing
#+name: sdp_each_file_do
#+BEGIN_SRC d                                                  :exports none
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];
  writeln("markup source file path: ", markup_src_file_path); // writeln(m.captures[1]);
  writeln(m.captures[2]);
}
if (match(fn_src, rgx.src_fn_master)) {
/* if master file scan document source for document imports (inserted sub-documents) */
  auto ins = new Inserts();
  auto markup_master_sourcefile_content =
    ins.scan_doc_source(markup_sourcefile_content, fn_src);
  msc = markup_master_sourcefile_content;
} else if (match(fn_src, rgx.src_fn)) {
  msc = markup_sourcefile_content;
} else {
  writeln("not a recognized filename");
}
debug(raw) {
  foreach (line; msc) {
    writeln(line);
  }
}
/* process document ao_abstract_doc_source SiSUdocAbstraction::Abstraction return abstraction as tuple */
auto t =
  abs.abstract_doc_source(msc);
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];
// destroy(t);
#+end_src
***** debug document parts (checkdoc)
#+name: sdp_each_file_do
#+BEGIN_SRC d                                                  :exports none
// DocumentParts
debug(checkdoc) {
  dbg.abstract_doc_source_debugs(
    contents,
    make_json,
    metadata_json,
    bookindex_unordered_hashes,
    biblio,
    fn_src,
    actions
  );
}
// compose abstract document markup state
// append book index
#+end_src
***** on exit
#+name: sdp_each_file_do
#+BEGIN_SRC d                                                  :exports none
scope(exit) {
  destroy(msc);
  destroy(t);
  destroy(contents);
  destroy(make_json);
  destroy(metadata_json);
  destroy(bookindex_unordered_hashes);
  destroy(fn_src);
  destroy(biblio);
}
#+end_src
**** no filename provided
#+name: sdp_no_filename_provided
#+BEGIN_SRC d                                                  :exports none
/* no recognized filename provided */
writeln("no recognized filename");
break;
// terminate, stop
#+end_src
* tangles
** code structure                                            :sdp.d:
#+name: tangle_sdp
#+BEGIN_SRC d  :tangle ../lib/sdp/sdp.d  :exports none :noweb yes
#!/usr/bin/env rdmd
/*
  sdp
  sdp.d
*/
<<sdp_imports>>
mixin RgxInit; mixin Interfaces; mixin Emitters;
void main(string[] argv) {
  <<sdp_argv>>
  foreach(fn_src; fns_src) {
    if (!empty(fn_src)) {
      <<sdp_each_file_do>>
    } else {
      <<sdp_no_filename_provided>>
    }
  }
}
#+end_src