summaryrefslogtreecommitdiff
path: root/bk_whlp.c
diff options
context:
space:
mode:
authorSimon Tatham <anakin@pobox.com>2004-06-19 16:04:39 +0000
committerSimon Tatham <anakin@pobox.com>2004-06-19 16:04:39 +0000
commit88cfb9065852d17c763d025c4f720f356c313259 (patch)
tree50ded70797ba631b2f95abbd08a0f017ef91a47a /bk_whlp.c
parentcf4bb9b46153ea9a0cbe8bcc539941bd6cee3abf (diff)
downloadhalibut-88cfb9065852d17c763d025c4f720f356c313259.zip
halibut-88cfb9065852d17c763d025c4f720f356c313259.tar.gz
halibut-88cfb9065852d17c763d025c4f720f356c313259.tar.bz2
halibut-88cfb9065852d17c763d025c4f720f356c313259.tar.xz
Moderately nasty workaround for the fact that Windows Help's index
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.) [originally from svn r4294]
Diffstat (limited to 'bk_whlp.c')
-rw-r--r--bk_whlp.c61
1 files changed, 57 insertions, 4 deletions
diff --git a/bk_whlp.c b/bk_whlp.c
index ca15b61..1e1ae31 100644
--- 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);