function wikiplugin_fitnesse($data, $params) { $runner = Tracker_Field_Math::getRunner(); $mock = new FixtureMockTrackerField(); $runner->mockFunction('tracker-field', $mock); $fixtures = array('trackermath' => 'wp_fixture_tracker_math', 'trackerdata' => function ($data, $params) use($mock) { return wp_fixture_tracker_data($data, $params, $mock); }); $matches = WikiParser_PluginMatcher::match($data); $argParser = new WikiParser_PluginArgumentParser(); foreach ($matches as $table) { $fixture = $table->getName(); $arguments = $table->getArguments(); $arguments = $argParser->parse($arguments); $body = trim($table->getBody()); if (isset($fixtures[$fixture])) { $replace = call_user_func($fixtures[$fixture], $body, new JitFilter($arguments)); $table->replaceWith($replace); } else { $data = new FixtureTable($body); $table->replaceWith('__' . tr('Fixture not found: %0', $fixture) . "__\n{$data}"); } } Tracker_Field_Math::resetRunner(); return $matches->getText(); }
function wikiplugin_map($data, $params) { global $tikilib, $prefs; if (isset($params['mapfile'])) { return wp_map_mapserver($params); } $smarty = TikiLib::lib('smarty'); $smarty->loadPlugin('smarty_modifier_escape'); $width = '100%'; if (isset($params['width'])) { $width = intval($params['width']) . 'px'; } $height = '100%'; if (isset($params['height'])) { $height = intval($params['height']) . 'px'; } if (!isset($params['controls'])) { $params['controls'] = wp_map_default_controls(); } if (!is_array($params['controls'])) { $params['controls'] = explode(',', $params['controls']); } if (!isset($params['popupstyle'])) { $params['popupstyle'] = 'bubble'; } if (!empty($params['tooltips']) && $params['tooltips'] === 'y') { $tooltips = ' data-tooltips="1"'; } else { $tooltips = ''; } $popupStyle = smarty_modifier_escape($params['popupstyle']); $controls = array_intersect($params['controls'], wp_map_available_controls()); $controls = array_intersect($params['controls'], wp_map_available_controls()); $controls = implode(',', $controls); $center = null; $geolib = TikiLib::lib('geo'); if (isset($params['center'])) { if ($coords = $geolib->parse_coordinates($params['center'])) { $center = ' data-geo-center="' . smarty_modifier_escape($geolib->build_location_string($coords)) . '" '; } } else { $center = $geolib->get_default_center(); } TikiLib::lib('header')->add_map(); $scope = smarty_modifier_escape(wp_map_getscope($params)); $output = "<div class=\"map-container\" data-marker-filter=\"{$scope}\" data-map-controls=\"{$controls}\" data-popup-style=\"{$popupStyle}\" style=\"width: {$width}; height: {$height};\" {$center}{$tooltips}>"; $argumentParser = new WikiParser_PluginArgumentParser(); $matches = WikiParser_PluginMatcher::match($data); foreach ($matches as $match) { $name = $match->getName(); $arguments = $argumentParser->parse($match->getArguments()); $function = 'wp_map_plugin_' . $name; if (function_exists($function)) { $output .= $function($match->getBody(), new JitFilter($arguments)); } } $output .= "</div>"; return $output; }
/** * Apply tablesorter is enabled * * @param WikiParser_PluginMatcher $matches * @param Search_Query $query * @return array */ function applyTablesorter(WikiParser_PluginMatcher $matches, Search_Query $query) { $ret = ['max' => false, 'tsOn' => false]; $parser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $name = $match->getName(); if ($name == 'tablesorter') { $tsargs = $parser->parse($match->getArguments()); $ajax = !empty($tsargs['server']) && $tsargs['server'] === 'y'; $ret['tsOn'] = Table_Check::isEnabled($ajax); if (!$ret['tsOn']) { TikiLib::lib('errorreport')->report(tra('List plugin: Feature "jQuery Sortable Tables" (tablesorter) is not enabled')); return $ret; } if (isset($tsargs['tsortcolumns'])) { $tsc = Table_Check::parseParam($tsargs['tsortcolumns']); } if (isset($tsargs['tspaginate'])) { $tsp = Table_Check::parseParam($tsargs['tspaginate']); if (isset($tsp[0]['max']) && $ajax) { $ret['max'] = (int) $tsp[0]['max']; } } } } foreach ($matches as $match) { $name = $match->getName(); if ($name == 'column') { $cols[] = $match; $args[] = $parser->parse($match->getArguments()); } } if (Table_Check::isSort()) { foreach ($_GET['sort'] as $key => $dir) { $n = ''; switch ($tsc[$key]['type']) { case 'digit': case 'currency': case 'percent': case 'time': case strpos($tsc[$key]['type'], 'date') !== false: $n = 'n'; break; } $query->setOrder($args[$key]['field'] . '_' . $n . Table_Check::$dir[$dir]); } } if (Table_Check::isFilter()) { foreach ($_GET['filter'] as $key => $filter) { $query->filterContent($filter, $args[$key]['field']); } } return $ret; }
function fromMatch($match) { $parser = new WikiParser_PluginArgumentParser(); $arrayBuilder = new Search_Formatter_ArrayBuilder(); $arguments = $parser->parse($match->getArguments()); if (!empty($arguments['name'])) { $sequence = $this->build($arguments['name'], $arrayBuilder->getData($match->getBody())); if (isset($arguments['group'])) { $sequence->setRequiredGroup($arguments['group']); } return $sequence; } }
function apply(WikiParser_PluginMatcher $matches) { $argumentParser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { if ($match->getName() === 'facet') { $arguments = $argumentParser->parse($match->getArguments()); $operator = isset($arguments['operator']) ? $arguments['operator'] : 'or'; if (isset($arguments['name'])) { $this->facets[] = array('name' => $arguments['name'], 'operator' => $operator); } } } }
private function processDisplay($valueFormatter, $body, $arguments) { $parser = new WikiParser_PluginArgumentParser(); $arguments = $parser->parse($arguments); $name = $arguments['name']; if (isset($arguments['format'])) { $format = $arguments['format']; } else { $format = 'plain'; } unset($arguments['format']); unset($arguments['name']); return $valueFormatter->{$format}($name, $arguments); }
function apply(WikiParser_PluginMatcher $matches) { $argumentParser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $name = $match->getName(); if ($name == 'group') { $arguments = $argumentParser->parse($match->getArguments()); $field = isset($arguments['field']) ? $arguments['field'] : 'aggregate'; $collect = isset($arguments['collect']) ? explode(',', $arguments['collect']) : array('user'); $this->result->groupBy($field, $collect); } } if ($this->paginationArguments) { $this->result->setMaxResults($this->paginationArguments['max']); } }
function apply(WikiParser_PluginMatcher $matches) { $argumentParser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $name = $match->getName(); $arguments = $argumentParser->parse($match->getArguments()); $this->addQueryArgument($name, $arguments); } $offsetArg = $this->paginationArguments['offset_arg']; $maxRecords = $this->paginationArguments['max']; if (isset($_REQUEST[$offsetArg])) { $this->query->setRange($_REQUEST[$offsetArg], $maxRecords * $this->boost); } else { $this->query->setRange(0, $maxRecords * $this->boost); } }
function getData($string) { $matches = WikiParser_PluginMatcher::match($string); $parser = new WikiParser_PluginArgumentParser(); $data = array(); foreach ($matches as $m) { $name = $m->getName(); $arguments = $m->getArguments(); if (isset($data[$name])) { if (!is_int(key($data[$name]))) { $data[$name] = array($data[$name]); } $data[$name][] = $parser->parse($arguments); } else { $data[$name] = $parser->parse($arguments); } } return $data; }
function apply(WikiParser_PluginMatcher $matches) { $argumentParser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $name = $match->getName(); $arguments = $argumentParser->parse($match->getArguments()); foreach ($arguments as $key => $value) { $function = "wpquery_{$name}_{$key}"; if (method_exists($this, $function)) { call_user_func(array($this, $function), $this->query, $value, $arguments); } } } $offsetArg = $this->paginationArguments['offset_arg']; $maxRecords = $this->paginationArguments['max']; if (isset($_REQUEST[$offsetArg])) { $this->query->setRange($_REQUEST[$offsetArg], $maxRecords * $this->boost); } else { $this->query->setRange(0, $maxRecords * $this->boost); } }
public static function search_plugin_content(Tiki_Profile_Writer $writer, $content) { $searchlib = TikiLib::lib('unifiedsearch'); $dataSource = $searchlib->getProfileExportHelper(); $argumentParser = new WikiParser_PluginArgumentParser(); $matches = WikiParser_PluginMatcher::match($content); $justReplace = false; foreach ($matches as $match) { if ($justReplaced) { $justReplaced = false; continue; } $name = $match->getName(); $args = $argumentParser->parse($match->getArguments()); if ($name === 'filter') { $args = $dataSource->replaceFilterReferences($writer, $args); $match->replaceWithPlugin('filter', $args, $match->getBody()); $justReplaced = true; } } return $matches->getText(); }
function wikiplugin_appframe_execute($plugin) { $name = $plugin->getName(); $body = $plugin->getBody(); $argumentParger = new WikiParser_PluginArgumentParser(); $params = $argumentParger->parse($plugin->getArguments()); if (!in_array($name, array('tab', 'column', 'page', 'module', 'cond', 'anchor', 'overlay', 'template', 'hidden', 'mapcontrol'))) { return null; } $function = 'wikiplugin_appframe_' . $name; return $function($body, new JitFilter($params), $plugin->getStart()); }
/** * Foreach plugin used in a object content call its save handler, * if one exist, and send email notifications when it has pending * status, if preference is enabled. * * A plugin save handler is a function defined on the plugin file * with the following format: wikiplugin_$pluginName_save() * * This function is called from object_post_save. Do not call directly. * * @param array $context object type and id * @param array $data * @return void */ private function plugin_post_save_actions($context, $data = null) { global $prefs; $parserlib = TikiLib::lib('parser'); if (is_null($data)) { $content = array(); if (isset($context['values'])) { $content = $context['values']; } if (isset($context['data'])) { $content[] = $context['data']; } $data['content'] = implode(' ', $content); } $argumentParser = new WikiParser_PluginArgumentParser(); $matches = WikiParser_PluginMatcher::match($data['content']); foreach ($matches as $match) { $plugin_name = $match->getName(); $body = $match->getBody(); $arguments = $argumentParser->parse($match->getArguments()); $dummy_output = ''; if ($parserlib->plugin_enabled($plugin_name, $dummy_output)) { $status = $parserlib->plugin_can_execute($plugin_name, $body, $arguments, true); // when plugin status is pending, $status equals plugin fingerprint if ($prefs['wikipluginprefs_pending_notification'] == 'y' && $status !== true && $status != 'rejected') { $this->plugin_pending_notification($plugin_name, $body, $arguments, $context); } $alias = new WikiPlugin_Negotiator_Wiki_Alias(); $alias->findImplementation($plugin_name, $body, $arguments); $func_name = 'wikiplugin_' . $plugin_name . '_save'; if (function_exists($func_name)) { $func_name($context, $body, $arguments); } } } }
private function loadYaml($content) { $this->pageContent = $content; $pos = 0; $this->data = array(); $matches = WikiParser_PluginMatcher::match($content); $parser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $arguments = $parser->parse($match->getArguments()); if ($match->getName() == 'code' && isset($arguments['caption']) && $arguments['caption'] == 'YAML' || $match->getName() == 'profile') { $yaml = $match->getBody(); $data = Horde_Yaml::load($yaml); foreach ($data as $key => $value) { if (array_key_exists($key, $this->data)) { $this->data[$key] = $this->mergeData($this->data[$key], $value); } else { $this->data[$key] = $value; } } } } $this->fetchExternals(); $this->getObjects(); }
function moveWikiUpToFgal($page_info, $fgalId, &$errors, &$feedbacks) { global $user; $tikilib = TikiLib::lib('tiki'); include_once 'lib/mime/mimelib.php'; $argumentParser = new WikiParser_PluginArgumentParser(); $files = array(); if (strpos($page_info['data'], 'img/wiki_up') === false) { return; } $matches = WikiParser_PluginMatcher::match($page_info['data']); foreach ($matches as $match) { $modif = false; $plugin_name = $match->getName(); if ($plugin_name == 'img') { $arguments = $argumentParser->parse($match->getArguments()); $newArgs = array(); foreach ($arguments as $key => $val) { if ($key == 'src') { if (false === ($data = @file_get_contents($val))) { $errors[] = tra('Cannot open this file:') . ' ' . $val . ' ' . tra('Page:') . ' ' . $page_info['pageName']; continue; } $name = preg_replace('|.*/([^/]*)|', '$1', $val); $fileId = $this->insert_file($fgalId, $name, 'Used in ' . $page_info['pageName'], $name, $data, strlen($data), tiki_get_mime($name, 'application/octet-stream', $val), $user, '', 'wiki_up conversion'); if (empty($fileId)) { $errors[] = tra('Cannot upload this file') . ' ' . $val . ' ' . tra('Page:') . ' ' . $page_info['pageName']; continue; } else { $files[] = $val; $modif = true; $newArgs[] = 'fileId="' . $fileId . '"'; } } else { $newArgs[] = "{$key}=\"{$val}\""; } } if ($modif) { $match->replaceWith('{img ' . implode(' ', $newArgs) . '}'); } } } if (!empty($files)) { $tikilib->update_page($page_info['pageName'], $matches->getText(), 'wiki_up conversion', $user, $tikilib->get_ip_address()); foreach ($files as $file) { unlink($file); } $feedbacks[] = $page_info['pageName']; } }
private function cs_process_group(&$dataappend, $grouped, $id, $grouping_keys, $min_match = 2, $max_match = 99, $checksimilar = true, $drop_if_no_match = false) { $parser = new WikiParser_PluginArgumentParser(); $to_reconstruct = array(); foreach ($grouped as $group_id => $grp) { if (count($grp) > 1) { $args = array(); $args_checked = array(); // just for consistency checking $query_vals = array(); foreach ($grp as $g) { $matches = WikiParser_PluginMatcher::match($dataappend[$g]); foreach ($matches as $match) { if ($match->getName() != 'filter') { $query_vals = array(); break 2; } $args = $parser->parse($match->getArguments()); // double check that they are the same filter other than the query itself, to avoid errornous mixing if ($checksimilar) { $args_to_check = $args; foreach ($grouping_keys as $k) { unset($args_to_check[$k]); } if (!empty($args_checked) && $args_checked != $args_to_check) { $query_vals = array(); break 2; } else { $args_checked = $args_to_check; } } foreach ($grouping_keys as $k) { if (array_key_exists($k, $args)) { $query_vals[] = $args[$k]; break; } } } } if (count($query_vals) >= $min_match && count($query_vals) <= $max_match) { $to_reconstruct[$group_id] = array('args' => $args, 'query_vals' => $query_vals); } elseif ($drop_if_no_match) { foreach ($grouped[$group_id] as $to_drop) { unset($dataappend[$to_drop]); } } } } return $to_reconstruct; }
function wikiplugin_list($data, $params) { $unifiedsearchlib = TikiLib::lib('unifiedsearch'); $alternate = null; $output = null; $subPlugins = array(); $query = new Search_Query; $query->setWeightCalculator($unifiedsearchlib->getWeightCalculator()); if (isset($_REQUEST['maxRecords'])) { if (isset($_REQUEST['offset'])) { $query->setRange($_REQUEST['offset'], $_REQUEST['maxRecords']); } else { $query->setRange(0, $_REQUEST['maxRecords']); } } elseif (isset($_REQUEST['offset'])) { $query->setRange($_REQUEST['offset']); } $matches = WikiParser_PluginMatcher::match($data); $argumentParser = new WikiParser_PluginArgumentParser; $onclick = ''; $offset_jsvar = ''; foreach ($matches as $match) { $name = $match->getName(); $arguments = $argumentParser->parse($match->getArguments()); foreach ($arguments as $key => $value) { $function = "wpquery_{$name}_{$key}"; if (function_exists($function)) { $function($query, $value, $arguments); } $function = "wpformat_{$name}_{$key}"; if (function_exists($function)) { $function($subPlugins, $value, $match->getBody()); } } if ($name == 'output') { $output = $match; } if ($name == 'alternate') { $alternate = $match->getBody(); } if ($name == 'pagination' && isset($arguments['onclick'])) { $onclick = $arguments['onclick']; } if ($name == 'pagination' && isset($arguments['offset_jsvar'])) { $offset_jsvar = $arguments['offset_jsvar']; } } if (! Perms::get()->admin) { $query->filterPermissions(Perms::get()->getGroups()); } if (!empty($_REQUEST['sort_mode'])) { $query->setOrder($_REQUEST['sort_mode']); } $index = $unifiedsearchlib->getIndex(); $result = $query->search($index); if (count($result)) { if (!empty($output)) { $arguments = $argumentParser->parse($output->getArguments()); if (isset($arguments['template'])) { if ($arguments['template'] == 'table') { $arguments['template'] = dirname(__FILE__) . '/../../templates/table.tpl'; } else if (!file_exists($arguments['template'])) { TikiLib::lib('errorreport')->report(tr('Missing template "%0"', $arguments['template'])); return ''; } $builder = new Search_Formatter_ArrayBuilder; $templateData = $builder->getData($output->getBody()); $plugin = new Search_Formatter_Plugin_SmartyTemplate($arguments['template']); $plugin->setData($templateData); $plugin->setFields(wp_list_findfields($templateData)); } elseif (isset($arguments['wiki']) && TikiLib::lib('tiki')->page_exists($arguments['wiki'])) { $wikitpl = "tplwiki:" . $arguments['wiki']; $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl); $plugin = new Search_Formatter_Plugin_WikiTemplate($wikicontent); } else { $plugin = new Search_Formatter_Plugin_WikiTemplate($output->getBody()); } if (isset($arguments['pagination'])) { $plugin = new WikiPlugin_List_AppendPagination($plugin, $onclick, $offset_jsvar); } } else { $plugin = new Search_Formatter_Plugin_WikiTemplate("* {display name=title format=objectlink}\n"); } $formatter = new Search_Formatter($plugin); $formatter->setDataSource($unifiedsearchlib->getDataSource()); foreach ($subPlugins as $key => $plugin) { $formatter->addSubFormatter($key, $plugin); } $out = $formatter->format($result); } elseif (!empty($alternate)) { $out = $alternate; } else { $out = '^' . tra('No results for query.') . '^'; } return $out; }
function wikiplugin_customsearch($data, $params) { global $prefs; if (!isset($params['wiki'])) { return tra('Template is not specified'); } elseif (!TikiLib::lib('tiki')->page_exists($params['wiki'])) { return tra('Template page not found'); } if (isset($params['id'])) { $id = $params['id']; } else { $id = '0'; } if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) { $recalllastsearch = 1; } else { $recalllastsearch = 0; } if (isset($params['autosearchdelay'])) { $autosearchdelay = $params['autosearchdelay']; } else { $autosearchdelay = 0; } if (isset($params['searchfadediv'])) { $searchfadediv = $params['searchfadediv']; } else { $searchfadediv = ''; } if (!isset($_REQUEST["offset"])) { $offset = 0; } else { $offset = $_REQUEST["offset"]; } if (isset($_REQUEST['maxRecords'])) { $maxRecords = $_REQUEST['maxRecords']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_$id"]['maxRecords'])) { $maxRecords = $_SESSION["customsearch_$id"]['maxRecords']; } else { $maxRecords = $prefs['maxRecords']; } if (!empty($_REQUEST['sort_mode'])) { $sort_mode = $_REQUEST['sort_mode']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_$id"]['sort_mode'])) { $sort_mode = $_SESSION["customsearch_$id"]['sort_mode']; } else { $sort_mode = ''; } if (!isset($params['searchonload'])) { $params['searchonload'] = 1; } $wikitpl = "tplwiki:" . $params['wiki']; $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl); TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent); $matches = WikiParser_PluginMatcher::match($wikicontent); $parser = new WikiParser_PluginArgumentParser; $fingerprint = md5(print_r($matches, true)); $sessionprint = "customsearch_{$id}_$fingerprint"; if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) { unset($_SESSION["customsearch_$id"]); } $_SESSION[$sessionprint] = $fingerprint; // important that offset from session is set after fingerprint check otherwise blank page might show if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_$id"]["offset"])) { $offset = $_SESSION["customsearch_$id"]["offset"]; } $groups = array(); $textrangegroups = array(); $daterangegroups = array(); $script = " function add_customsearch_$id(fieldid, filter) { customsearch_{$id}_searchdata[fieldid] = filter; } function remove_customsearch_$id(fieldid) { delete customsearch_{$id}_searchdata[fieldid]; } customsearch_{$id}_searchdata = new Object(); customsearch_{$id}_basedata = " . json_encode((string) $data) . "; $('#customsearch_$id').click(function() { // reset offset on reclick of form since new search should always start from 0 offset customsearch_offset_$id = 0; }); $('#customsearch_$id').submit(function() { load_customsearch_$id($.toJSON(customsearch_{$id}_searchdata)); return false; }); "; foreach ($matches as $k => $match) { $name = $match->getName(); $arguments = $parser->parse($match->getArguments()); $fieldid = "customsearch_{$id}_$k"; if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) { $sort_mode = $arguments['mode']; $match->replaceWith(''); continue; } if ($arguments['_filter'] == 'content' && !empty($arguments['_field'])) { $filter = $arguments['_field']; } elseif ($arguments['_filter'] == 'content' && empty($arguments['_field'])) { $filter = 'content'; } else { $filter = ''; } if ( $filter && !empty($_REQUEST['default'][$filter]) ) { $default = $_REQUEST['default'][$filter]; } elseif ($recalllastsearch && isset($_SESSION["customsearch_$id"][$fieldid])) { $default = $_SESSION["customsearch_$id"][$fieldid]; } elseif (!empty($arguments['_default'])) { if (strpos($arguments['_default'], ',') !== false) { $default = explode(',', $arguments['_default']); } else { $default = $arguments['_default']; } } else { $default = ''; } if ( $name == 'categories' ) { $parent = $arguments['_parent']; if (!empty($_REQUEST['defaultcat'][$parent])) { $default = $_REQUEST['defaultcat'][$parent]; } } $function = "cs_design_{$name}"; if (function_exists($function)) { if (isset($arguments['_group'])) { $groups[$fieldid] = $arguments['_group']; $fieldname = "customsearch_{$id}_gr" . $arguments['_group']; } elseif (isset($arguments['_textrange'])) { $textrangegroups[$fieldid] = $arguments['_textrange']; $fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange']; } elseif (isset($arguments['_daterange'])) { $daterangegroups[$fieldid] = $arguments['_daterange']; $fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange']; } else { $fieldname = $fieldid; } $match->replaceWith($function($id, $fieldname, $fieldid, $arguments, $default, $script, $groups, $autosearchdelay)); } } if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) { $callbackscript_tpl = "wiki:" . $params['callbackscript']; $callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl); } $script .= "function load_customsearch_$id(searchdata) {\n"; $searchfadetext = tr('Searching...'); if ($searchfadediv) { $script .= " if ($('#$searchfadediv').length) $('#$searchfadediv').modal('$searchfadetext');\n"; $script .= " else $('#customsearch_$id').modal('$searchfadetext');\n"; } else { $script .= " $('#customsearch_$id').modal('$searchfadetext');\n"; } $script .= " var datamap = { basedata: customsearch_{$id}_basedata, adddata: searchdata, searchid: '$id', groups: '" . json_encode($groups) . "', textrangegroups: '" . json_encode($textrangegroups) . "', daterangegroups: '" . json_encode($daterangegroups) . "', offset: customsearch_offset_$id, maxRecords: customsearch_maxRecords_$id }; if (customsearch_sort_mode_$id) { // blank sort_mode is not allowed by Tiki input filter datamap['sort_mode'] = customsearch_sort_mode_$id; } $.ajax({ type: 'POST', url: $.service('tracker_search', 'customsearch'), data: datamap, dataType: 'html', success: function(data){ "; if ($searchfadediv) { $script .= " if ($('#$searchfadediv').length) $('#$searchfadediv').modal();\n"; $script .= " else $('#customsearch_$id').modal();\n"; } else { $script .= " $('#customsearch_$id').modal();\n"; } if (!empty($params['destdiv'])) { $script .= " $('#{$params['destdiv']}').html(data); customsearch_quiet_$id = false;\n"; } else { $script .= " $('#customsearch_{$id}_results').html(data); customsearch_quiet_$id = false;\n"; } $script .= " $(document).trigger('pageSearchReady');\n"; if (!empty($callbackScript)) $script .= $callbackScript; $script .= " } }); }; customsearch_sort_mode_$id = '$sort_mode'; customsearch_offset_$id = $offset; customsearch_maxRecords_$id = $maxRecords; "; if ($params['searchonload']) { $script .= "$('#customsearch_$id').submit(); "; } TikiLib::lib('header')->add_jq_onready($script); $form = '<div id="' . "customsearch_$id" . '_form' . '"><form id="' . "customsearch_$id" . '">' . $matches->getText() . '</form></div>'; if (empty($params['destdiv'])) { $results = '<div id="' . "customsearch_$id" . '_results"></div>'; } $out = $form . $results; return $out; }
function process_save_plugins($data, array $context) { $parserlib = TikiLib::lib('parser'); $argumentParser = new WikiParser_PluginArgumentParser(); $matches = WikiParser_PluginMatcher::match($data); foreach ($matches as $match) { $plugin_name = $match->getName(); $body = $match->getBody(); $arguments = $argumentParser->parse($match->getArguments()); $dummy_output = ''; if ($parserlib->plugin_enabled($plugin_name, $dummy_output)) { $func_name = 'wikiplugin_' . $plugin_name . '_rewrite'; if (function_exists($func_name)) { $parserlib->plugin_apply_filters($plugin_name, $data, $arguments); $output = $func_name($body, $arguments, $context); if ($output !== false) { $match->replaceWith($output); } } if ($plugin_name == 'translationof') { $this->add_translationof_relation($data, $arguments, $context['itemId']); } } } $matches_text = $matches->getText(); return $matches_text; }
function plugin($pluginDetails) { $argParser = new WikiParser_PluginArgumentParser(); return $this->parse($this->pluginExecute($pluginDetails['name'], $argParser->parse($pluginDetails['args']), $pluginDetails['body'])); }
public static function fitnesse_content(Tiki_Profile_Writer $writer, $content) { $searchlib = TikiLib::lib('unifiedsearch'); $argumentParser = new WikiParser_PluginArgumentParser(); $matches = WikiParser_PluginMatcher::match($content); $justReplaced = false; foreach ($matches as $match) { if ($justReplaced) { $justReplaced = false; continue; } $name = $match->getName(); $args = $argumentParser->parse($match->getArguments()); if (isset($args['trackerId'])) { $args['trackerId'] = $writer->getReference('tracker', $args['trackerId']); $match->replaceWithPlugin($name, $args, $match->getBody()); $justReplaced = true; } } return $matches->getText(); }
function parse_first(&$data, &$preparsed, &$noparsed, $options = null, $real_start_diff = '0') { global $tikilib, $tiki_p_edit, $prefs, $pluginskiplist; $smarty = TikiLib::lib('smarty'); if (!is_array($pluginskiplist)) { $pluginskiplist = array(); } $is_html = isset($options['is_html']) ? $options['is_html'] : false; $data = $this->protectSpecialChars($data, $is_html, $options); $matches = WikiParser_PluginMatcher::match($data); $argumentParser = new WikiParser_PluginArgumentParser(); if (!isset($options['parseimgonly'])) { $options['parseimgonly'] = false; } foreach ($matches as $match) { if ($options['parseimgonly'] && $this->getName() != 'img') { continue; } //note parent plugin in case of plugins nested in an include - to suppress plugin edit icons below $plugin_parent = isset($plugin_name) ? $plugin_name : false; $plugin_name = $match->getName(); //suppress plugin edit icons for plugins within includes since edit doesn't work for these yet $options['suppress_icons'] = $plugin_name != 'include' && $plugin_parent && $plugin_parent == 'include' ? true : $options['suppress_icons']; $plugin_data = $match->getBody(); $arguments = $argumentParser->parse($match->getArguments()); $start = $match->getStart(); $pluginOutput = null; if ($this->plugin_enabled($plugin_name, $pluginOutput)) { static $plugin_indexes = array(); if (!array_key_exists($plugin_name, $plugin_indexes)) { $plugin_indexes[$plugin_name] = 0; } $current_index = ++$plugin_indexes[$plugin_name]; // get info to test for preview with auto_save if (!$options['skipvalidation']) { $status = $this->plugin_can_execute($plugin_name, $plugin_data, $arguments, $options['preview_mode'] || $options['ck_editor']); } else { $status = true; } global $tiki_p_plugin_viewdetail, $tiki_p_plugin_preview, $tiki_p_plugin_approve; $details = $tiki_p_plugin_viewdetail == 'y' && $status != 'rejected'; $preview = $tiki_p_plugin_preview == 'y' && $details && !$options['preview_mode']; $approve = $tiki_p_plugin_approve == 'y' && $details && !$options['preview_mode']; if ($status === true || $tiki_p_plugin_preview == 'y' && $details && $options['preview_mode'] && $prefs['ajax_autosave'] === 'y' || isset($options['noparseplugins']) && $options['noparseplugins']) { if (isset($options['stripplugins']) && $options['stripplugins']) { $ret = $plugin_data; } else { if (isset($options['noparseplugins']) && $options['noparseplugins']) { $ret = '~np~' . (string) $match . '~/np~'; } else { $ret = $this->plugin_execute($plugin_name, $plugin_data, $arguments, $start, false, $options); } } } else { if ($status != 'rejected') { $smarty->assign('plugin_fingerprint', $status); $status = 'pending'; } if ($options['ck_editor']) { $ret = $this->convert_plugin_for_ckeditor($plugin_name, $arguments, tra('Plugin execution pending approval'), $plugin_data, array('icon' => 'img/icons/error.png')); } else { $smarty->assign('plugin_name', $plugin_name); $smarty->assign('plugin_index', $current_index); $smarty->assign('plugin_status', $status); if (!$options['inside_pretty']) { $smarty->assign('plugin_details', $details); } else { $smarty->assign('plugin_details', ''); } $smarty->assign('plugin_preview', $preview); $smarty->assign('plugin_approve', $approve); $smarty->assign('plugin_body', $plugin_data); $smarty->assign('plugin_args', $arguments); $ret = '~np~' . $smarty->fetch('tiki-plugin_blocked.tpl') . '~/np~'; } } } else { $ret = $pluginOutput->toWiki(); } if ($ret === false) { continue; } if ($this->plugin_is_editable($plugin_name) && (empty($options['preview_mode']) || !$options['preview_mode']) && empty($options['indexing']) && (empty($options['print']) || !$options['print']) && !$options['suppress_icons']) { $headerlib = TikiLib::lib('header'); $headerlib->add_jsfile('tiki-jsplugin.php?language=' . $prefs['language'], 'dynamic'); if ($prefs['wikiplugin_module'] === 'y' && $prefs['wikiplugininline_module'] === 'n') { $headerlib->add_jsfile('tiki-jsmodule.php?language=' . $prefs['language'], 'dynamic'); } include_once 'lib/smarty_tiki/function.icon.php'; global $page; $id = 'plugin-edit-' . $plugin_name . $current_index; $headerlib->add_js("\$(document).ready( function() {\nif ( \$('#{$id}') ) {\n\$('#{$id}').click( function(event) {\n\tpopup_plugin_form(" . json_encode('editwiki') . ', ' . json_encode($plugin_name) . ', ' . json_encode($current_index) . ', ' . json_encode($page) . ', ' . json_encode($arguments) . ', ' . json_encode($this->unprotectSpecialChars($plugin_data, true)) . ", event.target);\n} );\n}\n} );\n"); $iconDisplayStyle = ''; if ($prefs['wiki_edit_icons_toggle'] == 'y' && ($prefs['wiki_edit_plugin'] == 'y' || $prefs['wiki_edit_section'] == 'y')) { if (!isset($_COOKIE['wiki_plugin_edit_view'])) { $iconDisplayStyle = ' style="display:none;"'; } } $ret .= '~np~<a id="' . $id . '" href="javascript:void(1)" class="editplugin"' . $iconDisplayStyle . '>' . smarty_function_icon(array('_id' => 'wiki_plugin_edit', 'alt' => tra('Edit Plugin') . ':' . $plugin_name), $smarty) . "</a>~/np~"; } // End plugin handling $ret = str_replace('~/np~~np~', '', $ret); $match->replaceWith($ret); } $data = $matches->getText(); $this->strip_unparsed_block($data, $noparsed); // ~pp~ $start = -1; while (false !== ($start = strpos($data, '~pp~', $start + 1))) { if (false !== ($end = strpos($data, '~/pp~', $start))) { $content = substr($data, $start + 4, $end - $start - 4); // ~pp~ type "plugins" $key = "§" . md5($tikilib->genPass()) . "§"; $noparsed["key"][] = preg_quote($key); $noparsed["data"][] = '<pre>' . $content . '</pre>'; $data = substr($data, 0, $start) . $key . substr($data, $end + 5); } } }
function wikiplugin_customsearch($data, $params) { global $prefs; if (!isset($params['wiki'])) { return tra('Template is not specified'); } elseif (!TikiLib::lib('tiki')->page_exists($params['wiki'])) { return tra('Template page not found'); } if (isset($params['id'])) { $id = $params['id']; } else { $id = '0'; } if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) { $recalllastsearch = 1; } else { $recalllastsearch = 0; } if (isset($params['searchfadediv'])) { $searchfadediv = $params['searchfadediv']; } else { $searchfadediv = ''; } if (!isset($_REQUEST["offset"])) { $offset = 0; } else { $offset = (int) $_REQUEST["offset"]; } if (isset($_REQUEST['maxRecords'])) { $maxRecords = (int) $_REQUEST['maxRecords']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['maxRecords'])) { $maxRecords = (int) $_SESSION["customsearch_{$id}"]['maxRecords']; } else { $maxRecords = (int) $prefs['maxRecords']; } if (!empty($_REQUEST['sort_mode'])) { $sort_mode = $_REQUEST['sort_mode']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['sort_mode'])) { $sort_mode = $_SESSION["customsearch_{$id}"]['sort_mode']; } else { $sort_mode = ''; } if (!isset($params['searchonload'])) { $params['searchonload'] = 1; } $definitionKey = md5($data); $matches = WikiParser_PluginMatcher::match($data); $query = new Search_Query(); $builder = new Search_Query_WikiBuilder($query); $builder->apply($matches); $builder = new Search_Formatter_Builder(); $builder->apply($matches); $formatter = $builder->getFormatter(); $cachelib = TikiLib::lib('cache'); $cachelib->cacheItem($definitionKey, serialize(array('query' => $query, 'formatter' => $formatter)), 'customsearch'); $wikitpl = "tplwiki:" . $params['wiki']; $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl); TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent); $matches = WikiParser_PluginMatcher::match($wikicontent); $fingerprint = md5($wikicontent); $sessionprint = "customsearch_{$id}_{$fingerprint}"; if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) { unset($_SESSION["customsearch_{$id}"]); } $_SESSION[$sessionprint] = $fingerprint; // important that offset from session is set after fingerprint check otherwise blank page might show if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_{$id}"]["offset"])) { $offset = (int) $_SESSION["customsearch_{$id}"]["offset"]; } $options = array('searchfadetext' => tr('Loading...'), 'searchfadediv' => $searchfadediv, 'results' => empty($params['destdiv']) ? "#customsearch_{$id}_results" : "#{$params['destdiv']}", 'autosearchdelay' => isset($params['autosearchdelay']) ? max(1500, (int) $params['autosearchdelay']) : 0, 'searchonload' => (int) $params['searchonload']); /** * NOTES: Search Execution * * There is a global delay on execution of 1 second. This makes sure * multiple submissions will never trigger multiple requests. * * There is an additional autosearchdelay configuration that can trigger the search * on field change rather than explicit request. Explicit requests will still work. */ $script = "\nvar customsearch = {\n\toptions: " . json_encode($options) . ",\n\tid: " . json_encode($id) . ",\n\toffset: 0,\n\tsearchdata: {},\n\tdefinition: " . json_encode((string) $definitionKey) . ",\n\tautoTimeout: null,\n\tadd: function (fieldId, filter) {\n\t\tthis.searchdata[fieldId] = filter;\n\t\tthis.auto();\n\t},\n\tremove: function (fieldId) {\n\t\tdelete this.searchdata[fieldId];\n\t\tthis.auto();\n\t},\n\tload: function () {\n\t\tthis._executor(this);\n\t},\n\tauto: function () {\n\t},\n\t_executor: delayedExecutor(1000, function (cs) {\n\t\tvar selector = '#' + cs.options.searchfadediv;\n\t\tif (cs.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\tselector = '#customsearch_' + cs.id;\n\t\t}\n\n\t\t\$(selector).modal(cs.options.searchfadetext);\n\n\t\tcs._load(function (data) {\n\t\t\t\$(selector).modal();\n\t\t\t\$(cs.options.results).html(data);\n\t\t\t\$(document).trigger('pageSearchReady');\n\t\t});\n\t}),\n\tinit: function () {\n\t\tvar that = this;\n\t\tif (that.options.searchonload) {\n\t\t\tthat.load();\n\t\t}\n\n\t\tif (that.options.autosearchdelay) {\n\t\t\tthat.auto = delayedExecutor(that.options.autosearchdelay, function () {\n\t\t\t\tthat.load();\n\t\t\t});\n\t\t}\n\t}\n};\n\$('#customsearch_{$id}').click(function() {\n\tcustomsearch.offset = 0;\n});\n\$('#customsearch_{$id}').submit(function() {\n\tcustomsearch.load();\n\treturn false;\n});\n\ncustomsearch_{$id} = customsearch;\n"; $parser = new WikiParser_PluginArgumentParser(); foreach ($matches as $match) { $name = $match->getName(); $arguments = $parser->parse($match->getArguments()); $key = $match->getInitialStart(); $fieldid = "customsearch_{$id}_{$key}"; if (isset($arguments['id'])) { $fieldid = $arguments['id']; } if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) { $sort_mode = $arguments['mode']; $match->replaceWith(''); continue; } if (!empty($arguments['_field']) && $arguments['_filter'] == 'content') { $filter = $arguments['_field']; } elseif (!empty($arguments['_field']) && $arguments['_filter'] == 'content') { $filter = 'content'; } else { $filter = ''; } if ($filter && !empty($_REQUEST['default'][$filter])) { $default = $_REQUEST['default'][$filter]; } elseif ($recalllastsearch && isset($_SESSION["customsearch_{$id}"][$fieldid])) { $default = $_SESSION["customsearch_{$id}"][$fieldid]; } elseif (!empty($arguments['_default'])) { if (strpos($arguments['_default'], ',') !== false) { $default = explode(',', $arguments['_default']); } else { $default = $arguments['_default']; } } else { $default = ''; } if ($name == 'categories') { $parent = $arguments['_parent']; if (!empty($_REQUEST['defaultcat'][$parent])) { $default = $_REQUEST['defaultcat'][$parent]; } } $function = "cs_design_{$name}"; if (function_exists($function)) { if (isset($arguments['_group'])) { $fieldname = "customsearch_{$id}_gr" . $arguments['_group']; } elseif (isset($arguments['_textrange'])) { $fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange']; } elseif (isset($arguments['_daterange'])) { $fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange']; } else { $fieldname = $fieldid; } $match->replaceWith($function($id, $fieldname, $fieldid, $arguments, $default, $script)); } } $callbackScript = null; if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) { $callbackscript_tpl = "wiki:" . $params['callbackscript']; $callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl); } global $page; $script .= "\ncustomsearch._load = function (receive) {\n\tvar datamap = {\n\t\tdefinition: this.definition,\n\t\tadddata: \$.toJSON(this.searchdata),\n\t\tsearchid: this.id,\n\t\toffset: customsearch.offset,\n\t\tmaxRecords: this.maxRecords,\n\t\tpage: " . json_encode($page) . ",\n\t\trecalllastsearch: {$recalllastsearch}\n\t};\n\tif (customsearch.sort_mode) {\n\t\t// blank sort_mode is not allowed by Tiki input filter\n\t\tdatamap.sort_mode = customsearch.sort_mode;\n\t}\n\t\$.ajax({\n\t\ttype: 'POST',\n\t\turl: \$.service('search_customsearch', 'customsearch'),\n\t\tdata: datamap,\n\t\tdataType: 'html',\n\t\tsuccess: function(data) {\n\t\t\treceive(data);\n\t\t\t{$callbackScript};\n\t\t}\n\t});\n};\ncustomsearch.sort_mode = " . json_encode($sort_mode) . ";\ncustomsearch.offset = {$offset};\ncustomsearch.maxRecords = {$maxRecords};\ncustomsearch.init();\n"; TikiLib::lib('header')->add_jq_onready($script); $out = '<div id="customsearch_' . $id . '_form"><form id="customsearch_' . $id . '">' . $matches->getText() . '</form></div>'; if (empty($params['destdiv'])) { $out .= '<div id="customsearch_' . $id . '_results"></div>'; } return $out; }
function testInvalidEnd() { $out = array('a' => 'b'); $parser = new WikiParser_PluginArgumentParser(); $this->assertEquals($parser->parse('a=b foo='), $out); }
function wikiplugin_customsearch($data, $params) { global $prefs; static $instance_id = null; if (empty($params['wiki']) && empty($params['tpl'])) { return tra('Template is not specified'); } elseif (!empty($params['wiki']) && !TikiLib::lib('tiki')->page_exists($params['wiki'])) { return tra('Template page not found'); } if (isset($params['id'])) { $id = $params['id']; } else { if ($instance_id === null) { $instance_id = 0; } else { $instance_id++; } $id = (string) $instance_id; } if (isset($params['recalllastsearch']) && $params['recalllastsearch'] == 1 && (!isset($_REQUEST['forgetlastsearch']) || $_REQUEST['forgetlastsearch'] != 'y')) { $recalllastsearch = 1; } else { $recalllastsearch = 0; } $defaults = array(); $plugininfo = wikiplugin_customsearch_info(); foreach ($plugininfo['params'] as $key => $param) { $defaults["{$key}"] = $param['default']; } $params = array_merge($defaults, $params); if (!isset($_REQUEST["offset"])) { $offset = 0; } else { $offset = (int) $_REQUEST["offset"]; } if (isset($_REQUEST['maxRecords'])) { $maxRecords = (int) $_REQUEST['maxRecords']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['maxRecords'])) { $maxRecords = (int) $_SESSION["customsearch_{$id}"]['maxRecords']; } else { $maxRecords = (int) $prefs['maxRecords']; $maxDefault = true; } if (!empty($_REQUEST['sort_mode'])) { $sort_mode = $_REQUEST['sort_mode']; } elseif ($recalllastsearch && !empty($_SESSION["customsearch_{$id}"]['sort_mode'])) { $sort_mode = $_SESSION["customsearch_{$id}"]['sort_mode']; } else { $sort_mode = ''; } $definitionKey = md5($data); $matches = WikiParser_PluginMatcher::match($data); $query = new Search_Query(); if (!isset($params['searchable_only']) || $params['searchable_only'] == 1) { $query->filterIdentifier('y', 'searchable'); } $builder = new Search_Query_WikiBuilder($query); $builder->apply($matches); $paginationArguments = $builder->getPaginationArguments(); // Use maxRecords set in LIST parameters rather then global default if set. if (isset($maxDefault) && $maxDefault) { if (!empty($paginationArguments['max'])) { $maxRecords = $paginationArguments['max']; } } // setup AJAX pagination $paginationArguments['offset_jsvar'] = "customsearch_{$id}.offset"; $paginationArguments['sort_jsvar'] = "customsearch_{$id}.sort_mode"; $paginationArguments['_onclick'] = "\$('#customsearch_{$id}').submit();return false;"; $builder = new Search_Formatter_Builder(); $builder->setPaginationArguments($paginationArguments); $builder->apply($matches); $formatter = $builder->getFormatter(); $facets = new Search_Query_FacetWikiBuilder(); $facets->apply($matches); $cachelib = TikiLib::lib('cache'); $cachelib->cacheItem($definitionKey, serialize(array('query' => $query, 'formatter' => $formatter, 'facets' => $facets)), 'customsearch'); if (!empty($params['wiki'])) { $wikitpl = "tplwiki:" . $params['wiki']; } else { $wikitpl = $params['tpl']; } $wikicontent = TikiLib::lib('smarty')->fetch($wikitpl); TikiLib::lib('parser')->parse_wiki_argvariable($wikicontent); $matches = WikiParser_PluginMatcher::match($wikicontent); $fingerprint = md5($wikicontent); $sessionprint = "customsearch_{$id}_{$fingerprint}"; if (isset($_SESSION[$sessionprint]) && $_SESSION[$sessionprint] != $fingerprint) { unset($_SESSION["customsearch_{$id}"]); } $_SESSION[$sessionprint] = $fingerprint; // important that offset from session is set after fingerprint check otherwise blank page might show if ($recalllastsearch && !isset($_REQUEST['offset']) && !empty($_SESSION["customsearch_{$id}"]["offset"])) { $offset = (int) $_SESSION["customsearch_{$id}"]["offset"]; } $options = array('searchfadetext' => tr('Loading...'), 'searchfadediv' => $params['searchfadediv'], 'results' => empty($params['destdiv']) ? "#customsearch_{$id}_results" : "#{$params['destdiv']}", 'autosearchdelay' => isset($params['autosearchdelay']) ? max(1500, (int) $params['autosearchdelay']) : 0, 'searchonload' => (int) $params['searchonload'], 'requireinput' => (bool) $params['requireinput'], 'origrequireinput' => (bool) $params['requireinput'], 'forcesortmode' => (bool) $params['forcesortmode']); /** * NOTES: Search Execution * * There is a global delay on execution of 1 second. This makes sure * multiple submissions will never trigger multiple requests. * * There is an additional autosearchdelay configuration that can trigger the search * on field change rather than explicit request. Explicit requests will still work. */ $script = "\nvar customsearch = {\n\toptions: " . json_encode($options) . ",\n\tid: " . json_encode($id) . ",\n\toffset: 0,\n\tsearchdata: {},\n\tdefinition: " . json_encode((string) $definitionKey) . ",\n\tautoTimeout: null,\n\tadd: function (fieldId, filter) {\n\t\tthis.searchdata[fieldId] = filter;\n\t\tthis.auto();\n\t},\n\tremove: function (fieldId) {\n\t\tdelete this.searchdata[fieldId];\n\t\tthis.auto();\n\t},\n\tload: function () {\n\t\tthis._executor(this);\n\t},\n\tauto: function () {\n\t},\n\t_executor: delayedExecutor(1000, function (cs) {\n\t\tvar selector = '#' + cs.options.searchfadediv;\n\t\tif (cs.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\tselector = '#customsearch_' + cs.id;\n\t\t}\n\n\t\t\$(selector).tikiModal(cs.options.searchfadetext);\n\n\t\tcs._load(function (data) {\n\t\t\t\$(selector).tikiModal();\n\t\t\t\$(cs.options.results).html(data);\n\t\t\t\$(document).trigger('pageSearchReady');\n\t\t});\n\t\tcs.store_query = '';\n\t}),\n\tinit: function () {\n\t\tvar that = this;\n\t\tif (that.options.searchonload) {\n\t\t\tthat.load();\n\t\t}\n\n\t\tif (that.options.autosearchdelay) {\n\t\t\tthat.auto = delayedExecutor(that.options.autosearchdelay, function () {\n\t\t\t\tif (that.options.requireinput && (!\$('#customsearch_{$id}').find(':text').val() || \$('#customsearch_{$id}').find(':text').val().indexOf('...') > 0)) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tthat.load();\n\t\t\t});\n\t\t}\n\t}\n};\n\$('#customsearch_{$id}').click(function() {\n\tcustomsearch.offset = 0;\n});\n\$('#customsearch_{$id}').submit(function() {\n\tif (customsearch.options.requireinput && (!\$(this).find(':text').val() || \$(this).find(':text').val().indexOf('...') > 0)) {\n\t\talert(tr('Please enter a search query'));\n\t\treturn false;\n\t}\n\tif (customsearch.options.origrequireinput != customsearch.options.requireinput) {\n\t\tcustomsearch.options.requireinput = customsearch.options.origrequireinput;\n\t}\n\tcustomsearch.load();\n\treturn false;\n});\n\nwindow.customsearch_{$id} = customsearch;\n\$(document).trigger('formSearchReady');\n"; $parser = new WikiParser_PluginArgumentParser(); $dr = 0; foreach ($matches as $match) { $name = $match->getName(); $arguments = $parser->parse($match->getArguments()); $key = $match->getInitialStart(); $fieldid = "customsearch_{$id}_{$key}"; if (isset($arguments['id'])) { $fieldid = $arguments['id']; } if ($name == 'sort' && !empty($arguments['mode']) && empty($sort_mode)) { $sort_mode = $arguments['mode']; $match->replaceWith(''); continue; } if (!empty($arguments['_field']) && !empty($arguments['_filter']) && $arguments['_filter'] == 'content') { $filter = $arguments['_field']; } elseif (empty($arguments['_field']) && !empty($arguments['_filter']) && $arguments['_filter'] == 'content') { $filter = 'content'; } else { $filter = ''; } if ($filter && !empty($_REQUEST['default'][$filter])) { $default = $_REQUEST['default'][$filter]; } elseif ($recalllastsearch && isset($_SESSION["customsearch_{$id}"][$fieldid])) { $default = $_SESSION["customsearch_{$id}"][$fieldid]; } elseif (!empty($arguments['_default'])) { if (strpos($arguments['_default'], ',') !== false) { $default = explode(',', $arguments['_default']); } else { $default = $arguments['_default']; } } else { $default = ''; } if ($name == 'categories') { $parent = $arguments['_parent']; if (!empty($_REQUEST['defaultcat'][$parent])) { $default = $_REQUEST['defaultcat'][$parent]; } } $function = "cs_design_{$name}"; if (function_exists($function)) { if (isset($arguments['_group'])) { $fieldname = "customsearch_{$id}_gr" . $arguments['_group']; } elseif (isset($arguments['_textrange'])) { $fieldname = "customsearch_{$id}_textrange" . $arguments['_textrange']; } elseif (isset($arguments['_daterange'])) { $fieldname = "customsearch_{$id}_daterange" . $arguments['_daterange']; } else { $fieldname = $fieldid; } $html = $function($id, $fieldname, $fieldid, $arguments, $default, $script); if ($params['trimlinefeeds']) { $html = trim($html); } $match->replaceWith($html); } if ($name == 'daterange') { $dr++; } } $callbackScript = null; if (!empty($params['callbackscript']) && TikiLib::lib('tiki')->page_exists($params['callbackscript'])) { $callbackscript_tpl = "wiki:" . $params['callbackscript']; $callbackScript = TikiLib::lib('smarty')->fetch($callbackscript_tpl); } //get iconset icon if daterange is one of the fields if ($dr) { $smarty = TikiLib::lib('smarty'); $smarty->loadPlugin('smarty_function_js_insert_icon'); $iconinsert = smarty_function_js_insert_icon(['type' => 'jscalendar', 'return' => 'y'], $smarty); } else { $iconinsert = ''; } global $page; $script .= "\ncustomsearch._load = function (receive) {\n\tvar datamap = {\n\t\tdefinition: this.definition,\n\t\tadddata: \$.toJSON(this.searchdata),\n\t\tsearchid: this.id,\n\t\toffset: customsearch.offset,\n\t\tmaxRecords: this.maxRecords,\n\t\tstore_query: this.store_query,\n\t\tpage: " . json_encode($page) . ",\n\t\trecalllastsearch: {$recalllastsearch}\n\t};\n\tif (!customsearch.options.forcesortmode && \$('#customsearch_{$id}').find(':text').val() && \$('#customsearch_{$id}').find(':text').val().indexOf('...') <= 0) {\n\t\tcustomsearch.sort_mode = 'score_desc';\n\t}\n\tif (customsearch.sort_mode) {\n\t\t// blank sort_mode is not allowed by Tiki input filter\n\t\tdatamap.sort_mode = customsearch.sort_mode;\n\t}\n\t\$.ajax({\n\t\ttype: 'POST',\n\t\turl: \$.service('search_customsearch', 'customsearch'),\n\t\tdata: datamap,\n\t\tdataType: 'html',\n\t\tsuccess: function(data) {\n\t\t\treceive(data);\n\t\t\t{$callbackScript};\n\t\t},\n\t\terror: function ( jqXHR, textStatus, errorThrown ) {\n\t\t\tvar selector = '#' + customsearch.options.searchfadediv;\n\t\t\tif (customsearch.options.searchfadediv.length <= 1 && \$(selector).length === 0) {\n\t\t\t\tselector = '#customsearch_' + customsearch.id;\n\t\t\t}\n\t\t\t\$(selector).tikiModal();\n\n\t\t\t\$('#customsearch_{$id}').showError(jqXHR)\n\t\t}\n\t});\n};\ncustomsearch.sort_mode = " . json_encode($sort_mode) . ";\ncustomsearch.offset = {$offset};\ncustomsearch.maxRecords = {$maxRecords};\ncustomsearch.store_query ='';\ncustomsearch.init();\n{$iconinsert}"; TikiLib::lib('header')->add_jq_onready($script); if ($params['customsearchjs']) { TikiLib::lib('header')->add_jsfile('lib/jquery_tiki/customsearch.js'); } $out = '<div id="customsearch_' . $id . '_form"><form id="customsearch_' . $id . '">' . $matches->getText() . '</form></div>'; if (empty($params['destdiv'])) { $out .= '<div id="customsearch_' . $id . '_results"></div>'; } if (!empty($params['wiki'])) { return $out; } else { // If using smarty tpl should assume it's all HTML $out = str_replace('~np~', '', $out); $out = str_replace('~/np~', '', $out); return '~np~' . $out . '~/np~'; } }