summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIngo Schwarze <schwarze@cvs.openbsd.org>2017-03-07 15:31:19 +0000
committerIngo Schwarze <schwarze@cvs.openbsd.org>2017-03-07 15:31:19 +0000
commit5f0ef4aa622fd2327acc5cbd430223174e546860 (patch)
tree9cd5d07c64b6435a95d4028cc4a19cc2356e9705
parentfd6435964873921aceb3c0be400b8d6e229f6ce3 (diff)
Escape blanks at the end of markdown lines
such that they don't look like output line breaks.
-rw-r--r--regress/usr.bin/mandoc/mdoc/Bl/Makefile4
-rw-r--r--regress/usr.bin/mandoc/mdoc/Bl/inset.out_markdown42
-rw-r--r--usr.bin/mandoc/mdoc_markdown.c35
3 files changed, 67 insertions, 14 deletions
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/Makefile b/regress/usr.bin/mandoc/mdoc/Bl/Makefile
index cab05ad4958..2bacab554a6 100644
--- a/regress/usr.bin/mandoc/mdoc/Bl/Makefile
+++ b/regress/usr.bin/mandoc/mdoc/Bl/Makefile
@@ -1,4 +1,4 @@
-# $OpenBSD: Makefile,v 1.33 2017/03/05 19:59:25 schwarze Exp $
+# $OpenBSD: Makefile,v 1.34 2017/03/07 15:31:18 schwarze Exp $
REGRESS_TARGETS = item inset diag ohang bullet dash enum hang tag
REGRESS_TARGETS += column colNoIt extend nested offset secstart
@@ -13,7 +13,7 @@ LINT_TARGETS = column notype badargs tag
LINT_TARGETS += empty noIt emptyhead emptytag emptyitem
LINT_TARGETS += bareIt bareTa break breakingIt broken
-MARKDOWN_TARGETS = item diag ohang bullet dash enum
+MARKDOWN_TARGETS = item inset diag ohang bullet dash enum
MARKDOWN_TARGETS += notype multitype
MARKDOWN_TARGETS += empty emptyitem
MARKDOWN_TARGETS += bareIt bareTa unclosed breakingTa
diff --git a/regress/usr.bin/mandoc/mdoc/Bl/inset.out_markdown b/regress/usr.bin/mandoc/mdoc/Bl/inset.out_markdown
new file mode 100644
index 00000000000..ad2b97286b0
--- /dev/null
+++ b/regress/usr.bin/mandoc/mdoc/Bl/inset.out_markdown
@@ -0,0 +1,42 @@
+BL-INSET(1) - General Commands Manual
+
+# NAME
+
+**Bl-inset** - inset list labels
+
+# DESCRIPTION
+
+tag
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+four
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+quint
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+indent
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+septime
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+achtacht
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+neun\_neun
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+zehn\_\_zehn
+x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x x
+
+a
+b
+
+a &zwnj;
+b
+
+a &zwnj;
+b
+
+OpenBSD - October 28, 2009
diff --git a/usr.bin/mandoc/mdoc_markdown.c b/usr.bin/mandoc/mdoc_markdown.c
index 96b75a47c2b..82fa4af1e2b 100644
--- a/usr.bin/mandoc/mdoc_markdown.c
+++ b/usr.bin/mandoc/mdoc_markdown.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mdoc_markdown.c,v 1.7 2017/03/07 14:03:56 schwarze Exp $ */
+/* $OpenBSD: mdoc_markdown.c,v 1.8 2017/03/07 15:31:18 schwarze Exp $ */
/*
* Copyright (c) 2017 Ingo Schwarze <schwarze@openbsd.org>
*
@@ -247,6 +247,7 @@ static int escflags; /* Escape in generated markdown code: */
#define ESC_PAR (1 << 3) /* ")" when "(" is open. */
#define ESC_SQU (1 << 4) /* "]" when "[" is open. */
#define ESC_FON (1 << 5) /* "*" immediately after unrelated "*". */
+#define ESC_EOL (1 << 6) /* " " at the and of a line. */
static int code_blocks, quote_blocks, list_blocks;
static int outcount;
@@ -380,25 +381,25 @@ md_preword(void)
* they terminate the list. Work around this markdown issue
* by using mere line breaks instead.
*/
+
if (list_blocks && outflags & MD_sp) {
outflags &= ~MD_sp;
outflags |= MD_br;
}
- /* End the old line if requested. */
+ /*
+ * End the old line if requested.
+ * Escape whitespace at the end of the markdown line
+ * such that it won't look like an output line break.
+ */
if (outflags & MD_sp)
putchar('\n');
else if (outflags & MD_br) {
putchar(' ');
putchar(' ');
-#ifdef DEBUG
- putchar(':');
- putchar(':');
- putchar(' ');
- putchar(' ');
-#endif
- }
+ } else if (outflags & MD_nl && escflags & ESC_EOL)
+ md_named("zwnj");
/* Start a new line if necessary. */
@@ -437,7 +438,7 @@ md_rawword(const char *s)
{
md_preword();
- if (*s == 0)
+ if (*s == '\0')
return;
if (escflags & ESC_FON) {
@@ -470,6 +471,10 @@ md_rawword(const char *s)
}
md_char(*s++);
}
+ if (s[-1] == ' ')
+ escflags |= ESC_EOL;
+ else
+ escflags &= ~ESC_EOL;
}
/*
@@ -490,6 +495,9 @@ md_word(const char *s)
md_preword();
+ if (*s == '\0')
+ return;
+
/* No spacing after opening delimiters. */
if ((s[0] == '(' || s[0] == '[') && s[1] == '\0')
outflags &= ~MD_spc;
@@ -630,7 +638,10 @@ md_word(const char *s)
if (*currfont != '\0') {
outflags &= ~MD_spc;
md_rawword(currfont);
- }
+ } else if (s[-2] == ' ')
+ escflags |= ESC_EOL;
+ else
+ escflags &= ~ESC_EOL;
}
/*
@@ -640,7 +651,7 @@ static void
md_named(const char *s)
{
printf("&%s;", s);
- escflags &= ~ESC_FON;
+ escflags &= ~(ESC_FON | ESC_EOL);
outcount++;
}