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.
var Showdown = require'showdown';var converter = ;convertermakeHtml'#hello markdown!';// <h1 id="hellomarkdown">hello markdown!</h1>
Developers can use Showdown to:
Add in-browser preview to existing Markdown apps
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
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
Showdown has been tested successfully with:
Showdown provides a wrapper for angular. Using it is very simple:
sd-model-to-htmldirective to bind a model to a view and render it as HTML.
Showdown allows additional functionality to be loaded via extensions.
<script src="src/showdown.js" /><script src="src/extensions/twitter.js" />var converter = extensions: 'twitter' ;
// Using a bundled extensionvar Showdown = require'showdown';var converter = extensions: 'twitter' ;// Using a custom extensionvar mine = require'./custom-extensions/mine';var converter = extensions: 'twitter' mine ;
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 file an issue 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:
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
<em> tags in URLs:
<a href="<*Markdown adds em tags in here*>"> improbable URL </a>
Showdown won't. But still, don't do that.
A suite of tests is available which require node.js. Once node is installed, run the following command from the project root to install the development dependencies:
npm install --dev
Once installed the tests can be run from the project root using:
New test cases can easily be added. Create a markdown file (ending in
.md) which contains the markdown to test. Create a
.html file of the exact same name. It will automatically be tested when the tests are executed with
A showdown extension is simply a function which returns an array of language extensions and/or output modifiers:
langtype, and add new markdown syntax to showdown. For example, say you wanted
^^youtube http://www.youtube.com/watch?v=oHg5SJYRHA0to automatically render as an embedded YouTube video, that would be a language extension.
outputtype. After showdown has generated HTML, an output modifier can make changes to the generated HTML. For example, if you wanted to change
<div class="header">to be
<header>, you could implement an output modifier.
Each showdown extension can provide language extensions and/or output modifiers.
string.replace function. Two properties are given,
regex is a string and
replace can be either a string or a function. If
replace is a string, it can use the
$1 syntax for group substitution, exactly as if it were making use of
string.replace (internally it does this actually); The value of
regex is assumed to be a global replacement.
varreturn// Replace escaped @ symbolstype: 'lang' regex: '\\@' replace: '@';
Alternately, if you'd just like to do everything yourself, you can specify a filter which is a callback with a single input parameter, text (the current source text within the showdown engine).
varreturn// Replace escaped @ symbolstype: 'lang'return textreplace/\\@/g '@';;
One bit which should be taken into account is maintaining both client-side and server-side compatibility. This can be achieved with a few lines of boilerplate code. First, to prevent polluting the global scope for client-side code, the extension definition should be wrapped in a self-executing function.
// Your extension here;
Second, client-side extensions should add a property onto
Showdown.extensions which matches the name of the file. As an example, a file named
demo.js should then add
Showdown.extensions.demo. Server-side extensions can simply export themselves.
var// ... extension code here ...;// Client-side exportif typeof window !== 'undefined' && windowShowdown && windowShowdownextensions windowShowdownextensionsdemo = demo;// Server-side exportif typeof module !== 'undefined' moduleexports = demo;;
The showdown test runner is setup to automatically test cases for extensions. To add test cases for an extension, create a new folder under
./test/extensions which matches the name of the
.js file in
./src/extensions. Place any test cases into the filder using the md/html format and they will automatically be run when tests are run.