Add strike-through support for groff output [jgm/peg-markdown]

See https://github.com/jgm/peg-markdown/commit/7748eca
This commit is contained in:
Michael Teichgräber 2013-06-11 02:45:09 +02:00
parent 53573d327b
commit 002c4b71f8
11 changed files with 69 additions and 53 deletions

View File

@ -26,8 +26,9 @@ import (
type troffOut struct { type troffOut struct {
baseWriter baseWriter
inListItem bool strikeMacroWritten bool
escape *strings.Replacer inListItem bool
escape *strings.Replacer
} }
// Returns a formatter that writes the document in groff mm format. // Returns a formatter that writes the document in groff mm format.
@ -67,6 +68,10 @@ func (w *troffOut) s(s string) *troffOut {
// write string, escape '\' // write string, escape '\'
func (w *troffOut) str(s string) *troffOut { func (w *troffOut) str(s string) *troffOut {
if strings.HasPrefix(s, ".") {
w.WriteString(`\[char46]`)
s = s[1:]
}
w.escape.WriteString(w, s) w.escape.WriteString(w, s)
return w return w
} }
@ -128,6 +133,17 @@ func (w *troffOut) elem(elt *element, isFirst bool) *troffOut {
w.inline(`\fI`, elt, `\fR`) w.inline(`\fI`, elt, `\fR`)
case STRONG: case STRONG:
w.inline(`\fB`, elt, `\fR`) w.inline(`\fB`, elt, `\fR`)
case STRIKE:
w.s("\\c\n")
if !w.strikeMacroWritten {
w.s(`.de ST
.nr width \w'\\$1'
\Z@\v'-.25m'\l'\\n[width]u'@\\$1\c
..
`)
w.strikeMacroWritten = true
}
w.inline(".ST \"", elt, `"`).br()
case LIST: case LIST:
w.children(elt) w.children(elt)
case RAW: case RAW:

2
portid
View File

@ -1 +1 @@
a79c71ede83f ad324b86de96

View File

@ -11,8 +11,8 @@ This & that.
.P .P
Here's a link (http://example.com/?foo=1&bar=2) with an ampersand in the URL. Here's a link (http://example.com/?foo=1&bar=2) with an ampersand in the URL.
.P .P
Here's a link with an amersand in the link text: AT&T (http://att.com/). Here's a link with an amersand in the link text: AT&T (http://att.com/)\[char46]
.P .P
Here's an inline link (/script?foo=1&bar=2). Here's an inline link (/script?foo=1&bar=2)\[char46]
.P .P
Here's an inline link (/script?foo=1&bar=2). Here's an inline link (/script?foo=1&bar=2)\[char46]

View File

@ -1,5 +1,5 @@
.P .P
Link: http://example.com/ (http://example.com/). Link: http://example.com/ (http://example.com/)\[char46]
.P .P
With an ampersand: http://example.com/?foo=1&bar=2 (http://example.com/?foo=1&bar=2) With an ampersand: http://example.com/?foo=1&bar=2 (http://example.com/?foo=1&bar=2)
.BL .BL

View File

@ -25,7 +25,7 @@ Greater-than: >
.P .P
Hash: # Hash: #
.P .P
Period: . Period: \[char46]
.P .P
Bang: ! Bang: !
.P .P
@ -113,6 +113,6 @@ _underscores_
.P .P
This is a code span with a literal backslash-backtick sequence: \fC\e`\fR This is a code span with a literal backslash-backtick sequence: \fC\e`\fR
.P .P
This is a tag with unescaped backticks bar. This is a tag with unescaped backticks bar\[char46]
.P .P
This is a tag with backslashes bar. This is a tag with backslashes bar\[char46]

View File

@ -1,12 +1,12 @@
.P .P
Just a URL (/url/). Just a URL (/url/)\[char46]
.P .P
URL and title (/url/). URL and title (/url/)\[char46]
.P .P
URL and title (/url/). URL and title (/url/)\[char46]
.P .P
URL and title (/url/). URL and title (/url/)\[char46]
.P .P
URL and title (/url/). URL and title (/url/)\[char46]
.P .P
Empty (). Empty ()\[char46]

View File

@ -1,17 +1,17 @@
.P .P
Foo bar (/url/). Foo bar (/url/)\[char46]
.P .P
Foo bar (/url/). Foo bar (/url/)\[char46]
.P .P
Foo bar (/url/). Foo bar (/url/)\[char46]
.P .P
With embedded [brackets] (/url/). With embedded [brackets] (/url/)\[char46]
.P .P
Indented once (/url). Indented once (/url)\[char46]
.P .P
Indented twice (/url). Indented twice (/url)\[char46]
.P .P
Indented thrice (/url). Indented thrice (/url)\[char46]
.P .P
Indented [four][] times. Indented [four][] times.
.VERBON 2 .VERBON 2
@ -21,27 +21,27 @@ Indented [four][] times.
.P .P
this (foo) should work this (foo) should work
.P .P
So should this (foo). So should this (foo)\[char46]
.P .P
And this (foo). And this (foo)\[char46]
.P .P
And this (foo). And this (foo)\[char46]
.P .P
And this (foo). And this (foo)\[char46]
.P .P
But not [that] []. But not [that] []\[char46]
.P .P
Nor [that][]. Nor [that][]\[char46]
.P .P
Nor [that]. Nor [that]\[char46]
.P .P
[Something in brackets like this (foo) should work] [Something in brackets like this (foo) should work]
.P .P
[Same with this (foo).] [Same with this (foo)\[char46]]
.P .P
In this case, this (/somethingelse/) points to something else. In this case, this (/somethingelse/) points to something else.
.P .P
Backslashing should suppress [this] and [this]. Backslashing should suppress [this] and [this]\[char46]
\l'\n(.lu*8u/10u' \l'\n(.lu*8u/10u'
.P .P
Here's one where the link Here's one where the link

View File

@ -1,8 +1,8 @@
.P .P
This is the simple case (/simple). This is the simple case (/simple)\[char46]
.P .P
This one has a line This one has a line
break (/foo). break (/foo)\[char46]
.P .P
This one has a line This one has a line
break (/foo) with a line-ending space. break (/foo) with a line-ending space.

View File

@ -1,4 +1,4 @@
.P .P
Foo bar (/url/). Foo bar (/url/)\[char46]
.P .P
Foo bar (/url/). Foo bar (/url/)\[char46]

View File

@ -13,7 +13,7 @@ web application that allows you type your own Markdown-formatted text
and translate it to XHTML. and translate it to XHTML.
.P .P
\fBNote:\fR This document is itself written using Markdown; you \fBNote:\fR This document is itself written using Markdown; you
can see the source for it by adding '.text' to the URL (/projects/markdown/basics.text). can see the source for it by adding '\[char46]text' to the URL (/projects/markdown/basics.text)\[char46]
.H 2 "Paragraphs, Headers, Blockquotes" .H 2 "Paragraphs, Headers, Blockquotes"
.P .P
A paragraph is simply one or more consecutive lines of text, separated A paragraph is simply one or more consecutive lines of text, separated
@ -21,7 +21,7 @@ by one or more blank lines. (A blank line is any line that looks like a
blank line -- a line containing nothing spaces or tabs is considered blank line -- a line containing nothing spaces or tabs is considered
blank.) Normal paragraphs should not be intended with spaces or tabs. blank.) Normal paragraphs should not be intended with spaces or tabs.
.P .P
Markdown offers two styles of headers: \fISetext\fR and \fIatx\fR. Markdown offers two styles of headers: \fISetext\fR and \fIatx\fR\[char46]
Setext-style headers for \fC<h1>\fR and \fC<h2>\fR are created by Setext-style headers for \fC<h1>\fR and \fC<h2>\fR are created by
"underlining" with equal signs (\fC=\fR) and hyphens (\fC-\fR), respectively. "underlining" with equal signs (\fC=\fR) and hyphens (\fC-\fR), respectively.
To create an atx-style header, you put 1-6 hash marks (\fC#\fR) at the To create an atx-style header, you put 1-6 hash marks (\fC#\fR) at the
@ -171,7 +171,7 @@ Output:
.H 3 "Links" .H 3 "Links"
.P .P
Markdown supports two styles for creating links: \fIinline\fR and Markdown supports two styles for creating links: \fIinline\fR and
\fIreference\fR. With both styles, you use square brackets to delimit the \fIreference\fR\[char46] With both styles, you use square brackets to delimit the
text you want to turn into a link. text you want to turn into a link.
.P .P
Inline-style links use parentheses immediately after the link text. Inline-style links use parentheses immediately after the link text.

View File

@ -49,7 +49,7 @@ Automatic Links (#autolink)
.LE 1 .LE 1
.P .P
\fBNote:\fR This document is itself written using Markdown; you \fBNote:\fR This document is itself written using Markdown; you
can see the source for it by adding '.text' to the URL (/projects/markdown/syntax.text). can see the source for it by adding '\[char46]text' to the URL (/projects/markdown/syntax.text)\[char46]
\l'\n(.lu*8u/10u' \l'\n(.lu*8u/10u'
.P .P
Markdown is intended to be as easy-to-read and easy-to-write as is feasible. Markdown is intended to be as easy-to-read and easy-to-write as is feasible.
@ -65,7 +65,7 @@ inspiration for Markdown's syntax is the format of plain text email.
To this end, Markdown's syntax is comprised entirely of punctuation To this end, Markdown's syntax is comprised entirely of punctuation
characters, which punctuation characters have been carefully chosen so characters, which punctuation characters have been carefully chosen so
as to look like what they mean. E.g., asterisks around a word actually as to look like what they mean. E.g., asterisks around a word actually
look like *emphasis*. Markdown lists look like, well, lists. Even look like *emphasis*\[char46] Markdown lists look like, well, lists. Even
blockquotes look like quoted passages of text, assuming you've ever blockquotes look like quoted passages of text, assuming you've ever
used email. used email.
.P .P
@ -119,13 +119,13 @@ Unlike block-level HTML tags, Markdown syntax \fIis\fR processed within
span-level tags. span-level tags.
.P .P
In HTML, there are two characters that demand special treatment: \fC<\fR In HTML, there are two characters that demand special treatment: \fC<\fR
and \fC&\fR. Left angle brackets are used to start tags; ampersands are and \fC&\fR\[char46] Left angle brackets are used to start tags; ampersands are
used to denote HTML entities. If you want to use them as literal used to denote HTML entities. If you want to use them as literal
characters, you must escape them as entities, e.g. \fC&lt;\fR, and characters, you must escape them as entities, e.g. \fC&lt;\fR, and
\fC&amp;\fR. \fC&amp;\fR\[char46]
.P .P
Ampersands in particular are bedeviling for web writers. If you want to Ampersands in particular are bedeviling for web writers. If you want to
write about 'AT&T', you need to write '\fCAT&amp;T\fR'. You even need to write about 'AT&T', you need to write '\fCAT&amp;T\fR'\[char46] You even need to
escape ampersands within URLs. Thus, if you want to link to: escape ampersands within URLs. Thus, if you want to link to:
.VERBON 2 .VERBON 2
http://images.google.com/images?num=30&q=larry+bird http://images.google.com/images?num=30&q=larry+bird
@ -143,7 +143,7 @@ errors in otherwise well-marked-up web sites.
Markdown allows you to use these characters naturally, taking care of Markdown allows you to use these characters naturally, taking care of
all the necessary escaping for you. If you use an ampersand as part of all the necessary escaping for you. If you use an ampersand as part of
an HTML entity, it remains unchanged; otherwise it will be translated an HTML entity, it remains unchanged; otherwise it will be translated
into \fC&amp;\fR. into \fC&amp;\fR\[char46]
.P .P
So, if you want to include a copyright symbol in your article, you can write: So, if you want to include a copyright symbol in your article, you can write:
.VERBON 2 .VERBON 2
@ -198,10 +198,10 @@ Yes, this takes a tad more effort to create a \fC<br />\fR, but a simplistic
Markdown's email-style blockquoting (#blockquote) and multi-paragraph list items (#list) Markdown's email-style blockquoting (#blockquote) and multi-paragraph list items (#list)
work best -- and look better -- when you format them with hard breaks. work best -- and look better -- when you format them with hard breaks.
.P .P
Markdown supports two styles of headers, Setext (http://docutils.sourceforge.net/mirror/setext.html) and atx (http://www.aaronsw.com/2002/atx/). Markdown supports two styles of headers, Setext (http://docutils.sourceforge.net/mirror/setext.html) and atx (http://www.aaronsw.com/2002/atx/)\[char46]
.P .P
Setext-style headers are "underlined" using equal signs (for first-level Setext-style headers are "underlined" using equal signs (for first-level
headers) and dashes (for second-level headers). For example: headers) and dashes (for second-level headers)\[char46] For example:
.VERBON 2 .VERBON 2
This is an H1 This is an H1
============= =============
@ -502,7 +502,7 @@ end tell
.VERBOFF .VERBOFF
.P .P
A code block continues until it reaches a line that is not indented A code block continues until it reaches a line that is not indented
(or the end of the article). (or the end of the article)\[char46]
.P .P
Within a code block, ampersands (\fC&\fR) and angle brackets (\fC<\fR and \fC>\fR) Within a code block, ampersands (\fC&\fR) and angle brackets (\fC<\fR and \fC>\fR)
are automatically converted into HTML entities. This makes it very are automatically converted into HTML entities. This makes it very
@ -546,9 +546,9 @@ _ _ _
.VERBOFF .VERBOFF
\l'\n(.lu*8u/10u' \l'\n(.lu*8u/10u'
.P .P
Markdown supports two style of links: \fIinline\fR and \fIreference\fR. Markdown supports two style of links: \fIinline\fR and \fIreference\fR\[char46]
.P .P
In both styles, the link text is delimited by [square brackets]. In both styles, the link text is delimited by [square brackets]\[char46]
.P .P
To create an inline link, use a set of regular parentheses immediately To create an inline link, use a set of regular parentheses immediately
after the link text's closing square bracket. Inside the parentheses, after the link text's closing square bracket. Inside the parentheses,
@ -753,7 +753,7 @@ escape it:
\e*this text is surrounded by literal asterisks\e* \e*this text is surrounded by literal asterisks\e*
.VERBOFF .VERBOFF
.P .P
To indicate a span of code, wrap it with backtick quotes (\fC`\fR). To indicate a span of code, wrap it with backtick quotes (\fC`\fR)\[char46]
Unlike a pre-formatted code block, a code span indicates code within a Unlike a pre-formatted code block, a code span indicates code within a
normal paragraph. For example: normal paragraph. For example:
.VERBON 2 .VERBON 2
@ -819,7 +819,7 @@ Admittedly, it's fairly difficult to devise a "natural" syntax for
placing images into a plain text document format. placing images into a plain text document format.
.P .P
Markdown uses an image syntax that is intended to resemble the syntax Markdown uses an image syntax that is intended to resemble the syntax
for links, allowing for two styles: \fIinline\fR and \fIreference\fR. for links, allowing for two styles: \fIinline\fR and \fIreference\fR\[char46]
.P .P
Inline image syntax looks like this: Inline image syntax looks like this:
.VERBON 2 .VERBON 2
@ -883,7 +883,7 @@ into something like this:
&#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a> &#109;&#x70;&#x6C;e&#x2E;&#99;&#111;&#109;</a>
.VERBOFF .VERBOFF
.P .P
which will render in a browser as a clickable link to "address@example.com". which will render in a browser as a clickable link to "address@example.com"\[char46]
.P .P
(This sort of entity-encoding trick will indeed fool many, if not (This sort of entity-encoding trick will indeed fool many, if not
most, address-harvesting bots, but it definitely won't fool all of most, address-harvesting bots, but it definitely won't fool all of