/+
- Name: Spine, Doc Reform [a part of]
- Description: documents, structuring, processing, publishing, search
- static content generator
- Author: Ralph Amissah
[ralph.amissah@gmail.com]
- Copyright: (C) 2015 - 2024 Ralph Amissah, All Rights Reserved.
- License: AGPL 3 or later:
Spine (SiSU), a framework for document structuring, publishing and
search
Copyright (C) Ralph Amissah
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU AFERO General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
more details.
You should have received a copy of the GNU General Public License along with
this program. If not, see [https://www.gnu.org/licenses/].
If you have Internet connection, the latest version of the AGPL should be
available at these locations:
[https://www.fsf.org/licensing/licenses/agpl.html]
[https://www.gnu.org/licenses/agpl.html]
- Spine (by Doc Reform, related to SiSU) uses standard:
- docReform markup syntax
- standard SiSU markup syntax with modified headers and minor modifications
- docReform object numbering
- standard SiSU object citation numbering & system
- Homepages:
[https://www.doc_reform.org]
[https://www.sisudoc.org]
- Git
[https://git.sisudoc.org/projects/?p=software/spine.git;a=summary]
+/
/++
read configuration files
- read config files
meta_config_files.d
+/
module doc_reform.io_in.read_config_files;
@safe:
import
std.file,
std.path;
import
doc_reform.meta,
doc_reform.io_in.paths_source,
doc_reform.meta.rgx_files,
doc_reform.meta.rgx;
template readConfigSite() {
@system final auto readConfigSite(Cf,O,Cfg)(Cf _conf_file_details, O _opt_action, Cfg _cfg) {
mixin spineRgxIn;
static auto rgx = RgxI();
string conf_filename = "NONE";
string config_file_str;
string default_config_file_str = format(q"┃
flag:
act0: "--html"
act1: "--html --epub"
output:
path: "%s"
default:
language: "en"
papersize: "a4"
text_wrap: "80"
digest: "sha256"
webserv:
http: "%s"
host: "%s"
data_http: "%s"
data_host: "%s"
data_root_url: "%s"
data_root_path: "%s"
data_root_part: ""
images_root_part: "image"
cgi_search_form_title: "%s"
cgi_http: "%s"
cgi_host: "%s"
cgi_bin_url: "%s"
cgi_bin_subpath: "%s"
cgi_bin_path: "%s"
cgi_search_script: "%s"
cgi_port: ""
cgi_user: ""
cgi_action: "%s"
db_sqlite_path: "%s"
db_sqlite_filename: "%s"
db_pg_table: ""
db_pg_user: ""
┃",
_cfg.processing_path_doc_root, // doc root
_cfg.http_request_type, // http
_cfg.http_host, // host / domain
_cfg.http_request_type, // data "http" or "https"
_cfg.http_host, // data domain "localhost"
_cfg.www_url_doc_root, // data root url "http://locahost" "https://sisudoc.org"
_cfg.processing_path_doc_root, // data root path
_cfg.cgi_search_form_title, // cgi title // e.g. "≅ SiSU Spine search"
_cfg.http_request_type, // cgi http
_cfg.http_host, // cgi host
_cfg.cgi_url_root, // cgi bin url
_cfg.cgi_bin_subpath, // cgi bin path
_cfg.cgi_bin_root, // cgi bin path
_cfg.cgi_filename, // cgi filename
_cfg.cgi_url_action, // cgi action
_cfg.db_sqlite_path, // sqlite db path
_cfg.db_sqlite_filename, // sqlite db filename
);
foreach(conf_fn; [_conf_file_details.config_filename_site]) {
foreach(pth; _conf_file_details.possible_config_path_locations.config_local_site) {
char[] conf_file;
conf_filename = conf_fn;
if (exists(pth)) {
auto f_attrib = pth.getLinkAttributes;
if (
_conf_file_details.possible_config_path_locations.config_local_site.length == 1
&& f_attrib.attrIsFile
) {
conf_file = pth.to!(char[]);
conf_filename = pth.baseName;
} else if (f_attrib.attrIsDir) {
conf_file = ((chainPath(pth.to!string, conf_fn)).asNormalizedPath).array;
conf_filename = conf_fn;
}
try {
if (exists(conf_file)) {
if (conf_file.getLinkAttributes.attrIsFile) {
if (_opt_action.vox_gt1 || _opt_action.debug_do) {
writeln("config file used: \"", conf_file, "\" (cli flag settings override config file's individual settings)");
}
config_file_str = conf_file.readText;
break;
}
}
} catch (ErrnoException ex) {
} catch (FileException ex) {
}
}
}
if (config_file_str.length > 0) { break; }
}
if (config_file_str.length > 0) {
import dyaml;
Node yaml_root;
try {
yaml_root = Loader.fromString(config_file_str).load();
} catch (Throwable) {
import std.stdio;
writeln("ERROR failed to read config file content, not parsed as yaml, program default used");
conf_filename = "VIRTUAL";
config_file_str = default_config_file_str;
}
}
if (config_file_str.length == 0) { /+ use dummy default config file +/
// writeln("WARNING config file NOT found, default provided");
conf_filename = "VIRTUAL";
config_file_str = default_config_file_str;
}
struct _ConfContent {
string filename() {
return conf_filename;
}
string filetype() {
string _ft = "";
if (content.match(rgx.yaml_config)) {
_ft = "yaml";
}
return _ft;
}
string content() {
return config_file_str;
}
}
return _ConfContent();
}
}
static template readConfigDoc() {
import
std.file,
std.path;
import
doc_reform.meta,
doc_reform.io_in.paths_source,
doc_reform.meta.rgx_files,
doc_reform.meta.rgx;
@system final auto readConfigDoc(M,E)(M _manifested, E _env) {
mixin spineRgxIn;
static auto rgx = RgxI();
mixin spineRgxFiles;
static auto rgx_files = RgxFiles();
string config_file_str;
string conf_filename = "NONE";
auto _conf_file_details = configFilePaths!()(_manifested, _env);
string[] possible_config_path_locations = _conf_file_details.possible_config_path_locations.dr_document_make;
foreach(conf_fn; [_conf_file_details.config_filename_document]) {
foreach(pth; possible_config_path_locations) {
char[] conf_file = ((chainPath(pth.to!string, conf_fn)).asNormalizedPath).array;
conf_filename = conf_fn;
if (config_file_str.length > 0) {
break;
}
try {
if (exists(conf_file)) {
if (conf_file.getLinkAttributes.attrIsFile) {
config_file_str = conf_file.readText;
break;
}
}
} catch (ErrnoException ex) {
} catch (FileException ex) {
}
}
if (config_file_str.length > 0) { break; }
}
struct _ConfContent {
string filename() {
return conf_filename;
}
string content() {
return config_file_str;
}
string filetype() {
string _ft = "";
if (content.match(rgx.yaml_config)) {
_ft = "yaml";
}
return _ft;
}
}
return _ConfContent();
}
}
static template configReadSiteYAML() {
import
std.file,
std.path;
import
doc_reform.meta,
doc_reform.io_in.paths_source,
doc_reform.meta.rgx_files,
doc_reform.meta.rgx;
final YAMLDocument configReadSiteYAML(M,E)(M _manifested, E _env) {
string _configuration = configReadInSiteYAML!()(_manifested, _env);
auto _conf_file_details = configFilePaths!()(_manifested, _env);
string _conf_yaml_fn = _conf_file_details.config_filename_site;
YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);
return _yaml_conf;
}
}
static template configReadDocYAML() {
import
std.file,
std.path;
import
doc_reform.meta,
doc_reform.io_in.paths_source;
final YAMLDocument configReadDocYAML(M,E)(M _manifested, E _env) {
string _configuration = configReadInDocYAML!()(_manifested, _env);
auto _conf_file_details = configFilePaths!()(_manifested, _env);
string _conf_yaml_fn = _conf_file_details.config_filename_document;
YAMLDocument _yaml_conf = configYAML!()(_configuration, _conf_yaml_fn);
return _yaml_conf;
}
}