template SiSUpod() {
  private import
    std.algorithm,
    std.array,
    std.container,
    std.exception,
    std.file,
    std.getopt,
    std.json,
    std.process,
    std.stdio,
    std.path,
    std.range,
    std.regex,
    std.string,
    std.traits,
    std.typecons,
    std.uni,
    std.utf,
    std.conv : to;
  import
    defaults,
    output_rgx,
    output_xhtmls;
  void SiSUpod(T)(T doc_matters) {
    debug(asserts){
      // static assert(is(typeof(doc_matters) == tuple));
    }
    mixin SiSUoutputRgxInit;
    mixin SiSUpaths;
    auto pth_sisupod = SiSUpodPaths();
    mixin SiSUlanguageCodes;
    auto lang = Lang();
    auto rgx = Rgx();
    assert (doc_matters.source_filename.match(rgx.src_fn));
    try {
      /+ create directory structure +/
      if (!exists(pth_sisupod.doc(doc_matters.source_filename))) {
        pth_sisupod.doc(doc_matters.source_filename).mkdirRecurse;
      }
      if (!exists(pth_sisupod.conf(doc_matters.source_filename))) {
        pth_sisupod.conf(doc_matters.source_filename).mkdirRecurse;
      }
      if (!exists(pth_sisupod.css(doc_matters.source_filename))) {
        pth_sisupod.css(doc_matters.source_filename).mkdirRecurse;
      }
      if (!exists(pth_sisupod.image(doc_matters.source_filename))) {
        pth_sisupod.image(doc_matters.source_filename).mkdirRecurse;
      }
      if (!exists(pth_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language))) {
        pth_sisupod.doc_lng(doc_matters.source_filename, doc_matters.language).mkdirRecurse;
      }
      debug(sisupod) {
        writeln(__LINE__, ": ",
          // doc_matters.environment["pwd"], "/",
            doc_matters.source_filename, " -> ",
          // doc_matters.environment["pwd"], "/",
            pth_sisupod.fn_doc(
              doc_matters.source_filename,
              doc_matters.language
        ));
      }
      if (exists(doc_matters.source_filename)) {
        copy(
          doc_matters.source_filename,
          pth_sisupod.fn_doc(
            doc_matters.source_filename,
            doc_matters.language
        ));
      }
      if (doc_matters.file_insert_list.length > 0) {
        foreach (insert_file; doc_matters.file_insert_list) {
          debug(sisupod) {
            writeln(
                insert_file, " -> ",
                pth_sisupod.fn_doc_insert(
                  doc_matters.source_filename,
                  insert_file,
                  doc_matters.language
            ));
          }
          if (exists(insert_file)) {
            insert_file.copy(
              pth_sisupod.fn_doc_insert(
                doc_matters.source_filename,
                insert_file,
                doc_matters.language
            ));
          }
        }
      }
      foreach (image; doc_matters.image_list) {
        debug(sisupod) {
          writeln(
              "_sisu/image/", image, " -> ",
              pth_sisupod.image(doc_matters.source_filename), "/", image
          );
        }
        if (exists("_sisu/image/"~ image)) {
          ("_sisu/image/"~ image).copy(
            (pth_sisupod.image(doc_matters.source_filename) ~ "/" ~ image)
          );
        }
      }
      
    }
    catch (ErrnoException ex) {
      // Handle error
    }
  }
}