Tweak to Tye 42 font generation -- construct the CharStrings dictionary
[sgt/halibut] / bk_html.c
index 11d37d3..0c66eb7 100644 (file)
--- a/bk_html.c
+++ b/bk_html.c
@@ -49,6 +49,7 @@ typedef struct {
     int address_section, visible_version_id;
     int leaf_contains_contents, leaf_smallest_contents;
     int navlinks;
+    int rellinks;
     char *contents_filename;
     char *index_filename;
     char *template_filename;
@@ -60,7 +61,7 @@ typedef struct {
     char *body_tag, *nav_attr;
     wchar_t *author, *description;
     wchar_t *index_text, *contents_text, *preamble_text, *title_separator;
-    wchar_t *nav_prev_text, *nav_next_text, *nav_separator;
+    wchar_t *nav_prev_text, *nav_next_text, *nav_up_text, *nav_separator;
     wchar_t *index_main_sep, *index_multi_sep;
     wchar_t *pre_versionid, *post_versionid;
     int restrict_charset, output_charset;
@@ -259,6 +260,7 @@ static htmlconfig html_configure(paragraph *source) {
     ret.leaf_contains_contents = FALSE;
     ret.leaf_smallest_contents = 4;
     ret.navlinks = TRUE;
+    ret.rellinks = TRUE;
     ret.single_filename = dupstr("Manual.html");
     ret.contents_filename = dupstr("Contents.html");
     ret.index_filename = dupstr("IndexPage.html");
@@ -280,6 +282,7 @@ static htmlconfig html_configure(paragraph *source) {
     ret.title_separator = L" - ";
     ret.nav_prev_text = L"Previous";
     ret.nav_next_text = L"Next";
+    ret.nav_up_text = L"Up";
     ret.nav_separator = L" | ";
     ret.index_main_sep = L": ";
     ret.index_multi_sep = L", ";
@@ -381,6 +384,8 @@ static htmlconfig html_configure(paragraph *source) {
                ret.achapter.just_numbers = utob(uadv(k));
            } else if (!ustricmp(k, L"html-suppress-navlinks")) {
                ret.navlinks = !utob(uadv(k));
+           } else if (!ustricmp(k, L"html-rellinks")) {
+               ret.rellinks = utob(uadv(k));
            } else if (!ustricmp(k, L"html-chapter-suffix")) {
                ret.achapter.number_suffix = uadv(k);
            } else if (!ustricmp(k, L"html-leaf-level")) {
@@ -490,6 +495,8 @@ static htmlconfig html_configure(paragraph *source) {
                ret.nav_prev_text = uadv(k);
            } else if (!ustricmp(k, L"html-nav-next-text")) {
                ret.nav_next_text = uadv(k);
+           } else if (!ustricmp(k, L"html-nav-up-text")) {
+               ret.nav_up_text = uadv(k);
            } else if (!ustricmp(k, L"html-nav-separator")) {
                ret.nav_separator = uadv(k);
            } else if (!ustricmp(k, L"html-index-main-separator")) {
@@ -957,6 +964,49 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
            element_close(&ho, "title");
            html_nl(&ho);
 
+           if (conf.rellinks) {
+
+               if (prevf) {
+                   element_empty(&ho, "link");
+                   element_attr(&ho, "rel", "previous");
+                   element_attr(&ho, "href", prevf->filename);
+                   html_nl(&ho);
+               }
+
+               if (f != files.head) {
+                   element_empty(&ho, "link");
+                   element_attr(&ho, "rel", "ToC");
+                   element_attr(&ho, "href", files.head->filename);
+                   html_nl(&ho);
+               }
+
+               if (conf.leaf_level > 0) {
+                   htmlsect *p = f->first->parent;
+                   assert(p == f->last->parent);
+                   if (p) {
+                       element_empty(&ho, "link");
+                       element_attr(&ho, "rel", "up");
+                       element_attr(&ho, "href", p->file->filename);
+                       html_nl(&ho);
+                   }
+               }
+
+               if (has_index && files.index && f != files.index) {
+                   element_empty(&ho, "link");
+                   element_attr(&ho, "rel", "index");
+                   element_attr(&ho, "href", files.index->filename);
+                   html_nl(&ho);
+               }
+
+               if (f->next) {
+                   element_empty(&ho, "link");
+                   element_attr(&ho, "rel", "next");
+                   element_attr(&ho, "href", f->next->filename);
+                   html_nl(&ho);
+               }
+
+           }
+
            if (conf.head_end)
                html_raw(&ho, conf.head_end);
 
@@ -1019,6 +1069,22 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
                if (f != files.head)
                    element_close(&ho, "a");
 
+               /* We don't bother with "Up" links for leaf-level 1,
+                * as they would be identical to the "Contents" links. */
+               if (conf.leaf_level >= 2) {
+                   htmlsect *p = f->first->parent;
+                   assert(p == f->last->parent);
+                   html_text(&ho, conf.nav_separator);
+                   if (p) {
+                       element_open(&ho, "a");
+                       element_attr(&ho, "href", p->file->filename);
+                   }
+                   html_text(&ho, conf.nav_up_text);
+                   if (p) {
+                       element_close(&ho, "a");
+                   }
+               }
+
                if (has_index && files.index) {
                    html_text(&ho, conf.nav_separator);
                    if (f != files.index) {
@@ -1580,6 +1646,8 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
 
     /*
      * Output the MS HTML Help supporting files, if requested.
+     *
+     * A good unofficial reference for these is <http://chmspec.nongnu.org/>.
      */
     if (conf.hhp_filename) {
        htmlfile *f;
@@ -1599,6 +1667,8 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
 
        fprintf(ho.fp,
                "[OPTIONS]\n"
+               /* Binary TOC required for Next/Previous nav to work */
+               "Binary TOC=Yes\n"
                "Compatibility=1.1 or later\n"
                "Compiled file=%s\n"
                "Default Window=main\n"
@@ -1633,7 +1703,17 @@ void html_backend(paragraph *sourceform, keywordlist *keywords,
                   NULL, keywords, &conf);
 
        fprintf(ho.fp, "\",\"%s\",\"%s\",\"%s\",,,,,,"
-               "0x42520,,0x3876,[271,372,593,566],,,,,,,0\n",
+               /* This first magic number is fsWinProperties, controlling
+                * Navigation Pane options and the like.
+                * Constants HHWIN_PROP_* in htmlhelp.h. */
+               "0x62520,,"
+               /* This second number is fsToolBarFlags, mainly controlling
+                * toolbar buttons. Constants HHWIN_BUTTON_*.
+                * NOTE: there are two pairs of bits for Next/Previous
+                * buttons: 7/8 (which do nothing useful), and 21/22
+                * (which work). (Neither of these are exposed in the HHW
+                * UI, but they work fine in HH.) We use the latter. */
+               "0x60304e,,,,,,,,0\n",
                conf.hhc_filename ? conf.hhc_filename : "",
                hhk_filename ? hhk_filename : "",
                files.head->filename);