diff options
Diffstat (limited to 'src/sisudoc')
| -rw-r--r-- | src/sisudoc/outputs/io_out/xmls.d | 217 |
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   rather than , because the epub is xml, + and xml defines no 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, - " ") - .replaceAll(rgx.grouped_para_indent_2, - " ") - .replaceAll(rgx.grouped_para_indent_3, - " ") - .replaceAll(rgx.grouped_para_indent_4, - " ") - .replaceAll(rgx.grouped_para_indent_5, - " ") - .replaceAll(rgx.grouped_para_indent_6, - " ") - .replaceAll(rgx.grouped_para_indent_7, - " ") - .replaceAll(rgx.grouped_para_indent_8, - " ") - .replaceAll(rgx.grouped_para_indent_9, - " ") - .replaceAll(rgx.grouped_para_indent_hang, " ") - .replaceAll(rgx.grouped_para_bullet, "● ") - .replaceAll(rgx.grouped_para_bullet_indent_1, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_2, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_3, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_4, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_5, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_6, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_7, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_8, - " ● ") - .replaceAll(rgx.grouped_para_bullet_indent_9, - " ● "); + .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, " "); 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; |
