Revision: 13603
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at April 29, 2009 04:26 by iroybot
Initial Code
function linebreaker(&$s) { if (!preg_match('@<[^>]+\n@sm', $s)) return str_replace("\n", "<br />\n", $s); $buffer = ''; $inside = false; for ($i=0;$i<strlen($s);$i++) { $c = $s[$i]; switch ($c) { case '<': $inside = true; $buffer .= $c; break; case '>': $inside = false; $buffer .= $c; break; case "\n": $buffer .= ($inside ? "\n" : "<br />\n"); break; default: $buffer .= $c; } } return $buffer; } function ¶grapher(&$s) { if (substr($s, 0, 4) == "\t<p>") return($s); // already formatted // clean up bare & $s = preg_replace('@&(?![a-z0-9#]+;)@', '&', $s); // code should be inside pre to be preformatted, let's leave it here for now anyway $block_tags = 'object|pre|p|dl|div|noscript|script|blockquote|form|table|td|th|ins|fieldset|address|h1|h2|h3|h4|h5|h6|ul|ol|li|code'; $r = '@(?: # match paragraph mark ((?:\n\s*){2,}) | # match block open tag (< # save tag (' . $block_tags . ') # save tag name [^>]*>) | # match block close tag (</\s*(' . $block_tags . ')\s*>) )@smix'; $m = array(); preg_match_all($r, str_replace("\r", '', $s), $m, PREG_SET_ORDER | PREG_OFFSET_CAPTURE); $matches = count($m); $s = str_replace("\r", '', $s); if ($matches == 0) { $buffer = "<p>" . linebreaker($s) . "</p>"; return $buffer; } else { $p_parents = array('div'=>1, 'blockquote'=>1, 'td'=>1, 'th'=>1, 'ins'=>1, 'form'=>1, 'li'=>1); $buffer = ''; $pre = false; $last_offset = 0; $tags = array(); $tag = null; $tag_content = ''; $reset_tag = null; foreach ($m as $match) { // grab the content from the latest match offset up to the current one $offset = $match[0][1]; $slice = substr($s, $last_offset, $offset - $last_offset); $convert = is_null($tag) || (!$pre && isset($p_parents[$tag])); if ($convert) { $slice = trim($slice); $slice = linebreaker($slice); } $last_offset = $offset + strlen($match[0][0]); // now fill the buffer if (!empty($slice)) $buffer .= $convert ? "<p>$slice</p>\n" : "$slice"; // set the current tag context switch (count($match)) { case 2: # paragraph mark $buffer .= $pre ? "\n\n" : ''; break; case 4: # block open tag $tag = strtolower($match[3][0]); $tags[] = $tag; if ($tag == 'pre' || $tag == 'script') $pre = true; $buffer .= $match[0][0] . ($pre ? '' : "\n"); break; case 6: # block close tag array_pop($tags); $tag = strtolower($match[5][0]); if ($tag == 'pre' || $tag == 'script') $pre = false; $buffer .= $match[0][0] . ($pre ? '' : "\n"); if ($tag == 'pre') $pre = false; $tlen = count($tags); if ($tlen > 0) $tag = $tags[$tlen - 1]; else $tag = $pre = null; break; } } $tail = substr($s, $last_offset, strlen($s) - $last_offset); if ($pre) { // unlikely, but does not hurt to check $buffer .= $tail; } else { $tail = trim($tail); if (!empty($tail)) $buffer .= '<p>' . linebreaker($tail) . '</p>'; } } return $buffer; }
Initial URL
http://lightpress-de.googlecode.com/svn/trunk/lightpress/classes/Frontend.php
Initial Description
Transform text (eg. from a WYSIWYG) into nicely formatted HTML paragraphs. (Credits: Ludo Magnocavallo's LightPress). [this is a solid starting point - but a lot of HTML elements are missing]
Initial Title
PHP Paragrapher
Initial Tags
html
Initial Language
PHP