]> git.cameronkatri.com Git - mandoc.git/commitdiff
implement tag priority 0, which will tag only keys that appear as
authorIngo Schwarze <schwarze@openbsd.org>
Tue, 8 Nov 2016 16:23:58 +0000 (16:23 +0000)
committerIngo Schwarze <schwarze@openbsd.org>
Tue, 8 Nov 2016 16:23:58 +0000 (16:23 +0000)
tag candidates exactly once, and use it for .Em and .Sy;
written on the TGV Toulouse-Paris

mdoc_term.c
tag.c

index a05e3859aeee1f3ec9ae495533f10173c3ad9f7e..429dca6a46a93918be4e8bba3a0c11b613ebff6b 100644 (file)
@@ -1,4 +1,4 @@
-/*     $Id: mdoc_term.c,v 1.333 2016/11/08 16:04:57 schwarze Exp $ */
+/*     $Id: mdoc_term.c,v 1.334 2016/11/08 16:23:58 schwarze Exp $ */
 /*
  * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv>
  * Copyright (c) 2010, 2012-2016 Ingo Schwarze <schwarze@openbsd.org>
@@ -95,6 +95,7 @@ static        int       termp_bx_pre(DECL_ARGS);
 static int       termp_cd_pre(DECL_ARGS);
 static int       termp_d1_pre(DECL_ARGS);
 static int       termp_eo_pre(DECL_ARGS);
+static int       termp_em_pre(DECL_ARGS);
 static int       termp_er_pre(DECL_ARGS);
 static int       termp_ex_pre(DECL_ARGS);
 static int       termp_fa_pre(DECL_ARGS);
@@ -119,6 +120,7 @@ static      int       termp_skip_pre(DECL_ARGS);
 static int       termp_sm_pre(DECL_ARGS);
 static int       termp_sp_pre(DECL_ARGS);
 static int       termp_ss_pre(DECL_ARGS);
+static int       termp_sy_pre(DECL_ARGS);
 static int       termp_tag_pre(DECL_ARGS);
 static int       termp_under_pre(DECL_ARGS);
 static int       termp_ud_pre(DECL_ARGS);
@@ -195,7 +197,7 @@ static      const struct termact termacts[MDOC_MAX] = {
        { termp_quote_pre, termp_quote_post }, /* Dq */
        { NULL, NULL }, /* Ec */ /* FIXME: no space */
        { NULL, NULL }, /* Ef */
-       { termp_under_pre, NULL }, /* Em */
+       { termp_em_pre, NULL }, /* Em */
        { termp_eo_pre, termp_eo_post }, /* Eo */
        { termp_xx_pre, NULL }, /* Fx */
        { termp_bold_pre, NULL }, /* Ms */
@@ -218,7 +220,7 @@ static      const struct termact termacts[MDOC_MAX] = {
        { termp_quote_pre, termp_quote_post }, /* Sq */
        { termp_sm_pre, NULL }, /* Sm */
        { termp_under_pre, NULL }, /* Sx */
-       { termp_bold_pre, NULL }, /* Sy */
+       { termp_sy_pre, NULL }, /* Sy */
        { NULL, NULL }, /* Tn */
        { termp_xx_pre, NULL }, /* Ux */
        { NULL, NULL }, /* Xc */
@@ -2217,6 +2219,26 @@ termp_under_pre(DECL_ARGS)
        return 1;
 }
 
+static int
+termp_em_pre(DECL_ARGS)
+{
+       if (n->child != NULL &&
+           n->child->type == ROFFT_TEXT)
+               tag_put(n->child->string, 0, p->line);
+       term_fontpush(p, TERMFONT_UNDER);
+       return 1;
+}
+
+static int
+termp_sy_pre(DECL_ARGS)
+{
+       if (n->child != NULL &&
+           n->child->type == ROFFT_TEXT)
+               tag_put(n->child->string, 0, p->line);
+       term_fontpush(p, TERMFONT_BOLD);
+       return 1;
+}
+
 static int
 termp_er_pre(DECL_ARGS)
 {
diff --git a/tag.c b/tag.c
index fd9f2a1137c90a08789f0f7dc0636e2729924554..a618c4a01cf9ae0f0be0df6c66a6ce3a512290b5 100644 (file)
--- a/tag.c
+++ b/tag.c
@@ -1,4 +1,4 @@
-/*     $Id: tag.c,v 1.15 2016/11/08 15:57:28 schwarze Exp $ */
+/*     $Id: tag.c,v 1.16 2016/11/08 16:23:58 schwarze Exp $ */
 /*
  * Copyright (c) 2015, 2016 Ingo Schwarze <schwarze@openbsd.org>
  *
@@ -155,14 +155,22 @@ tag_put(const char *s, int prio, size_t line)
 
        } else {
 
+               /* Handle priority 0 entries. */
+
+               if (prio == 0) {
+                       if (entry->prio == 0)
+                               entry->prio = -1;
+                       return;
+               }
+
                /* A better entry is already present, ignore the new one. */
 
-               if (entry->prio < prio)
+               if (entry->prio > 0 && entry->prio < prio)
                        return;
 
                /* The existing entry is worse, clear it. */
 
-               if (entry->prio > prio)
+               if (entry->prio < 1 || entry->prio > prio)
                        entry->nlines = 0;
        }
 
@@ -194,7 +202,7 @@ tag_write(void)
        stream = fdopen(tag_files.tfd, "w");
        entry = ohash_first(&tag_data, &slot);
        while (entry != NULL) {
-               if (stream != NULL)
+               if (stream != NULL && entry->prio >= 0)
                        for (i = 0; i < entry->nlines; i++)
                                fprintf(stream, "%s %s %zu\n",
                                    entry->s, tag_files.ofn, entry->lines[i]);