aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/sisudoc
diff options
context:
space:
mode:
Diffstat (limited to 'src/sisudoc')
-rw-r--r--src/sisudoc/outputs/io_out/xmls.d217
1 files changed, 85 insertions, 132 deletions
diff --git a/src/sisudoc/outputs/io_out/xmls.d b/src/sisudoc/outputs/io_out/xmls.d
index c97a7e3..aba0e4f 100644
--- a/src/sisudoc/outputs/io_out/xmls.d
+++ b/src/sisudoc/outputs/io_out/xmls.d
@@ -174,51 +174,36 @@ template outputXHTMLs() {
.replaceAll(rgx.nbsp_char, " ");
return _txt;
}
+ /+ ↓ a group's line-leading indent and bullet markers ("_1 ", "_* ", "_2* ",
+ "_0_1 "), then the escaping and the line breaks.
+ .
+ The markers are anchored to the start of a line, so they must be read while
+ the text still has lines: special_characters_text turns the line separator
+ into <br /> and takes the newlines with it, after which "^" matches only at
+ the start of the object and every later marker is printed as text. So the
+ markers go first, into a private-use codepoint that the escaping leaves
+ alone, and that becomes a no-break space after it. U+E003, beside the
+ U+E000 to U+E002 the markdown and typst writers use for their own
+ protection. Written &#160; rather than &nbsp;, because the epub is xml,
+ and xml defines no &nbsp; entity: in an epub it is a fatal error.
+ +/
string special_characters_breaks_indents_bullets(O)(
const O obj,
) {
- string _txt = special_characters_text(obj.text);
+ import std.array : replace, replicate;
+ import std.regex : Captures, replaceAll;
+ enum _sp = "";
+ string _txt = obj.text;
if (obj.metainfo.is_a == "group") {
_txt = (_txt)
- .replaceAll(rgx.grouped_para_indent_1,
- "&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_2,
- "&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_3,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_4,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_5,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_6,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_7,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_8,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_9,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_indent_hang, "&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet, "●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_1,
- "&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_2,
- "&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_3,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_4,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_5,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_6,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_7,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_8,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;")
- .replaceAll(rgx.grouped_para_bullet_indent_9,
- "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;●&nbsp;&nbsp;");
+ .replaceAll(rgx.grouped_para_indent_hang, _sp.replicate(2))
+ .replaceAll!((Captures!string m) => _sp.replicate(2 * m["indent"].to!int) ~ "●" ~ _sp.replicate(2))
+ (rgx.grouped_para_bullet_indent)
+ .replaceAll(rgx.grouped_para_bullet, "●" ~ _sp.replicate(2))
+ .replaceAll!((Captures!string m) => _sp.replicate(2 * m["indent"].to!int))
+ (rgx.grouped_para_indent);
}
+ _txt = special_characters_text(_txt).replace(_sp, "&#160;");
if (!(obj.metainfo.is_a == "code")) {
_txt = (_txt)
.replaceAll(rgx_xhtml.line_break, "<br />");
@@ -243,11 +228,12 @@ template outputXHTMLs() {
Markup goes to level 7; HTML stops at h6, and an <h7> is simply
not an element, so the deepest three markup levels share h6 and
are told apart by the "heading" class and their ocn. Level 0 is
- the document title, which is h1 in a segment of its own.
+ the document title, which is h1 in a segment of its own, in html
+ as in epub: there is no <h0> element.
+/
int _heading_element_level(O)(O obj, string _xml_type) {
int _lev = obj.metainfo.heading_lev_markup.to!int;
- if (_xml_type == "epub" && _lev == 0) { return 1; }
+ if (_lev < 1) { return 1; }
return (_lev > 6) ? 6 : _lev;
}
/+ ↓ the anchors an object carries.
@@ -278,43 +264,47 @@ template outputXHTMLs() {
}
return tags;
}
- string header_metadata(M)(
- M doc_matters,
+ /+ ↓ Dublin Core metas, shared by the html and epub head. A meta is written only
+ where there is a value for it.
+ +/
+ string dc_metadata(M)(
+ M doc_matters,
+ string _indent,
+ bool _generator,
) {
- string _publisher="Publisher"; // TODO
+ auto _meta = doc_matters.conf_make_meta.meta;
string o;
- o = format(q"┃<!-- spine DocReform header metadata -->
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <meta name="dc.title" content="%s" />
- <meta name="dc.author" content="%s" />
- <meta name="dc.publisher" content="%s" />
- <meta name="dc.date" content="%s" />
- <meta name="dc.date.created" content="%s" />
- <meta name="dc.date.issued" content="%syear" />
- <meta name="dc.date.available" content="%syear" />
- <meta name="dc.date.valid" content="%syear" />
- <meta name="dc.date.modified" content="%syear" />
- <meta name="dc.language" content="%s" />
- <meta name="dc.rights" content="%s" />
- <meta name="generator" content="%s" />
- <link rel="generator" href="%s" />
- <!-- spine DocReform header metadata -->┃",
- special_characters_plain(doc_matters.conf_make_meta.meta.title_full),
- special_characters_plain(doc_matters.conf_make_meta.meta.creator_author),
- _publisher,
- special_characters_plain_date(doc_matters.conf_make_meta.meta.date_published),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_created),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_issued),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_available),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_valid),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_modified),
- doc_matters.src.language_tag,
- special_characters_plain(doc_matters.conf_make_meta.meta.rights_copyright),
- doc_matters.opt.action.generated_by ? special_characters_plain(doc_matters.generator_program.name_and_version) : "",
- special_characters_plain(doc_matters.generator_program.url_home),
- );
+ void _dc(string _name, string _content) {
+ if (!(_content.empty)) {
+ o ~= _indent ~ "<meta name=\"" ~ _name ~ "\" content=\"" ~ _content ~ "\" />\n";
+ }
+ }
+ _dc("dc.title", special_characters_plain(_meta.title_full));
+ _dc("dc.author", special_characters_plain(_meta.creator_author));
+ _dc("dc.publisher", special_characters_plain(_meta.publisher));
+ _dc("dc.date", special_characters_plain_date(_meta.date_published));
+ _dc("dc.date.created", special_characters_plain_date(_meta.date_created));
+ _dc("dc.date.issued", special_characters_plain_date(_meta.date_issued));
+ _dc("dc.date.available", special_characters_plain_date(_meta.date_available));
+ _dc("dc.date.valid", special_characters_plain_date(_meta.date_valid));
+ _dc("dc.date.modified", special_characters_plain_date(_meta.date_modified));
+ _dc("dc.language", doc_matters.src.language_tag);
+ _dc("dc.rights", special_characters_plain(_meta.rights_copyright));
+ if (_generator) {
+ _dc("generator", special_characters_plain(doc_matters.generator_program.name_and_version));
+ }
+ o ~= _indent ~ "<link rel=\"generator\" href=\""
+ ~ special_characters_plain(doc_matters.generator_program.url_home) ~ "\" />";
return o;
}
+ string header_metadata(M)(
+ M doc_matters,
+ ) {
+ return "<!-- spine DocReform header metadata -->\n"
+ ~ " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n"
+ ~ dc_metadata(doc_matters, " ", doc_matters.opt.action.generated_by) ~ "\n"
+ ~ " <!-- spine DocReform header metadata -->";
+ }
string site_info_button(M)(
M doc_matters,
) {
@@ -444,14 +434,12 @@ template outputXHTMLs() {
o = format(q"┃<!DOCTYPE html>
<html>
<head>
- <meta http-equiv="Content-Type" content="text/plain; charset=UTF-8" />
<title>
%s%s
</title>
<!-- metadata -->
%s
<!-- metadata -->
- <link rel="generator" href="https://www.sisudoc.org/" />
<link rel="shortcut icon" href="%s../../image/dr.ico" />
<link href="%s" rel="stylesheet" />
</head>
@@ -483,67 +471,32 @@ template outputXHTMLs() {
string epub3_seg_head(M)(
M doc_matters,
) {
- string html_base = format(q"┃<!DOCTYPE html>
- <html>┃",
- );
string html_simple = format(q"┃<!DOCTYPE html>
- <html
- xmlns="http://www.w3.org/1999/xhtml"
- xmlns:epub="http://www.idpf.org/2007/ops"
- lang="%s" xml:lang="%s">┃",
- doc_matters.src.language_tag,
- doc_matters.src.language_tag,
- );
- string html_strict = format(q"┃<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml"
- xmlns:epub="http://www.idpf.org/2007/ops"
- lang="%s" xml:lang="%s">┃",
- doc_matters.src.language_tag,
- doc_matters.src.language_tag,
- );
- string o;
- o = format(q"┃%s
- <head>
- <title>
- %s%s
- </title>
- <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
- <meta name="dc.title" content="%s" />
- <meta name="dc.author" content="%s" />
- <meta name="dc.publisher" content="FIX" />
- <meta name="dc.date" content="%s" />
- <meta name="dc.date.created" content="%s" />
- <meta name="dc.date.issued" content="%s" />
- <meta name="dc.date.available" content="%s" />
- <meta name="dc.date.valid" content="%s" />
- <meta name="dc.date.modified" content="%s" />
- <meta name="dc.language" content="%s" />
- <meta name="dc.rights" content="%s" />
- <meta name="generator" content="%s" />
- <link rel="generator" href="%s" />
- <link rel="shortcut icon" href="../_dr/image/dr.ico" />
- <link rel="stylesheet" href="Styles/epub.css" type="text/css" id="main-css" />
- </head>
- <body lang="%s">
- <a id="top"></a>┃",
+<html
+ xmlns="http://www.w3.org/1999/xhtml"
+ xmlns:epub="http://www.idpf.org/2007/ops"
+ lang="%s" xml:lang="%s">┃",
+ doc_matters.src.language_tag,
+ doc_matters.src.language_tag,
+ );
+ string o;
+ o = format(q"┃%s
+<head>
+ <title>
+ %s%s
+ </title>
+ <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+ %s
+ <link rel="shortcut icon" href="../_dr/image/dr.ico" />
+ <link rel="stylesheet" href="Styles/epub.css" type="text/css" id="main-css" />
+</head>
+<body lang="%s">
+<a id="top"></a>┃",
html_simple,
special_characters_plain(doc_matters.conf_make_meta.meta.title_full),
(doc_matters.conf_make_meta.meta.creator_author.empty) ? ""
: ", " ~ special_characters_plain(doc_matters.conf_make_meta.meta.creator_author),
- special_characters_plain(doc_matters.conf_make_meta.meta.title_full),
- (doc_matters.conf_make_meta.meta.creator_author.empty) ? ""
- : ", " ~ special_characters_plain(doc_matters.conf_make_meta.meta.creator_author),
- special_characters_plain_date(doc_matters.conf_make_meta.meta.date_published),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_created),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_issued),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_available),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_valid),
- special_characters_plain(doc_matters.conf_make_meta.meta.date_modified),
- doc_matters.src.language_tag,
- special_characters_plain(doc_matters.conf_make_meta.meta.rights_copyright),
- special_characters_plain(doc_matters.generator_program.name_and_version),
- special_characters_plain(doc_matters.generator_program.url_home),
+ dc_metadata(doc_matters, " ", true),
doc_matters.src.language_tag,
);
return o;