diff options
| author | Jacob Nevins <jacobn@chiark.greenend.org.uk> | 2007-01-01 21:27:39 +0000 |
|---|---|---|
| committer | Jacob Nevins <jacobn@chiark.greenend.org.uk> | 2007-01-01 21:27:39 +0000 |
| commit | 0a93e0f4e52191819069b0a32b5fb051fae7d0da (patch) | |
| tree | ca8c7c9c872b1e3ebed47ecc168a438ec6d08e29 | |
| parent | 86c2b2e8b4ebbbe18f1668eec6fea03b454cce9d (diff) | |
| download | halibut-0a93e0f4e52191819069b0a32b5fb051fae7d0da.zip halibut-0a93e0f4e52191819069b0a32b5fb051fae7d0da.tar.gz halibut-0a93e0f4e52191819069b0a32b5fb051fae7d0da.tar.bz2 halibut-0a93e0f4e52191819069b0a32b5fb051fae7d0da.tar.xz | |
Fix the behaviour of constructions like \e{index \i{term}} -- the index tag
was causing emphasis to be broken (particularly noticeable in text-like
backends). There are some instances of this in the PuTTY manual, for instance.
Unfortunately, \k references in similar situations still aren't quite right,
but fixing that will be more involved, and I haven't found any instances
yet.
[originally from svn r7049]
| -rw-r--r-- | halibut.h | 1 | ||||
| -rw-r--r-- | inputs/test.but | 14 | ||||
| -rw-r--r-- | misc.c | 31 |
3 files changed, 38 insertions, 8 deletions
@@ -185,6 +185,7 @@ enum { quote_Close = 0x0020, quote_mask = 0x0030 }; +#define isvis(x) ( ( (x) >= word_Normal && (x) <= word_LowerXref ) ) #define isattr(x) ( ( (x) > word_Normal && (x) < word_WhiteSpace ) || \ ( (x) > word_WhiteSpace && (x) < word_internal_endattrs ) ) #define sameattr(x,y) ( (((x)-(y)) & 3) == 0 ) diff --git a/inputs/test.but b/inputs/test.but index 3cfc69e..72f8719 100644 --- a/inputs/test.but +++ b/inputs/test.but @@ -256,6 +256,20 @@ An index tag containing non-alternatived Unicode: \i{\u00BFChe?} An invisible index tag: \I{she seems to have an invisible tag}yeah. +An index tag inside another tag: jackdaws love my \e{big \i{sphinx}} +of quartz. + +Similarly, we should support things like hyperlinks +\e{\W{http://www.tartarus.org/}{at the beginning} of emphasised sections}, +and \e{in the \W{http://www.tartarus.org/}{middle} of them}, and also +\e{at the \W{http://home.att.net/~cecw/lastpage.htm}{end}}. + +\#{FIXME: Unfortunately, we still don't quite do the right thing with +references: +How about a \e{reference to \k{subhead} here}? And at +\e{the end: \k{subhead}} and \e{\k{subhead}: the start}? +} + \S2{sub-sub}{Florble} Smaller heading still A tiny section. Awww. How cute. Actually, this one's a \e{florble}, @@ -237,17 +237,32 @@ void mark_attr_ends(word *words) wp = NULL; for (w = words; w; w = w->next) { - if (isattr(w->type)) { - int before = (wp && isattr(wp->type) && - sameattr(wp->type, w->type)); - int after = (w->next && isattr(w->next->type) && - sameattr(w->next->type, w->type)); - w->aux |= (before ? - (after ? attr_Always : attr_Last) : - (after ? attr_First : attr_Only)); + int both; + if (!isvis(w->type)) + /* Invisible elements should not affect this calculation */ + continue; + both = (isattr(w->type) && + wp && isattr(wp->type) && + sameattr(wp->type, w->type)); + w->aux |= both ? attr_Always : attr_First; + if (wp && !both) { + /* If previous considered word turns out to have been + * the end of a run, tidy it up. */ + int wp_attr = attraux(wp->aux); + wp->aux = (wp->aux & ~attr_mask) | + ((wp_attr == attr_Always) ? attr_Last + /* attr_First */ : attr_Only); } wp = w; } + + /* Tidy up last word touched */ + if (wp) { + int wp_attr = attraux(wp->aux); + wp->aux = (wp->aux & ~attr_mask) | + ((wp_attr == attr_Always) ? attr_Last + /* attr_First */ : attr_Only); + } } /* |