Fix the behaviour of constructions like \e{index \i{term}} -- the index tag
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Mon, 1 Jan 2007 21:27:39 +0000 (21:27 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Mon, 1 Jan 2007 21:27:39 +0000 (21:27 +0000)
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.

git-svn-id: svn://svn.tartarus.org/sgt/halibut@7049 cda61777-01e9-0310-a592-d414129be87e

halibut.h
inputs/test.but
misc.c

index 1ff014e..11e478f 100644 (file)
--- a/halibut.h
+++ b/halibut.h
@@ -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 )
index 3cfc69e..72f8719 100644 (file)
@@ -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},
diff --git a/misc.c b/misc.c
index 1d407de..3f2483c 100644 (file)
--- a/misc.c
+++ b/misc.c
@@ -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);
+    }
 }
 
 /*