Пример #1
0
    /**
     * Handle syntax matches
     *
     * @param string       $match   The current match
     * @param int          $state   The match state
     * @param int          $pos     The position of the match
     * @param Doku_Handler $handler The hanlder object
     * @return array The instructions of the plugin
     */
    function handle($match, $state, $pos, &$handler) {

        $match = substr($match, 2, -2); // strip markup
        list($match, $flags) = explode('&', $match, 2);

        // break the pattern up into its parts 
        list($mode, $page, $sect) = preg_split('/>|#/u', $match, 3); 
        $check = false;
        if (isset($sect)) $sect = sectionID($sect, $check);
        $level = NULL;
        return array($mode, $page, $sect, explode('&', $flags), $level, $pos);
    }
Пример #2
0
 /**
  * Jump after save to the section containing this table
  *
  * @param Doku_Event $event
  */
 function jump_to_section($event)
 {
     global $INPUT;
     if (!$INPUT->has('edittable_data')) {
         return;
     }
     global $PRE;
     if (preg_match_all('/^\\s*={2,}([^=\\n]+)/m', $PRE, $match, PREG_SET_ORDER)) {
         $check = false;
         //Byref
         $match = array_pop($match);
         $event->data['fragment'] = sectionID($match[1], $check);
     }
 }
Пример #3
0
    /** 
     * Get a section including its subsections 
     *
     * @author Michael Klier <*****@*****.**>
     */ 
    function _get_section(&$ins, $sect) {
        $num = count($ins);
        $offset = false;
        $lvl    = false;
        $end    = false;
        $endpos = null; // end position in the input text, needed for section edit buttons

        $check = array(); // used for sectionID() in order to get the same ids as the xhtml renderer

        for($i=0; $i<$num; $i++) {
            if ($ins[$i][0] == 'header') { 

                // found the right header 
                if (sectionID($ins[$i][1][0], $check) == $sect) {
                    $offset = $i;
                    $lvl    = $ins[$i][1][1]; 
                } elseif ($offset && $lvl && ($ins[$i][1][1] <= $lvl)) {
                    $end = $i - $offset;
                    $endpos = $ins[$i][1][2]; // the position directly after the found section, needed for the section edit button
                    break;
                }
            }
        }
        $offset = $offset ? $offset : 0;
        $end = $end ? $end : ($num - 1);
        if(is_array($ins)) {
            $ins = array_slice($ins, $offset, $end);
            // store the end position in the include_closelastsecedit instruction so it can generate a matching button
            $ins[] = array('plugin', array('include_closelastsecedit', array($endpos)));
        }
    } 
Пример #4
0
 /**
  * Creates a linkid from a headline
  *
  * @author Andreas Gohr <*****@*****.**>
  * @param string  $title   The headline title
  * @param boolean $create  Create a new unique ID?
  * @return string
  */
 function _headerToLink($title, $create = false)
 {
     if ($create) {
         return sectionID($title, $this->headers);
     } else {
         $check = false;
         return sectionID($title, $check);
     }
 }
Пример #5
0
/**
 * Do a redirect after receiving post data
 *
 * Tries to add the section id as hash mark after section editing
 */
function act_redirect($id, $preact)
{
    global $PRE;
    global $TEXT;
    global $MSG;
    //are there any undisplayed messages? keep them in session for display
    //on the next page
    if (isset($MSG) && count($MSG)) {
        //reopen session, store data and close session again
        @session_start();
        $_SESSION[DOKU_COOKIE]['msg'] = $MSG;
        session_write_close();
    }
    $opts = array('id' => $id, 'preact' => $preact);
    //get section name when coming from section edit
    if ($PRE && preg_match('/^\\s*==+([^=\\n]+)/', $TEXT, $match)) {
        $check = false;
        //Byref
        $opts['fragment'] = sectionID($match[0], $check);
    }
    trigger_event('ACTION_SHOW_REDIRECT', $opts, 'act_redirect_execute');
}
Пример #6
0
 /**
  * reformat links if needed
  */
 function _formatLink($link)
 {
     // for internal links contains the title the pageid
     if (in_array($link['title'], $this->actioninstance->getExportedPages())) {
         list(, $hash) = explode('#', $link['url'], 2);
         $check = false;
         $pid = sectionID($link['title'], $check);
         $link['url'] = "#" . $pid . '__' . $hash;
     }
     // prefix interwiki links with interwiki icon
     if ($link['name'][0] != '<' && preg_match('/\\binterwiki iw_(.\\w+)\\b/', $link['class'], $m)) {
         if (file_exists(DOKU_INC . 'lib/images/interwiki/' . $m[1] . '.png')) {
             $img = DOKU_BASE . 'lib/images/interwiki/' . $m[1] . '.png';
         } elseif (file_exists(DOKU_INC . 'lib/images/interwiki/' . $m[1] . '.gif')) {
             $img = DOKU_BASE . 'lib/images/interwiki/' . $m[1] . '.gif';
         } else {
             $img = DOKU_BASE . 'lib/images/interwiki.png';
         }
         $link['name'] = '<img src="' . $img . '" width="16" height="16" style="vertical-align: center" class="' . $link['class'] . '" />' . $link['name'];
     }
     return parent::_formatLink($link);
 }
