function action_edit() { global $ErrorPageLocked, $page, $pagefrom, $pagestore, $ParseEngine; global $section, $use_template, $UserName, $version; $pg = $pagestore->page($page); $pg->read(); if (!$UserName || !$pg->mutable) { die($ErrorPageLocked); } $archive = 0; if ($version != '') { $pg->version = $version; $pg->read(); $archive = 1; } $page_text = $pg->text; // page template if ($use_template) { $tmpl_pg = $pagestore->page($use_template); if ($tmpl_pg->exists()) { $tmpl_pg->read(); $page_text = $tmpl_pg->text; $archive = 0; } else { $use_template = ''; } } // section editing $text_before = ''; $text_after = ''; if ($section) { $lines = explode("\n", $page_text); $lines_before = array(); $lines_after = array(); $lines_section = array(); $section_count = 0; $found_level = 0; foreach ($lines as $line) { if (($result = parse_heading_line_match(strip_tags($line))) !== false && (!$found_level || strlen($result[2]) <= $found_level)) { $section_count++; } if ($section_count < $section) { $lines_before[] = $line; } else { if ($section_count > $section) { $lines_after[] = $line; } else { if (!$found_level) { $found_level = strlen($result[2]); } $lines_section[] = $line; } } } $text_before = implode("\n", $lines_before); $text_after = implode("\n", $lines_after); $page_text = implode("\n", $lines_section); } if (trim($page_text) == '') { $page_text = "Describe {$page} here...\n\nPlease provide content before " . "saving.\n\n-- [{$UserName}]"; } template_edit(array('page' => $page, 'pagefrom' => $pagefrom, 'text' => $page_text, 'section' => $section, 'text_before' => $text_before, 'text_after' => $text_after, 'timestamp' => $pg->time, 'nextver' => $pg->version + 1, 'archive' => $archive, 'template' => $pg->template, 'templates' => $pagestore->getTemplatePages(), 'use_template' => $use_template, 'edituser' => $pg->username, 'editver' => $UserName && $pg->mutable ? $version == '' ? 0 : $version : -1)); }
function parse_heading($text) { global $action, $MaxHeading, $page, $pagestore, $UserName; static $c = array(); static $last_level = 0; static $numbering_level_diff = -1; static $show_edit_link; if (($result = parse_heading_line_match($text)) === false) { return $text; } if (!isset($show_edit_link)) { $pg = $pagestore->page($page); $show_edit_link = $UserName && $pg->mutable && $action == 'view'; } if (($level = strlen($result[2])) > $MaxHeading) { $level = $MaxHeading; } $style_underline = $result[1] == '_'; $headers_numbering = $result[1] == '@'; $header_num = ''; if ($headers_numbering) { if ($numbering_level_diff < 0) { $numbering_level_diff = $level - 1; } if ($level > $last_level) { for ($i = $last_level + 1; $i < $level; $i++) { $c[$i] = 1; } $c[$level] = 0; } $last_level = $level; $c[$level]++; for ($i = 1 + $numbering_level_diff; $i <= $level; $i++) { if ($header_num != '') { $header_num .= '.'; } $header_num .= $c[$i]; } $header_num .= ' '; } return new_entity(array('head_start', $level, $style_underline, trim($header_num), strlen($result[5]), $show_edit_link)) . $header_num . trim($result[3]) . new_entity(array('head_end', $level, $show_edit_link)) . (strlen($result[5]) ? ' ' : '') . $result[6]; }
function parse($max_level, $page) { global $pagestore, $MaxHeading, $document, $TocJavascriptFunctions; global $ViewMacroEngine; $document = parseText($document, array('parse_htmlpre', 'parse_nowiki'), $page); if (!$max_level) { $max_level = $MaxHeading; } // maximum for the wiki if (!$max_level) { $max_level = 9; } // maximum in html $this->i++; if ($this->i > 1) { $TocJavascriptFunctions = ''; } // find highest header level $prev_level = $max_level; $found = 0; foreach (explode("\n", $document) as $line) { if (($result = parse_heading_line_match(strip_tags($line))) !== false) { $found = 1; $level = min(strlen($result[2]), $max_level); if ($level < $prev_level) { $prev_level = $level; } } } if ($found) { $prev_level--; } else { $prev_level = 0; } $toc = array(); $count = 0; $level = $prev_level; // variables used for numbered headers support $num_headers_count = array(); $last_level = 0; $numbering_level_diff = -1; foreach (explode("\n", $document) as $line) { // includes content of checklists in the toc if ($level + 1 <= $max_level && isset($ViewMacroEngine['ChecklistMaster']) && preg_match('/\\[\\[ChecklistMaster ([^]]+)]]/', $line, $matches)) { $prev_level = $level + 1; $categories = $ViewMacroEngine['ChecklistMaster']->getCategories($matches[1]); $anchor_name = str_replace(' ', '_', $matches[1]); $toc[] = '<ul>'; $toc[] = "<li type=disc><a href=\"#{$anchor_name}\">{$matches['1']}</a>"; if ($level + 2 <= $max_level) { $toc[] = '<ul>'; foreach ($categories as $id => $name) { $toc[] = "<li type=disc><a href=\"#{$anchor_name}{$id}\">{$name}</a>"; } $toc[] = '</ul>'; } } // actual toc based on the headers if (($result = parse_heading_line_match(strip_tags($line))) !== false) { $level = strlen($result[2]); $count++; if ($level <= $max_level) { $indentIncrease = $level - $prev_level; for ($i = 0; $i < $indentIncrease; $i++) { $toc[] = '<ul>'; if ($i != $indentIncrease - 1) { $toc[] = '<li type=disc>'; } } for ($i = $indentIncrease; $i < 0; $i++) { $toc[] = '</ul>'; } $prev_level = $level; $header = $result[3]; // remove tags, brackets around wiki words, and // exclamations marks disabling wiki words $header = preg_replace('/<[^>]+>/', '', $header); $header = preg_replace('/[\\[\\]]/', '', $header); $header = preg_replace('/!(\\S)/', '\\1', $header); // resolve parse elements from previous call to parseText $header = parseText($header, array('parse_elements'), $page); // support for numbered headers $header_num = ''; if ($result[1] == '@') { if ($numbering_level_diff < 0) { $numbering_level_diff = $level - 1; } if ($level > $last_level) { for ($i = $last_level + 1; $i < $level; $i++) { $num_headers_count[$i] = 1; } $num_headers_count[$level] = 0; } $last_level = $level; $num_headers_count[$level]++; for ($i = 1 + $numbering_level_diff; $i <= $level; $i++) { if ($header_num != '') { $header_num .= '.'; } $header_num .= $num_headers_count[$i]; } } $anchor = $header_num ? "section{$header_num}" : "toc{$count}"; $toc[] = "<li type=disc><a href=\"#{$anchor}\">{$header_num} {$header}</a>"; } } } for ($i = 0; $i < $prev_level; $i++) { $toc[] = '</ul>'; } $toc = implode("\n", $toc); $return_value = '<table class="toc">' . '<tr class="printhide" id="showtoc' . $this->i . '" style="display: none;">' . '<td><b>Table of contents</b> [ <a href="javascript:showToc(' . $this->i . ');">show</a> ]</td></tr>' . '<tr id="thetoc' . $this->i . '"><td><b>Table of contents</b> ' . '<span class="printhide">[ <a href="javascript:hideToc(' . $this->i . ');">hide</a> ]</span>' . $toc . '</td></tr></table>'; return "{$TocJavascriptFunctions}\n\n{$return_value}"; }