/** * 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); }
/** * 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); } }
/** * 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))); } }
/** * 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); } }
/** * 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'); }
/** * 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); }
/** * 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'); }
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; }
/** * 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']); } }
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; }
/** * 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); } }
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]); } }
/** * 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; }
/** * 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; }