diff options
| author | Ralph Amissah <ralph@amissah.com> | 2017-11-29 18:37:41 -0500 | 
|---|---|---|
| committer | Ralph Amissah <ralph@amissah.com> | 2019-04-10 15:14:14 -0400 | 
| commit | 23920cdf33513ead479801568735f4d6545422aa (patch) | |
| tree | 6be80cc175d8d32fde9aeb6488f76b5d7dc87723 | |
| parent | paths, manifest (diff) | |
0.21.0 paths, pod manifest source alternativedoc-reform_v0.0.21
- sisupod.manifest
  - list alternative processable files with paths
    e.g.:
      media/text/en/live-manual.ssm
      media/text/fr/live-manual.ssm
      ...
  - name file followed by list of language codes
    e.g.:
      live-manual.ssm
      en, ca, de, es, fr, it, ja, pl, ro
      live-manual_next.ssm
      en, de, es, fr, it, ja
| -rw-r--r-- | org/default_paths.org | 133 | ||||
| -rw-r--r-- | org/default_regex.org | 7 | ||||
| -rw-r--r-- | org/output_sisupod.org | 18 | ||||
| -rw-r--r-- | org/sdp.org | 107 | ||||
| -rw-r--r-- | src/sdp/meta/metadoc.d | 35 | ||||
| -rw-r--r-- | src/sdp/meta/rgx.d | 7 | ||||
| -rw-r--r-- | src/sdp/output/paths_source.d | 125 | ||||
| -rw-r--r-- | src/sdp/output/rgx.d | 7 | ||||
| -rw-r--r-- | src/sdp/output/source_sisupod.d | 18 | ||||
| -rwxr-xr-x | src/sdp/sdp.d | 51 | ||||
| -rw-r--r-- | views/version.txt | 2 | 
11 files changed, 383 insertions, 127 deletions
| diff --git a/org/default_paths.org b/org/default_paths.org index 623584e..b2c1980 100644 --- a/org/default_paths.org +++ b/org/default_paths.org @@ -46,11 +46,11 @@ template PodManifest() {    mixin SiSUrgxInit;    static auto rgx = Rgx();    auto PodManifest(P)( -    P   _pth, +    P   _pth = "",    ) {      struct ManifestFile_ {        auto pod_manifest_filename() { -        string _manifest_file = "sisudoc.txt"; +        string _manifest_file = "sisupod.manifest";          return _manifest_file;        }        auto pod_manifest_path() { @@ -61,8 +61,7 @@ template PodManifest() {          } else if (_pth.match(rgx.src_pth_contents)          && (_pth.isFile)) {            _manifest_path = dirName(_pth); -        } else { -          // _manifest_path = ""; +        // } else { // _manifest_path = "";          }          return _manifest_path;        } @@ -76,6 +75,111 @@ template PodManifest() {  }  #+END_SRC +** _manifest and source files_                                      :manifest: + +#+name: template_paths_src +#+BEGIN_SRC d +template PodManifestAndSrcFile() { +  mixin SiSUrgxInit; +  static auto rgx = Rgx(); +  auto PodManifestAndSrcFile(O,E,P,F)( +    O   _opt_actions, +    E   _env, +    P   _pth                   = "", +    F   _fns                   = "", +    char[][] _manifest_fn_list = [[]], +  ) { +    auto _manifest = PodManifest!()(_pth); +    struct ManifestFilePlus_ { +      auto pwd() { +        return _env["pwd"]; +      } +      auto home() { +        return _env["home"]; +      } +      auto opt_action() { +        return _opt_actions; +      } +      auto is_pod() { +        auto _is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; +        return _is_pod; +      } +      auto pod_manifest_list_of_filenames() { +        return _manifest_fn_list; +      } +      auto pod_manifest_list_of_languages() { +        string[] _lngs; +        foreach (filename_; pod_manifest_list_of_filenames) { +          string _k = "en"; +          if (auto m = (filename_).match(rgx.language_code_and_filename)) { +            _k = m.captures[1].to!string; +          } +          _lngs ~= _k; // all the languages from the manifest list of filenames with paths +        } +        return _lngs; +      } +      auto pod_manifest_filename() { +        return _manifest.pod_manifest_filename; +      } +      auto pod_manifest_path() { +        return _manifest.pod_manifest_path; +      } +      auto pod_manifest_file_with_path() { +        return _manifest.pod_manifest_file_with_path; +      } +      auto pod_config_dirs() {                              // TODO +        string[] _config_dirs; +        return _config_dirs; +      } +      auto pod_image_dirs() {                               // TODO +        string[] _image_dirs; +        return _image_dirs; +      } +      auto src_fn() { +        return _fns; +      } +      auto src_lng() { +        string _k; +        if (auto m = (src_fn).match(rgx.language_code_and_filename)) { +          _k = m.captures[1]; +        } else { +          _k = "en"; +        } +        return _k; +      } +      auto output_path() { +        auto _output_path = pwd; +        if ((_opt_actions.output_dir_set.length > 0) +          && isValidPath(_opt_actions.output_dir_set) +        ) { +          _output_path = asNormalizedPath(_opt_actions.output_dir_set).array; +          if (!exists(_output_path)) { +            _output_path.mkdirRecurse; +          } +          assert(_output_path.isDir); +        } +        return _output_path; +      } +      auto src_config_dirs() {                              // TODO +        string[] _config_dirs; +        if (is_pod) { +        } else { +        } +        return _config_dirs; +      } +      auto src_image_dirs() {                               // TODO +        string[] _image_dirs; +        if (is_pod) { +        } else { +        } +        return _image_dirs; +      } +    } +    return ManifestFilePlus_(); +  } +} +#+END_SRC +  ** _config_                                                           :config:  #+name: template_paths_src @@ -136,7 +240,7 @@ sisupod      │   │       ├── [conf]      │   │       └── [image]      │   └── video -    └── sisudoc.txt +    └── sisupod.manifest  _replace:_ @@ -274,10 +378,7 @@ template SiSUpathsSisupods() {    string _base_dir_pod = "sisupod";    string _base_dir_doc = "sisudoc";    string _suffix = ".zip"; -  auto SiSUpathsSisupods(Ps,Lng)( -    Ps  src_pth_info, -    Lng lng, -  ) { +  auto SiSUpathsSisupods()() {      struct _PodPaths {        string base_filename_(string fn_src) {          auto pth = fn_src.baseName.stripExtension; @@ -432,7 +533,7 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto doc_lng(string fn_src) { +      auto doc_lng(string fn_src, string lng) {          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; @@ -478,10 +579,10 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto fn_doc(string fn_src) { +      auto fn_doc(string fn_src, string lng) {          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; +        auto pth_1_ = doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName).array; +        auto pth_2_ = doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName).array;          struct _pods {            auto zpod() {              return pth_1_; @@ -493,10 +594,10 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto fn_doc_insert(string fn_src, string fn_insert) { +      auto fn_doc_insert(string fn_src, string fn_insert, string lng) {          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; +        auto pth_1_ = doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName).array; +        auto pth_2_ = doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName).array;          struct _pods {            auto zpod() {              return pth_1_; diff --git a/org/default_regex.org b/org/default_regex.org index 334b025..92197ef 100644 --- a/org/default_regex.org +++ b/org/default_regex.org @@ -412,10 +412,13 @@ static nbsp_char_and_space                            = ctRegex!(`░[ ]`, "mg")  #+name: prgmkup_rgx  #+BEGIN_SRC d  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_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`);  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._-]+/sisupod[.]manifest)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`); +static pod_content_location                           = +  ctRegex!(`^(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])(?P<languages>(?:\s+[a-z]{2}(?:,|$))+)`, "mg");  static src_fn                                         =    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)$`); diff --git a/org/output_sisupod.org b/org/output_sisupod.org index 398af1c..a267384 100644 --- a/org/output_sisupod.org +++ b/org/output_sisupod.org @@ -63,9 +63,8 @@ debug(asserts) {  mixin SiSUoutputRgxInit;  string pwd = doc_matters.environment["pwd"];  auto src_path_info = doc_matters.src_path_info; -string lng = doc_matters.language;  auto pth_sisudoc_src = doc_matters.src_path_info; -auto pths_sisupod = SiSUpathsSisupods!()(src_path_info, lng); +auto pths_sisupod = SiSUpathsSisupods!()();  mixin SiSUlanguageCodes;  auto lang = Lang();  static auto rgx = Rgx(); @@ -95,8 +94,8 @@ if (doc_matters.opt_action.source) {    if (!exists(pths_sisupod.image_root(doc_matters.source_filename).filesystem_open_zpod)) {      pths_sisupod.image_root(doc_matters.source_filename).filesystem_open_zpod.mkdirRecurse;    } -  if (!exists(pths_sisupod.doc_lng(doc_matters.source_filename).filesystem_open_zpod)) { -    pths_sisupod.doc_lng(doc_matters.source_filename).filesystem_open_zpod.mkdirRecurse; +  if (!exists(pths_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod)) { +    pths_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod.mkdirRecurse;    }  }  #+END_SRC @@ -108,7 +107,7 @@ if (doc_matters.opt_action.source) {  debug(sisupod) {    writeln(__LINE__, ": ",      doc_matters.source_filename, " -> ", -    pths_sisupod.fn_doc(doc_matters.source_filename).filesystem_open_zpod +    pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod    );  }  auto zip = new ZipArchive(); @@ -157,9 +156,9 @@ auto fn_sisupod = pths_sisupod.sisupod_filename(doc_matters.source_filename).zpo    }  } { /+ TODO bundle primary file +/    auto fn_src_in = doc_matters.source_filename; -  auto fn_src_out_sisupod_zip_base = pths_sisupod.fn_doc(doc_matters.source_filename).zpod.to!string; -  auto fn_src_out_filesystem = pths_sisupod.fn_doc(doc_matters.source_filename).filesystem_open_zpod.to!string; // needed without root path: -  auto fn_src_out_inside_pod = pths_sisupod.fn_doc(doc_matters.source_filename).zpod.to!string; // needed without root path: +  auto fn_src_out_sisupod_zip_base = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).zpod.to!string; +  auto fn_src_out_filesystem = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod.to!string; // needed without root path: +  auto fn_src_out_inside_pod = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).zpod.to!string; // needed without root path:    string[] filelist_src_out_sisupod_arr;    string[] filelist_src_zpod_arr;    if (exists(fn_src_in)) { @@ -190,6 +189,7 @@ auto fn_sisupod = pths_sisupod.sisupod_filename(doc_matters.source_filename).zpo            pths_sisupod.fn_doc_insert(              doc_matters.source_filename,              insert_file, +            doc_matters.language,            ).zpod          );        } @@ -198,11 +198,13 @@ auto fn_sisupod = pths_sisupod.sisupod_filename(doc_matters.source_filename).zpo          pths_sisupod.fn_doc_insert(            doc_matters.source_filename,            insert_file, +          doc_matters.language,          ).zpod.to!string;        auto fn_src_out_filesystem =          pths_sisupod.fn_doc_insert(            doc_matters.source_filename,            insert_file, +          doc_matters.language,          ).filesystem_open_zpod.to!string;        if (exists(fn_src_in)) {          if (doc_matters.opt_action.source) { diff --git a/org/sdp.org b/org/sdp.org index fb00a4b..32e9833 100644 --- a/org/sdp.org +++ b/org/sdp.org @@ -26,11 +26,9 @@ struct Version {    int minor;    int patch;  } -enum ver = Version(0, 20, 2); +enum ver = Version(0, 21, 0);  #+END_SRC -#+NAME: version_txt -  ** compilation restrictions (supported compilers)  http://dlang.org/spec/version.html#predefined-versions @@ -80,9 +78,9 @@ void main(string[] args) {    <<sdp_args>>    <<sdp_env>>    <<sdp_do_selected>> -  if (fns_src.length > 0) { -    foreach(fn_src; fns_src) { -      if (!empty(fn_src)) { +  if (_manifests.length > 1) { // _manifests[0] is dummy element used in initialization to be removed +    foreach(manifest; _manifests[1..$]) { +      if (!empty(manifest.src_fn)) {          <<sdp_each_file_do_scope>>          <<sdp_abstraction>>          <<sdp_each_file_do_debugs_checkdoc>> @@ -193,7 +191,6 @@ mixin outputHub;  #+NAME: sdp_args  #+BEGIN_SRC d -string[] fns_src;  string flag_action;  string arg_unrecognized;  enum dAM { abstraction, matters } @@ -484,13 +481,21 @@ auto _opt_action = OptActions();  #+NAME: sdp_args  #+BEGIN_SRC d +auto _env = [ +  "pwd" : environment["PWD"], +  "home" : environment["HOME"], +]; +auto _manifest = PodManifest!()(); +auto _manifest_plus = PodManifestAndSrcFile!()(_opt_action, _env); +auto _manifests = [ _manifest_plus ];  foreach(arg; args[1..$]) { -  auto _manifest = PodManifest!()(arg); +  _manifest = PodManifest!()(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 +    _manifests ~= PodManifestAndSrcFile!()(_opt_action, _env, arg, arg); // gather input markup source file names for processing    } else if (_manifest.pod_manifest_file_with_path) { +    string contents_location_raw_;      string contents_location_;      string sisudoc_txt_ = _manifest.pod_manifest_file_with_path;      enforce( @@ -500,7 +505,7 @@ foreach(arg; args[1..$]) {      );      try {        if (exists(sisudoc_txt_)) { -        contents_location_ = sisudoc_txt_.readText; +        contents_location_raw_ = sisudoc_txt_.readText;        }      }      catch (ErrnoException ex) { @@ -508,6 +513,15 @@ foreach(arg; args[1..$]) {      catch (FileException ex) {        // Handle errors      } +    if (contents_location_raw_.match(rgx.pod_content_location)) { // (file name followed by language codes \n)+ +      foreach (m; contents_location_raw_.matchAll(rgx.pod_content_location)) { +        foreach (n; m.captures[2].matchAll(rgx.language_codes)) { +          contents_location_ ~= "media/text/" ~ n.captures[1].to!string ~ "/" ~ m.captures[1].to!string ~ "\n"; +        } +      } +    } else { // (file name with path \n)+ +      contents_location_ = contents_location_raw_; +    }      auto contents_locations_arr =        (cast(char[]) contents_location_).split;      auto tmp_dir_ = (sisudoc_txt_).dirName.array; @@ -521,7 +535,9 @@ foreach(arg; args[1..$]) {        if (_opt_action.languages_set[0] == "all"          || (contents_location_pth_).match(lang_rgx_)        ) { -        fns_src ~= (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(char[]); +        auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(string); +        _manifest_plus = PodManifestAndSrcFile!()(_opt_action, _env, arg, _fns, contents_locations_arr); +        _manifests ~= _manifest_plus; // TODO how to capture?        }      }    } else if (arg.match(rgx.src_pth_zip)) { @@ -532,26 +548,16 @@ foreach(arg; args[1..$]) {  }  #+END_SRC -**** environment                                             :environment: - -#+NAME: sdp_env -#+BEGIN_SRC d -auto env = [ -  "pwd" : environment["PWD"], -  "home" : environment["HOME"], -]; -#+END_SRC -  **** TODO config files (load & read) (so far only SDLang)   :config:files:  #+NAME: sdp_conf_files  #+BEGIN_SRC d -auto sdl_root_config_share = configRead!()("config_share", env); -auto sdl_root_config_local = configRead!()("config_local", env); +auto sdl_root_config_share = configRead!()("config_share", _env); +auto sdl_root_config_local = configRead!()("config_local", _env);  auto conf_files_composite_make = confFilesSDLtoStruct!()(sdl_root_config_share, sdl_root_config_local);  #+END_SRC -** 2a. actions independed of processing files +** 2a. actions independent of processing files  #+NAME: sdp_do_selected  #+BEGIN_SRC d  if (!(_opt_action.skip_output)) { @@ -578,14 +584,14 @@ scope(failure) {      stderr.writefln(        "~ document run failure ~ (%s  v%s)\n\t%s",        __VENDOR__, __VERSION__, -      fn_src +      src_fn      );    }  }  enforce( -  fn_src.match(rgx.src_pth_types), +  manifest.src_fn.match(rgx.src_pth_types),    "not a sisu markup filename: «" ~ -  fn_src ~ "»" +  manifest.src_fn ~ "»"  );  #+END_SRC @@ -597,7 +603,7 @@ enforce(  #+NAME: sdp_abstraction  #+BEGIN_SRC d -auto t = SiSUabstraction!()(fn_src, _opt_action, env); +auto t = SiSUabstraction!()(manifest, _opt_action, _env);  static assert(!isTypeTuple!(t));  static assert(t.length==2);  auto doc_abstraction = t[dAM.abstraction]; @@ -647,10 +653,10 @@ scope(exit) {    debug(checkdoc) {      writefln(        "processed file: %s", -      fn_src +      manifest.src_fn      );    } -  destroy(fn_src); +  destroy(manifest);  }  #+END_SRC @@ -674,10 +680,10 @@ template SiSUabstraction() {    enum makeMeta { make, meta }    enum docAbst  { doc_abstraction, section_keys, segnames, segnames_0_4, images }    static auto rgx = Rgx(); -  auto SiSUabstraction(Fn,O,E)( -    Fn fn_src, +  auto SiSUabstraction(M,O,E)( +    M _manifest,      O _opt_action, -    E env, +    E _env,    ){      <<sdp_conf_files>>      <<sdp_each_file_do_read_and_split_sisu_markup_file_content_into_header_and_body>> @@ -694,12 +700,12 @@ template SiSUabstraction() {  ** 1. (a) _read in raw file_ (b) split content into: _doc header & doc content_  - [[./meta_read_source_files.org][meta_read_source_files]] -- read in the source marked up document and +- read in the _marked up source document_ and    - split the document into:      - document header      - document body    - if a master document make a list of insert files -- return a tuple of: +- _return a tuple of_:    - header    - body    - insert file list @@ -712,7 +718,7 @@ debug(steps) {    writeln(__LINE__, ":", __FILE__, ": step1 commence → (get document header & body & insert files)");  }  auto _header_body_inserts = -  SiSUrawMarkupContent!()(fn_src); +  SiSUrawMarkupContent!()(_manifest.src_fn);  static assert(!isTypeTuple!(_header_body_inserts));  static assert(_header_body_inserts.length==3);  debug(steps) { @@ -728,12 +734,12 @@ debug(header_and_body) {  ** 2. _document metadata_ & _make instructions_       :doc:header:metadata:make:  - [[./meta_conf_make_meta.org][meta_conf_make_meta]] -- read document header, split into: +- read _document header_, split into:    - metadata    - make instructions  - read config files    - consolidate make instructions -- return tuple of: +- _return tuple of_:    - document metadata    - make instructions (from configuration files & document header make      instructions) @@ -756,7 +762,7 @@ debug(steps) {  - prepare the document abstraction used in downstream processing -- return tuple of: +- _return tuple of_:    - document abstraction (_the_document_ or doc_abstraction)    - document abstraction keys      - (head, toc, body, endnotes, glossary, bibliography, bookindex, blurb, @@ -817,25 +823,29 @@ struct DocumentMatters {      return _k;    }    auto source_filename() { -    string _k = fn_src; +    string _k = _manifest.src_fn;      return _k;    }    auto src_path_info() { -    string _pwd = env["pwd"]; -    auto _k = SiSUpathsSRC!()(_pwd, fn_src); +    string _pwd = _env["pwd"]; +    auto _k = SiSUpathsSRC!()(_pwd, _manifest.src_fn);      return _k;    }    auto opt_action() { +    /+ getopt options, commandline instructions, raw +     - processing instructions --epub --html etc. +     - command line config instructions --output-path +    +/      auto _k = _opt_action;      return _k;    }    auto environment() { -    auto _k = env; +    auto _k = _env;      return _k;    }    auto language() {      string _k; -    if (auto m = fn_src.match(rgx.language_code_and_filename)) { +    if (auto m = (_manifest.src_fn).match(rgx.language_code_and_filename)) {        _k = m.captures[1];      } else {        _k = "en"; @@ -846,6 +856,15 @@ struct DocumentMatters {      string[] _k = _header_body_inserts[headBody.insert_filelist];      return _k;    } +  auto pod_manifest() { +    /+ extensive information on +     - source processing paths +     - repetition of opt_action with additional processing, including +       - output path if any +    +/ +    auto _k = _manifest; +    return _k; +  }    auto image_list() {      auto _k = _images;      return _k; diff --git a/src/sdp/meta/metadoc.d b/src/sdp/meta/metadoc.d index f36af09..b028f8d 100644 --- a/src/sdp/meta/metadoc.d +++ b/src/sdp/meta/metadoc.d @@ -31,13 +31,13 @@ template SiSUabstraction() {    enum makeMeta { make, meta }    enum docAbst  { doc_abstraction, section_keys, segnames, segnames_0_4, images }    static auto rgx = Rgx(); -  auto SiSUabstraction(Fn,O,E)( -    Fn fn_src, +  auto SiSUabstraction(M,O,E)( +    M _manifest,      O _opt_action, -    E env, +    E _env,    ){ -    auto sdl_root_config_share = configRead!()("config_share", env); -    auto sdl_root_config_local = configRead!()("config_local", env); +    auto sdl_root_config_share = configRead!()("config_share", _env); +    auto sdl_root_config_local = configRead!()("config_local", _env);      auto conf_files_composite_make = confFilesSDLtoStruct!()(sdl_root_config_share, sdl_root_config_local);      /+ ↓ read file (filename with path) +/      /+ ↓ file tuple of header and content +/ @@ -45,7 +45,7 @@ template SiSUabstraction() {        writeln(__LINE__, ":", __FILE__, ": step1 commence → (get document header & body & insert files)");      }      auto _header_body_inserts = -      SiSUrawMarkupContent!()(fn_src); +      SiSUrawMarkupContent!()(_manifest.src_fn);      static assert(!isTypeTuple!(_header_body_inserts));      static assert(_header_body_inserts.length==3);      debug(steps) { @@ -106,25 +106,29 @@ template SiSUabstraction() {          return _k;        }        auto source_filename() { -        string _k = fn_src; +        string _k = _manifest.src_fn;          return _k;        }        auto src_path_info() { -        string _pwd = env["pwd"]; -        auto _k = SiSUpathsSRC!()(_pwd, fn_src); +        string _pwd = _env["pwd"]; +        auto _k = SiSUpathsSRC!()(_pwd, _manifest.src_fn);          return _k;        }        auto opt_action() { +        /+ getopt options, commandline instructions, raw +         - processing instructions --epub --html etc. +         - command line config instructions --output-path +        +/          auto _k = _opt_action;          return _k;        }        auto environment() { -        auto _k = env; +        auto _k = _env;          return _k;        }        auto language() {          string _k; -        if (auto m = fn_src.match(rgx.language_code_and_filename)) { +        if (auto m = (_manifest.src_fn).match(rgx.language_code_and_filename)) {            _k = m.captures[1];          } else {            _k = "en"; @@ -135,6 +139,15 @@ template SiSUabstraction() {          string[] _k = _header_body_inserts[headBody.insert_filelist];          return _k;        } +      auto pod_manifest() { +        /+ extensive information on +         - source processing paths +         - repetition of opt_action with additional processing, including +           - output path if any +        +/ +        auto _k = _manifest; +        return _k; +      }        auto image_list() {          auto _k = _images;          return _k; diff --git a/src/sdp/meta/rgx.d b/src/sdp/meta/rgx.d index 70f48bb..73f7bfe 100644 --- a/src/sdp/meta/rgx.d +++ b/src/sdp/meta/rgx.d @@ -197,10 +197,13 @@ static template SiSUrgxInit() {      static nbsp_and_space                                 = ctRegex!(` [ ]`, "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_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`);      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._-]+/sisupod[.]manifest)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`); +    static pod_content_location                           = +      ctRegex!(`^(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])(?P<languages>(?:\s+[a-z]{2}(?:,|$))+)`, "mg");      static src_fn                                         =        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)$`); diff --git a/src/sdp/output/paths_source.d b/src/sdp/output/paths_source.d index de14b23..c22efe0 100644 --- a/src/sdp/output/paths_source.d +++ b/src/sdp/output/paths_source.d @@ -15,11 +15,11 @@ template PodManifest() {    mixin SiSUrgxInit;    static auto rgx = Rgx();    auto PodManifest(P)( -    P   _pth, +    P   _pth = "",    ) {      struct ManifestFile_ {        auto pod_manifest_filename() { -        string _manifest_file = "sisudoc.txt"; +        string _manifest_file = "sisupod.manifest";          return _manifest_file;        }        auto pod_manifest_path() { @@ -30,8 +30,7 @@ template PodManifest() {          } else if (_pth.match(rgx.src_pth_contents)          && (_pth.isFile)) {            _manifest_path = dirName(_pth); -        } else { -          // _manifest_path = ""; +        // } else { // _manifest_path = "";          }          return _manifest_path;        } @@ -43,6 +42,105 @@ template PodManifest() {      return ManifestFile_();    }  } +template PodManifestAndSrcFile() { +  mixin SiSUrgxInit; +  static auto rgx = Rgx(); +  auto PodManifestAndSrcFile(O,E,P,F)( +    O   _opt_actions, +    E   _env, +    P   _pth                   = "", +    F   _fns                   = "", +    char[][] _manifest_fn_list = [[]], +  ) { +    auto _manifest = PodManifest!()(_pth); +    struct ManifestFilePlus_ { +      auto pwd() { +        return _env["pwd"]; +      } +      auto home() { +        return _env["home"]; +      } +      auto opt_action() { +        return _opt_actions; +      } +      auto is_pod() { +        auto _is_pod = (_manifest.pod_manifest_path.length > 0) ? true : false; +        return _is_pod; +      } +      auto pod_manifest_list_of_filenames() { +        return _manifest_fn_list; +      } +      auto pod_manifest_list_of_languages() { +        string[] _lngs; +        foreach (filename_; pod_manifest_list_of_filenames) { +          string _k = "en"; +          if (auto m = (filename_).match(rgx.language_code_and_filename)) { +            _k = m.captures[1].to!string; +          } +          _lngs ~= _k; // all the languages from the manifest list of filenames with paths +        } +        return _lngs; +      } +      auto pod_manifest_filename() { +        return _manifest.pod_manifest_filename; +      } +      auto pod_manifest_path() { +        return _manifest.pod_manifest_path; +      } +      auto pod_manifest_file_with_path() { +        return _manifest.pod_manifest_file_with_path; +      } +      auto pod_config_dirs() {                              // TODO +        string[] _config_dirs; +        return _config_dirs; +      } +      auto pod_image_dirs() {                               // TODO +        string[] _image_dirs; +        return _image_dirs; +      } +      auto src_fn() { +        return _fns; +      } +      auto src_lng() { +        string _k; +        if (auto m = (src_fn).match(rgx.language_code_and_filename)) { +          _k = m.captures[1]; +        } else { +          _k = "en"; +        } +        return _k; +      } +      auto output_path() { +        auto _output_path = pwd; +        if ((_opt_actions.output_dir_set.length > 0) +          && isValidPath(_opt_actions.output_dir_set) +        ) { +          _output_path = asNormalizedPath(_opt_actions.output_dir_set).array; +          if (!exists(_output_path)) { +            _output_path.mkdirRecurse; +          } +          assert(_output_path.isDir); +        } +        return _output_path; +      } +      auto src_config_dirs() {                              // TODO +        string[] _config_dirs; +        if (is_pod) { +        } else { +        } +        return _config_dirs; +      } +      auto src_image_dirs() {                               // TODO +        string[] _image_dirs; +        if (is_pod) { +        } else { +        } +        return _image_dirs; +      } +    } +    return ManifestFilePlus_(); +  } +}  template ConfigFilePaths() {    mixin SiSUrgxInit;    static auto rgx = Rgx(); @@ -174,10 +272,7 @@ template SiSUpathsSisupods() {    string _base_dir_pod = "sisupod";    string _base_dir_doc = "sisudoc";    string _suffix = ".zip"; -  auto SiSUpathsSisupods(Ps,Lng)( -    Ps  src_pth_info, -    Lng lng, -  ) { +  auto SiSUpathsSisupods()() {      struct _PodPaths {        string base_filename_(string fn_src) {          auto pth = fn_src.baseName.stripExtension; @@ -332,7 +427,7 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto doc_lng(string fn_src) { +      auto doc_lng(string fn_src, string lng) {          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; @@ -378,10 +473,10 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto fn_doc(string fn_src) { +      auto fn_doc(string fn_src, string lng) {          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; +        auto pth_1_ = doc_lng(fn_src, lng).zpod.chainPath(fn_src.baseName).array; +        auto pth_2_ = doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_src.baseName).array;          struct _pods {            auto zpod() {              return pth_1_; @@ -393,10 +488,10 @@ template SiSUpathsSisupods() {          }          return _pods();        } -      auto fn_doc_insert(string fn_src, string fn_insert) { +      auto fn_doc_insert(string fn_src, string fn_insert, string lng) {          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; +        auto pth_1_ = doc_lng(fn_src, lng).zpod.chainPath(fn_insert.baseName).array; +        auto pth_2_ = doc_lng(fn_src, lng).filesystem_open_zpod.chainPath(fn_insert.baseName).array;          struct _pods {            auto zpod() {              return pth_1_; diff --git a/src/sdp/output/rgx.d b/src/sdp/output/rgx.d index c9f0175..9daaa3b 100644 --- a/src/sdp/output/rgx.d +++ b/src/sdp/output/rgx.d @@ -16,10 +16,13 @@ static template SiSUoutputRgxInit() {      static nbsp_and_space                                 = ctRegex!(` [ ]`, "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_contents                               = ctRegex!(`^(?P<path>[/]?(?:[a-zA-Z0-9._-]+/)*)(?P<filename>[a-zA-Z0-9._-]+)/sisupod[.]manifest$`);      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._-]+/sisupod[.]manifest)|(?P<filezip>[a-zA-Z0-9._-]+[.]zip))$`); +    static pod_content_location                           = +      ctRegex!(`^(?P<filename>[a-zA-Z0-9._-]+[.]ss[tm])(?P<languages>(?:\s+[a-z]{2}(?:,|$))+)`, "mg");      static src_fn                                         =        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)$`); diff --git a/src/sdp/output/source_sisupod.d b/src/sdp/output/source_sisupod.d index 6e06667..106c419 100644 --- a/src/sdp/output/source_sisupod.d +++ b/src/sdp/output/source_sisupod.d @@ -17,9 +17,8 @@ template SiSUpod() {      mixin SiSUoutputRgxInit;      string pwd = doc_matters.environment["pwd"];      auto src_path_info = doc_matters.src_path_info; -    string lng = doc_matters.language;      auto pth_sisudoc_src = doc_matters.src_path_info; -    auto pths_sisupod = SiSUpathsSisupods!()(src_path_info, lng); +    auto pths_sisupod = SiSUpathsSisupods!()();      mixin SiSUlanguageCodes;      auto lang = Lang();      static auto rgx = Rgx(); @@ -46,14 +45,14 @@ template SiSUpod() {          if (!exists(pths_sisupod.image_root(doc_matters.source_filename).filesystem_open_zpod)) {            pths_sisupod.image_root(doc_matters.source_filename).filesystem_open_zpod.mkdirRecurse;          } -        if (!exists(pths_sisupod.doc_lng(doc_matters.source_filename).filesystem_open_zpod)) { -          pths_sisupod.doc_lng(doc_matters.source_filename).filesystem_open_zpod.mkdirRecurse; +        if (!exists(pths_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod)) { +          pths_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod.mkdirRecurse;          }        }        debug(sisupod) {          writeln(__LINE__, ": ",            doc_matters.source_filename, " -> ", -          pths_sisupod.fn_doc(doc_matters.source_filename).filesystem_open_zpod +          pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod          );        }        auto zip = new ZipArchive(); @@ -102,9 +101,9 @@ template SiSUpod() {          }        } { /+ TODO bundle primary file +/          auto fn_src_in = doc_matters.source_filename; -        auto fn_src_out_sisupod_zip_base = pths_sisupod.fn_doc(doc_matters.source_filename).zpod.to!string; -        auto fn_src_out_filesystem = pths_sisupod.fn_doc(doc_matters.source_filename).filesystem_open_zpod.to!string; // needed without root path: -        auto fn_src_out_inside_pod = pths_sisupod.fn_doc(doc_matters.source_filename).zpod.to!string; // needed without root path: +        auto fn_src_out_sisupod_zip_base = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).zpod.to!string; +        auto fn_src_out_filesystem = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).filesystem_open_zpod.to!string; // needed without root path: +        auto fn_src_out_inside_pod = pths_sisupod.fn_doc(doc_matters.source_filename, doc_matters.language).zpod.to!string; // needed without root path:          string[] filelist_src_out_sisupod_arr;          string[] filelist_src_zpod_arr;          if (exists(fn_src_in)) { @@ -135,6 +134,7 @@ template SiSUpod() {                  pths_sisupod.fn_doc_insert(                    doc_matters.source_filename,                    insert_file, +                  doc_matters.language,                  ).zpod                );              } @@ -143,11 +143,13 @@ template SiSUpod() {                pths_sisupod.fn_doc_insert(                  doc_matters.source_filename,                  insert_file, +                doc_matters.language,                ).zpod.to!string;              auto fn_src_out_filesystem =                pths_sisupod.fn_doc_insert(                  doc_matters.source_filename,                  insert_file, +                doc_matters.language,                ).filesystem_open_zpod.to!string;              if (exists(fn_src_in)) {                if (doc_matters.opt_action.source) { diff --git a/src/sdp/sdp.d b/src/sdp/sdp.d index af3a0a0..34f11d9 100755 --- a/src/sdp/sdp.d +++ b/src/sdp/sdp.d @@ -39,7 +39,6 @@ void main(string[] args) {    mixin SiSUbiblio;    mixin SiSUrgxInitFlags;    mixin outputHub; -  string[] fns_src;    string flag_action;    string arg_unrecognized;    enum dAM { abstraction, matters } @@ -299,13 +298,21 @@ void main(string[] args) {      }    }    auto _opt_action = OptActions(); +  auto _env = [ +    "pwd" : environment["PWD"], +    "home" : environment["HOME"], +  ]; +  auto _manifest = PodManifest!()(); +  auto _manifest_plus = PodManifestAndSrcFile!()(_opt_action, _env); +  auto _manifests = [ _manifest_plus ];    foreach(arg; args[1..$]) { -    auto _manifest = PodManifest!()(arg); +    _manifest = PodManifest!()(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 +      _manifests ~= PodManifestAndSrcFile!()(_opt_action, _env, arg, arg); // gather input markup source file names for processing      } else if (_manifest.pod_manifest_file_with_path) { +      string contents_location_raw_;        string contents_location_;        string sisudoc_txt_ = _manifest.pod_manifest_file_with_path;        enforce( @@ -315,7 +322,7 @@ void main(string[] args) {        );        try {          if (exists(sisudoc_txt_)) { -          contents_location_ = sisudoc_txt_.readText; +          contents_location_raw_ = sisudoc_txt_.readText;          }        }        catch (ErrnoException ex) { @@ -323,6 +330,15 @@ void main(string[] args) {        catch (FileException ex) {          // Handle errors        } +      if (contents_location_raw_.match(rgx.pod_content_location)) { // (file name followed by language codes \n)+ +        foreach (m; contents_location_raw_.matchAll(rgx.pod_content_location)) { +          foreach (n; m.captures[2].matchAll(rgx.language_codes)) { +            contents_location_ ~= "media/text/" ~ n.captures[1].to!string ~ "/" ~ m.captures[1].to!string ~ "\n"; +          } +        } +      } else { // (file name with path \n)+ +        contents_location_ = contents_location_raw_; +      }        auto contents_locations_arr =          (cast(char[]) contents_location_).split;        auto tmp_dir_ = (sisudoc_txt_).dirName.array; @@ -336,7 +352,9 @@ void main(string[] args) {          if (_opt_action.languages_set[0] == "all"            || (contents_location_pth_).match(lang_rgx_)          ) { -          fns_src ~= (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(char[]); +          auto _fns = (((tmp_dir_).chainPath(contents_location_pth_)).array).to!(string); +          _manifest_plus = PodManifestAndSrcFile!()(_opt_action, _env, arg, _fns, contents_locations_arr); +          _manifests ~= _manifest_plus; // TODO how to capture?          }        }      } else if (arg.match(rgx.src_pth_zip)) { @@ -345,16 +363,13 @@ void main(string[] args) {        arg_unrecognized ~= " " ~ arg;      }    } -  auto env = [ -    "pwd" : environment["PWD"], -    "home" : environment["HOME"], -  ]; +      if (!(_opt_action.skip_output)) {      outputHubOp!()(_opt_action);    } -  if (fns_src.length > 0) { -    foreach(fn_src; fns_src) { -      if (!empty(fn_src)) { +  if (_manifests.length > 1) { // _manifests[0] is dummy element used in initialization to be removed +    foreach(manifest; _manifests[1..$]) { +      if (!empty(manifest.src_fn)) {          scope(success) {            debug(checkdoc) {              writefln( @@ -369,16 +384,16 @@ void main(string[] args) {              stderr.writefln(                "~ document run failure ~ (%s  v%s)\n\t%s",                __VENDOR__, __VERSION__, -              fn_src +              src_fn              );            }          }          enforce( -          fn_src.match(rgx.src_pth_types), +          manifest.src_fn.match(rgx.src_pth_types),            "not a sisu markup filename: «" ~ -          fn_src ~ "»" +          manifest.src_fn ~ "»"          ); -        auto t = SiSUabstraction!()(fn_src, _opt_action, env); +        auto t = SiSUabstraction!()(manifest, _opt_action, _env);          static assert(!isTypeTuple!(t));          static assert(t.length==2);          auto doc_abstraction = t[dAM.abstraction]; @@ -401,10 +416,10 @@ void main(string[] args) {            debug(checkdoc) {              writefln(                "processed file: %s", -              fn_src +              manifest.src_fn              );            } -          destroy(fn_src); +          destroy(manifest);          }        } else {          /+ no recognized filename provided +/ diff --git a/views/version.txt b/views/version.txt index 4be6543..022ef80 100644 --- a/views/version.txt +++ b/views/version.txt @@ -4,7 +4,7 @@ struct Version {    int minor;    int patch;  } -enum ver = Version(0, 20, 2); +enum ver = Version(0, 21, 0);  version (Posix) {    version (DigitalMars) {    } else version (LDC) { | 
