summaryrefslogtreecommitdiff
path: root/support/dktools/hbconf.ctr
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
committerNorbert Preining <norbert@preining.info>2020-09-20 03:03:26 +0000
commit1f457376b478257b88d4a857f5ec1b6155442dd7 (patch)
tree2a06a60551dea362cf8cb0cb0ba66c78608717c4 /support/dktools/hbconf.ctr
parentac690ca29ad5bf8a5203a65fd6252f7b564f4727 (diff)
CTAN sync 202009200303
Diffstat (limited to 'support/dktools/hbconf.ctr')
-rw-r--r--support/dktools/hbconf.ctr422
1 files changed, 410 insertions, 12 deletions
diff --git a/support/dktools/hbconf.ctr b/support/dktools/hbconf.ctr
index 5cacff78f2..9eda380076 100644
--- a/support/dktools/hbconf.ctr
+++ b/support/dktools/hbconf.ctr
@@ -2,7 +2,7 @@
copyright owner = Dirk Krause
copyright year = 2013-xxxx
-license = bsd
+SPDX-License-Identifier: BSD-3-Clause
%% header
@@ -36,12 +36,11 @@ int
hbconf_process_line(hb_job_t *job, dkChar *il, int st);
/** Find template name for a node.
- @param job Job structure.
@param node Node to find template for.
@return Template file name on success, NULL on error.
*/
dkChar const *
-hbconf_node_template(hb_job_t *job, hb_node_t *node);
+hbconf_node_template(hb_node_t *node);
/** Find icon file name.
@param job Job structure.
@@ -92,6 +91,12 @@ hbconf_favicon(hb_node_t *node);
dkChar const *
hbconf_location(hb_node_t *node);
+/** Write external link character to elmbuf.
+ @param job Job structure containing elmchr and elmbuf.
+*/
+void
+hbconf_write_external_marker_character(hb_job_t *job);
+
#ifdef __cplusplus
}
#endif
@@ -100,7 +105,7 @@ hbconf_location(hb_node_t *node);
#include "dk3all.h"
#include "htmlbook.h"
-
+#include "dk3maihd.h"
$!trace-include
@@ -275,6 +280,70 @@ code line numbers
# 40
#
icon home
+#
+# 41
+#
+mark external links
+#
+# 42
+#
+external link marker symbol
+#
+# 43
+#
+table summaries
+#
+# 44
+#
+svg wh
+#
+# 45
+#
+html doctype
+#
+# 46
+#
+privacy link
+#
+# 47
+#
+privacy page
+#
+# 48
+#
+html lang
+#
+# 49
+#
+async js file
+#
+# 50
+#
+fold page toc
+#
+# 51
+#
+page toc js file
+$!end
+};
+
+
+
+/** Names for HTML doctypes. Must correspond to the enumeration
+ in the htmlbook header and the hbhtml_doctypes array in the
+ hbhtml module.
+*/
+dkChar const * const hbconf_doctype_names[] = {
+$!string-table macro=dkT
+none
+html-5
+html-4.01-strict
+html-4.01-transitional
+html-4.01-frameset
+xhtml-1.0-strict
+xhtml-1.0-transitional
+xhtml-1.0-frameset
+xhtml-1.1
$!end
};
@@ -292,6 +361,23 @@ $!end
+void
+hbconf_write_external_marker_character(hb_job_t *job)
+{
+ char buf[8*sizeof(dk3_um_t)];
+
+ if (NULL != job) {
+ job->elmbuf[0] = '\0';
+ if (0UL < job->elmchr) {
+ if (0 != dk3ma_um_to_c8_hex_string(buf,sizeof(buf),job->elmchr,6)) {
+ dk3str_c8_cpy(&(job->elmbuf[0]), buf);
+ }
+ }
+ }
+}
+
+
+
/** Set jump node for the nodes parents.
@param nodeptr Text node.
*/
@@ -324,6 +410,45 @@ hbconf_set_jump_node(hb_node_t *nodeptr)
+static
+void
+hbconf_change_external_marker_character(
+ hb_job_t *job,
+ dkChar *vp,
+ int *backptr
+)
+{
+ dk3_um_t um = (dk3_um_t)0UL;
+ int ec = 0;
+
+ if (0 != dk3ma_um_from_hex_string(&um, vp, &ec)) {
+ if ((dk3_um_t)0x01000000UL > um) {
+ job->elmchr = (unsigned long)um;
+ hbconf_write_external_marker_character(job);
+ }
+ else {
+ /* ERROR: Math overflow */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 101);
+ }
+ }
+ else {
+ switch (ec) {
+ case DK3_ERROR_MATH_OVERFLOW : {
+ /* ERROR: Math overflow */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 101);
+ } break;
+ default : {
+ /* ERROR: Syntax, not a hexadecimal number */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 100);
+ } break;
+ }
+ *backptr = -1;
+ }
+}
+
+
+
+
/** Process one configuration line from configuration file.
@param job Job structure.
@param il Input line to process.
@@ -485,14 +610,14 @@ hbconf_process_line(hb_job_t *job, dkChar *il, int st)
ptr = dk3str_dup_app(vp,job->app);
if(ptr) {
dk3str_correct_filename(ptr);
- if((job->currentnode)->template) {
+ if((job->currentnode)->templatefi) {
if(0UL != (job->currentnode)->objno) {
/* Overwriting template */
dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 73);
}
}
- dk3_release((job->currentnode)->template);
- (job->currentnode)->template = ptr;
+ dk3_release((job->currentnode)->templatefi);
+ (job->currentnode)->templatefi = ptr;
} else {
back = -1; /* REPORTED */
}
@@ -824,7 +949,7 @@ hbconf_process_line(hb_job_t *job, dkChar *il, int st)
if(job->currentnode) { $? ". have current node"
ap = dk3str_next(vp, NULL);
if(ap) { $? ". value specified (add,change)"
- kvp = dk3sto_it_find_like(
+ kvp = (dk3_key_value_t *)dk3sto_it_find_like(
(job->currentnode)->i_variables, vp, 1
);
if(kvp) { $? ". existing value found, change"
@@ -853,7 +978,7 @@ hbconf_process_line(hb_job_t *job, dkChar *il, int st)
}
}
} else { $? ". no value (delete)"
- kvp = dk3sto_it_find_like(
+ kvp = (dk3_key_value_t *)dk3sto_it_find_like(
(job->currentnode)->i_variables, vp, 1
);
if(kvp) { $? ". found, removing"
@@ -883,6 +1008,7 @@ hbconf_process_line(hb_job_t *job, dkChar *il, int st)
job->impressumnode = hb_node_new(
job, job->rootnode, job->lineno, job->nextobj, 0
);
+ $? ". impressum node is %lu", (unsigned long)(job->nextobj)
job->nextobj += 1UL;
if(job->impressumnode) { $? ". impressumnode"
if((job->impressumnode)->depth > job->maxdepth) {
@@ -1203,6 +1329,278 @@ hbconf_process_line(hb_job_t *job, dkChar *il, int st)
}
}
} break;
+ case 41 : {
+ if(HB_SECTION_OPTIONS == st) {
+ if (NULL != vp) {
+ if(dk3str_is_bool(vp)) {
+ job->markel = dk3str_is_bool(vp);
+ }
+ else {
+ /* WARNING: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ else {
+ job->markel = 1;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 42 : {
+ if(HB_SECTION_OPTIONS == st) {
+ if (NULL != vp) {
+ hbconf_change_external_marker_character(job, vp, &back);
+ }
+ else {
+ job->elmchr = 0x01F310UL;
+ hbconf_write_external_marker_character(job);
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 43: {
+ if(HB_SECTION_OPTIONS == st) {
+ if (NULL != vp) {
+ if(dk3str_is_bool(vp)) {
+ job->tabsum = dk3str_is_on(vp);
+ }
+ else {
+ /* WARNING: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ else {
+ job->tabsum = 1;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 44: {
+ if(HB_SECTION_OPTIONS == st) {
+ if (NULL != vp) {
+ if (dk3str_is_bool(vp)) {
+ job->svgwhdef = dk3str_is_on(vp);
+ }
+ else {
+ /* WARNING: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ else {
+ job->svgwhdef = 1;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 45: {
+ if (NULL != vp) {
+ newie = dk3str_array_index(hbconf_doctype_names, vp, 0);
+ if (HTML_DOCTYPE_NONE <= newie) {
+ if (HB_SECTION_OPTIONS == st) {
+ if (HTML_DOCTYPE_UNSPECIFIED != job->htdt) {
+ /* WARNING Overwriting doctype */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 103);
+ }
+ job->htdt = newie;
+ }
+ else {
+ if (HB_SECTION_CONTENTS == st) {
+ if (NULL != job->currentnode) {
+ if (HTML_DOCTYPE_UNSPECIFIED != job->htdt) {
+ /* WARNING Overwriting doctype */
+ dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 103);
+ }
+ job->currentnode->htdt = newie;
+ }
+ }
+ }
+ }
+ else {
+ /* ERROR: Invalid doctype */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 102);
+ }
+ }
+ else {
+ /* ERROR: Value required */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 133, 134, kp);
+ }
+ } break;
+ case 46 : { /* privacy link */
+ if(HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp, job->app);
+ if (NULL != ptr) {
+ dk3_release(job->privacylink);
+ job->privacylink = ptr;
+ } else {
+ back = -1; /* REPORTED */
+ }
+ } else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 47 : { /* privacy page */
+ if(HB_SECTION_OPTIONS == st) {
+ job->privacynode = hb_node_new(
+ job, job->rootnode, job->lineno, job->nextobj, 0
+ );
+ $? ". privacy node is %lu", (unsigned long)(job->nextobj)
+ job->nextobj += 1UL;
+ if (job->privacynode) {
+ if ((job->privacynode)->depth > job->maxdepth) {
+ job->maxdepth = (job->privacynode)->depth;
+ }
+ (job->privacynode)->options |= HB_NODE_OPT_PRIVACY;
+ if(dk3sto_add(job->s_nodes, (void *)(job->privacynode))) {
+ (job->privacynode)->shorttitle =
+ dk3str_dup_app((job->msg)[104], job->app);
+ (job->privacynode)->title =
+ dk3str_dup_app((job->msg)[105], job->app);
+ if ((job->privacynode)->title) {
+ dk3str_correct_filename(vp);
+ if (!(hbtool_check_filename(job, vp))) { back = -1; }
+ (job->privacynode)->filename =
+ dk3str_dup_app(vp, job->app);
+ if (!((job->privacynode)->filename)) {
+ back = -1; $? "! filename"
+ }
+ } else { $? "! title"
+ back = -1; /* REPORTED */
+ }
+ if (1 == back) {
+ if(!dk3sto_add(job->s_pnodes,(void*)(job->privacynode)))
+ { $? "! add"
+ back = -1; /* REPORTED */
+ }
+ }
+ } else { $? "! add"
+ hb_node_delete(job->privacynode);
+ job->privacynode = NULL;
+ back = -1; /* REPORTED */
+ }
+ } else { $? "! node allocation"
+ back = -1; /* REPORTED */
+ }
+ } else { $? "! wrong section"
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 48 : {
+ if (HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp, job->app);
+ if (NULL != ptr) {
+ dk3_release(job->htmllang);
+ job->htmllang = ptr;
+ }
+ else {
+ back = -1;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 49: {
+ if((job->currentnode) && (vp)) {
+ if(!((job->currentnode)->s_jsfiles)) {
+ (job->currentnode)->s_jsfiles =
+ dk3sto_open_app(job->app);
+ if((job->currentnode)->s_jsfiles) {
+ dk3sto_set_comp(
+ (job->currentnode)->s_jsfiles,
+ hbnode_link_compare, 2
+ );
+ }
+ }
+ if(!((job->currentnode)->i_jsfiles)) {
+ if((job->currentnode)->s_jsfiles) {
+ (job->currentnode)->i_jsfiles = dk3sto_it_open(
+ (job->currentnode)->s_jsfiles
+ );
+ }
+ }
+ if((job->currentnode)->s_jsfiles) {
+ if((job->currentnode)->i_jsfiles) {
+ linkptr = hbnode_link_new(
+ vp, (job->currentnode)->nextjs, job->app
+ );
+ if(linkptr) {
+ if(dk3sto_add((job->currentnode)->s_jsfiles, linkptr)) {
+ (job->currentnode)->nextjs += 1UL;
+ linkptr->flags |= LINK_FLAG_SCRIPT_ASYNC;
+ } else {
+ hbnode_link_delete(linkptr);
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ } else {
+ back = -1;
+ }
+ }
+ if(vp) {
+ if(!hbtool_add_url(job, vp)) { back = -1; }
+ }
+ } break;
+ case 50 : {
+ if(HB_SECTION_OPTIONS == st) {
+ if (NULL != vp) {
+ if (dk3str_is_bool(vp)) {
+ if (0 != dk3str_is_on(vp)) {
+ job->options |= HB_JOB_OPT_FOLD_PTOC;
+ }
+ else {
+ job->options &= (~(HB_JOB_OPT_FOLD_PTOC));
+ }
+ }
+ else {
+ /* WARNING: Not a boolean value! */
+ dk3app_log_i3(job->app, DK3_LL_ERROR, 146, 144, vp);
+ }
+ }
+ else {
+ job->options |= HB_JOB_OPT_FOLD_PTOC;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
+ case 51 : { /* page toc js file */
+ if (HB_SECTION_OPTIONS == st) {
+ ptr = dk3str_dup_app(vp, job->app);
+ if (NULL != ptr) {
+ dk3_release(job->ptocjsfile);
+ job->ptocjsfile = ptr;
+ }
+ else {
+ back = -1;
+ }
+ }
+ else {
+ /* ERROR: Only allowed in options section */
+ dk3app_log_1(job->app, DK3_LL_ERROR, job->msg, 10);
+ }
+ } break;
default: {
dk3app_log_3(job->app, DK3_LL_ERROR, job->msg, 43, 44, kp);
} break;
@@ -1292,15 +1690,15 @@ hbconf_read_files(hb_job_t *job)
dkChar const *
-hbconf_node_template(hb_job_t *job, hb_node_t *node)
+hbconf_node_template(hb_node_t *node)
{
dkChar const *back = NULL;
hb_node_t *nptr; /* Traverse node and parent nodes */
$? "+ hbconf_node_template"
nptr = node;
while((nptr) && (NULL == back)) {
- if(nptr->template) {
- back = nptr->template;
+ if(nptr->templatefi) {
+ back = nptr->templatefi;
} else {
nptr = nptr->parent;
}