[ANN] Showdown -- A javascript port of Markdown

John Fraser showdown at attacklab.net
Tue Feb 27 23:56:15 EST 2007


Hi,

I've just posted the first public version of Showdown, a full
javascript port of Markdown. It's 10KB and works in all major
browsers. Try out the sample app:

<http://www.attacklab.net/showdown-gui.html>

Full source code is available:

<http://www.attacklab.net/showdown-v0.9.zip>

All the heavy lifting is done by the browser's regular expression
engine, so Showdown should be fast enough to handle anything a
reasonable person would put in a textarea.

This is mostly a faithful, line-by-line port of Markdown.pl, but I've
made a few changes to work around missing RegExp features and to
improve performance. I'm kind of shocked by the speedup I got
without any algorithmic changes: Showdown converts my 300KB test file
about 10x as fast as Markdown 1.0.2b2 and 30x as fast as 1.0.2b7.
More reasonable input shows a smaller (but still substantial)
improvement. I'm guessing that the major gains are from getting rid
of md5 hashing, anchoring a wandering regex in `_Detab()`, and
removing `_TokenizeHTML()` completely.

I think the sample app actually ended up being a pretty usable tool --
and it's a great way to learn Markdown. If you know people who could
use it, please send them my way.

Release notes follow.

-John Fraser

email: showdown [at] [the following site]
site: <http://attacklab.net/>


---


Showdown -- A JavaScript port of Markdown
=========================================

Showdown Copyright (c) 2007 John Fraser.
<http://www.attacklab.net/>

Original Markdown Copyright (c) 2004-2005 John Gruber
<http://daringfireball.net/projects/markdown/>

Redistributable under a BSD-style open source license.
See license.txt for more information.


What's it for?
--------------

Developers can use Showdown to:

* Add in-browser preview to existing Markdown applications

Showdown's output is (almost always) identical to
markdown.pl's, so the server can reproduce exactly
the output that the user saw. (See below for
exceptions.)

* Add Markdown input to programs that don't support it

Any app that accepts HTML input can now be made to speak
Markdown by modifying the input pages's HTML. If your
application lets users edit documents again later,
then they won't have access to the original Markdown
text. But this should be good enough for many
uses -- and you can do it with just a two-line
`onsubmit` function.

* Add Markdown input to closed-source web apps

You can write bookmarklets or userscripts to extend
any standard textarea on the web so that it accepts
Markdown instead of HTML. With a little more hacking,
the same can probably be done with many rich edit
controls.

* Build new web apps from scratch

A Showdown front-end can send back text in Markdown,
HTML or both, so you can trade bandwidth for server
load to reduce your cost of operation. If your app
requires javascript, you won't need to do any
Markdown processing on the server at all. (For most
uses, you'll still need to sanitize the HTML before
showing it to other users -- but you'd need to do
that anyway if you're allowing raw HTML in your
Markdown.)


Browser Compatibility
---------------------

Showdown has been tested successfully with:

- Firefox 1.5 and 2.0
- Internet Explorer 6 and 7
- Safari 2.0.4
- Opera 8.54 and 9.10
- Netscape 8.1.2
- Konqueror 3.5.4

In theory, Showdown will work in any browser that supports ECMA 262
3rd Edition (JavaScript 1.5). The converter itself might even work in
things that aren't web browsers, like Acrobat. No promises.


Known Differences in Output
---------------------------

In most cases, Showdown's output is identical to that of Perl Markdown
v1.0.2b7. What follows is a list of all known deviations. Please
email me if you find more.


* This release uses the HTML parser from Markdown 1.0.2b2,
which means it fails `Inline HTML (Advanced).text` from
the Markdown test suite:

<div>
<div>
unindented == broken
</div>
</div>


* Showdown doesn't support the markdown="1" attribute:

<div markdown="1">
Markdown does *not* work in here.
</div>

This is half laziness on my part and half stubbornness.
Markdown is smart enough to process the contents of span-
level tags without screwing things up; shouldn't it be
able to do the same inside block elements? Let's find a
way to make markdown="1" the default.


* You can only nest square brackets in link titles to a
depth of two levels:

[[fine]](http://www.attacklab.net/)
[[[broken]]](http://www.attacklab.net/)

If you need more, you can escape them with backslashes.


* When sublists have paragraphs, Showdown produces equivalent
HTML with a slightly different arrangement of newlines:

+ item

- subitem

The HTML has a superfluous newline before this
paragraph.

- subitem

The HTML here is unchanged.

- subitem

The HTML is missing a newline after this
list subitem.



* Markdown.pl creates empty title attributes for
inline-style images:

Here's an empty title on an inline-style
![image](http://w3.org/Icons/valid-xhtml10).

I tried to replicate this to clean up my diffs during
testing, but I went too far: now Showdown also makes
empty titles for reference-style images:

Showdown makes an empty title for
reference-style ![images][] too.

[images]: http://w3.org/Icons/valid-xhtml10


* With crazy input, Markdown will mistakenly put
`<strong>` or `<em>` tags in URLs:

<a href="<*Markdown adds em tags in here*>">
improbable URL
</a>

Showdown won't. But still, don't do that.


More information about the Markdown-Discuss mailing list