Пример #7
0
/**
 * Do a redirect after receiving post data
 *
 * Tries to add the section id as hash mark after section editing
 */
function act_redirect($id, $preact)
{
    global $PRE;
    global $TEXT;
    $opts = array('id' => $id, 'preact' => $preact);
    //get section name when coming from section edit
    if ($PRE && preg_match('/^\\s*==+([^=\\n]+)/', $TEXT, $match)) {
        $check = false;
        //Byref
        $opts['fragment'] = sectionID($match[0], $check);
    }
    trigger_event('ACTION_SHOW_REDIRECT', $opts, 'act_redirect_execute');
}
Пример #8
0
 function _parse_headers($id)
 {
     $data = file_get_contents(wikiFN($id));
     //$data = preg_replace("#^\s*~~NEWSFEED.*?~~\s+#","",$data);
     $segs = $this->header;
     $ar = preg_split("/(={" . $segs . ",}.*?={" . $segs . ",})\\s*\n/", $data, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
     if (count($ar) == 0) {
         return false;
     }
     array_shift($ar);
     //removes ~~NEWSFEED.*?~~ and any text above first header
     $feed_data = array();
     for ($i = 0, $j = 0; $i < count($ar); $i += 2, $j++) {
         $feed_data[$j]['title'] = str_replace('=', "", $ar[$i]);
         $feed_data[$j]['item'] = $this->render($ar[$i + 1]);
         $check = false;
         $feed_data[$j]['name'] = sectionID($ar[$i], $check);
     }
     $md_5 = md5($id);
     $metafile = metaFN('newsfeed:' . $md_5, '.gz');
     $this->_writeFile($metafile, $feed_data, true);
     return $md_5;
 }
Пример #9
0
 /**
  * Output the data in a table
  *
  * @param array $data
  * @param Doku_Renderer_xhtml $R
  */
 function _showData($data, &$R)
 {
     global $ID;
     $ret = '';
     if (method_exists($R, 'startSectionEdit')) {
         $data['classes'] .= ' ' . $R->startSectionEdit($data['pos'], 'plugin_data');
     }
     $ret .= '<div class="inline dataplugin_entry ' . $data['classes'] . '"><dl>';
     $class_names = array();
     foreach ($data['data'] as $key => $val) {
         if ($val == '' || !count($val)) {
             continue;
         }
         $type = $data['cols'][$key]['type'];
         if (is_array($type)) {
             $type = $type['type'];
         }
         if ($type === 'hidden') {
             continue;
         }
         $class_name = hsc(sectionID($key, $class_names));
         $ret .= '<dt class="' . $class_name . '">' . hsc($data['cols'][$key]['title']) . '<span class="sep">: </span></dt>';
         $ret .= '<dd class="' . $class_name . '">';
         if (is_array($val)) {
             $cnt = count($val);
             for ($i = 0; $i < $cnt; $i++) {
                 switch ($type) {
                     case 'pageid':
                         $type = 'title';
                     case 'wiki':
                         $val[$i] = $ID . '|' . $val[$i];
                         break;
                 }
                 $ret .= $this->dthlp->_formatData($data['cols'][$key], $val[$i], $R);
                 if ($i < $cnt - 1) {
                     $ret .= '<span class="sep">, </span>';
                 }
             }
         } else {
             switch ($type) {
                 case 'pageid':
                     $type = 'title';
                 case 'wiki':
                     $val = $ID . '|' . $val;
                     break;
             }
             $ret .= $this->dthlp->_formatData($data['cols'][$key], $val, $R);
         }
         $ret .= '</dd>';
     }
     $ret .= '</dl></div>';
     $R->doc .= $ret;
     if (method_exists($R, 'finishSectionEdit')) {
         $R->finishSectionEdit($data['len'] + $data['pos']);
     }
 }
Пример #10
0
 function getMapID($elem, &$check)
 {
     $meta = p_get_metadata($elem['id'], 'context', true);
     $mapID = explode('|', empty($meta['id']) ? sectionID($elem['name'], $check) : $meta['id']);
     array_walk($mapID, array($this, 'mapIDWithAnchor'), $elem['anchor']);
     return $mapID;
 }
    /**
     * Create output
     */
    function render($mode, &$renderer, $input)
    {
        global $conf;
        list($instr, $data) = $input;
        if ($mode == 'xhtml' || $mode == 'metadata') {
            if (!is_array($this->header[$mode])) {
                $this->header[$mode] = array();
            }
            switch ($instr) {
                case 'imageflow__start':
                    $this->sectionID[] = sectionID("imageflow_container_", $this->header[$mode]);
                    $scID = $this->sectionID[sizeof($this->sectionID) - 1];
                    if ($mode == 'xhtml') {
                        $renderer->doc .= <<<OUTPUT
\t<div class="imageflow_wrapper" id="{$scID}">
\t\t<noscript>
\t\t\t<div class="hasscript">
OUTPUT;
                    }
                    if ($data === null) {
                        break;
                    }
                    $retData = array();
                    list($id, $width) = explode('?', $data, 2);
                    $dir = str_replace(':', '/', cleanID($id));
                    search($retData, $conf['mediadir'], 'search_media', null, $dir);
                    foreach ($retData as $item) {
                        if (!$item['isimg']) {
                            continue;
                        }
                        $imgData = array('src' => $item['id']);
                        if (empty($width)) {
                            $width = 300;
                        }
                        $imgData['params'] = array('w' => intval($width));
                        $imgData['id'] = sectionID(noNS($item['id']), $this->header[$mode]);
                        $imgData['isImage'] = true;
                        $this->_image($imgData, $renderer, $mode);
                    }
                    break;
                case 'image':
                    $this->_image($data, $renderer, $mode);
                    break;
                case 'imageflow__end':
                    if (sizeOf($sectionID) > 0) {
                        array_pop($sectionID);
                    }
                    if ($mode == 'xhtml') {
                        $renderer->doc .= <<<OUTPUT
\t\t\t</div>
\t\t</noscript>
\t</div>
OUTPUT;
                    }
                    break;
            }
            return true;
        }
        return false;
    }
Пример #12
0
 /** 
  * Get a section including its subsections 
  *
  * @author Michael Klier <*****@*****.**>
  */
 function _get_section(&$ins, $sect)
 {
     $num = count($ins);
     $offset = false;
     $lvl = false;
     $end = false;
     $check = array();
     // used for sectionID() in order to get the same ids as the xhtml renderer
     for ($i = 0; $i < $num; $i++) {
         if ($ins[$i][0] == 'header') {
             // found the right header
             if (sectionID($ins[$i][1][0], $check) == $sect) {
                 $offset = $i;
                 $lvl = $ins[$i][1][1];
             } elseif ($offset && $lvl && $ins[$i][1][1] <= $lvl) {
                 $end = $i - $offset;
                 break;
             }
         }
     }
     $offset = $offset ? $offset : 0;
     $end = $end ? $end : $num - 1;
     if (is_array($ins)) {
         $ins = array_slice($ins, $offset, $end);
     }
 }
Пример #13
0
 function _convert_link(&$renderer, &$instr, $id)
 {
     global $ID;
     $exists = false;
     resolve_pageid(getNS($id), $instr[1][0], $exists);
     list($pageID, $pageReference) = explode("#", $instr[1][0], 2);
     if (in_array($pageID, $this->includedPages)) {
         // Crate new internal Links
         $check = null;
         // Either get existing reference or create from first heading. If still not there take the alternate ID
         $pageNameLink = empty($pageReference) ? sectionID($pageID, $check) : $pageReference;
         $instr[1][0] = $ID . "#" . $pageNameLink;
     } else {
         // Convert external Links to plain Text
         $instr = array("cdata", array($instr[1][1]), $instr[2]);
     }
 }
Пример #14
0
 /**
  * Handles the actual output creation.
  *
  * @param   string        $format output format being rendered
  * @param   Doku_Renderer $R      the current renderer object
  * @param   array         $data   data created by handler()
  * @return  boolean               rendered correctly? (however, returned value is not used at the moment)
  */
 function render($format, Doku_Renderer $R, $data)
 {
     if ($format != 'xhtml' && $format != 'odt') {
         return false;
     }
     /** @var Doku_Renderer_xhtml $R */
     if (is_null($data)) {
         return false;
     }
     if (!$this->dthlp->ready()) {
         return false;
     }
     $sqlite = $this->dthlp->_getDB();
     if (!$sqlite) {
         return false;
     }
     $R->info['cache'] = false;
     //reset counters
     $this->sums = array();
     if ($this->hasRequestFilter() or isset($_REQUEST['dataofs'])) {
         $this->updateSQLwithQuery($data);
         // handles request params
     }
     $this->dthlp->_replacePlaceholdersInSQL($data);
     // run query
     $clist = array_keys($data['cols']);
     $res = $sqlite->query($data['sql']);
     $rows = $sqlite->res2arr($res);
     $cnt = count($rows);
     if ($cnt === 0) {
         $this->nullList($data, $clist, $R);
         return true;
     }
     if ($data['limit'] && $cnt > $data['limit']) {
         $rows = array_slice($rows, 0, $data['limit']);
     }
     //build classnames per column
     $classes = array();
     $class_names_cache = array();
     $offset = 0;
     if ($data['rownumbers']) {
         $offset = 1;
         //rownumbers are in first column
         $classes[] = $data['align'][0] . 'align rownumbers';
     }
     foreach ($clist as $index => $col) {
         $class = $data['align'][$index + $offset] . 'align';
         $class .= ' ' . hsc(sectionID($col, $class_names_cache));
         $classes[] = $class;
     }
     //start table/list
     $this->preList($clist, $data, $R);
     foreach ($rows as $rownum => $row) {
         // build data rows
         $this->before_item($R);
         if ($data['rownumbers']) {
             $this->before_val('class="' . $classes[0] . '"', $R);
             $R->doc .= $rownum + 1;
             $this->after_val($R);
         }
         foreach (array_values($row) as $num => $cval) {
             $num_rn = $num + $offset;
             $this->beforeVal($data, $num_rn, 'class="' . $classes[$num_rn] . '"', $R);
             $R->doc .= $this->dthlp->_formatData($data['cols'][$clist[$num]], $cval, $R);
             $this->afterVal($data, $num_rn, $R);
             // clean currency symbols
             $nval = str_replace('$€₤', '', $cval);
             $nval = str_replace('/ [A-Z]{0,3}$/', '', $nval);
             $nval = str_replace(',', '.', $nval);
             $nval = trim($nval);
             // summarize
             if ($data['summarize'] && is_numeric($nval)) {
                 if (!isset($this->sums[$num])) {
                     $this->sums[$num] = 0;
                 }
                 $this->sums[$num] += $nval;
             }
         }
         $this->after_item($R);
     }
     $this->postList($data, $cnt, $R);
     return true;
 }
Пример #15
0
 /**
  * Generates a two-level table of contents for the config plugin.
  *
  * @author Ben Coburn <*****@*****.**>
  *
  * @return array
  */
 function getTOC()
 {
     if (is_null($this->_config)) {
         $this->_config = new configuration($this->_file);
     }
     $this->setupLocale(true);
     $allow_debug = $GLOBALS['conf']['allowdebug'];
     // avoid global $conf; here.
     // gather toc data
     $has_undefined = false;
     $toc = array('conf' => array(), 'plugin' => array(), 'template' => null);
     foreach ($this->_config->setting as $setting) {
         if (is_a($setting, 'setting_fieldset')) {
             if (substr($setting->_key, 0, 10) == 'plugin' . CM_KEYMARKER) {
                 $toc['plugin'][] = $setting;
             } else {
                 if (substr($setting->_key, 0, 7) == 'tpl' . CM_KEYMARKER) {
                     $toc['template'] = $setting;
                 } else {
                     $toc['conf'][] = $setting;
                 }
             }
         } else {
             if (!$has_undefined && is_a($setting, 'setting_undefined')) {
                 $has_undefined = true;
             }
         }
     }
     // build toc
     $t = array();
     $check = false;
     $title = $this->getLang('_configuration_manager');
     $t[] = html_mktocitem(sectionID($title, $check), $title, 1);
     $t[] = html_mktocitem('dokuwiki_settings', $this->getLang('_header_dokuwiki'), 1);
     /** @var setting $setting */
     foreach ($toc['conf'] as $setting) {
         $name = $setting->prompt($this);
         $t[] = html_mktocitem($setting->_key, $name, 2);
     }
     if (!empty($toc['plugin'])) {
         $t[] = html_mktocitem('plugin_settings', $this->getLang('_header_plugin'), 1);
     }
     foreach ($toc['plugin'] as $setting) {
         $name = $setting->prompt($this);
         $t[] = html_mktocitem($setting->_key, $name, 2);
     }
     if (isset($toc['template'])) {
         $t[] = html_mktocitem('template_settings', $this->getLang('_header_template'), 1);
         $setting = $toc['template'];
         $name = $setting->prompt($this);
         $t[] = html_mktocitem($setting->_key, $name, 2);
     }
     if ($has_undefined && $allow_debug) {
         $t[] = html_mktocitem('undefined_settings', $this->getLang('_header_undefined'), 1);
     }
     return $t;
 }