Moderately nasty workaround for the fact that Windows Help's index
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 19 Jun 2004 16:04:39 +0000 (16:04 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Sat, 19 Jun 2004 16:04:39 +0000 (16:04 +0000)
mechanism is case-insensitive with respect to sorting the list of
index entries. We now append nonbreaking spaces to the ends of some
index terms to ensure they are considered distinct. (Nasty, but it
seems to work.)

git-svn-id: svn://svn.tartarus.org/sgt/halibut@4294 cda61777-01e9-0310-a592-d414129be87e

bk_whlp.c
inputs/test.but

index ca15b61..1e1ae31 100644 (file)
--- a/bk_whlp.c
+++ b/bk_whlp.c
@@ -246,10 +246,63 @@ void whlp_backend(paragraph *sourceform, keywordlist *keywords,
      * Loop over the index entries, preparing final text forms for
      * each one.
      */
-    for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) {
-       rdstringc rs = {0, 0, NULL};
-       whlp_rdaddwc(&rs, ie->text, &conf, NULL);
-       ie->backend_data = rs.text;
+    {
+       indexentry *ie_prev = NULL;
+       int nspaces = 1;
+
+       for (i = 0; (ie = index234(idx->entries, i)) != NULL; i++) {
+           rdstringc rs = {0, 0, NULL};
+           charset_state state = CHARSET_INIT_STATE;
+           whlp_rdaddwc(&rs, ie->text, &conf, &state);
+
+           if (ie_prev) {
+               /*
+                * It appears that Windows Help's index mechanism
+                * is inherently case-sensitive. Therefore, if two
+                * adjacent index terms compare equal apart from
+                * case, I'm going to append nonbreaking spaces to
+                * the end of the second one so that Windows will
+                * treat them as distinct.
+                * 
+                * This is nasty because we're depending on our
+                * case-insensitive comparison having the same
+                * semantics as the Windows one :-/ but I see no
+                * alternative.
+                */
+               wchar_t *a, *b;
+
+               a = ufroma_dup((char *)ie_prev->backend_data, conf.charset);
+               b = ufroma_dup(rs.text, conf.charset);
+               if (!ustricmp(a, b)) {
+                   int j;
+                   for (j = 0; j < nspaces; j++)
+                       whlp_rdadds(&rs, L"\xA0", &conf, &state);
+                   /*
+                    * Add one to nspaces, so that if another term
+                    * appears which is equivalent to the previous
+                    * two it'll acquire one more space.
+                    */
+                   nspaces++;
+               } else
+                   nspaces = 1;
+               sfree(a);
+               sfree(b);
+           }
+
+           whlp_rdadds(&rs, NULL, &conf, &state);
+
+           ie->backend_data = rs.text;
+
+           /*
+            * Only move ie_prev on if nspaces==1 (since when we
+            * have three or more adjacent terms differing only in
+            * case, we will want to compare with the _first_ of
+            * them because that won't have had any extra spaces
+            * added on which will foul up the comparison).
+            */
+           if (nspaces == 1)
+               ie_prev = ie;
+       }
     }
 
     whlp_prepare(h);
index 887825f..1908609 100644 (file)
@@ -32,7 +32,7 @@ a bit]
 
 \define{eur} \u20AC{EUR }
 
-\versionid $Id: test.but,v 1.31 2004/06/19 14:44:47 simon Exp $
+\versionid $Id: test.but,v 1.32 2004/06/19 16:04:39 simon Exp $
 
 \C{ch\\ap} First chapter title; for similar wrapping reasons this
 chapter title will be ludicrously long. I wonder how much more
@@ -222,10 +222,10 @@ It also contains a \W{http://www.tartarus.org/}{hyperlink}.
 Also I'm going to index \i\c{-output} to ensure that its two
 components are displayed as a joined-up code fragment in the index.
 
-Here are some subsections with silly chapter titles and interesting
-use of Unicode. The Unicode oddities are in the titles rather than
-the body text because that way I get to test their handling in the
-PDF document outline.
+Here are \I{testone}some \I{testtwo}subsections \I{testthree}with
+silly chapter titles and interesting use of Unicode. The Unicode
+oddities are in the titles rather than the body text because that
+way I get to test their handling in the PDF document outline.
 
 \H{app-one} The 1024 \u00D7{x} 768 screen resolution
 
@@ -267,3 +267,11 @@ the document even though there is no \cw{\\k} citing it.
 
 \IM{she seems to have an invisible tag}{appendix} Invisible tags
 and/or appendices
+
+\# The display forms of these three index terms differ only in case.
+\# This is a fiddly special case in the Windows Help backend,
+\# because Windows Help's index mechanism is case-insensitive...
+
+\IM{testone} Test
+\IM{testtwo} TesT
+\IM{testthree} test