Don't translate hyphens into \(hy inside \c{...} or code paragraphs,
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 21 Nov 2008 19:15:50 +0000 (19:15 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 21 Nov 2008 19:15:50 +0000 (19:15 +0000)
because otherwise UTF-8 versions of man(1) tend to turn them into
Unicode hyphen characters, with the result that if you cut and paste
sample command lines out of man pages in the obvious way then the
things that look like hyphens are not in fact the character that the
program in question would recognise as an option introducer.

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

bk_man.c

index 1146150..204d145 100644 (file)
--- a/bk_man.c
+++ b/bk_man.c
@@ -215,8 +215,9 @@ paragraph *man_config_filename(char *filename)
     return cmdline_cfg_simple("man-filename", filename, NULL);
 }
 
-#define QUOTE_INITCTRL 1 /* quote initial . and ' on a line */
-#define QUOTE_QUOTES   2 /* quote double quotes by doubling them */
+#define QUOTE_INITCTRL    1 /* quote initial . and ' on a line */
+#define QUOTE_QUOTES      2 /* quote double quotes by doubling them */
+#define QUOTE_LITHYPHENS  4 /* don't convert hyphens into \(hy */
 
 void man_backend(paragraph *sourceform, keywordlist *keywords,
                 indexdata *idx, void *unused) {
@@ -482,7 +483,7 @@ static int man_convert(wchar_t const *s, int maxlen,
                /* Turn backslashes into \e. */
                rdaddsc(&out, "\\e");
                continue;
-           } else if (*q == '-') {
+           } else if (*q == '-' && !(quote_props & QUOTE_LITHYPHENS)) {
                /* Turn nonbreakable hyphens into \(hy. */
                rdaddsc(&out, "\\(hy");
                continue;
@@ -584,6 +585,10 @@ static int man_rdaddwc(rdstringc *rs, word *text, word *end,
            quote_props = man_rdaddctrl(rs, "\\fB", quote_props, conf, state);
        }
 
+       if (towordstyle(text->type) == word_Code ||
+           towordstyle(text->type) == word_WeakCode)
+           quote_props |= QUOTE_LITHYPHENS;
+
        if (removeattr(text->type) == word_Normal) {
            charset_state s2 = *state;
            int len = ustrlen(text->text), hyphen = FALSE;
@@ -654,7 +659,7 @@ static void man_codepara(FILE *fp, word *text, int charset) {
     for (; text; text = text->next) if (text->type == word_WeakCode) {
        char *c;
        wchar_t *t, *e;
-       int quote_props = QUOTE_INITCTRL;
+       int quote_props = QUOTE_INITCTRL | QUOTE_LITHYPHENS;
 
        t = text->text;
        if (text->next && text->next->type == word_Emph) {