From 7c570bf386b055563f689fb3c424af29227db8e6 Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 19 Jun 2004 16:04:39 +0000 Subject: [PATCH] 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.) git-svn-id: svn://svn.tartarus.org/sgt/halibut@4294 cda61777-01e9-0310-a592-d414129be87e --- bk_whlp.c | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++---- inputs/test.but | 18 ++++++++++++----- 2 files changed, 70 insertions(+), 9 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); 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 -- 2.11.0