*/ class Markdown extends BaseObject { /** * Converts a Markdown string into HTML. The hardwrap parameter maximizes * compatibility with Diaspora in spite of the Markdown standard. * * @brief Converts a Markdown string into HTML * @param string $text * @param bool $hardwrap * @return string */ public static function convert($text, $hardwrap = true) { $stamp1 = microtime(true); $MarkdownParser = new MarkdownExtra(); $MarkdownParser->hard_wrap = $hardwrap; $html = $MarkdownParser->transform($text); self::getApp()->save_timestamp($stamp1, "parser"); return $html; } /** * @brief Callback function to replace a Diaspora style mention in a mention for Friendica * * @param array $match Matching values for the callback * @return string Replaced mention */ private static function diasporaMention2BBCodeCallback($match) { if ($match[2] == '') { return; } $data = Contact::getDetailsByAddr($match[2]); $name = $match[1]; if ($name == '') { $name = $data['name']; } return '@[url=' . $data['url'] . ']' . $name . '[/url]'; } /* * we don't want to support a bbcode specific markdown interpreter * and the markdown library we have is pretty good, but provides HTML output. * So we'll use that to convert to HTML, then convert the HTML back to bbcode, * and then clean up a few Diaspora specific constructs. */ public static function toBBCode($s) { $s = html_entity_decode($s, ENT_COMPAT, 'UTF-8'); // Handles single newlines $s = str_replace("\r\n", "\n", $s); $s = str_replace("\n", " \n", $s); $s = str_replace("\r", " \n", $s); // Replace lonely stars in lines not starting with it with literal stars $s = preg_replace('/^([^\*]+)\*([^\*]*)$/im', '$1\*$2', $s); // The parser cannot handle paragraphs correctly $s = str_replace(['

', '

', '

'], ['
', '
', '
'], $s); // Escaping the hash tags $s = preg_replace('/\#([^\s\#])/', '#$1', $s); $s = Markdown::convert($s); $regexp = "/@\{(?:([^\}]+?); )?([^\} ]+)\}/"; $s = preg_replace_callback($regexp, ['self', 'diasporaMention2BBCodeCallback'], $s); $s = str_replace('#', '#', $s); $s = html2bbcode($s); // protect the recycle symbol from turning into a tag, but without unescaping angles and naked ampersands $s = str_replace('♲', html_entity_decode('♲', ENT_QUOTES, 'UTF-8'), $s); // Convert everything that looks like a link to a link $s = preg_replace('/([^\]=]|^)(https?\:\/\/)([a-zA-Z0-9:\/\-?&;.=_~#%$!+,@]+(?