From 6dc69228f20b3566320b52966b3782d633171e71 Mon Sep 17 00:00:00 2001
From: Ralph Amissah <ralph@amissah.com>
Date: Mon, 27 Nov 2017 20:35:14 -0500
Subject: 0.20.2 paths, config & manifest files

---
 src/sdp/meta/read_config_files.d |  27 +--
 src/sdp/meta/read_source_files.d |   1 +
 src/sdp/meta/rgx.d               |  10 +-
 src/sdp/output/package.d         |   1 +
 src/sdp/output/paths_output.d    | 282 -------------------------------
 src/sdp/output/paths_source.d    | 353 ++++++++++++++++++++++++++++++++++++++-
 src/sdp/output/rgx.d             |  10 +-
 src/sdp/sdp.d                    |  18 +-
 8 files changed, 375 insertions(+), 327 deletions(-)

(limited to 'src')

diff --git a/src/sdp/meta/read_config_files.d b/src/sdp/meta/read_config_files.d
index 012ccb6..369d9c2 100644
--- a/src/sdp/meta/read_config_files.d
+++ b/src/sdp/meta/read_config_files.d
@@ -7,32 +7,11 @@ module sdp.meta.read_config_files;
 static template configIn() {
   import
     sdp.meta,
+    sdp.output.paths_source,
     std.file,
     std.path;
   final string configIn(C,E)(C conf_sdl, E env) {
-    /+ FIX clean up conf paths ↓ +/
-    string sisudoc_conf_pwd = chainPath(to!string(env["pwd"]), "sisudoc/conf").array;
-    string sisudoc_conf_pwd_a = chainPath(to!string(env["pwd"]), "conf").array;
-    string sisudoc_conf_pwd_b = chainPath(to!string(env["pwd"]), "../conf").array;
-    string sisudoc_conf_pwd_c = chainPath(to!string(env["pwd"]), "../../conf").array;
-    string sisudoc_conf_pwd_d = chainPath(to!string(env["pwd"]), "../../../conf").array;
-    /+ FIX clean up conf paths ↑
-       (compare pwd to doc path location, and build config path)
-    +/
-    string dot_pwd = chainPath(to!string(env["pwd"]), ".sisu").array;
-    string underscore_pwd = chainPath(to!string(env["pwd"]), "_sisu").array;
-    string dot_home = chainPath(to!string(env["home"]), ".sisu").array;
-    string[] possible_config_path_locations = [
-      sisudoc_conf_pwd,
-      sisudoc_conf_pwd_a,
-      sisudoc_conf_pwd_b,
-      sisudoc_conf_pwd_c,
-      sisudoc_conf_pwd_d,
-      dot_pwd,
-      underscore_pwd,
-      dot_home,
-      "/etc/sisu"
-    ];
+    auto possible_config_path_locations = ConfigFilePaths!()(env).possible_config_path_locations;
     string config_file_str;
     foreach(pth; possible_config_path_locations) {
       auto conf_file = format(
@@ -67,6 +46,7 @@ static template ConfigSDLang() {
   import sdlang;
   import
     sdp.meta,
+    sdp.output.paths_source,
     std.file,
     std.path;
   auto ConfigSDLang(string configuration, string conf_sdl_filename) {
@@ -86,6 +66,7 @@ static template ConfigSDLang() {
 static template configRead() {
   import
     sdp.meta,
+    sdp.output.paths_source,
     std.file,
     std.path;
   
diff --git a/src/sdp/meta/read_source_files.d b/src/sdp/meta/read_source_files.d
index 0443ded..ccda78c 100644
--- a/src/sdp/meta/read_source_files.d
+++ b/src/sdp/meta/read_source_files.d
@@ -9,6 +9,7 @@ static template SiSUrawMarkupContent() {
     sdp.meta.rgx;
   import
     sdp.meta,
+    sdp.output.paths_source,
     std.file,
     std.path;
   mixin SiSUrgxInit;
diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d
index bf1b175..70f48bb 100644
--- a/src/sdp/meta/rgx.d
+++ b/src/sdp/meta/rgx.d
@@ -196,13 +196,13 @@ static template SiSUrgxInit() {
     static nbsp_chars_line_start                          = ctRegex!(`^░+`, "mg");
     static nbsp_and_space                                 = ctRegex!(`&nbsp;[ ]`, "mg");
     static nbsp_char_and_space                            = ctRegex!(`░[ ]`, "mg");
-    static src_pth                                        = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
-    static src_pth_contents                               = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisudoc[.]txt$`);
-    static src_pth_zip                                    = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);
+    static src_pth                                        = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
+    static src_pth_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisudoc[.]txt$`);
+    static src_pth_zip                                    = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);
     static src_pth_unzip_pod                              = ctRegex!(`^(?P<path>media/text/[a-z]{2}/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);
-    static src_pth_types                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<gotfile>(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])|(?P<filelist>[a-zA-Z0-9._-]+/sisudoc[.]txt)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`);
+    static src_pth_types                                  = ctRegex!(`^(?P<path>[/]?[a-zA-Z0-9._-]+/)*(?P<gotfile>(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])|(?P<filelist>[a-zA-Z0-9._-]+/sisudoc[.]txt)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`);
     static src_fn                                         =
-      ctRegex!(`^([a-zA-Z0-9._-]+/)*(?P<fn_src>(?P<fn_base>[a-zA-Z0-9._-]+)[.](?P<fn_src_suffix>ss[tm]))$`);
+      ctRegex!(`^([/]?(?:[a-zA-Z0-9._-]+/)*)(?P<fn_src>(?P<fn_base>[a-zA-Z0-9._-]+)[.](?P<fn_src_suffix>ss[tm]))$`);
     static src_fn_master                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ssm)$`);
     static src_fn_text                                    = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]sst)$`);
     static src_fn_insert                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ssi)$`);
diff --git a/src/sdp/output/package.d b/src/sdp/output/package.d
index 58a6ae8..84bdfce 100644
--- a/src/sdp/output/package.d
+++ b/src/sdp/output/package.d
@@ -15,6 +15,7 @@ public import
   // std.uni,
   std.utf;
 public import
+  sdp.output.paths_source,
   sdp.output.defaults,
   sdp.output.paths_output,
   sdp.output.rgx;
diff --git a/src/sdp/output/paths_output.d b/src/sdp/output/paths_output.d
index a5ea0d9..accfcaf 100644
--- a/src/sdp/output/paths_output.d
+++ b/src/sdp/output/paths_output.d
@@ -7,288 +7,6 @@ import std.array,
   std.regex,
   std.stdio;
 import sdp.meta.rgx;
-template SiSUpathsSisupod() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  string _base_dir_pod = "sisupod";
-  string _base_dir_doc = "sisudoc";
-  string _suffix = ".zip";
-  auto SiSUpathsSisupod()() {
-    struct _PathsStruct {
-      string base_filename(string fn_src) {
-        auto pth = fn_src.baseName.stripExtension;
-        return pth;
-      }
-      string sisupod_dir() {
-        auto pth = _base_dir_pod;
-        return pth;
-      }
-      string sisudoc_dir() {
-        auto pth = _base_dir_doc;
-        return pth;
-      }
-      string sisupod_filename(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename(fn_src) ~ _suffix).array;
-        return pth;
-      }
-      string base_filesystem(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array;
-        assert(pth == _base_dir_pod ~ "/"  ~ base_filename(fn_src),
-          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename(fn_src) ~ "?");
-        return pth;
-      }
-      string base_pod(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array; // change this
-        return pth;
-      }
-    }
-    return _PathsStruct();
-  }
-}
-
-template SiSUpathsSisupods() {
-  mixin SiSUrgxInit;
-  static auto rgx = Rgx();
-  string _base_dir_pod = "sisupod";
-  string _base_dir_doc = "sisudoc";
-  string _suffix = ".zip";
-  auto SiSUpathsSisupods(Ps,Lng)(
-    Ps  src_pth_info,
-    Lng lng,
-  ) {
-    struct _PodPaths {
-      string base_filename_(string fn_src) {
-        auto pth = fn_src.baseName.stripExtension;
-        return pth;
-      }
-      string sisupod_dir_() {
-        auto pth = _base_dir_pod;
-        return pth;
-      }
-      string sisudoc_dir_() {
-        auto pth = _base_dir_doc;
-        return pth;
-      }
-      string sisupod_filename_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array;
-        return pth;
-      }
-      string base_filesystem_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array;
-        assert(pth == _base_dir_pod ~ "/"  ~ base_filename_(fn_src),
-          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?");
-        return pth;
-      }
-      string base_pod_(string fn_src) {
-        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this
-        return pth;
-      }
-      auto base_filename(string fn_src) {
-        auto pth_1_ = base_filename_(fn_src);
-        auto pth_2_ = base_filename_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto sisupod_filename(string fn_src) {
-        auto pth_1_ = sisupod_filename_(fn_src);
-        auto pth_2_ = sisupod_filename_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto base(string fn_src) {
-        auto pth_1_ = "";
-        auto pth_2_ = base_filesystem_(fn_src);
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto pod_root(string fn_src) {
-        auto pth_1_ = "";
-        auto pth_2_ = base(fn_src).filesystem_open_zpod.chainPath("").array; // "sisudoc"
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto conf_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = "conf";
-        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("conf").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto css(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = conf_root(fn_src).zpod.chainPath("css").array;
-        auto pth_2_ = conf_root(fn_src).filesystem_open_zpod.chainPath("css").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto media_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = "media";
-        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("media").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto text_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = media_root(fn_src).zpod.chainPath("text").array;
-        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("text").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto doc(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = text_root(fn_src).zpod;
-        auto pth_2_ = text_root(fn_src).filesystem_open_zpod;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto doc_lng(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = text_root(fn_src).zpod.chainPath(lng).array;
-        auto pth_2_ = text_root(fn_src).filesystem_open_zpod.chainPath(lng).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto image_root(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = media_root(fn_src).zpod.chainPath("image").array;
-        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("image").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_pod_filelist(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = "sisudoc.txt";
-        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("sisudoc.txt").array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_doc(string fn_src) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_src.baseName).array;
-        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_src.baseName).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-      auto fn_doc_insert(string fn_src, string fn_insert) {
-        auto pod_root_ = pod_root(fn_src);
-        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_insert.baseName).array;
-        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_insert.baseName).array;
-        struct _pods {
-          auto zpod() {
-            return pth_1_;
-          }
-          auto filesystem_open_zpod() {
-            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
-            return pth_2_;
-          }
-        }
-        return _pods();
-      }
-    }
-    return _PodPaths();
-  }
-}
 template SiSUoutPaths() {
   auto SiSUoutPaths(Ps,Lng)(
     Ps  src_pth_info,
diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d
index a242a33..1fd87e5 100644
--- a/src/sdp/output/paths_source.d
+++ b/src/sdp/output/paths_source.d
@@ -5,10 +5,77 @@
 +/
 module sdp.output.paths_source;
 import std.array,
+  std.file,
   std.path,
   std.regex,
-  std.stdio;
+  std.stdio,
+  std.conv : to;
 import sdp.meta.rgx;
+template ManifestFile() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto ManifestFile(P)(
+    P   _pth,
+  ) {
+    struct ManifestFile_ {
+      auto manifest_file() {
+        string _manifest_file = "sisudoc.txt";
+        return _manifest_file;
+      }
+      auto manifest_file_and_path() {
+        string _manifest_file_and_path;
+        if (isValidPath(_pth) && _pth.isDir
+        && ((_pth.chainPath(manifest_file).array).isFile)) {
+          _manifest_file_and_path = _pth.chainPath(manifest_file).array;
+        } else if (_pth.match(rgx.src_pth_contents)
+        && (_pth.isFile)) {
+          _manifest_file_and_path = _pth;
+        } else {
+          // _manifest_file_and_path = "";
+        }
+        return _manifest_file_and_path;
+      }
+    }
+    return ManifestFile_();
+  }
+}
+template ConfigFilePaths() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  auto ConfigFilePaths(E)(
+    E   _env,
+  ) {
+    struct ConfFilePaths {
+      auto possible_config_path_locations() {
+        /+ FIX clean up conf paths ↓ +/
+        string _sisudoc_conf_pwd   = chainPath(to!string(_env["pwd"]), "sisudoc/conf").array;
+        string _sisudoc_conf_pwd_a = chainPath(to!string(_env["pwd"]), "conf").array;
+        string _sisudoc_conf_pwd_b = chainPath(to!string(_env["pwd"]), "../conf").array;
+        string _sisudoc_conf_pwd_c = chainPath(to!string(_env["pwd"]), "../../conf").array;
+        string _sisudoc_conf_pwd_d = chainPath(to!string(_env["pwd"]), "../../../conf").array;
+        /+ FIX clean up conf paths ↑
+        (compare pwd to doc path location, and build config path)
+        +/
+        string _dot_pwd        = chainPath(to!string(_env["pwd"]), ".sisu").array;
+        string _underscore_pwd = chainPath(to!string(_env["pwd"]), "_sisu").array;
+        string _dot_home       = chainPath(to!string(_env["home"]), ".sisu").array;
+        string[] _possible_config_path_locations = [
+          _sisudoc_conf_pwd,
+          _sisudoc_conf_pwd_a,
+          _sisudoc_conf_pwd_b,
+          _sisudoc_conf_pwd_c,
+          _sisudoc_conf_pwd_d,
+          _dot_pwd,
+          _underscore_pwd,
+          _dot_home,
+          "/etc/sisu"
+        ];
+        return _possible_config_path_locations;
+      }
+    }
+    return ConfFilePaths();
+  }
+}
 template SiSUpathsSRC() {
   mixin SiSUrgxInit;
   static auto rgx = Rgx();
@@ -25,7 +92,7 @@ template SiSUpathsSRC() {
         string _k;
         if (auto m = _fn_src_and_relative_path.match(rgx.language_code_and_filename)) {
           _k = m.captures[1];
-        } else {
+        } else { /+ unknown until doc_meta read, (could provide & use command line info?) +/
           _k = "xx"; // original default was "en" but is not known
         }
         return _k;
@@ -58,3 +125,285 @@ template SiSUpathsSRC() {
     return SisuSrcPaths();
   }
 }
+template SiSUpathsSisupod() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  string _base_dir_pod = "sisupod";
+  string _base_dir_doc = "sisudoc";
+  string _suffix = ".zip";
+  auto SiSUpathsSisupod()() {
+    struct _PathsStruct {
+      string base_filename(string fn_src) {
+        auto pth = fn_src.baseName.stripExtension;
+        return pth;
+      }
+      string sisupod_dir() {
+        auto pth = _base_dir_pod;
+        return pth;
+      }
+      string sisudoc_dir() {
+        auto pth = _base_dir_doc;
+        return pth;
+      }
+      string sisupod_filename(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename(fn_src) ~ _suffix).array;
+        return pth;
+      }
+      string base_filesystem(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array;
+        assert(pth == _base_dir_pod ~ "/"  ~ base_filename(fn_src),
+          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename(fn_src) ~ "?");
+        return pth;
+      }
+      string base_pod(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename(fn_src)).array; // change this
+        return pth;
+      }
+    }
+    return _PathsStruct();
+  }
+}
+
+template SiSUpathsSisupods() {
+  mixin SiSUrgxInit;
+  static auto rgx = Rgx();
+  string _base_dir_pod = "sisupod";
+  string _base_dir_doc = "sisudoc";
+  string _suffix = ".zip";
+  auto SiSUpathsSisupods(Ps,Lng)(
+    Ps  src_pth_info,
+    Lng lng,
+  ) {
+    struct _PodPaths {
+      string base_filename_(string fn_src) {
+        auto pth = fn_src.baseName.stripExtension;
+        return pth;
+      }
+      string sisupod_dir_() {
+        auto pth = _base_dir_pod;
+        return pth;
+      }
+      string sisudoc_dir_() {
+        auto pth = _base_dir_doc;
+        return pth;
+      }
+      string sisupod_filename_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src) ~ _suffix).array;
+        return pth;
+      }
+      string base_filesystem_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array;
+        assert(pth == _base_dir_pod ~ "/"  ~ base_filename_(fn_src),
+          pth ~ " == "  ~ _base_dir_pod ~ "/" ~ base_filename_(fn_src) ~ "?");
+        return pth;
+      }
+      string base_pod_(string fn_src) {
+        string pth = _base_dir_pod.chainPath(base_filename_(fn_src)).array; // change this
+        return pth;
+      }
+      auto base_filename(string fn_src) {
+        auto pth_1_ = base_filename_(fn_src);
+        auto pth_2_ = base_filename_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto sisupod_filename(string fn_src) {
+        auto pth_1_ = sisupod_filename_(fn_src);
+        auto pth_2_ = sisupod_filename_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto base(string fn_src) {
+        auto pth_1_ = "";
+        auto pth_2_ = base_filesystem_(fn_src);
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto pod_root(string fn_src) {
+        auto pth_1_ = "";
+        auto pth_2_ = base(fn_src).filesystem_open_zpod.chainPath("").array; // "sisudoc"
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto conf_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = "conf";
+        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("conf").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto css(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = conf_root(fn_src).zpod.chainPath("css").array;
+        auto pth_2_ = conf_root(fn_src).filesystem_open_zpod.chainPath("css").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto media_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = "media";
+        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("media").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto text_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = media_root(fn_src).zpod.chainPath("text").array;
+        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("text").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto doc(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = text_root(fn_src).zpod;
+        auto pth_2_ = text_root(fn_src).filesystem_open_zpod;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto doc_lng(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = text_root(fn_src).zpod.chainPath(lng).array;
+        auto pth_2_ = text_root(fn_src).filesystem_open_zpod.chainPath(lng).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto image_root(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = media_root(fn_src).zpod.chainPath("image").array;
+        auto pth_2_ = media_root(fn_src).filesystem_open_zpod.chainPath("image").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_pod_filelist(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = "sisudoc.txt";
+        auto pth_2_ = pod_root(fn_src).filesystem_open_zpod.chainPath("sisudoc.txt").array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_doc(string fn_src) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_src.baseName).array;
+        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_src.baseName).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+      auto fn_doc_insert(string fn_src, string fn_insert) {
+        auto pod_root_ = pod_root(fn_src);
+        auto pth_1_ = doc_lng(fn_src).zpod.chainPath(fn_insert.baseName).array;
+        auto pth_2_ = doc_lng(fn_src).filesystem_open_zpod.chainPath(fn_insert.baseName).array;
+        struct _pods {
+          auto zpod() {
+            return pth_1_;
+          }
+          auto filesystem_open_zpod() {
+            assert(pod_root_.filesystem_open_zpod.chainPath(zpod).array == pth_2_);
+            return pth_2_;
+          }
+        }
+        return _pods();
+      }
+    }
+    return _PodPaths();
+  }
+}
diff --git a/src/sdp/output/rgx.d b/src/sdp/output/rgx.d
index dbd1528..c9f0175 100644
--- a/src/sdp/output/rgx.d
+++ b/src/sdp/output/rgx.d
@@ -15,13 +15,13 @@ static template SiSUoutputRgxInit() {
     static nbsp_chars_line_start                          = ctRegex!(`^░+`, "mg");
     static nbsp_and_space                                 = ctRegex!(`&nbsp;[ ]`, "mg");
     static nbsp_char_and_space                            = ctRegex!(`░[ ]`, "mg");
-    static src_pth                                        = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
-    static src_pth_contents                               = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisudoc[.]txt$`);
-    static src_pth_zip                                    = ctRegex!(`^(?P<path>(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);
+    static src_pth                                        = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])$`);
+    static src_pth_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisudoc[.]txt$`);
+    static src_pth_zip                                    = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+[.]zip)$`);
     static src_pth_unzip_pod                              = ctRegex!(`^(?P<path>media/text/[a-z]{2}/)*(?P<filename>[a-zA-Z0-9._-]+[.]ss[im])$`);
-    static src_pth_types                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<gotfile>(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])|(?P<filelist>[a-zA-Z0-9._-]+/sisudoc[.]txt)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`);
+    static src_pth_types                                  = ctRegex!(`^(?P<path>[/]?[a-zA-Z0-9._-]+/)*(?P<gotfile>(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])|(?P<filelist>[a-zA-Z0-9._-]+/sisudoc[.]txt)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`);
     static src_fn                                         =
-      ctRegex!(`^([a-zA-Z0-9._-]+/)*(?P<fn_src>(?P<fn_base>[a-zA-Z0-9._-]+)[.](?P<fn_src_suffix>ss[tm]))$`);
+      ctRegex!(`^([/]?(?:[a-zA-Z0-9._-]+/)*)(?P<fn_src>(?P<fn_base>[a-zA-Z0-9._-]+)[.](?P<fn_src_suffix>ss[tm]))$`);
     static src_fn_master                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ssm)$`);
     static src_fn_text                                    = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]sst)$`);
     static src_fn_insert                                  = ctRegex!(`^(?P<path>[a-zA-Z0-9._-]+/)*(?P<filename>[a-zA-Z0-9._-]+[.]ssi)$`);
diff --git a/src/sdp/sdp.d b/src/sdp/sdp.d
index ac022ba..a9f63e2 100755
--- a/src/sdp/sdp.d
+++ b/src/sdp/sdp.d
@@ -300,21 +300,19 @@ void main(string[] args) {
   }
   auto _opt_action = OptActions();
   foreach(arg; args[1..$]) {
+    auto _manifest = ManifestFile!()(arg);
     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 if (arg.match(rgx.src_pth_contents)
-      ||  ((arg.isDir) && ((arg.chainPath("sisudoc.txt").array).isFile))
-    ) {
+    } else if (_manifest.manifest_file_and_path) {
       string contents_location_;
-      string sisudoc_txt_;
-      if ((arg.chainPath("sisudoc.txt").array).isFile) {
-        sisudoc_txt_ = arg.chainPath("sisudoc.txt").array;
-      } else if (arg.match(rgx.src_pth_contents)) {
-        sisudoc_txt_ = arg;
-      } else {
-      }
+      string sisudoc_txt_ = _manifest.manifest_file_and_path;
+      enforce(
+        exists(sisudoc_txt_)!=0,
+        "file not found: «" ~
+        sisudoc_txt_ ~ "»"
+      );
       try {
         if (exists(sisudoc_txt_)) {
           contents_location_ = sisudoc_txt_.readText;
-- 
cgit v1.2.3