/** * Convert a piece of text from "wiki" markup to XHTML markup for display * @param string $body Text to convert * @return string XHTML markup */ static function convert($body) { // Ensure only plain text $body = check_plain($body); // Any parsing to do? Quick check if (strpos($body, '[[') !== false) { $body = sscText::_parse_tags($body); } // Headings for ($i = 4; $i > 2; $i--) { $h = str_repeat('=', $i - 1); $body = preg_replace("/{$h}(.+){$h}/", "\n<h{$i}>\\1</h{$i}>\n", $body); } // Prepare to parse paragraphs if (strpos($body, "\r") !== false) { // Are \r's if (strpos($body, "\n") !== false) { // \n's too // Assume windows \r\n format $body = str_replace("\r", '', $body); } else { // No \n's $body = str_replace("\r", "\n", $body); } } // Parsing of paragraphs (normal and specialised), lists, etc $bulk = explode("\n", $body); $inpara = false; $body = ''; $count = count($bulk); // Loop through each line for ($i = 0; $i < $count; $i++) { // Check first character if (empty($bulk[$i])) { if ($inpara) { $body .= '</p><p>'; } else { $body .= '<p>'; $inpara = true; } continue; } switch (substr($bulk[$i], 0, 1)) { case ' ': // Space - denotes pre-formatted stuff for code if ($inpara) { $body .= '</p>'; $inpara = false; } $body .= '<pre>'; do { $body .= $bulk[$i] . '\\n'; $i++; } while (isset($bulk[$i][0]) && $bulk[$i][0] == ' '); $body .= '</pre>'; $i--; break; case '*': // Asterisk - denotes bulleted list if ($inpara) { $body .= '</p>'; $inpara = false; } $body .= sscText::_do_list($bulk, $i); break; default: if (strpos($bulk[$i], '<h') !== false) { if ($inpara) { $inpara = false; $body .= '</p>'; } } else { if (!$inpara) { $body .= '<p>'; $inpara = true; } } $body .= $bulk[$i]; } } if ($inpara) { $body .= '</p>'; } while (strpos($body, '<p></p>') !== false) { $body = str_replace('<p></p>', '', $body); } return $body; }