From d073b168924a8391c771ecf47af3448bdfa027c6 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 10 Apr 2010 12:38:07 -0700
Subject: Added Textile writer module.

---
 tests/RunTests.hs    |   1 +
 tests/tables.textile | 212 ++++++++++++++++
 tests/writer.textile | 683 +++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 896 insertions(+)
 create mode 100644 tests/tables.textile
 create mode 100644 tests/writer.textile

(limited to 'tests')

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:
+
+ <table>
+ <caption>Demonstration of simple table syntax.</caption>
+ <thead>
+<tr class="header">
+<th align="right">Right</th>
+<th align="left">Left</th>
+<th align="center">Center</th>
+<th align="left">Default</th>
+</tr>
+ </thead>
+ <tbody>
+<tr class="odd">
+<td align="right">12</td>
+<td align="left">12</td>
+<td align="center">12</td>
+<td align="left">12</td>
+</tr>
+<tr class="even">
+<td align="right">123</td>
+<td align="left">123</td>
+<td align="center">123</td>
+<td align="left">123</td>
+</tr>
+<tr class="odd">
+<td align="right">1</td>
+<td align="left">1</td>
+<td align="center">1</td>
+<td align="left">1</td>
+</tr>
+ </tbody>
+ </table>
+
+Simple table without caption:
+
+ <table>
+ <thead>
+<tr class="header">
+<th align="right">Right</th>
+<th align="left">Left</th>
+<th align="center">Center</th>
+<th align="left">Default</th>
+</tr>
+ </thead>
+ <tbody>
+<tr class="odd">
+<td align="right">12</td>
+<td align="left">12</td>
+<td align="center">12</td>
+<td align="left">12</td>
+</tr>
+<tr class="even">
+<td align="right">123</td>
+<td align="left">123</td>
+<td align="center">123</td>
+<td align="left">123</td>
+</tr>
+<tr class="odd">
+<td align="right">1</td>
+<td align="left">1</td>
+<td align="center">1</td>
+<td align="left">1</td>
+</tr>
+ </tbody>
+ </table>
+
+Simple table indented two spaces:
+
+ <table>
+ <caption>Demonstration of simple table syntax.</caption>
+ <thead>
+<tr class="header">
+<th align="right">Right</th>
+<th align="left">Left</th>
+<th align="center">Center</th>
+<th align="left">Default</th>
+</tr>
+ </thead>
+ <tbody>
+<tr class="odd">
+<td align="right">12</td>
+<td align="left">12</td>
+<td align="center">12</td>
+<td align="left">12</td>
+</tr>
+<tr class="even">
+<td align="right">123</td>
+<td align="left">123</td>
+<td align="center">123</td>
+<td align="left">123</td>
+</tr>
+<tr class="odd">
+<td align="right">1</td>
+<td align="left">1</td>
+<td align="center">1</td>
+<td align="left">1</td>
+</tr>
+ </tbody>
+ </table>
+
+Multiline table with caption:
+
+ <table>
+ <caption>Here's the caption. It may span multiple lines.</caption>
+ <col width="15%" />
+ <col width="13%" />
+ <col width="16%" />
+ <col width="33%" />
+ <thead>
+<tr class="header">
+<th align="center">Centered Header</th>
+<th align="left">Left Aligned</th>
+<th align="right">Right Aligned</th>
+<th align="left">Default aligned</th>
+</tr>
+ </thead>
+ <tbody>
+<tr class="odd">
+<td align="center">First</td>
+<td align="left">row</td>
+<td align="right">12.0</td>
+<td align="left">Example of a row that spans multiple lines.</td>
+</tr>
+<tr class="even">
+<td align="center">Second</td>
+<td align="left">row</td>
+<td align="right">5.0</td>
+<td align="left">Here's another one. Note the blank line between rows.</td>
+</tr>
+ </tbody>
+ </table>
+
+Multiline table without caption:
+
+ <table>
+ <col width="15%" />
+ <col width="13%" />
+ <col width="16%" />
+ <col width="33%" />
+ <thead>
+<tr class="header">
+<th align="center">Centered Header</th>
+<th align="left">Left Aligned</th>
+<th align="right">Right Aligned</th>
+<th align="left">Default aligned</th>
+</tr>
+ </thead>
+ <tbody>
+<tr class="odd">
+<td align="center">First</td>
+<td align="left">row</td>
+<td align="right">12.0</td>
+<td align="left">Example of a row that spans multiple lines.</td>
+</tr>
+<tr class="even">
+<td align="center">Second</td>
+<td align="left">row</td>
+<td align="right">5.0</td>
+<td align="left">Here's another one. Note the blank line between rows.</td>
+</tr>
+ </tbody>
+ </table>
+
+Table without column headers:
+
+ <table>
+ <tbody>
+<tr class="odd">
+<td align="right">12</td>
+<td align="left">12</td>
+<td align="center">12</td>
+<td align="right">12</td>
+</tr>
+<tr class="even">
+<td align="right">123</td>
+<td align="left">123</td>
+<td align="center">123</td>
+<td align="right">123</td>
+</tr>
+<tr class="odd">
+<td align="right">1</td>
+<td align="left">1</td>
+<td align="center">1</td>
+<td align="right">1</td>
+</tr>
+ </tbody>
+ </table>
+
+Multiline table without column headers:
+
+ <table>
+ <col width="15%" />
+ <col width="13%" />
+ <col width="16%" />
+ <col width="33%" />
+ <tbody>
+<tr class="odd">
+<td align="center">First</td>
+<td align="left">row</td>
+<td align="right">12.0</td>
+<td align="left">Example of a row that spans multiple lines.</td>
+</tr>
+<tr class="even">
+<td align="center">Second</td>
+<td align="left">row</td>
+<td align="right">5.0</td>
+<td align="left">Here's another one. Note the blank line between rows.</td>
+</tr>
+ </tbody>
+ </table>
+
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.
+
+<hr />
+
+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
+
+<hr />
+
+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. &#42; criminey.
+
+There should be a hard line break
+here.
+
+<hr />
+
+h1. Block Quotes
+
+E-mail style:
+
+bq. This is a block quote. It is pretty short.
+
+<blockquote>
+
+Code in a block quote:
+
+bc. sub status {
+    print &quot;working&quot;;
+}
+
+A list:
+
+# item one
+# item two
+
+Nested block quotes:
+
+bq. nested
+
+bq. nested
+
+</blockquote>
+
+This should not be a block quote: 2 &gt; 1.
+
+And a following paragraph.
+
+<hr />
+
+h1. Code Blocks
+
+Code:
+
+bc.. ---- (should be four hyphens)
+
+sub status {
+    print &quot;working&quot;;
+}
+
+this code block is indented by one tab
+
+And:
+
+bc..     this code block is indented by two tabs
+
+These should not be escaped:  \$ \\ \&gt; \[ \{
+
+<hr />
+
+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:
+
+ <ol style="list-style-type: decimal;">
+ <li> <p>Item 1, graf one.</p>
+ <p>Item 1. graf two. The quick brown fox jumped over the lazy dog's back.</p></li>
+ <li> <p>Item 2.</p></li>
+ <li> <p>Item 3.</p></li> </ol>
+
+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
+
+ <ol start="2" style="list-style-type: decimal;">
+ <li>begins with 2</li>
+ <li> <p>and now 3</p>
+ <p>with a continuation</p>
+ <ol start="4" style="list-style-type: lower-roman;">
+ <li>sublist with roman numerals, starting with 4</li>
+ <li>more items
+ <ol style="list-style-type: upper-alpha;">
+ <li>a subsublist</li>
+ <li>a subsublist</li> </ol>
+</li> </ol>
+</li> </ol>
+
+Nesting:
+
+ <ol style="list-style-type: upper-alpha;">
+ <li>Upper Alpha
+ <ol style="list-style-type: upper-roman;">
+ <li>Upper Roman.
+ <ol start="6" style="list-style-type: decimal;">
+ <li>Decimal start with 6
+ <ol start="3" style="list-style-type: lower-alpha;">
+ <li>Lower alpha with paren</li> </ol>
+</li> </ol>
+</li> </ol>
+</li> </ol>
+
+Autonumbering:
+
+# Autonumber.
+# More.
+## Nested.
+
+
+Should not be a list item:
+
+M.A. 2007
+
+B. Williams
+
+<hr />
+
+h1. Definition Lists
+
+Tight using spaces:
+
+ <dl>
+ <dt>apple</dt>
+ <dd>red fruit</dd>
+ <dt>orange</dt>
+ <dd>orange fruit</dd>
+ <dt>banana</dt>
+ <dd>yellow fruit</dd> </dl>
+
+Tight using tabs:
+
+ <dl>
+ <dt>apple</dt>
+ <dd>red fruit</dd>
+ <dt>orange</dt>
+ <dd>orange fruit</dd>
+ <dt>banana</dt>
+ <dd>yellow fruit</dd> </dl>
+
+Loose:
+
+ <dl>
+ <dt>apple</dt>
+ <dd> <p>red fruit</p></dd>
+ <dt>orange</dt>
+ <dd> <p>orange fruit</p></dd>
+ <dt>banana</dt>
+ <dd> <p>yellow fruit</p></dd> </dl>
+
+Multiple blocks with italics:
+
+ <dl>
+ <dt>_apple_</dt>
+ <dd> <p>red fruit</p>
+ <p>contains seeds, crisp, pleasant to taste</p></dd>
+ <dt>_orange_</dt>
+ <dd> <p>orange fruit</p>
+bc. { orange code block }
+
+bq.  <p>orange block quote</p></dd> </dl>
+
+Multiple definitions, tight:
+
+ <dl>
+ <dt>apple</dt>
+ <dd>red fruit</dd>
+ <dd>computer</dd>
+ <dt>orange</dt>
+ <dd>orange fruit</dd>
+ <dd>bank</dd> </dl>
+
+Multiple definitions, loose:
+
+ <dl>
+ <dt>apple</dt>
+ <dd> <p>red fruit</p></dd>
+ <dd> <p>computer</p></dd>
+ <dt>orange</dt>
+ <dd> <p>orange fruit</p></dd>
+ <dd> <p>bank</p></dd> </dl>
+
+Blank line after term, indented marker, alternate markers:
+
+ <dl>
+ <dt>apple</dt>
+ <dd> <p>red fruit</p></dd>
+ <dd> <p>computer</p></dd>
+ <dt>orange</dt>
+ <dd> <p>orange fruit</p>
+ <ol style="list-style-type: decimal;">
+ <li>sublist</li>
+ <li>sublist</li> </ol>
+</dd> </dl>
+
+h1. HTML Blocks
+
+Simple block on one line:
+
+<div>
+foo
+</div>
+
+And nested without indentation:
+
+<div>
+<div>
+<div>
+foo
+</div>
+</div>
+<div>
+bar
+</div>
+</div>
+
+Interpreted markdown in a table:
+
+<table>
+<tr>
+<td>
+This is _emphasized_
+</td>
+<td>
+And this is *strong*
+</td>
+</tr>
+</table>
+
+<script type="text/javascript">document.write('This *should not* be interpreted as markdown');</script>
+
+Here's a simple block:
+
+<div>
+    
+foo
+</div>
+
+This should be a code block, though:
+
+bc. &lt;div&gt;
+    foo
+&lt;/div&gt;
+
+As should this:
+
+bc. &lt;div&gt;foo&lt;/div&gt;
+
+Now, nested:
+
+<div>
+    <div>
+        <div>
+            
+foo
+</div>
+    </div>
+</div>
+
+This should just be an HTML comment:
+
+<!-- Comment -->
+
+Multiline:
+
+<!--
+Blah
+Blah
+-->
+
+<!--
+    This is another comment.
+-->
+
+Code block:
+
+bc. &lt;!-- Comment --&gt;
+
+Just plain comment, with trailing spaces on the line:
+
+<!-- foo -->   
+
+Code:
+
+bc. &lt;hr /&gt;
+
+Hr's:
+
+<hr>
+
+<hr />
+
+<hr />
+
+<hr>   
+
+<hr />  
+
+<hr /> 
+
+<hr class="foo" id="bar" />
+
+<hr class="foo" id="bar" />
+
+<hr class="foo" id="bar">
+
+<hr />
+
+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: @&gt;@, @$@, @\@, @\$@, @&lt;html&gt;@.
+
+-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.
+
+<hr />
+
+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....
+
+<hr />
+
+h1. LaTeX
+
+* 
+* <span class="math">2+2=4</math>
+* <span class="math">x \in y</math>
+* <span class="math">\alpha \wedge \omega</math>
+* <span class="math">223</math>
+* <span class="math">p</math>-Tree
+* Here's some display math: <span class="math">\frac{d}{dx}f(x)=\lim_{h\to 0}\frac{f(x+h)-f(x)}{h}</math>
+* Here's one that has a line break in it: <span class="math">\alpha + \omega \times x^2</math>.
+
+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:
+
+
+
+<hr />
+
+h1. Special Characters
+
+Here is some unicode:
+
+* I hat: Î
+* o umlaut: ö
+* section: §
+* set membership: ∈
+* copyright: ©
+
+AT&amp;T has an ampersand in their name.
+
+AT&amp;T is another way to write it.
+
+This &amp; that.
+
+4 &lt; 5.
+
+6 &gt; 5.
+
+Backslash: \
+
+Backtick: `
+
+Asterisk: &#42;
+
+Underscore: &#95;
+
+Left brace: {
+
+Right brace: }
+
+Left bracket: [
+
+Right bracket: ]
+
+Left paren: (
+
+Right paren: )
+
+Greater-than: &gt;
+
+Hash: #
+
+Period: .
+
+Bang: !
+
+Plus: +
+
+Minus: -
+
+<hr />
+
+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&#95;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&amp;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: @&lt;http://example.com/&gt;@
+
+bc. or here: &lt;http://example.com/&gt;
+
+<hr />
+
+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.
+
+<hr />
+
+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.   { &lt;code&gt; }
+
+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.
+
+
-- 
cgit v1.2.3


From cae3f8edbaac60e16152c87b93f0da317c1952f9 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 27 Nov 2010 10:44:35 -0800
Subject: Fixed spacing problems in textile nested lists.

---
 src/Text/Pandoc/Writers/Textile.hs | 6 ++++--
 tests/writer.textile               | 6 ------
 2 files changed, 4 insertions(+), 8 deletions(-)

(limited to 'tests')

diff --git a/src/Text/Pandoc/Writers/Textile.hs b/src/Text/Pandoc/Writers/Textile.hs
index 8dd2288c9..05acb5e8b 100644
--- a/src/Text/Pandoc/Writers/Textile.hs
+++ b/src/Text/Pandoc/Writers/Textile.hs
@@ -176,9 +176,10 @@ blockToTextile opts x@(BulletList items) = do
         return $ " <ul>\n" ++ vcat contents ++ " </ul>\n"
      else do
         modify $ \s -> s { stListLevel = stListLevel s ++ "*" }
+        level <- get >>= return . length . stListLevel
         contents <- mapM (listItemToTextile opts) items
         modify $ \s -> s { stListLevel = init (stListLevel s) }
-        return $ vcat contents ++ "\n"
+        return $ vcat contents ++ (if level > 1 then "" else "\n")
 
 blockToTextile opts x@(OrderedList attribs items) = do
   oldUseTags <- liftM stUseTags get
@@ -190,9 +191,10 @@ blockToTextile opts x@(OrderedList attribs items) = do
                    " </ol>\n"
      else do
         modify $ \s -> s { stListLevel = stListLevel s ++ "#" }
+        level <- get >>= return . length . stListLevel
         contents <- mapM (listItemToTextile opts) items
         modify $ \s -> s { stListLevel = init (stListLevel s) }
-        return $ vcat contents ++ "\n"
+        return $ vcat contents ++ (if level > 1 then "" else "\n")
 
 blockToTextile opts (DefinitionList items) = do
   contents <- withUseTags $ mapM (definitionListItemToTextile opts) items
diff --git a/tests/writer.textile b/tests/writer.textile
index f864e71f2..7fcda539d 100644
--- a/tests/writer.textile
+++ b/tests/writer.textile
@@ -172,8 +172,6 @@ h2. Nested
 ** Tab
 *** Tab
 
-
-
 Here's another:
 
 # First
@@ -181,7 +179,6 @@ Here's another:
 #* Fee
 #* Fie
 #* Foe
-
 # Third
 
 Same thing but with paragraphs:
@@ -191,7 +188,6 @@ Same thing but with paragraphs:
 #* Fee
 #* Fie
 #* Foe
-
 # Third
 
 h2. Tabs and spaces
@@ -201,7 +197,6 @@ h2. Tabs and spaces
 ** this is an example list item indented with tabs
 ** this is an example list item indented with spaces
 
-
 h2. Fancy list markers
 
  <ol start="2" style="list-style-type: decimal;">
@@ -237,7 +232,6 @@ Autonumbering:
 # More.
 ## Nested.
 
-
 Should not be a list item:
 
 M.A. 2007
-- 
cgit v1.2.3


From 71c9316a597298415a7d4cb7f758b523ac9339cd Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 27 Nov 2010 10:44:58 -0800
Subject: Use [] for superscripts and subscripts in textile writer.

---
 src/Text/Pandoc/Writers/Textile.hs | 4 ++--
 tests/writer.textile               | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

(limited to 'tests')

diff --git a/src/Text/Pandoc/Writers/Textile.hs b/src/Text/Pandoc/Writers/Textile.hs
index 05acb5e8b..cb8f20a0a 100644
--- a/src/Text/Pandoc/Writers/Textile.hs
+++ b/src/Text/Pandoc/Writers/Textile.hs
@@ -344,13 +344,13 @@ inlineToTextile opts (Superscript lst) = do
   contents <- inlineListToTextile opts lst
   return $ if '^' `elem` contents
               then "<sup>" ++ contents ++ "</sup>"
-              else "^" ++ contents ++ "^"
+              else "[^" ++ contents ++ "^]"
 
 inlineToTextile opts (Subscript lst) = do
   contents <- inlineListToTextile opts lst
   return $ if '~' `elem` contents
               then "<sub>" ++ contents ++ "</sub>"
-              else "~" ++ contents ++ "~"
+              else "[~" ++ contents ++ "~]"
 
 inlineToTextile opts (SmallCaps lst) = inlineListToTextile opts lst
 
diff --git a/tests/writer.textile b/tests/writer.textile
index 7fcda539d..b3e2e545b 100644
--- a/tests/writer.textile
+++ b/tests/writer.textile
@@ -450,9 +450,9 @@ This is code: @&gt;@, @$@, @\@, @\$@, @&lt;html&gt;@.
 
 -This is _strikeout_.-
 
-Superscripts: a^bc^d a^_hello_^ a^hello there^.
+Superscripts: a[^bc^]d a[^_hello_^] a[^hello there^].
 
-Subscripts: H~2~O, H~23~O, H~many of them~O.
+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.
 
-- 
cgit v1.2.3