diff --git a/README b/README
index e8bac9d5d..44bb9a9e1 100644
--- a/README
+++ b/README
@@ -7,7 +7,7 @@ another, and a command-line tool that uses this library. It can read
[markdown] and (subsets of) [reStructuredText], [HTML], and [LaTeX]; and
it can write plain text, [markdown], [reStructuredText], [HTML], [LaTeX],
[ConTeXt], [RTF], [DocBook XML], [OpenDocument XML], [ODT], [GNU Texinfo],
-[MediaWiki markup], [groff man] pages, and [S5] HTML slide shows.
+[MediaWiki markup], [Textile], [groff man] pages, and [S5] HTML slide shows.
Pandoc's enhanced version of markdown includes syntax for footnotes,
tables, flexible ordered lists, definition lists, delimited code blocks,
superscript, subscript, strikeout, title blocks, automatic tables of
@@ -22,6 +22,7 @@ representation of the document, and a set of writers, which convert
this native representation into a target format. Thus, adding an input
or output format requires only adding a reader or writer.
+[Textile]: http://thresholdstate.com/articles/4312/the-textile-reference-manual
[markdown]: http://daringfireball.net/projects/markdown/
[reStructuredText]: http://docutils.sourceforge.net/docs/ref/rst/introduction.html
[S5]: http://meyerweb.com/eric/tools/s5/
@@ -90,8 +91,9 @@ Supported output formats include `markdown`, `latex`, `context`
(ConTeXt), `html`, `rtf` (rich text format), `rst`
(reStructuredText), `docbook` (DocBook XML), `opendocument`
(OpenDocument XML), `odt` (OpenOffice text document), `texinfo`, (GNU
-Texinfo), `mediawiki` (MediaWiki markup), `man` (groff man), and `s5`
-(which produces an HTML file that acts like powerpoint).
+Texinfo), `mediawiki` (MediaWiki markup), `textile` (Textile), `man`
+(groff man), and `s5` (which produces an HTML file that acts like
+powerpoint).
Supported input formats include `markdown`, `html`, `latex`, and `rst`.
Note that the `rst` reader only parses a subset of reStructuredText
@@ -1122,6 +1124,8 @@ In groff man output, it will be rendered verbatim without $'s.
In MediaWiki output, it will be rendered inside `"
+
+inlineToTextile _ (TeX _) = return ""
+
+inlineToTextile _ (HtmlInline str) = return str
+
+inlineToTextile _ (LineBreak) = return "\n"
+
+inlineToTextile _ Space = return " "
+
+inlineToTextile opts (Link txt (src, _)) = do
+ label <- case txt of
+ [Code s] -> return s
+ _ -> inlineListToTextile opts txt
+ return $ "\"" ++ label ++ "\":" ++ src
+
+inlineToTextile opts (Image alt (source, tit)) = do
+ alt' <- inlineListToTextile opts alt
+ let txt = if null tit
+ then if null alt'
+ then ""
+ else "(" ++ alt' ++ ")"
+ else "(" ++ tit ++ ")"
+ return $ "!" ++ source ++ txt ++ "!"
+
+inlineToTextile opts (Note contents) = do
+ curNotes <- liftM stNotes get
+ let newnum = length curNotes + 1
+ contents' <- blockListToTextile opts contents
+ let thisnote = "fn" ++ show newnum ++ ". " ++ contents' ++ "\n"
+ modify $ \s -> s { stNotes = thisnote : curNotes }
+ return $ "[" ++ show newnum ++ "]"
+ -- note - may not work for notes with multiple blocks
diff --git a/src/pandoc.hs b/src/pandoc.hs
index 84e2b2a52..92fc3db1f 100644
--- a/src/pandoc.hs
+++ b/src/pandoc.hs
@@ -120,6 +120,7 @@ writers = [("native" , writeDoc)
,("rst" , writeRST)
,("rst+lhs" , writeRST)
,("mediawiki" , writeMediaWiki)
+ ,("textile" , writeTextile)
,("rtf" , writeRTF)
]
diff --git a/templates/textile.template b/templates/textile.template
new file mode 100644
index 000000000..1862360a8
--- /dev/null
+++ b/templates/textile.template
@@ -0,0 +1,12 @@
+$if(legacy-header)$
+$legacy-header$
+$endif$
+$for(include-before)$
+$include-before$
+
+$endfor$
+$body$
+$for(include-after)$
+
+$include-after$
+$endfor$
diff --git a/tests/RunTests.hs b/tests/RunTests.hs
index 1715400fd..cf2997a06 100644
--- a/tests/RunTests.hs
+++ b/tests/RunTests.hs
@@ -60,6 +60,7 @@ writerFormats = [ "native"
, "markdown"
, "rst"
, "mediawiki"
+ , "textile"
, "rtf"
]
diff --git a/tests/tables.textile b/tests/tables.textile
new file mode 100644
index 000000000..ccb34cf58
--- /dev/null
+++ b/tests/tables.textile
@@ -0,0 +1,212 @@
+Simple table with caption:
+
+
+ Demonstration of simple table syntax.
+
+
+
+
+
+12 |
+12 |
+12 |
+12 |
+
+
+123 |
+123 |
+123 |
+123 |
+
+
+1 |
+1 |
+1 |
+1 |
+
+
+
+
+Simple table without caption:
+
+
+
+
+
+
+
+12 |
+12 |
+12 |
+12 |
+
+
+123 |
+123 |
+123 |
+123 |
+
+
+1 |
+1 |
+1 |
+1 |
+
+
+
+
+Simple table indented two spaces:
+
+
+ Demonstration of simple table syntax.
+
+
+
+
+
+12 |
+12 |
+12 |
+12 |
+
+
+123 |
+123 |
+123 |
+123 |
+
+
+1 |
+1 |
+1 |
+1 |
+
+
+
+
+Multiline table with caption:
+
+
+ Here's the caption. It may span multiple lines.
+
+
+
+
+
+
+
+
+
+First |
+row |
+12.0 |
+Example of a row that spans multiple lines. |
+
+
+Second |
+row |
+5.0 |
+Here's another one. Note the blank line between rows. |
+
+
+
+
+Multiline table without caption:
+
+
+
+
+
+
+
+
+
+
+
+First |
+row |
+12.0 |
+Example of a row that spans multiple lines. |
+
+
+Second |
+row |
+5.0 |
+Here's another one. Note the blank line between rows. |
+
+
+
+
+Table without column headers:
+
+
+
+
+12 |
+12 |
+12 |
+12 |
+
+
+123 |
+123 |
+123 |
+123 |
+
+
+1 |
+1 |
+1 |
+1 |
+
+
+
+
+Multiline table without column headers:
+
+
+
+
+
+
+
+
+First |
+row |
+12.0 |
+Example of a row that spans multiple lines. |
+
+
+Second |
+row |
+5.0 |
+Here's another one. Note the blank line between rows. |
+
+
+
+
diff --git a/tests/writer.textile b/tests/writer.textile
new file mode 100644
index 000000000..f864e71f2
--- /dev/null
+++ b/tests/writer.textile
@@ -0,0 +1,683 @@
+This is a set of tests for pandoc. Most of them are adapted from John Gruber's markdown test suite.
+
+
+
+h1. Headers
+
+h2. Level 2 with an "embedded link":/url
+
+h3. Level 3 with _emphasis_
+
+h4. Level 4
+
+h5. Level 5
+
+h1. Level 1
+
+h2. Level 2 with _emphasis_
+
+h3. Level 3
+
+with no blank line
+
+h2. Level 2
+
+with no blank line
+
+
+
+h1. Paragraphs
+
+Here's a regular paragraph.
+
+In Markdown 1.0.0 and earlier. Version 8. This line turns into a list item. Because a hard-wrapped line in the middle of a paragraph looked like a list item.
+
+Here's one with a bullet. * criminey.
+
+There should be a hard line break
+here.
+
+
+
+h1. Block Quotes
+
+E-mail style:
+
+bq. This is a block quote. It is pretty short.
+
+
+
+Code in a block quote:
+
+bc. sub status {
+ print "working";
+}
+
+A list:
+
+# item one
+# item two
+
+Nested block quotes:
+
+bq. nested
+
+bq. nested
+
+
+
+This should not be a block quote: 2 > 1.
+
+And a following paragraph.
+
+
+
+h1. Code Blocks
+
+Code:
+
+bc.. ---- (should be four hyphens)
+
+sub status {
+ print "working";
+}
+
+this code block is indented by one tab
+
+And:
+
+bc.. this code block is indented by two tabs
+
+These should not be escaped: \$ \\ \> \[ \{
+
+
+
+h1. Lists
+
+h2. Unordered
+
+Asterisks tight:
+
+* asterisk 1
+* asterisk 2
+* asterisk 3
+
+Asterisks loose:
+
+* asterisk 1
+* asterisk 2
+* asterisk 3
+
+Pluses tight:
+
+* Plus 1
+* Plus 2
+* Plus 3
+
+Pluses loose:
+
+* Plus 1
+* Plus 2
+* Plus 3
+
+Minuses tight:
+
+* Minus 1
+* Minus 2
+* Minus 3
+
+Minuses loose:
+
+* Minus 1
+* Minus 2
+* Minus 3
+
+h2. Ordered
+
+Tight:
+
+# First
+# Second
+# Third
+
+and:
+
+# One
+# Two
+# Three
+
+Loose using tabs:
+
+# First
+# Second
+# Third
+
+and using spaces:
+
+# One
+# Two
+# Three
+
+Multiple paragraphs:
+
+
+ -
Item 1, graf one.
+ Item 1. graf two. The quick brown fox jumped over the lazy dog's back.
+ -
Item 2.
+ -
Item 3.
+
+h2. Nested
+
+* Tab
+** Tab
+*** Tab
+
+
+
+Here's another:
+
+# First
+# Second:
+#* Fee
+#* Fie
+#* Foe
+
+# Third
+
+Same thing but with paragraphs:
+
+# First
+# Second:
+#* Fee
+#* Fie
+#* Foe
+
+# Third
+
+h2. Tabs and spaces
+
+* this is a list item indented with tabs
+* this is a list item indented with spaces
+** this is an example list item indented with tabs
+** this is an example list item indented with spaces
+
+
+h2. Fancy list markers
+
+
+ - begins with 2
+ -
and now 3
+ with a continuation
+
+ - sublist with roman numerals, starting with 4
+ - more items
+
+ - a subsublist
+ - a subsublist
+
+
+
+Nesting:
+
+
+ - Upper Alpha
+
+ - Upper Roman.
+
+ - Decimal start with 6
+
+ - Lower alpha with paren
+
+
+
+
+Autonumbering:
+
+# Autonumber.
+# More.
+## Nested.
+
+
+Should not be a list item:
+
+M.A. 2007
+
+B. Williams
+
+
+
+h1. Definition Lists
+
+Tight using spaces:
+
+
+ - apple
+ - red fruit
+ - orange
+ - orange fruit
+ - banana
+ - yellow fruit
+
+Tight using tabs:
+
+
+ - apple
+ - red fruit
+ - orange
+ - orange fruit
+ - banana
+ - yellow fruit
+
+Loose:
+
+
+ - apple
+ -
red fruit
+ - orange
+ -
orange fruit
+ - banana
+ -
yellow fruit
+
+Multiple blocks with italics:
+
+
+ - _apple_
+ -
red fruit
+ contains seeds, crisp, pleasant to taste
+ - _orange_
+ -
orange fruit
+bc. { orange code block }
+
+bq. orange block quote
+
+Multiple definitions, tight:
+
+
+ - apple
+ - red fruit
+ - computer
+ - orange
+ - orange fruit
+ - bank
+
+Multiple definitions, loose:
+
+
+ - apple
+ -
red fruit
+ -
computer
+ - orange
+ -
orange fruit
+ -
bank
+
+Blank line after term, indented marker, alternate markers:
+
+
+ - apple
+ -
red fruit
+ -
computer
+ - orange
+ -
orange fruit
+
+ - sublist
+ - sublist
+
+
+h1. HTML Blocks
+
+Simple block on one line:
+
+
+foo
+
+
+And nested without indentation:
+
+
+
+Interpreted markdown in a table:
+
+
+
+
+This is _emphasized_
+ |
+
+And this is *strong*
+ |
+
+
+
+
+
+Here's a simple block:
+
+
+
+foo
+
+
+This should be a code block, though:
+
+bc. <div>
+ foo
+</div>
+
+As should this:
+
+bc. <div>foo</div>
+
+Now, nested:
+
+
+
+This should just be an HTML comment:
+
+
+
+Multiline:
+
+
+
+
+
+Code block:
+
+bc. <!-- Comment -->
+
+Just plain comment, with trailing spaces on the line:
+
+
+
+Code:
+
+bc. <hr />
+
+Hr's:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+h1. Inline Markup
+
+This is _emphasized_, and so _is this_.
+
+This is *strong*, and so *is this*.
+
+An _"emphasized link":/url_.
+
+*_This is strong and em._*
+
+So is *_this_* word.
+
+*_This is strong and em._*
+
+So is *_this_* word.
+
+This is code: @>@, @$@, @\@, @\$@, @<html>@.
+
+-This is _strikeout_.-
+
+Superscripts: a^bc^d a^_hello_^ a^hello there^.
+
+Subscripts: H~2~O, H~23~O, H~many of them~O.
+
+These should not be superscripts or subscripts, because of the unescaped spaces: a^b c^d, a~b c~d.
+
+
+
+h1. Smart quotes, ellipses, dashes
+
+"Hello," said the spider. "'Shelob' is my name."
+
+'A', 'B', and 'C' are letters.
+
+'Oak,' 'elm,' and 'beech' are names of trees. So is 'pine.'
+
+'He said, "I want to go."' Were you alive in the 70's?
+
+Here is some quoted '@code@' and a ""quoted link":http://example.com/?foo=1&bar=2".
+
+Some dashes: one -- two -- three -- four -- five.
+
+Dashes between numbers: 5 - 7, 255 - 66, 1987 - 1999.
+
+Ellipses...and...and....
+
+
+
+h1. LaTeX
+
+*
+* 2+2=4
+* x \in y
+* \alpha \wedge \omega
+* 223
+* p-Tree
+* Here's some display math: \frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}
+* Here's one that has a line break in it: \alpha + \omega \times x^2.
+
+These shouldn't be math:
+
+* To get the famous equation, write @$e = mc^2$@.
+* $22,000 is a _lot_ of money. So is $34,000. (It worked if "lot" is emphasized.)
+* Shoes ($20) and socks ($5).
+* Escaped @$@: $73 _this should be emphasized_ 23$.
+
+Here's a LaTeX table:
+
+
+
+
+
+h1. Special Characters
+
+Here is some unicode:
+
+* I hat: Î
+* o umlaut: ö
+* section: §
+* set membership: ∈
+* copyright: ©
+
+AT&T has an ampersand in their name.
+
+AT&T is another way to write it.
+
+This & that.
+
+4 < 5.
+
+6 > 5.
+
+Backslash: \
+
+Backtick: `
+
+Asterisk: *
+
+Underscore: _
+
+Left brace: {
+
+Right brace: }
+
+Left bracket: [
+
+Right bracket: ]
+
+Left paren: (
+
+Right paren: )
+
+Greater-than: >
+
+Hash: #
+
+Period: .
+
+Bang: !
+
+Plus: +
+
+Minus: -
+
+
+
+h1. Links
+
+h2. Explicit
+
+Just a "URL":/url/.
+
+"URL and title":/url/.
+
+"URL and title":/url/.
+
+"URL and title":/url/.
+
+"URL and title":/url/
+
+"URL and title":/url/
+
+"with_underscore":/url/with_underscore
+
+"Email link":mailto:nobody@nowhere.net
+
+"Empty":.
+
+h2. Reference
+
+Foo "bar":/url/.
+
+Foo "bar":/url/.
+
+Foo "bar":/url/.
+
+With "embedded [brackets]":/url/.
+
+"b":/url/ by itself should be a link.
+
+Indented "once":/url.
+
+Indented "twice":/url.
+
+Indented "thrice":/url.
+
+This should [not][] be a link.
+
+bc. [not]: /url
+
+Foo "bar":/url/.
+
+Foo "biz":/url/.
+
+h2. With ampersands
+
+Here's a "link with an ampersand in the URL":http://example.com/?foo=1&bar=2.
+
+Here's a link with an amersand in the link text: "AT&T":http://att.com/.
+
+Here's an "inline link":/script?foo=1&bar=2.
+
+Here's an "inline link in pointy braces":/script?foo=1&bar=2.
+
+h2. Autolinks
+
+With an ampersand: "http://example.com/?foo=1&bar=2":http://example.com/?foo=1&bar=2
+
+* In a list?
+* "http://example.com/":http://example.com/
+* It should.
+
+An e-mail address: "nobody@nowhere.net":mailto:nobody@nowhere.net
+
+bq. Blockquoted: "http://example.com/":http://example.com/
+
+Auto-links should not occur here: @<http://example.com/>@
+
+bc. or here: <http://example.com/>
+
+
+
+h1. Images
+
+From "Voyage dans la Lune" by Georges Melies (1902):
+
+!lalune.jpg(Voyage dans la Lune)!
+lalune
+
+Here is a movie !movie.jpg(movie)! icon.
+
+
+
+h1. Footnotes
+
+Here is a footnote reference,[1] and another.[2] This should _not_ be a footnote reference, because it contains a space.[^my note] Here is an inline note.[3]
+
+bq. Notes can go in quotes.[4]
+
+# And in list items.[5]
+
+This paragraph should not be part of the note, as it is not indented.
+
+
+fn1. Here is the footnote. It can go anywhere after the footnote reference. It need not be placed at the end of the document.
+
+
+fn2. Here's the long note. This one contains multiple blocks.
+
+Subsequent blocks are indented to show that they belong to the footnote (as with list items).
+
+bc. { <code> }
+
+If you want, you can indent every line, but you can also be lazy and just indent the first line of each block.
+
+
+fn3. This is _easier_ to type. Inline notes may contain "links":http://google.com and @]@ verbatim characters, as well as [bracketed text].
+
+
+fn4. In quote.
+
+
+fn5. In list.
+
+