📄 markdown.php
字号:
global $g_empty_element_suffix; $result; $whole_match = $matches[1]; $alt_text = $matches[2]; $url = $matches[3]; $title = $matches[4]; $url = str_replace(array('*', '_'), array('*', '_'), $url); $result = "<img src=\"$url\" alt=\"$alt_text\""; if (isset($title)) { $title = str_replace(array('*', '_'), array('*', '_'), $title); $result .= " title=$title"; # $title already quoted } $result .= $g_empty_element_suffix; return $result;}function _DoHeaders($text) { $text = preg_replace( array("/(.+)[ \t]*\n=+[ \t]*\n+/e", "/(.+)[ \t]*\n-+[ \t]*\n+/e"), array("'<h1>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h1>\n\n'", "'<h2>'._RunSpanGamut(_UnslashQuotes('\\1')).'</h2>\n\n'"), $text); $text = preg_replace("{ ^(\\#{1,6}) # $1 = string of #'s [ \\t]* (.+?) # $2 = Header text [ \\t]* \\#* # optional closing #'s (not counted) \\n+ }xme", "'<h'.strlen('\\1').'>'._RunSpanGamut(_UnslashQuotes('\\2')).'</h'.strlen('\\1').'>\n\n'", $text); return $text;}function _DoLists($text) { global $g_tab_width; $less_than_tab = $g_tab_width - 1; $text = preg_replace_callback("{ ( ( ^[ ]{0,$less_than_tab} (\\*|\\d+[.]) [ \\t]+ ) (?s:.+?) ( \\z | \\n{2,} (?=\\S) (?![ \\t]* (\\*|\\d+[.]) [ \\t]+) ) ) }xm", '_DoLists_callback', $text); return $text;}function _DoLists_callback($matches) { $list_type = ($matches[3] == "*") ? "ul" : "ol"; $list = $matches[1]; $list = preg_replace("/\n{2,}/", "\n\n\n", $list); $result = _ProcessListItems($list); $result = "<$list_type>\n" . $result . "</$list_type>\n"; return $result;}function _ProcessListItems($list_str) { # trim trailing blank lines: $list_str = preg_replace("/\n{2,}\\z/", "\n", $list_str); $list_str = preg_replace_callback('{ (\n)? # leading line = $1 (^[ \t]*) # leading whitespace = $2 (\*|\d+[.]) [ \t]+ # list marker = $3 ((?s:.+?) # list item text = $4 (\n{1,2})) (?= \n* (\z | \2 (\*|\d+[.]) [ \t]+)) }xm', '_ProcessListItems_callback', $list_str); return $list_str;}function _ProcessListItems_callback($matches) { $item = $matches[4]; $leading_line = $matches[1]; $leading_space = $matches[2]; if ($leading_line || preg_match('/\n{2,}/', $item)) { $item = _RunBlockGamut(_Outdent($item)); #$item =~ s/\n+/\n/g; } else { # Recursion for sub-lists: $item = _DoLists(_Outdent($item)); $item = rtrim($item, "\n"); $item = _RunSpanGamut($item); } return "<li>" . $item . "</li>\n";}function _DoCodeBlocks($text) { global $g_tab_width; $text = preg_replace_callback("{ (.?) # $1 = preceding character (:) # $2 = colon delimiter (\\n+) # $3 = newlines after colon ( # $4 = 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 }xm", '_DoCodeBlocks_callback', $text); return $text;}function _DoCodeBlocks_callback($matches) { $prevchar = $matches[1]; $newlines = $matches[2]; $codeblock = $matches[4]; $result; # return value $prefix = ""; if (!(preg_match('/\s/', $prevchar) || ($prevchar == ""))) { $prefix = "$prevchar:"; } $codeblock = _EncodeCode(_Outdent($codeblock)); $codeblock = _Detab($codeblock); # trim leading newlines and trailing whitespace $codeblock = preg_replace(array('/\A\n+/', '/\s+\z/'), '', $codeblock); $result = $prefix . "\n\n<pre><code>" . $codeblock . "\n</code></pre>\n\n"; return $result;}function _DoCodeSpans($text) { $text = preg_replace_callback("@ (`+) # Opening run of ` (.+?) # the code block (?<!`) \\1 (?!`) @xs", '_DoCodeSpans_callback', $text); return $text;}function _DoCodeSpans_callback($matches) { $c = $matches[2]; $c = preg_replace('/^[ \t]*/', '', $c); # leading whitespace $c = preg_replace('/[ \t]*$/', '', $c); # trailing whitespace $c = _EncodeCode($c); return "<code>$c</code>";}function _EncodeCode($_) { global $g_escape_table; # Encode all ampersands; HTML entities are not # entities within a Markdown code span. $_ = str_replace('&', '&', $_); # Do the angle bracket song and dance: $_ = str_replace(array('<', '>'), array('<', '>'), $_); # Now, escape characters that are magic in Markdown: $_ = str_replace(array_keys($g_escape_table), array_values($g_escape_table), $_); return $_;}function _DoItalicsAndBold($text) { # <strong> must go first: $text = preg_replace('{ (\*\*|__) (?=\S) (.+?) (?<=\S) \1 }sx', '<strong>\2</strong>', $text); # Then <em>: $text = preg_replace('{ (\*|_) (?=\S) (.+?) (?<=\S) \1 }sx', '<em>\2</em>', $text); return $text;}function _DoBlockQuotes($text) { $text = preg_replace_callback('/ ( # 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 )+ ) /xm', '_DoBlockQuotes_callback', $text); return $text;}function _DoBlockQuotes_callback($matches) { $bq = $matches[1]; $bq = preg_replace('/^[ \t]*>[ \t]?/m', '', $bq); $bq = _RunBlockGamut($bq); # recurse $bq = preg_replace('/^/m', "\t", $bq); return "<blockquote>\n$bq\n</blockquote>\n\n";}function _FormParagraphs($text) { global $g_html_blocks; # Strip leading and trailing lines: $text = preg_replace(array('/\A\n+/', '/\n+\z/'), '', $text); $grafs = preg_split('/\n{2,}/', $text); //$count = count($graph); foreach ($grafs as $key => $value) { if (!isset( $g_html_blocks[$value] )) { $value = _RunSpanGamut($value); $value = preg_replace('/^([ \t]*)/', '<p>', $value); $value .= "</p>"; $grafs[$key] = $value; } } foreach ($grafs as $key => $value) { if (isset( $g_html_blocks[$value] )) { $grafs[$key] = $g_html_blocks[$value]; } } return implode("\n\n", $grafs);}function _EncodeAmpsAndAngles($text) { $text = preg_replace('/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w{1,8});)/', '&', $text);; # Encode naked <'s $text = preg_replace('{<(?![a-z/?\$!])}i', '<', $text); return $text;}function _EncodeBackslashEscapes($text) { global $g_escape_table, $g_backslash_escape_table; # Must process escaped backslashes first. return @str_replace(array_keys($g_backslash_escape_table), array_values($g_backslash_escape_table), $text);}function _DoAutoLinks($text) { $text = preg_replace("!<((https?|ftp):[^'\">\\s]+)>!", '<a href="\1">\1</a>', $text); # Email addresses: <address@domain.foo> $text = preg_replace('{ < ( [-.\w]+ \@ [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ ) > }exi', "_EncodeEmailAddress(_UnescapeSpecialChars(_UnslashQuotes('\\1')))", $text); return $text;}function _EncodeEmailAddress($addr) { $addr = "mailto:" . $addr; $length = strlen($addr); $addr = preg_replace_callback('/([^\:])/', '_EncodeEmailAddress_callback', $addr); $addr = "<a href=\"$addr\">$addr</a>"; $addr = preg_replace('/">.+?:/', '">', $addr); return $addr;}function _EncodeEmailAddress_callback($matches) { $char = $matches[1]; $r = rand(0, 100); if ($r > 90 && $char != '@') return $char; if ($r < 45) return '&#x'.dechex(ord($char)).';'; return '&#'.ord($char).';';}function _UnescapeSpecialChars($text) { global $g_escape_table; return @str_replace(array_values($g_escape_table), array_keys($g_escape_table), $text);}function _TokenizeHTML($str) { $pos = 0; $len = strlen($str); $tokens = array(); $depth = 6; $nested_tags = str_repeat('(?:<[a-z\/!$](?:[^<>]|',$depth) .str_repeat(')*>)', $depth); $match = "(?s:<!(--.*?--\s*)+>)|". # comment "(?s:<\?.*?\?>)|". # processing instruction "$nested_tags"; # nested tags preg_match_all("/($match)/", $str, $matches, PREG_SET_ORDER | PREG_OFFSET_CAPTURE); foreach ($matches as $element) { $whole_tag = $element[0][0]; $tag_start = $element[0][1]; $sec_start = $tag_start + strlen($whole_tag); if ($pos < $tag_start) { array_push($tokens, array('text', substr($str, $pos, $tag_start - $pos))); } array_push($tokens, array('tag', $whole_tag)); $pos = $sec_start; } if ($pos < $len) array_push($tokens, array('text', substr($str, $pos, $len - $pos))); return $tokens;}function _Outdent($text) { global $g_tab_width; return preg_replace("/^(\\t|[ ]{1,$g_tab_width})/m", "", $text);}function _Detab($text) { global $g_tab_width; $text = preg_replace( "/(.*?)\t/e", "'\\1'".str_repeat(' ', $g_tab_width - strlen('\\1') % $g_tab_width), $text); return $text;}function _UnslashQuotes($text) { return str_replace('\"', '"', $text);}}// And now for the filtersremove_filter('the_content', 'wpautop');remove_filter('the_excerpt', 'wpautop');remove_filter('comment_text', 'wpautop');add_filter('the_content', 'Markdown');add_filter('the_excerpt', 'Markdown');remove_filter('comment_text', 'Markdown');?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -