X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/halibut/blobdiff_plain/d9d3dd95b99d64ff168c5980b10bcd9b6b1ac084..7136a6c7f094fa423c48ec319748c4fd7e1fa645:/bk_xhtml.c?ds=inline
diff --git a/bk_xhtml.c b/bk_xhtml.c
index fef0779..053bf33 100644
--- a/bk_xhtml.c
+++ b/bk_xhtml.c
@@ -28,6 +28,7 @@
#include
#include
+#include
#include
#include "halibut.h"
@@ -62,6 +63,11 @@ struct xhtmlindex_Struct {
};
typedef struct {
+ int just_numbers;
+ wchar_t *number_suffix;
+} xhtmlheadfmt;
+
+typedef struct {
int contents_depth[6];
int leaf_contains_contents;
int leaf_level;
@@ -70,6 +76,8 @@ typedef struct {
wchar_t *author, *description;
wchar_t *head_end, *body, *body_start, *body_end, *address_start, *address_end, *nav_attrs;
int suppress_address;
+ xhtmlheadfmt fchapter, *fsect;
+ int nfsect;
} xhtmlconfig;
/*static void xhtml_level(paragraph *, int);
@@ -135,6 +143,15 @@ static xhtmlconfig xhtml_configure(paragraph *source)
ret.nav_attrs = NULL;
ret.suppress_address = FALSE;
+ ret.fchapter.just_numbers = FALSE;
+ ret.fchapter.number_suffix = ustrdup(L": ");
+ ret.nfsect = 2;
+ ret.fsect = mknewa(xhtmlheadfmt, ret.nfsect);
+ ret.fsect[0].just_numbers = FALSE;
+ ret.fsect[0].number_suffix = ustrdup(L": ");
+ ret.fsect[1].just_numbers = TRUE;
+ ret.fsect[1].number_suffix = ustrdup(L" ");
+
for (; source; source = source->next)
{
if (source->type == para_Config)
@@ -179,6 +196,40 @@ static xhtmlconfig xhtml_configure(paragraph *source)
ret.address_end = uadv(source->keyword);
} else if (!ustricmp(source->keyword, L"xhtml-navigation-attributes")) {
ret.nav_attrs = uadv(source->keyword);
+ } else if (!ustricmp(source->keyword, L"xhtml-chapter-numeric")) {
+ ret.fchapter.just_numbers = utob(uadv(source->keyword));
+ } else if (!ustricmp(source->keyword, L"xhtml-chapter-suffix")) {
+ ret.fchapter.number_suffix = ustrdup(uadv(source->keyword));
+ } else if (!ustricmp(source->keyword, L"xhtml-section-numeric")) {
+ wchar_t *p = uadv(source->keyword);
+ int n = 0;
+ if (uisdigit(*p)) {
+ n = utoi(p);
+ p = uadv(p);
+ }
+ if (n >= ret.nfsect) {
+ int i;
+ ret.fsect = resize(ret.fsect, n+1);
+ for (i = ret.nfsect; i <= n; i++)
+ ret.fsect[i] = ret.fsect[ret.nfsect-1];
+ ret.nfsect = n+1;
+ }
+ ret.fsect[n].just_numbers = utob(p);
+ } else if (!ustricmp(source->keyword, L"xhtml-section-suffix")) {
+ wchar_t *p = uadv(source->keyword);
+ int n = 0;
+ if (uisdigit(*p)) {
+ n = utoi(p);
+ p = uadv(p);
+ }
+ if (n >= ret.nfsect) {
+ int i;
+ ret.fsect = resize(ret.fsect, n+1);
+ for (i = ret.nfsect; i <= n; i++)
+ ret.fsect[i] = ret.fsect[ret.nfsect-1];
+ ret.nfsect = n+1;
+ }
+ ret.fsect[n].number_suffix = ustrdup(p);
}
}
}
@@ -308,7 +359,7 @@ void xhtml_fixup_layout(xhtmlfile* file)
* | | |
* X +----X----+ (1)
* | |
- * Y (3)
+ * Y (2)
* |
* (3)
*
@@ -625,6 +676,13 @@ void xhtml_backend(paragraph *sourceform, keywordlist *in_keywords,
}
ientry->backend_data = NULL;
}
+ {
+ int i;
+ sfree(conf.fchapter.number_suffix);
+ for (i = 0; i < conf.nfsect; i++)
+ sfree(conf.fsect[i].number_suffix);
+ sfree(conf.fsect);
+ }
}
static int xhtml_para_level(paragraph *p)
@@ -837,7 +895,11 @@ static void xhtml_do_top_file(xhtmlfile *file, paragraph *sourceform)
xhtml_do_contents(fp, file);
xhtml_do_sections(fp, file->sections);
- if (count234(idx->entries) > 0) {
+ /*
+ * Put the index in the top file if we're in single-file mode
+ * (leaf-level 0).
+ */
+ if (conf.leaf_level == 0 && count234(idx->entries) > 0) {
fprintf(fp, "Index
\n");
xhtml_do_index_body(fp);
}
@@ -973,7 +1035,7 @@ static int xhtml_add_contents_entry(FILE *fp, xhtmlsection *section, int limit)
{
if (!section || section->level > limit)
return FALSE;
- if (fp==NULL || !section->parent)
+ if (fp==NULL || section->level < 0)
return TRUE;
while (last_level > section->level) {
last_level--;
@@ -1014,14 +1076,15 @@ static void xhtml_do_sections(FILE *fp, xhtmlsection *sections)
/* Write this list of paragraphs. Close off all lists at the end. */
static void xhtml_do_paras(FILE *fp, paragraph *p)
{
- int last_type = -1, first=TRUE;
+ int last_type = -1, ptype, first=TRUE;
+ stack lcont_stack = stk_new();
if (!p)
return;
/* for (; p && (xhtml_para_level(p)>limit || xhtml_para_level(p)==-1 || first); p=p->next) {*/
for (; p && (xhtml_para_level(p)==-1 || first); p=p->next) {
first=FALSE;
- switch (p->type)
+ switch (ptype = p->type)
{
/*
* Things we ignore because we've already processed them or
@@ -1061,8 +1124,29 @@ static void xhtml_do_paras(FILE *fp, paragraph *p)
fprintf(fp, "
\n");
break;
+ case para_LcontPush:
+ {
+ int *p;
+ p = mknew(int);
+ *p = last_type;
+ stk_push(lcont_stack, p);
+ last_type = para_Normal;
+ }
+ break;
+ case para_LcontPop:
+ {
+ int *p = stk_pop(lcont_stack);
+ assert(p);
+ ptype = last_type = *p;
+ sfree(p);
+ goto closeofflist; /* ick */
+ }
+ break;
+
case para_Bullet:
case para_NumberedList:
+ case para_Description:
+ case para_DescribedThing:
case para_BiblioCited:
if (last_type!=p->type) {
/* start up list if necessary */
@@ -1070,41 +1154,62 @@ static void xhtml_do_paras(FILE *fp, paragraph *p)
fprintf(fp, "\n");
} else if (p->type == para_NumberedList) {
fprintf(fp, "\n");
- } else if (p->type == para_BiblioCited) {
+ } else if (p->type == para_BiblioCited ||
+ p->type == para_DescribedThing ||
+ p->type == para_Description) {
fprintf(fp, "\n");
}
}
- if (p->type == para_Bullet || p->type == para_NumberedList)
+ if (p->type == para_Bullet || p->type == para_NumberedList) {
fprintf(fp, "
- ");
- else if (p->type == para_BiblioCited) {
+ } else if (p->type == para_DescribedThing) {
+ fprintf(fp, "
- ");
+ } else if (p->type == para_Description) {
+ fprintf(fp, "
- ");
+ } else if (p->type == para_BiblioCited) {
fprintf(fp, "
- ");
xhtml_para(fp, p->kwtext);
fprintf(fp, "
\n- ");
}
xhtml_para(fp, p->words);
- if (p->type == para_BiblioCited) {
+ {
+ paragraph *p2 = p->next;
+ if (p2 && xhtml_para_level(p2)==-1 && p2->type == para_LcontPush)
+ break;
+ }
+
+ closeofflist:
+ if (ptype == para_BiblioCited) {
fprintf(fp, "
\n");
- } else if (p->type == para_Bullet || p->type == para_NumberedList) {
+ } else if (p->type == para_DescribedThing) {
+ fprintf(fp, "");
+ } else if (p->type == para_Description) {
+ fprintf(fp, "");
+ } else if (ptype == para_Bullet || ptype == para_NumberedList) {
fprintf(fp, " ");
}
- if (p->type == para_Bullet || p->type == para_NumberedList || p->type == para_BiblioCited)
+ if (ptype == para_Bullet || ptype == para_NumberedList ||
+ ptype == para_BiblioCited || ptype == para_Description ||
+ ptype == para_DescribedThing)
/* close off list if necessary */
{
paragraph *p2 = p->next;
int close_off=FALSE;
/* if (p2 && (xhtml_para_level(p2)>limit || xhtml_para_level(p2)==-1)) {*/
if (p2 && xhtml_para_level(p2)==-1) {
- if (p2->type != p->type)
+ if (p2->type != ptype && p2->type != para_LcontPush)
close_off=TRUE;
} else {
close_off=TRUE;
}
if (close_off) {
- if (p->type == para_Bullet) {
+ if (ptype == para_Bullet) {
fprintf(fp, "
\n");
- } else if (p->type == para_NumberedList) {
+ } else if (ptype == para_NumberedList) {
fprintf(fp, "\n");
- } else if (p->type == para_BiblioCited) {
+ } else if (ptype == para_BiblioCited ||
+ ptype == para_Description ||
+ ptype == para_DescribedThing) {
fprintf(fp, "\n");
}
}
@@ -1115,8 +1220,10 @@ static void xhtml_do_paras(FILE *fp, paragraph *p)
xhtml_codepara(fp, p->words);
break;
}
- last_type = p->type;
+ last_type = ptype;
}
+
+ stk_free(lcont_stack);
}
/*
@@ -1431,6 +1538,7 @@ static void xhtml_heading(FILE *fp, paragraph *p)
word *text = p->words;
int level = xhtml_para_level(p);
xhtmlsection *sect = xhtml_find_section(p);
+ xhtmlheadfmt *fmt;
char *fragment;
if (sect) {
fragment = sect->fragment;
@@ -1443,12 +1551,33 @@ static void xhtml_heading(FILE *fp, paragraph *p)
}
}
- if (level>2 && nprefix) { /* FIXME: configurability on the level thing */
+ if (p->type == para_Title)
+ fmt = NULL;
+ else if (level == 1)
+ fmt = &conf.fchapter;
+ else if (level-1 < conf.nfsect)
+ fmt = &conf.fsect[level-1];
+ else
+ fmt = &conf.fsect[conf.nfsect-1];
+
+ if (fmt && fmt->just_numbers && nprefix) {
xhtml_rdaddwc(&t, nprefix, NULL);
- rdaddc(&t, ' '); /* FIXME: as below */
- } else if (tprefix) {
+ if (fmt) {
+ char *c;
+ if (xhtml_convert(fmt->number_suffix, &c, FALSE)) {
+ rdaddsc(&t, c);
+ sfree(c);
+ }
+ }
+ } else if (fmt && !fmt->just_numbers && tprefix) {
xhtml_rdaddwc(&t, tprefix, NULL);
- rdaddsc(&t, ": "); /* FIXME: configurability */
+ if (fmt) {
+ char *c;
+ if (xhtml_convert(fmt->number_suffix, &c, FALSE)) {
+ rdaddsc(&t, c);
+ sfree(c);
+ }
+ }
}
xhtml_rdaddwc(&t, text, NULL);
/*