` tag. + ++ Fix for horizontal rules preceded by 2 or 3 spaces. + ++ `
` tags.
+
++ You can now write empty links:
+
+ [like this]()
+
+ and they'll be turned into anchor tags with empty href attributes.
+ This should have worked before, but didn't.
+
++ `***this***` and `___this___` are now turned into
+
+ this
+
+ Instead of
+
+ this
+
+ which isn't valid. (Thanks to Michel Fortin for the fix.)
+
++ Added a new substitution in `_EncodeCode()`: s/\$/$/g; This
+ is only for the benefit of Blosxom users, because Blosxom
+ (sometimes?) interpolates Perl scalars in your article bodies.
+
++ Fixed problem for links defined with urls that include parens, e.g.:
+
+ [1]: http://sources.wikipedia.org/wiki/Middle_East_Policy_(Chomsky)
+
+ "Chomsky" was being erroneously treated as the URL's title.
+
++ At some point during 1.0's beta cycle, I changed every sub's
+ argument fetching from this idiom:
+
+ my $text = shift;
+
+ to:
+
+ my $text = shift || return '';
+
+ The idea was to keep Markdown from doing any work in a sub
+ if the input was empty. This introduced a bug, though:
+ if the input to any function was the single-character string
+ "0", it would also evaluate as false and return immediately.
+ How silly. Now fixed.
+
+
+
+Donations
+---------
+
+Donations to support Markdown's development are happily accepted. See:
+ s around
+ # "paragraphs" that are wrapped in non-block-level tags, such as anchors,
+ # phrase emphasis, and spans. The list of tags we're looking for is
+ # hard-coded:
+ my $block_tags_a = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del/;
+ my $block_tags_b = qr/p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math/;
+
+ # First, look for nested blocks, e.g.:
+ # Just type tags
+#
+ my $text = shift;
+
+ # Strip leading and trailing lines:
+ $text =~ s/\A\n+//;
+ $text =~ s/\n+\z//;
+
+ my @grafs = split(/\n{2,}/, $text);
+
+ #
+ # Wrap tags.
+ #
+ foreach (@grafs) {
+ unless (defined( $g_html_blocks{$_} )) {
+ $_ = _RunSpanGamut($_);
+ s/^([ \t]*)/ /;
+ $_ .= " NOTE: This is Traditional Chinese Edition Document of
+Markdown Syntax. If you are seeking for English Edition
+Document. Please refer to Markdown: Syntax. Note: This document is itself written using Markdown; you
+can see the source for it by adding '.text' to the URL. Markdown is intended to be as easy-to-read and easy-to-write as is feasible. Markdown 將容易閱讀和容易寫作這兩點作為主要目標。 Readability, however, is emphasized above all else. A Markdown-formatted
+document should be publishable as-is, as plain text, without looking
+like it's been marked up with tags or formatting instructions. While
+Markdown's syntax has been influenced by several existing text-to-HTML
+filters -- including Setext, atx, Textile, reStructuredText,
+Grutatext, and EtText -- the single biggest source of
+inspiration for Markdown's syntax is the format of plain text email. 可讀性則是其中最重要的一個特點,一篇 Markdown 格式的文件應該要可以直
+接作為發佈用的文件,而不會讓人覺得他是使用像是邊簽語言之類的格式來編
+寫,Markdown 的文件格式受到很多的 text-to-HTML 格式的影響,包括
+Setext、atx、Textile、reStructuredText、
+Grutatext 和 EtText,然而影響最大的其實是純文字的電子郵
+件。 To this end, Markdown's syntax is comprised entirely of punctuation
+characters, which punctuation characters have been carefully chosen so
+as to look like what they mean. E.g., asterisks around a word actually
+look like *emphasis*. Markdown lists look like, well, lists. Even
+blockquotes look like quoted passages of text, assuming you've ever
+used email. 為了這個目的,Markdown 的語法全部由標點符號來組成,標點符號的選擇是依
+據他們看起來樣子或是他們的意義慎重的考慮的,像是在文字兩旁加上星號,看
+起來就很像在 *強調* 。Markdow 的清單就很像是清單,區塊引研究很像是電
+子郵件的引言。 Markdown's syntax is intended for one purpose: to be used as a
+format for writing for the web. Markdown 的語法有個主要的目的:用來作為一種網路內容的 寫作 用語言。 Markdown is not a replacement for HTML, or even close to it. Its
+syntax is very small, corresponding only to a very small subset of
+HTML tags. The idea is not to create a syntax that makes it easier
+to insert HTML tags. In my opinion, HTML tags are already easy to
+insert. The idea for Markdown is to make it easy to read, write, and
+edit prose. HTML is a publishing format; Markdown is a writing
+format. Thus, Markdown's formatting syntax only addresses issues that
+can be conveyed in plain text. Markdown 不是要來取代 HTML,甚至也沒有要和它相似,它的語法種類不多,
+只和 HTML 的一部分有關係,重點 不是 要創造一種更容易插入 HTML 標籤
+的語法,我認為 HTML 已經很容易插入了,Markdown 的重點在讓文件更容易
+閱讀、編寫,HTML 是一種 發佈 的格式,Markdown 是一種 編寫 的格式,
+因此,Markdown 的格式語法只涵蓋純文字可以涵蓋的範圍。 For any markup that is not covered by Markdown's syntax, you simply
+use HTML itself. There's no need to preface it or delimit it to
+indicate that you're switching from Markdown to HTML; you just use
+the tags. 不在 Markdown 涵蓋範圍之外的標籤,都可以直接在文件裡面用 HTML 撰寫。
+不需要額外標註這是 HTML 或是 Markdown;只要直接加標籤就可以了。 The only restrictions are that block-level HTML elements -- e.g. 只有區塊元素──比如 For example, to add an HTML table to a Markdown article: 舉例說明,在 Markdown 文件裡加上一段 HTML 表格: Note that Markdown formatting syntax is not processed within block-level
+HTML tags. E.g., you can't use Markdown-style 請注意,在 HTML 區塊標籤內,是不會對 Markdown 的語法進行處理的。例如,
+HTML 區塊內,無法使用 Markdown 形式的 Span-level HTML tags -- e.g. HTML 的跨度標間如 Unlike block-level HTML tags, Markdown syntax is processed within
+span-level tags. HTML 跨度標籤和區塊標籤不同,在跨度標籤的範圍內, Markdown 的語法是有效的。 In HTML, there are two characters that demand special treatment: Ampersands in particular are bedeviling for web writers. If you want to
+write about 'AT&T', you need to write ' you need to encode the URL as: in your anchor tag 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
+an HTML entity, it remains unchanged; otherwise it will be translated
+into So, if you want to include a copyright symbol in your article, you can write: and Markdown will leave it alone. But if you write: Markdown will translate it to: Similarly, because Markdown supports inline HTML, if you use
+angle brackets as delimiters for HTML tags, Markdown will treat them as
+such. But if you write: Markdown will translate it to: However, inside Markdown code spans and blocks, angle brackets and
+ampersands are always encoded automatically. This makes it easy to use
+Markdown to write about HTML code. (As opposed to raw HTML, which is a
+terrible format for writing about HTML syntax, because every single A paragraph is simply one or more consecutive lines of text, separated
+by one or more blank lines. (A blank line is any line that looks like a
+blank line -- a line containing nothing but spaces or tabs is considered
+blank.) Normal paragraphs should not be indented with spaces or tabs. The implication of the "one or more consecutive lines of text" rule is
+that Markdown supports "hard-wrapped" text paragraphs. This differs
+significantly from most other text-to-HTML formatters (including Movable
+Type's "Convert Line Breaks" option) which translate every line break
+character in a paragraph into a When you do want to insert a Yes, this takes a tad more effort to create a Markdown supports two styles of headers, Setext and atx. Setext-style headers are "underlined" using equal signs (for first-level
+headers) and dashes (for second-level headers). For example: Any number of underlining Atx-style headers use 1-6 hash characters at the start of the line,
+corresponding to header levels 1-6. For example: Optionally, you may "close" atx-style headers. This is purely
+cosmetic -- you can use this if you think it looks better. The
+closing hashes don't even need to match the number of hashes
+used to open the header. (The number of opening hashes
+determines the header level.) : Markdown uses email-style Markdown allows you to be lazy and only put the Blockquotes can be nested (i.e. a blockquote-in-a-blockquote) by
+adding additional levels of Blockquotes can contain other Markdown elements, including headers, lists,
+and code blocks: Any decent text editor should make email-style quoting easy. For
+example, with BBEdit, you can make a selection and choose Increase
+Quote Level from the Text menu. Markdown supports ordered (numbered) and unordered (bulleted) lists. Unordered lists use asterisks, pluses, and hyphens -- interchangably
+-- as list markers: is equivalent to: and: Ordered lists use numbers followed by periods: It's important to note that the actual numbers you use to mark the
+list have no effect on the HTML output Markdown produces. The HTML
+Markdown produces from the above list is: If you instead wrote the list in Markdown like this: or even: you'd get the exact same HTML output. The point is, if you want to,
+you can use ordinal numbers in your ordered Markdown lists, so that
+the numbers in your source match the numbers in your published HTML.
+But if you want to be lazy, you don't have to. If you do use lazy list numbering, however, you should still start the
+list with the number 1. At some point in the future, Markdown may support
+starting ordered lists at an arbitrary number. List markers typically start at the left margin, but may be indented by
+up to three spaces. List markers must be followed by one or more spaces
+or a tab. To make lists look nice, you can wrap items with hanging indents: But if you want to be lazy, you don't have to: If list items are separated by blank lines, Markdown will wrap the
+items in will turn into: But this: will turn into: List items may consist of multiple paragraphs. Each subsequent
+paragraph in a list item must be indented by either 4 spaces
+or one tab: It looks nice if you indent every line of the subsequent
+paragraphs, but here again, Markdown will allow you to be
+lazy: To put a blockquote within a list item, the blockquote's To put a code block within a list item, the code block needs
+to be indented twice -- 8 spaces or two tabs: It's worth noting that it's possible to trigger an ordered list by
+accident, by writing something like this: In other words, a number-period-space sequence at the beginning of a
+line. To avoid this, you can backslash-escape the period: Pre-formatted code blocks are used for writing about programming or
+markup source code. Rather than forming normal paragraphs, the lines
+of a code block are interpreted literally. Markdown wraps a code block
+in both To produce a code block in Markdown, simply indent every line of the
+block by at least 4 spaces or 1 tab. For example, given this input: Markdown will generate: One level of indentation -- 4 spaces or 1 tab -- is removed from each
+line of the code block. For example, this: will turn into: A code block continues until it reaches a line that is not indented
+(or the end of the article). Within a code block, ampersands ( will turn into: Regular Markdown syntax is not processed within code blocks. E.g.,
+asterisks are just literal asterisks within a code block. This means
+it's also easy to use Markdown to write about Markdown's own syntax. You can produce a horizontal rule tag ( Markdown supports two style of links: inline and reference. In both styles, the link text is delimited by [square brackets]. To create an inline link, use a set of regular parentheses immediately
+after the link text's closing square bracket. Inside the parentheses,
+put the URL where you want the link to point, along with an optional
+title for the link, surrounded in quotes. For example: Will produce: If you're referring to a local resource on the same server, you can
+use relative paths: Reference-style links use a second set of square brackets, inside
+which you place a label of your choosing to identify the link: You can optionally use a space to separate the sets of brackets: Then, anywhere in the document, you define your link label like this,
+on a line by itself: That is: The following three link definitions are equivalent: Note: There is a known bug in Markdown.pl 1.0.1 which prevents
+single quotes from being used to delimit link titles. The link URL may, optionally, be surrounded by angle brackets: You can put the title attribute on the next line and use extra spaces
+or tabs for padding, which tends to look better with longer URLs: Link definitions are only used for creating links during Markdown
+processing, and are stripped from your document in the HTML output. Link definition names may consist of letters, numbers, spaces, and
+punctuation -- but they are not case sensitive. E.g. these two
+links: are equivalent. The implicit link name shortcut allows you to omit the name of the
+link, in which case the link text itself is used as the name.
+Just use an empty set of square brackets -- e.g., to link the word
+"Google" to the google.com web site, you could simply write: And then define the link: Because link names may contain spaces, this shortcut even works for
+multiple words in the link text: And then define the link: Link definitions can be placed anywhere in your Markdown document. I
+tend to put them immediately after each paragraph in which they're
+used, but if you want, you can put them all at the end of your
+document, sort of like footnotes. Here's an example of reference links in action: Using the implicit link name shortcut, you could instead write: Both of the above examples will produce the following HTML output: For comparison, here is the same paragraph written using
+Markdown's inline link style: The point of reference-style links is not that they're easier to
+write. The point is that with reference-style links, your document
+source is vastly more readable. Compare the above examples: using
+reference-style links, the paragraph itself is only 81 characters
+long; with inline-style links, it's 176 characters; and as raw HTML,
+it's 234 characters. In the raw HTML, there's more markup than there
+is text. With Markdown's reference-style links, a source document much more
+closely resembles the final output, as rendered in a browser. By
+allowing you to move the markup-related metadata out of the paragraph,
+you can add links without interrupting the narrative flow of your
+prose. Markdown treats asterisks ( will produce: You can use whichever style you prefer; the lone restriction is that
+the same character must be used to open and close an emphasis span. Emphasis can be used in the middle of a word: But if you surround an To produce a literal asterisk or underscore at a position where it
+would otherwise be used as an emphasis delimiter, you can backslash
+escape it: To indicate a span of code, wrap it with backtick quotes ( will produce: To include a literal backtick character within a code span, you can use
+multiple backticks as the opening and closing delimiters: which will produce this: The backtick delimiters surrounding a code span may include spaces --
+one after the opening, one before the closing. This allows you to place
+literal backtick characters at the beginning or end of a code span: will produce: With a code span, ampersands and angle brackets are encoded as HTML
+entities automatically, which makes it easy to include example HTML
+tags. Markdown will turn this: into: You can write this: to produce: Admittedly, it's fairly difficult to devise a "natural" syntax for
+placing images into a plain text document format. Markdown uses an image syntax that is intended to resemble the syntax
+for links, allowing for two styles: inline and reference. Inline image syntax looks like this: That is: Reference-style image syntax looks like this: Where "id" is the name of a defined image reference. Image references
+are defined using syntax identical to link references: As of this writing, Markdown has no syntax for specifying the
+dimensions of an image; if this is important to you, you can simply
+use regular HTML Markdown supports a shortcut style for creating "automatic" links for URLs and email addresses: simply surround the URL or email address with angle brackets. What this means is that if you want to show the actual text of a URL or email address, and also have it be a clickable link, you can do this: Markdown will turn this into: Automatic links for email addresses work similarly, except that
+Markdown will also perform a bit of randomized decimal and hex
+entity-encoding to help obscure your address from address-harvesting
+spambots. For example, Markdown will turn this: into something like this: which will render in a browser as a clickable link to "address@example.com". (This sort of entity-encoding trick will indeed fool many, if not
+most, address-harvesting bots, but it definitely won't fool all of
+them. It's better than nothing, but an address published in this way
+will probably eventually start receiving spam.) Markdown allows you to use backslash escapes to generate literal
+characters which would otherwise have special meaning in Markdown's
+formatting syntax. For example, if you wanted to surround a word
+with literal asterisks (instead of an HTML Markdown provides backslash escapes for the following characters:
. It was easier to make a special case than
+ # to make the other regex more complicated.
+ $text =~ s{
+ (?:
+ (?<=\n\n) # Starting after a blank line
+ | # or
+ \A\n? # the beginning of the doc
+ )
+ ( # save in $1
+ [ ]{0,$less_than_tab}
+ <(hr) # start tag = $2
+ \b # word break
+ ([^<>])*? #
+ /?> # the matching end tag
+ [ \t]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+ )
+ }{
+ my $key = md5_hex($1);
+ $g_html_blocks{$key} = $1;
+ "\n\n" . $key . "\n\n";
+ }egx;
+
+ # Special case for standalone HTML comments:
+ $text =~ s{
+ (?:
+ (?<=\n\n) # Starting after a blank line
+ | # or
+ \A\n? # the beginning of the doc
+ )
+ ( # save in $1
+ [ ]{0,$less_than_tab}
+ (?s:
+
+ )
+ [ \t]*
+ (?=\n{2,}|\Z) # followed by a blank line or end of document
+ )
+ }{
+ my $key = md5_hex($1);
+ $g_html_blocks{$key} = $1;
+ "\n\n" . $key . "\n\n";
+ }egx;
+
+
+ return $text;
+}
+
+
+sub _RunBlockGamut {
+#
+# These are all the transformations that form block-level
+# tags like paragraphs, headers, and list items.
+#
+ my $text = shift;
+
+ $text = _DoHeaders($text);
+
+ # Do Horizontal Rules:
+ $text =~ s{^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$}{\n
tags around block-level tags.
+ $text = _HashHTMLBlocks($text);
+
+ $text = _FormParagraphs($text);
+
+ return $text;
+}
+
+
+sub _RunSpanGamut {
+#
+# These are all the transformations that occur *within* block-level
+# tags like paragraphs, headers, and list items.
+#
+ my $text = shift;
+
+ $text = _DoCodeSpans($text);
+
+ $text = _EscapeSpecialChars($text);
+
+ # Process anchor and image tags. Images must come first,
+ # because ![foo][f] looks like an anchor.
+ $text = _DoImages($text);
+ $text = _DoAnchors($text);
+
+ # Make links out of things like `
or tags.
+# my $tags_to_skip = qr!<(/?)(?:pre|code|kbd|script|math)[\s>]!;
+
+ foreach my $cur_token (@$tokens) {
+ if ($cur_token->[0] eq "tag") {
+ # Within tags, encode * and _ so they don't conflict
+ # with their use in Markdown for italics and strong.
+ # We're replacing each such character with its
+ # corresponding MD5 checksum value; this is likely
+ # overkill, but it should prevent us from colliding
+ # with the escape values by accident.
+ $cur_token->[1] =~ s! \* !$g_escape_table{'*'}!gx;
+ $cur_token->[1] =~ s! _ !$g_escape_table{'_'}!gx;
+ $text .= $cur_token->[1];
+ } else {
+ my $t = $cur_token->[1];
+ $t = _EncodeBackslashEscapes($t);
+ $text .= $t;
+ }
+ }
+ return $text;
+}
+
+
+sub _DoAnchors {
+#
+# Turn Markdown link shortcuts into XHTML tags.
+#
+ my $text = shift;
+
+ #
+ # First, handle reference-style links: [link text] [id]
+ #
+ $text =~ s{
+ ( # wrap whole match in $1
+ \[
+ ($g_nested_brackets) # link text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+ )
+ }{
+ my $result;
+ my $whole_match = $1;
+ my $link_text = $2;
+ my $link_id = lc $3;
+
+ if ($link_id eq "") {
+ $link_id = lc $link_text; # for shortcut links like [this][].
+ }
+
+ if (defined $g_urls{$link_id}) {
+ my $url = $g_urls{$link_id};
+ $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid
+ $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold.
+ $result = "? # href = $3
+ [ \t]*
+ ( # $4
+ (['"]) # quote char = $5
+ (.*?) # Title = $6
+ \5 # matching quote
+ )? # title is optional
+ \)
+ )
+ }{
+ my $result;
+ my $whole_match = $1;
+ my $link_text = $2;
+ my $url = $3;
+ my $title = $6;
+
+ $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid
+ $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold.
+ $result = " tags.
+#
+ my $text = shift;
+
+ #
+ # First, handle reference-style labeled images: ![alt text][id]
+ #
+ $text =~ s{
+ ( # wrap whole match in $1
+ !\[
+ (.*?) # alt text = $2
+ \]
+
+ [ ]? # one optional space
+ (?:\n[ ]*)? # one optional newline followed by spaces
+
+ \[
+ (.*?) # id = $3
+ \]
+
+ )
+ }{
+ my $result;
+ my $whole_match = $1;
+ my $alt_text = $2;
+ my $link_id = lc $3;
+
+ if ($link_id eq "") {
+ $link_id = lc $alt_text; # for shortcut links like ![this][].
+ }
+
+ $alt_text =~ s/"/"/g;
+ if (defined $g_urls{$link_id}) {
+ my $url = $g_urls{$link_id};
+ $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid
+ $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold.
+ $result = "? # src url = $3
+ [ \t]*
+ ( # $4
+ (['"]) # quote char = $5
+ (.*?) # title = $6
+ \5 # matching quote
+ [ \t]*
+ )? # title is optional
+ \)
+ )
+ }{
+ my $result;
+ my $whole_match = $1;
+ my $alt_text = $2;
+ my $url = $3;
+ my $title = '';
+ if (defined($6)) {
+ $title = $6;
+ }
+
+ $alt_text =~ s/"/"/g;
+ $title =~ s/"/"/g;
+ $url =~ s! \* !$g_escape_table{'*'}!gx; # We've got to encode these to avoid
+ $url =~ s! _ !$g_escape_table{'_'}!gx; # conflicting with italics/bold.
+ $result = "" . _RunSpanGamut($1) . "\n\n";
+ }egmx;
+
+ $text =~ s{ ^(.+)[ \t]*\n-+[ \t]*\n+ }{
+ "
" . _RunSpanGamut($1) . "
\n\n";
+ }egmx;
+
+
+ # atx-style headers:
+ # # Header 1
+ # ## Header 2
+ # ## Header 2 with closing hashes ##
+ # ...
+ # ###### Header 6
+ #
+ $text =~ s{
+ ^(\#{1,6}) # $1 = string of #'s
+ [ \t]*
+ (.+?) # $2 = Header text
+ [ \t]*
+ \#* # optional closing #'s (not counted)
+ \n+
+ }{
+ my $h_level = length($1);
+ "` blocks.
+#
+
+ my $text = shift;
+
+ $text =~ s{
+ (?:\n\n|\A)
+ ( # $1 = the code block -- one or more lines, starting with a space/tab
+ (?:
+ (?:[ ]{$g_tab_width} | \t) # Lines must start with a tab or a tab-width of spaces
+ .*\n+
+ )+
+ )
+ ((?=^[ ]{0,$g_tab_width}\S)|\Z) # Lookahead for non-space at line-start, or end of doc
+ }{
+ my $codeblock = $1;
+ my $result; # return value
+
+ $codeblock = _EncodeCode(_Outdent($codeblock));
+ $codeblock = _Detab($codeblock);
+ $codeblock =~ s/\A\n+//; # trim leading newlines
+ $codeblock =~ s/\s+\z//; # trim trailing whitespace
+
+ $result = "\n\n
";
+ @egsx;
+
+ return $text;
+}
+
+
+sub _EncodeCode {
+#
+# Encode/escape certain characters inside Markdown code runs.
+# The point is that in code, these characters are literals,
+# and lose their special Markdown meanings.
+#
+ local $_ = shift;
+
+ # Encode all ampersands; HTML entities are not
+ # entities within a Markdown code span.
+ s/&/&/g;
+
+ # Encode $'s, but only if we're running under Blosxom.
+ # (Blosxom interpolates Perl variables in article bodies.)
+ {
+ no warnings 'once';
+ if (defined($blosxom::version)) {
+ s/\$/$/g;
+ }
+ }
+
+
+ # Do the angle bracket song and dance:
+ s! < !<!gx;
+ s! > !>!gx;
+
+ # Now, escape characters that are magic in Markdown:
+ s! \* !$g_escape_table{'*'}!gx;
+ s! _ !$g_escape_table{'_'}!gx;
+ s! { !$g_escape_table{'{'}!gx;
+ s! } !$g_escape_table{'}'}!gx;
+ s! \[ !$g_escape_table{'['}!gx;
+ s! \] !$g_escape_table{']'}!gx;
+ s! \\ !$g_escape_table{'\\'}!gx;
+
+ return $_;
+}
+
+
+sub _DoItalicsAndBold {
+ my $text = shift;
+
+ # must go first:
+ $text =~ s{ (\*\*|__) (?=\S) (.+?[*_]*) (?<=\S) \1 }
+ {$2}gsx;
+
+ $text =~ s{ (\*|_) (?=\S) (.+?) (?<=\S) \1 }
+ {$2}gsx;
+
+ return $text;
+}
+
+
+sub _DoBlockQuotes {
+ my $text = shift;
+
+ $text =~ s{
+ ( # Wrap whole match in $1
+ (
+ ^[ \t]*>[ \t]? # '>' at the start of a line
+ .+\n # rest of the first line
+ (.+\n)* # subsequent consecutive lines
+ \n* # blanks
+ )+
+ )
+ }{
+ my $bq = $1;
+ $bq =~ s/^[ \t]*>[ \t]?//gm; # trim one level of quoting
+ $bq =~ s/^[ \t]+$//mg; # trim whitespace-only lines
+ $bq = _RunBlockGamut($bq); # recurse
+
+ $bq =~ s/^/ /g;
+ # These leading spaces screw with
\n\n";
+
+ $result;
+ }egmx;
+
+ return $text;
+}
+
+
+sub _DoCodeSpans {
+#
+# * Backtick quotes are used for " . $codeblock . "\n
spans.
+#
+# * You can use multiple backticks as the delimiters if you want to
+# include literal backticks in the code span. So, this input:
+#
+# Just type ``foo `bar` baz`` at the prompt.
+#
+# Will translate to:
+#
+#
foo `bar` baz
at the prompt.`bar`
...
+#
+
+ my $text = shift;
+
+ $text =~ s@
+ (`+) # $1 = Opening run of `
+ (.+?) # $2 = The code block
+ (?$c content, so we need to fix that:
+ $bq =~ s{
+ (\s*
.+?
)
+ }{
+ my $pre = $1;
+ $pre =~ s/^ //mg;
+ $pre;
+ }egsx;
+
+ "\n$bq\n
\n\n";
+ }egmx;
+
+
+ return $text;
+}
+
+
+sub _FormParagraphs {
+#
+# Params:
+# $text - string to process with html as well).
+
+For more information about Markdown's syntax, see:
+
+ http://daringfireball.net/projects/markdown/
+
+
+=head1 OPTIONS
+
+Use "--" to end switch parsing. For example, to open a file named "-z", use:
+
+ Markdown.pl -- -z
+
+=over 4
+
+
+=item B<--html4tags>
+
+Use HTML 4 style for empty element tags, e.g.:
+
+
+
+instead of Markdown's default XHTML style tags, e.g.:
+
+
+
+
+=item B<-v>, B<--version>
+
+Display Markdown's version number and copyright information.
+
+
+=item B<-s>, B<--shortversion>
+
+Display the short-form version number.
+
+
+=back
+
+
+
+=head1 BUGS
+
+To file bug reports or feature requests (other than topics listed in the
+Caveats section above) please send email to:
+
+ support@daringfireball.net
+
+Please include with your report: (1) the example input; (2) the output
+you expected; (3) the output Markdown actually produced.
+
+
+=head1 VERSION HISTORY
+
+See the readme file for detailed release notes for this version.
+
+1.0.1 - 14 Dec 2004
+
+1.0 - 28 Aug 2004
+
+
+=head1 AUTHOR
+
+ John Gruber
+ http://daringfireball.net
+
+ PHP port and other contributions by Michel Fortin
+ http://michelf.com
+
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyright (c) 2003-2004 John Gruber
+Markdown: Syntax
+
+
+
+
+
+
+Overview
+
+Philosophy
+
+Inline HTML
+
+<div>
,
+<table>
, <pre>
, <p>
, etc. -- must be separated from surrounding
+content by blank lines, and the start and end tags of the block should
+not be indented with tabs or spaces. Markdown is smart enough not
+to add extra (unwanted) <p>
tags around HTML block-level tags.<div>
,<table>
, <pre>
, <p>
等標籤,必需在
+前後加上空白,以利與內容區隔。而且這些的開始與結尾標籤,不可以用 tab
+或是空白來縮排。Markdown 的產生器有智慧型判斷,可以避免在區塊標籤前後
+加上沒有必要的 <p>
標籤。
+
+This is a regular paragraph.
+這是一般的段落
+
+<table>
+ <tr>
+ <td>Foo</td>
+ </tr>
+</table>
+
+This is another regular paragraph.
+這是下一個段落
+
*emphasis*
inside an
+HTML block.*強調*
<span>
, <cite>
, or <del>
-- can be
+used anywhere in a Markdown paragraph, list item, or header. If you
+want, you can even use HTML tags instead of Markdown formatting; e.g. if
+you'd prefer to use HTML <a>
or <img>
tags instead of Markdown's
+link or image syntax, go right ahead.<span>
, <cite>
或者 <del>
則不受限制,可以在
+Markdown 的段落、清單或是檔頭裡任意使用。依照個人習慣,甚至可以不用
+Markdown 格式,而採用 HTML 標籤來格式化。舉例說明:如果比較喜歡 HTML
+的 <a>
或 <img>
標籤,可以直接使用這些標籤,而不用 Markdown 提
+供的連結或是影像標示語法。Automatic Escaping for Special Characters
+
+<
+and &
. Left angle brackets are used to start tags; ampersands are
+used to denote HTML entities. If you want to use them as literal
+characters, you must escape them as entities, e.g. <
, and
+&
.AT&T
'. You even need to
+escape ampersands within URLs. Thus, if you want to link to:
+
+http://images.google.com/images?num=30&q=larry+bird
+
+
+http://images.google.com/images?num=30&q=larry+bird
+
href
attribute. Needless to say, this is easy to
+forget, and is probably the single most common source of HTML validation
+errors in otherwise well-marked-up web sites.&
.
+
+©
+
+
+AT&T
+
+
+AT&T
+
+
+4 < 5
+
+
+4 < 5
+
<
+and &
in your example code needs to be escaped.)
+
+Block Elements
+
+Paragraphs and Line Breaks
+
+<br />
tag.<br />
break tag using Markdown, you
+end a line with two or more spaces, then type return.<br />
, but a simplistic
+"every line break is a <br />
" rule wouldn't work for Markdown.
+Markdown's email-style blockquoting and multi-paragraph list items
+work best -- and look better -- when you format them with hard breaks.Headers
+
+
+
+This is an H1
+=============
+
+This is an H2
+-------------
+
=
's or -
's will work.
+
+# This is an H1
+
+## This is an H2
+
+###### This is an H6
+
+
+# This is an H1 #
+
+## This is an H2 ##
+
+### This is an H3 ######
+
Blockquotes
+
+>
characters for blockquoting. If you're
+familiar with quoting passages of text in an email message, then you
+know how to create a blockquote in Markdown. It looks best if you hard
+wrap the text and put a >
before every line:
+
+> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+> consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+> Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+>
+> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+> id sem consectetuer libero luctus adipiscing.
+
>
before the first
+line of a hard-wrapped paragraph:
+
+> This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
+consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
+Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
+
+> Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
+id sem consectetuer libero luctus adipiscing.
+
>
:
+
+> This is the first level of quoting.
+>
+> > This is nested blockquote.
+>
+> Back to the first level.
+
+
+> ## This is a header.
+>
+> 1. This is the first list item.
+> 2. This is the second list item.
+>
+> Here's some example code:
+>
+> return shell_exec("echo $input | $markdown_script");
+
Lists
+
+
+
+* Red
+* Green
+* Blue
+
+
++ Red
++ Green
++ Blue
+
+
+- Red
+- Green
+- Blue
+
+
+1. Bird
+2. McHale
+3. Parish
+
+
+<ol>
+<li>Bird</li>
+<li>McHale</li>
+<li>Parish</li>
+</ol>
+
+
+1. Bird
+1. McHale
+1. Parish
+
+
+3. Bird
+1. McHale
+8. Parish
+
+
+* Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+ Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+ viverra nec, fringilla in, laoreet vitae, risus.
+* Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+ Suspendisse id sem consectetuer libero luctus adipiscing.
+
+
+* Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
+Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
+viverra nec, fringilla in, laoreet vitae, risus.
+* Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
+Suspendisse id sem consectetuer libero luctus adipiscing.
+
<p>
tags in the HTML output. For example, this input:
+
+* Bird
+* Magic
+
+
+<ul>
+<li>Bird</li>
+<li>Magic</li>
+</ul>
+
+
+* Bird
+
+* Magic
+
+
+<ul>
+<li><p>Bird</p></li>
+<li><p>Magic</p></li>
+</ul>
+
+
+1. This is a list item with two paragraphs. Lorem ipsum dolor
+ sit amet, consectetuer adipiscing elit. Aliquam hendrerit
+ mi posuere lectus.
+
+ Vestibulum enim wisi, viverra nec, fringilla in, laoreet
+ vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
+ sit amet velit.
+
+2. Suspendisse id sem consectetuer libero luctus adipiscing.
+
+
+* This is a list item with two paragraphs.
+
+ This is the second paragraph in the list item. You're
+only required to indent the first line. Lorem ipsum dolor
+sit amet, consectetuer adipiscing elit.
+
+* Another item in the same list.
+
>
+delimiters need to be indented:
+
+* A list item with a blockquote:
+
+ > This is a blockquote
+ > inside a list item.
+
+
+* A list item with a code block:
+
+ <code goes here>
+
+
+1986. What a great season.
+
+
+1986\. What a great season.
+
Code Blocks
+
+<pre>
and <code>
tags.
+
+This is a normal paragraph:
+
+ This is a code block.
+
+
+<p>This is a normal paragraph:</p>
+
+<pre><code>This is a code block.
+</code></pre>
+
+
+Here is an example of AppleScript:
+
+ tell application "Foo"
+ beep
+ end tell
+
+
+<p>Here is an example of AppleScript:</p>
+
+<pre><code>tell application "Foo"
+ beep
+end tell
+</code></pre>
+
&
) and angle brackets (<
and >
)
+are automatically converted into HTML entities. This makes it very
+easy to include example HTML source code using Markdown -- just paste
+it and indent it, and Markdown will handle the hassle of encoding the
+ampersands and angle brackets. For example, this:
+
+ <div class="footer">
+ © 2004 Foo Corporation
+ </div>
+
+
+<pre><code><div class="footer">
+ &copy; 2004 Foo Corporation
+</div>
+</code></pre>
+
Horizontal Rules
+
+<hr />
) by placing three or
+more hyphens, asterisks, or underscores on a line by themselves. If you
+wish, you may use spaces between the hyphens or asterisks. Each of the
+following lines will produce a horizontal rule:
+
+* * *
+
+***
+
+*****
+
+- - -
+
+---------------------------------------
+
+
+Span Elements
+
+Links
+
+
+
+This is [an example](http://example.com/ "Title") inline link.
+
+[This link](http://example.net/) has no title attribute.
+
+
+<p>This is <a href="http://example.com/" title="Title">
+an example</a> inline link.</p>
+
+<p><a href="http://example.net/">This link</a> has no
+title attribute.</p>
+
+
+See my [About](/about/) page for details.
+
+
+This is [an example][id] reference-style link.
+
+
+This is [an example] [id] reference-style link.
+
+
+[id]: http://example.com/ "Optional Title Here"
+
+
+
+
+
+[foo]: http://example.com/ "Optional Title Here"
+[foo]: http://example.com/ 'Optional Title Here'
+[foo]: http://example.com/ (Optional Title Here)
+
+
+[id]: <http://example.com/> "Optional Title Here"
+
+
+[id]: http://example.com/longish/path/to/resource/here
+ "Optional Title Here"
+
+
+[link text][a]
+[link text][A]
+
+
+[Google][]
+
+
+[Google]: http://google.com/
+
+
+Visit [Daring Fireball][] for more information.
+
+
+[Daring Fireball]: http://daringfireball.net/
+
+
+I get 10 times more traffic from [Google] [1] than from
+[Yahoo] [2] or [MSN] [3].
+
+ [1]: http://google.com/ "Google"
+ [2]: http://search.yahoo.com/ "Yahoo Search"
+ [3]: http://search.msn.com/ "MSN Search"
+
+
+I get 10 times more traffic from [Google][] than from
+[Yahoo][] or [MSN][].
+
+ [google]: http://google.com/ "Google"
+ [yahoo]: http://search.yahoo.com/ "Yahoo Search"
+ [msn]: http://search.msn.com/ "MSN Search"
+
+
+<p>I get 10 times more traffic from <a href="http://google.com/"
+title="Google">Google</a> than from
+<a href="http://search.yahoo.com/" title="Yahoo Search">Yahoo</a>
+or <a href="http://search.msn.com/" title="MSN Search">MSN</a>.</p>
+
+
+I get 10 times more traffic from [Google](http://google.com/ "Google")
+than from [Yahoo](http://search.yahoo.com/ "Yahoo Search") or
+[MSN](http://search.msn.com/ "MSN Search").
+
Emphasis
+
+*
) and underscores (_
) as indicators of
+emphasis. Text wrapped with one *
or _
will be wrapped with an
+HTML <em>
tag; double *
's or _
's will be wrapped with an HTML
+<strong>
tag. E.g., this input:
+
+*single asterisks*
+
+_single underscores_
+
+**double asterisks**
+
+__double underscores__
+
+
+<em>single asterisks</em>
+
+<em>single underscores</em>
+
+<strong>double asterisks</strong>
+
+<strong>double underscores</strong>
+
+
+un*frigging*believable
+
*
or _
with spaces, it'll be treated as a
+literal asterisk or underscore.
+
+\*this text is surrounded by literal asterisks\*
+
Code
+
+`
).
+Unlike a pre-formatted code block, a code span indicates code within a
+normal paragraph. For example:
+
+Use the `printf()` function.
+
+
+<p>Use the <code>printf()</code> function.</p>
+
+
+``There is a literal backtick (`) here.``
+
+
+<p><code>There is a literal backtick (`) here.</code></p>
+
+
+A single backtick in a code span: `` ` ``
+
+A backtick-delimited string in a code span: `` `foo` ``
+
+
+<p>A single backtick in a code span: <code>`</code></p>
+
+<p>A backtick-delimited string in a code span: <code>`foo`</code></p>
+
+
+Please don't use any `<blink>` tags.
+
+
+<p>Please don't use any <code><blink></code> tags.</p>
+
+
+`—` is the decimal-encoded equivalent of `—`.
+
+
+<p><code>&#8212;</code> is the decimal-encoded
+equivalent of <code>&mdash;</code>.</p>
+
Images
+
+
+
+![Alt text](/path/to/img.jpg)
+
+![Alt text](/path/to/img.jpg "Optional title")
+
+
+
+!
;alt
+attribute text for the image;title
attribute enclosed in double
+or single quotes.
+
+![Alt text][id]
+
+
+[id]: url/to/image "Optional title attribute"
+
<img>
tags.
+
+Miscellaneous
+
+Automatic Links
+
+
+
+<http://example.com/>
+
+
+<a href="http://example.com/">http://example.com/</a>
+
+
+<address@example.com>
+
+
+<a href="mailto:addre
+ss@example.co
+m">address@exa
+mple.com</a>
+
Backslash Escapes
+
+<em>
tag), you can use
+backslashes before the asterisks, like this:
+
+\*literal asterisks\*
+
diff --git a/footer.html b/footer.html
new file mode 100644
index 0000000..e0a828b
--- /dev/null
+++ b/footer.html
@@ -0,0 +1,15 @@
+
+ \ backslash
+` backtick
+* asterisk
+_ underscore
+{} curly braces
+[] square brackets
+() parentheses
+# hash mark
++ plus sign
+- minus sign (hyphen)
+. dot
+! exclamation mark
+
+\ 反斜線
+` 反引號
+* 星號
+_ 底線
+{} 大括號
+[] 方括號
+() 括號
+# 井字號
++ 加號
+- 減號
+. 英文句點Ddot
+! 驚嘆號
+