diff options
| author | Simon Tatham <anakin@pobox.com> | 2004-06-19 16:04:39 +0000 |
|---|---|---|
| committer | Simon Tatham <anakin@pobox.com> | 2004-06-19 16:04:39 +0000 |
| commit | 88cfb9065852d17c763d025c4f720f356c313259 (patch) | |
| tree | 50ded70797ba631b2f95abbd08a0f017ef91a47a /bk_whlp.c | |
| parent | cf4bb9b46153ea9a0cbe8bcc539941bd6cee3abf (diff) | |
| download | halibut-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.c | 61 |
1 files changed, 57 insertions, 4 deletions
@@ -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); |