Extend r8309 to try to ensure that single-quote/apostrophe characters in code
authorjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 23 Nov 2008 17:41:44 +0000 (17:41 +0000)
committerjacob <jacob@cda61777-01e9-0310-a592-d414129be87e>
Sun, 23 Nov 2008 17:41:44 +0000 (17:41 +0000)
contexts get output usefully in the face of UTF-8 *roff implementations.
Works on Debian-derived distributions (and hence along with r8309 should fix
#496063), but I'm slightly worried about portability as I've used a named
character "\(aq" which doesn't appear in the "classic" reference CS TR #54.

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

bk_man.c

index 204d145..1433dfd 100644 (file)
--- a/bk_man.c
+++ b/bk_man.c
@@ -217,7 +217,7 @@ paragraph *man_config_filename(char *filename)
 
 #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 */
+#define QUOTE_LITERAL     4 /* defeat special meaning of `, ', - in troff */
 
 void man_backend(paragraph *sourceform, keywordlist *keywords,
                 indexdata *idx, void *unused) {
@@ -476,17 +476,22 @@ static int man_convert(wchar_t const *s, int maxlen,
                 */
                rdaddc(&out, '\\');
                rdaddc(&out, '&');
-           } else if (*q == '`' || *q == ' ') {
+           }
+           if (*q == '`' || *q == ' ') {
                /* Quote backticks and nonbreakable spaces always. */
                rdaddc(&out, '\\');
            } else if (*q == '\\') {
                /* Turn backslashes into \e. */
                rdaddsc(&out, "\\e");
                continue;
-           } else if (*q == '-' && !(quote_props & QUOTE_LITHYPHENS)) {
+           } else if (*q == '-' && !(quote_props & QUOTE_LITERAL)) {
                /* Turn nonbreakable hyphens into \(hy. */
                rdaddsc(&out, "\\(hy");
                continue;
+           } else if (*q == '\'' && (quote_props & QUOTE_LITERAL)) {
+               /* Try to preserve literal U+0027 */
+               rdaddsc(&out, "\\(aq"); /* "apostrophe quote" */
+               continue;
            } else if (*q == '"' && (quote_props & QUOTE_QUOTES)) {
                /*
                 * Double quote within double quotes. Quote it by
@@ -587,7 +592,7 @@ static int man_rdaddwc(rdstringc *rs, word *text, word *end,
 
        if (towordstyle(text->type) == word_Code ||
            towordstyle(text->type) == word_WeakCode)
-           quote_props |= QUOTE_LITHYPHENS;
+           quote_props |= QUOTE_LITERAL;
 
        if (removeattr(text->type) == word_Normal) {
            charset_state s2 = *state;
@@ -659,7 +664,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 | QUOTE_LITHYPHENS;
+       int quote_props = QUOTE_INITCTRL | QUOTE_LITERAL;
 
        t = text->text;
        if (text->next && text->next->type == word_Emph) {