summaryrefslogtreecommitdiff
path: root/app/tools
diff options
context:
space:
mode:
Diffstat (limited to 'app/tools')
-rw-r--r--app/tools/halibut/bk_html.c185
-rw-r--r--app/tools/halibut/halibut.h1
-rw-r--r--app/tools/halibut/input.c3
3 files changed, 151 insertions, 38 deletions
diff --git a/app/tools/halibut/bk_html.c b/app/tools/halibut/bk_html.c
index 8b5443b..4f7c49b 100644
--- a/app/tools/halibut/bk_html.c
+++ b/app/tools/halibut/bk_html.c
@@ -54,7 +54,8 @@ typedef struct {
char *index_filename;
char *template_filename;
char *single_filename;
- char *chm_filename, *hhp_filename, *hhc_filename, *hhk_filename;
+ char *chm_filename, *hhp_filename, *hhc_filename, *hhk_filename;
+ char *appletoc_filename;
char **template_fragments;
int ntfragments;
char *head_end, *body_start, *body_end, *addr_start, *addr_end;
@@ -100,7 +101,7 @@ struct htmlsect {
htmlsect *next, *parent;
htmlfile *file;
paragraph *title, *text;
- enum { NORMAL, TOP, INDEX } type;
+ enum { NORMAL, TOP, INDEX, APPLEINDEX } type;
int contents_depth;
char **fragments;
};
@@ -235,7 +236,7 @@ static char *html_sanitise_filename(htmlfilelist *files, char *text);
static void html_contents_entry(htmloutput *ho, int depth, htmlsect *s,
htmlfile *thisfile, keywordlist *keywords,
- htmlconfig *cfg);
+ htmlconfig *cfg, int toc_yes);
static void html_section_title(htmloutput *ho, htmlsect *s,
htmlfile *thisfile, keywordlist *keywords,
htmlconfig *cfg, int real);
@@ -268,6 +269,7 @@ static htmlconfig html_configure(paragraph *source) {
ret.template_filename = dupstr("%n.html");
ret.chm_filename = ret.hhp_filename = NULL;
ret.hhc_filename = ret.hhk_filename = NULL;
+ ret.appletoc_filename = NULL;
ret.ntfragments = 1;
ret.template_fragments = snewn(ret.ntfragments, char *);
ret.template_fragments[0] = dupstr("%b");
@@ -517,6 +519,9 @@ static htmlconfig html_configure(paragraph *source) {
} else if (!ustricmp(k, L"html-mshtmlhelp-index")) {
sfree(ret.hhk_filename);
ret.hhk_filename = dupstr(adv(p->origkeyword));
+ } else if (!ustricmp(k, L"html-applehelp-toc")) {
+ sfree(ret.appletoc_filename);
+ ret.appletoc_filename = dupstr(adv(p->origkeyword));
}
}
}
@@ -539,6 +544,7 @@ static htmlconfig html_configure(paragraph *source) {
sfree(ret.hhc_filename); ret.hhc_filename = NULL;
sfree(ret.hhk_filename); ret.hhk_filename = NULL;
}
+
/*
* Now process fallbacks on quote characters.
@@ -839,7 +845,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
* output the section text
* - for each section which is not in the file but which has a
* parent that is, we output a contents entry for the
- * section if appropriate
+ * section if appropriate/
* - finally, we output the file trailer and close the file.
*/
{
@@ -1007,12 +1013,14 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
for (s = sects.head; s; s = s->next) {
if (s->file == f && s->text) {
for (p = s->text;
- p && (p == s->text || p->type == para_Title ||
- !is_heading_type(p->type));
+ p && (p == s->text || p->type == para_Title
+ || !is_heading_type(p->type)
+ );
p = p->next) {
if (p->type == para_Config) {
if (!ustricmp(p->keyword, L"html-local-head")) {
html_raw(&ho, adv(p->origkeyword));
+ html_nl(&ho);
}
}
}
@@ -1023,13 +1031,15 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
html_nl(&ho);
if (conf.body_tag)
- html_raw(&ho, conf.body_tag);
+ html_raw(&ho, conf.body_tag);
else
- element_open(&ho, "body");
+ element_open(&ho, "body");
html_nl(&ho);
- if (conf.body_start)
- html_raw(&ho, conf.body_start);
+ if (conf.body_start) {
+ html_raw(&ho, conf.body_start);
+ html_nl(&ho);
+ }
/*
* Write out a nav bar. Special case: we don't do this
@@ -1084,6 +1094,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
}
prevf = f;
+
/*
* Write out a prefix TOC for the file (if a leaf file).
*
@@ -1149,9 +1160,9 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
assert(hlevel >= 1);
html_contents_entry(&ho, hlevel, s,
- f, keywords, &conf);
+ f, keywords, &conf, 0);
}
- html_contents_entry(&ho, 0, NULL, f, keywords, &conf);
+ html_contents_entry(&ho, 0, NULL, f, keywords, &conf, 0);
}
}
@@ -1204,7 +1215,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
*/
if (adepth <= a->contents_depth) {
html_contents_entry(&ho, adepth, s,
- f, keywords, &conf);
+ f, keywords, &conf, 0);
}
}
}
@@ -1213,7 +1224,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
int hlevel;
char htag[3];
- html_contents_entry(&ho, 0, NULL, f, keywords, &conf);
+ html_contents_entry(&ho, 0, NULL, f, keywords, &conf, 0);
/*
* Display the section heading.
@@ -1440,7 +1451,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
sfree(stackhead);
}
- if (s->type == INDEX) {
+ if (s->type == INDEX ) {
indexentry *entry;
int i;
@@ -1503,7 +1514,7 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
}
}
- html_contents_entry(&ho, 0, NULL, f, keywords, &conf);
+ html_contents_entry(&ho, 0, NULL, f, keywords, &conf, 0);
html_nl(&ho);
{
@@ -1593,6 +1604,78 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
}
}
+ /* APPLE TOC only has list entries and all entries are remote */
+ /*
+ * Write out the whole TOC in the TOC file.
+ *
+ */
+
+ if (conf.appletoc_filename) {
+ htmlsect *s, *top;
+ htmlfile *f;
+ htmloutput ho;
+ ho.charset = conf.output_charset;
+ ho.restrict_charset = conf.restrict_charset;
+ ho.cstate = charset_init_state;
+ ho.ver = conf.htmlver;
+ ho.state = HO_NEUTRAL;
+ ho.contents_level = 0;
+ ho.hackflags = 0; /* none of these thankyouverymuch */
+ ho.hacklimit = -1;
+
+ ho.fp = fopen(conf.appletoc_filename, "w");
+ if (!ho.fp)
+ error(err_cantopenw, conf.appletoc_filename);
+
+ /* Find TOP section */
+ s = sects.head;
+
+ html_contents_entry(&ho, 1, s, NULL, keywords, &conf, TRUE);
+
+ /* Loop through all sections */
+ for (s = sects.head; s; s = s->next) {
+ if (s->type == TOP) {
+ /*
+ * This is the head - ignore as we just wrote out its entry.
+ */
+ } else {
+ /*
+ * Doesn't contain the TOP so it is
+ * a descendant we consider it for the
+ * main TOC.
+ */
+ htmlsect *a, *ac;
+ int depth, adepth;
+ /*
+ * Search up from this section until we find
+ * the highest-level one
+ */
+ depth = adepth = 0;
+ a = NULL;
+ for (ac = s; ac; ac = ac->parent) {
+ if (ac->type == TOP) {
+ a = ac;
+ adepth = depth;
+ }
+ depth++;
+ }
+ if (a) {
+
+ html_contents_entry(&ho, adepth, s,
+ NULL, keywords, &conf, TRUE);
+ }
+ }
+ }
+ /*
+ * Close the entries
+ */
+ html_contents_entry(&ho, 0, NULL, NULL, keywords, &conf, TRUE);
+ cleanup(&ho);
+
+ }
+
+ /* End of Apple TOC */
+
/*
* Before we start outputting the HTML Help files, check
* whether there's even going to _be_ an index file: we omit it
@@ -1703,6 +1786,9 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
fclose(ho.fp);
}
+
+
+
if (conf.hhc_filename) {
htmlfile *f;
htmlsect *s, *a;
@@ -2139,8 +2225,16 @@ static void html_words(htmloutput *ho, word *words, int flags,
sfree(c);
}
break;
+ case word_Anchor:
+ if (flags & LINKS) {
+ element_empty( ho, "a");
+ c = utoa_dup(w->text, CS_ASCII);
+ element_attr(ho, "name", c);
+ sfree(c);
+ }
+ break;
case word_Graphic:
- element_open( ho, "img");
+ element_empty( ho, "img");
c = utoa_dup(w->text, CS_ASCII);
element_attr(ho, "src", c);
return_to_neutral(ho);
@@ -2160,6 +2254,7 @@ static void html_words(htmloutput *ho, word *words, int flags,
assert(s);
html_href(ho, file, s->file, s->fragments[0]);
+
}
break;
case word_HyperEnd:
@@ -2490,7 +2585,6 @@ static void html_href(htmloutput *ho, htmlfile *thisfile,
{
rdstringc rs = { 0, 0, NULL };
char *url;
-
if (targetfile != thisfile)
rdaddsc(&rs, targetfile->filename);
if (targetfrag) {
@@ -2708,37 +2802,52 @@ static char *html_sanitise_filename(htmlfilelist *files, char *text)
static void html_contents_entry(htmloutput *ho, int depth, htmlsect *s,
htmlfile *thisfile, keywordlist *keywords,
- htmlconfig *cfg)
+ htmlconfig *cfg, int toc_yes)
{
- if (ho->contents_level >= depth && ho->contents_level > 0) {
- element_close(ho, "li");
- html_nl(ho);
+
+
+ while (ho->contents_level > depth) {
+ element_close(ho, "ul");
+ ho->contents_level--;
+ html_nl(ho);
+ if (toc_yes && ho->contents_level == 1 && depth == 1) {
+ element_close(ho, "div");
+ html_nl(ho);
+ }
}
+
- while (ho->contents_level > depth) {
- element_close(ho, "ul");
- ho->contents_level--;
- if (ho->contents_level > 0) {
- element_close(ho, "li");
- }
- html_nl(ho);
- }
while (ho->contents_level < depth) {
- html_nl(ho);
- element_open(ho, "ul");
- html_nl(ho);
- ho->contents_level++;
+ if (toc_yes && ho->contents_level == 1 && depth == 2) {
+ element_open(ho,"div");
+ element_attr(ho,"class","panel");
+ html_nl(ho);
+ }
+ element_open(ho, "ul");
+ if (toc_yes && ho->contents_level < 1)
+ element_attr(ho,"class","top-list");
+ html_nl(ho);
+ ho->contents_level++;
}
if (!s)
- return;
+ return;
element_open(ho, "li");
+ if (toc_yes && ho->contents_level > 0 && depth == 1) {
+ element_open(ho,"button");
+ element_attr(ho,"class","accordion");
+ element_close(ho,"button");
+ }
+
html_href(ho, thisfile, s->file, s->fragments[0]);
html_section_title(ho, s, thisfile, keywords, cfg, FALSE);
element_close(ho, "a");
- /* <li> will be closed by a later invocation */
+ element_close(ho, "li");
+ html_nl(ho);
+
+
}
static void html_section_title(htmloutput *ho, htmlsect *s, htmlfile *thisfile,
@@ -2778,9 +2887,9 @@ static void html_section_title(htmloutput *ho, htmlsect *s, htmlfile *thisfile,
assert(s->type != NORMAL);
/*
* If we're printing the full document title for _real_ and
- * there isn't one, we don't want to print `Preamble' at
+ * there isn't one, won't want to print `Preamble' at
* the top of what ought to just be some text. If we need
- * it in any other context such as TOCs, we need to print
+ * it in any other context such ae ds TOCs, we need to print
* `Preamble'.
*/
if (s->type == TOP && !real)
diff --git a/app/tools/halibut/halibut.h b/app/tools/halibut/halibut.h
index 8fe1f08..aa750bd 100644
--- a/app/tools/halibut/halibut.h
+++ b/app/tools/halibut/halibut.h
@@ -169,6 +169,7 @@ enum {
word_HyperLink, /* (invisible) */
word_HyperEnd, /* (also invisible; no text) */
word_Graphic, /* \G */
+ word_Anchor, /* \IA */
/*
* Back ends may define their own word types beyond here, in
* case they need to use them internally.
diff --git a/app/tools/halibut/input.c b/app/tools/halibut/input.c
index b877508..256d9c6 100644
--- a/app/tools/halibut/input.c
+++ b/app/tools/halibut/input.c
@@ -213,6 +213,7 @@ enum {
c_G, /* graphic */
c_H, /* heading */
c_I, /* invisible index mark */
+ c_IA, /* included anchor */
c_IM, /* index merge/rewrite */
c_K, /* capitalised cross-reference */
c_S, /* aux field is 0, 1, 2, ... */
@@ -1299,6 +1300,8 @@ static void read_file(paragraph ***ret, input *in, indexdata *idx,
wd.type = word_HyperLink;
else if (t.cmd == c_G)
wd.type = word_Graphic;
+ else if (t.cmd == c_IA)
+ wd.type = word_Anchor;
else
wd.type = word_Normal;
dtor(t), t = get_token(in);