text = $text; parent::__construct(); } /** * Returns given text translated to HTML using the Flay syntax. * * @param string $text String to format * @param boolean $bare Set this to only do

transforms and > to >, no typography additions. * @param boolean $allowHtml Set this to trim whitespace and disable all HTML * @return string Formatted text * @access public */ function toHtml($text = null, $bare = false, $allowHtml = false) { if (empty($text) && empty($this->text)) { return false; } $text = $text ? $text : $this->text; // trim whitespace and disable all HTML if ($allowHtml) { $text = trim($text); } else { $text = str_replace('<', '<', str_replace('>', '>', trim($text))); } if (!$bare) { // multi-paragraph functions $text=preg_replace('#(?:[\n]{0,2})"""(.*)"""(?:[\n]{0,2})#s', "\n\n%BLOCKQUOTE%\n\n\\1\n\n%ENDBLOCKQUOTE%\n\n", $text); $text=preg_replace('#(?:[\n]{0,2})===(.*)===(?:[\n]{0,2})#s', "\n\n%CENTER%\n\n\\1\n\n%ENDCENTER%\n\n", $text); } // pre-parse newlines $text=preg_replace("#\r\n#", "\n", $text); $text=preg_replace("#[\n]{2,}#", "%PARAGRAPH%", $text); $text=preg_replace('#[\n]{1}#', "%LINEBREAK%", $text); $out =''; foreach (split('%PARAGRAPH%', $text)as $line) { if ($line) { if (!$bare) { $links = array(); $regs = null; if (preg_match_all('#\[([^\[]{4,})\]#', $line, $regs)) { foreach ($regs[1] as $reg) { $links[] = $reg; $line = str_replace("[{$reg}]", '%LINK' . (count($links) - 1) . '%', $line); } } // bold $line = ereg_replace("\*([^\*]*)\*", "\\1", $line); // italic $line = ereg_replace("_([^_]*)_", "\\1", $line); } // entities $line = str_replace(' - ', ' – ', $line); $line = str_replace(' -- ', ' — ', $line); $line = str_replace('(C)', '©', $line); $line = str_replace('(R)', '®', $line); $line = str_replace('(TM)', '™', $line); // guess e-mails $emails = null; if (preg_match_all("#([_A-Za-z0-9+-+]+(?:\.[_A-Za-z0-9+-]+)*@[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)*)#", $line, $emails)) { foreach ($emails[1] as $email) { $line = str_replace($email, "{$email}", $line); } } if (!$bare) { $urls = null; if (preg_match_all("#((?:http|https|ftp|nntp)://[^ ]+)#", $line, $urls)) { foreach ($urls[1] as $url) { $line = str_replace($url, "{$url}", $line); } } if (preg_match_all("#(www\.[^\n\%\ ]+[^\n\%\,\.\ ])#", $line, $urls)) { foreach ($urls[1] as $url) { $line = str_replace($url, "{$url}", $line); } } if ($count = count($links)) { for ($ii = 0; $ii < $count; $ii++) { if (preg_match("#^(http|https|ftp|nntp)://#", $links[$ii])) { $prefix = null; } else { $prefix = 'http://'; } if (preg_match('#^[^\ ]+\.(jpg|jpeg|gif|png)$#', $links[$ii])) { $with = "\"\""; } elseif (preg_match('#^([^\]\ ]+)(?:\ ([^\]]+))?$#', $links[$ii], $regs)) { if (isset($regs[2])) { if (preg_match('#\.(jpg|jpeg|gif|png)$#', $regs[2])) { $body = "\"\""; } else { $body = $regs[2]; } } else { $body = $links[$ii]; } $with = "{$body}"; } else { $with = $prefix . $links[$ii]; } $line = str_replace("%LINK{$ii}%", $with, $line); } } } $out .= str_replace('%LINEBREAK%', "
\n", "

{$line}

\n"); } } if (!$bare) { $out = str_replace('

%BLOCKQUOTE%

', "
", $out); $out = str_replace('

%ENDBLOCKQUOTE%

', "
", $out); $out = str_replace('

%CENTER%

', "
", $out); $out = str_replace('

%ENDCENTER%

', "
", $out); } return $out; } /** * Return the words of the string as an array. * * @param string $string * @return array Array of words * @access public */ function extractWords($string) { $split = preg_split('/[\s,\.:\/="!\(\)<>~\[\]]+/', $string); return $split; } /** * Return given string with words in array colorMarked, up to a number of times (defaults to 5). * * @param array $words Words to look for and markup * @param string $string String to look in * @param integer $max_snippets Max number of snippets to extract * @return string String with words marked * @see colorMark * @access public */ function markedSnippets($words, $string, $max_snippets = 5) { $string = strip_tags($string); $snips = array(); $rest = $string; foreach ($words as $word) { if (preg_match_all("/[\s,]+.{0,40}{$word}.{0,40}[\s,]+/i", $rest, $r)) { foreach ($r as $result) { $rest = str_replace($result, '', $rest); } $snips = array_merge($snips, $r[0]); } } if (count($snips) > $max_snippets) { $snips = array_slice($snips, 0, $max_snippets); } $joined = join(' ... ', $snips); $snips = $joined ? "... {$joined} ..." : substr($string, 0, 80) . '...'; return $this->colorMark($words, $snips); } /** * Returns string with EM elements with color classes added. * * @param array $words Array of words to be colorized * @param string $string Text in which the words might be found * @return string String with words colorized * @access public */ function colorMark($words, $string) { $colors=array('yl', 'gr', 'rd', 'bl', 'fu', 'cy'); $nextColorIndex = 0; foreach ($words as $word) { $string = preg_replace("/({$word})/i", '\\1", $string); $nextColorIndex++; } return $string; } /** * Returns given text with tags stripped out. * * @param string $text Text to clean * @return string Cleaned text * @access public */ function toClean($text) { $strip = strip_tags(html_entity_decode($text, ENT_QUOTES)); return $strip; } /** * Return parsed text with tags stripped out. * * @param string $text Text to parse and clean * @return string Cleaned text * @access public */ function toParsedAndClean($text) { return $this->toClean(Flay::toHtml($text)); } /** * Return a fragment of a text, up to $length characters long, with an ellipsis after it. * * @param string $text Text to be truncated. * @param integer $length Max length of text. * @param string $ellipsis Sign to print after truncated text. * @return string Fragment * @access public */ function fragment($text, $length, $ellipsis = '...') { $soft = $length - 5; $hard = $length + 5; $rx = '/(.{' . $soft . ',' . $hard . '})[\s,\.:\/="!\(\)<>~\[\]]+.*/'; if (preg_match($rx, $text, $r)) { $out = $r[1]; } else { $out = substr($text, 0, $length); } $out = $out . (strlen($out) < strlen($text) ? $ellipsis : null); return $out; } } ?>