diff options
| -rw-r--r-- | bk_whlp.c | 61 | ||||
| -rw-r--r-- | inputs/test.but | 18 |
2 files changed, 70 insertions, 9 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); diff --git a/inputs/test.but b/inputs/test.but index 887825f..1908609 100644 --- a/inputs/test.but +++ b/inputs/test.but @@ -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 |