Esempio n. 1
0
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));
}
Esempio n. 2
0
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]) ? '&nbsp;' : '') . $result[6];
}
Esempio n. 3
0
 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}";
 }