function XpWikiTracker_list(&$xpwiki, $base, $refer, &$config, $list) { $this->xpwiki =& $xpwiki; $this->root =& $xpwiki->root; $this->cont =& $xpwiki->cont; $this->func =& $xpwiki->func; $this->base = $base; $this->config =& $config; $this->list = $list; $fields = xpwiki_plugin_tracker::plugin_tracker_get_fields($base, $refer, $config); $pattern = array(); $pattern_fields = array(); // Generate regexes: // TODO: if (is FALSE) OR file_exists() $source = xpwiki_plugin_tracker::plugin_tracker_get_source($config->page . '/page', TRUE); // Block-plugins to pseudo fields (#convert => [_block_convert]) $source = preg_replace('/^\\#([^\\(\\s]+)(?:\\((.*?)\\))?\\s*$/m', '[_block_$1]', $source); // Now, $source = array('*someting*', 'fieldname', '*someting*', 'fieldname', ...) $source = preg_split('/\\\\\\[(\\w+?)\\\\\\]/', preg_quote($source, '/'), -1, PREG_SPLIT_DELIM_CAPTURE); while (!empty($source)) { // Just ignore these _fixed_ data // NOTE: if a page has garbages between fields, it will fail to be load $pattern[] = preg_replace('/\\s+/', '\\s*', '(?>\\s*' . trim(array_shift($source)) . '\\s*)'); if (!empty($source)) { $fieldname = array_shift($source); if (isset($fields[$fieldname])) { $pattern[] = '(.*?)'; // Just capture it $pattern_fields[] = $fieldname; // Capture it as this $filedname } else { $pattern[] = '.*?'; // Just ignore pseudo fields } } } $this->fields = $fields; $this->pattern = implode('', $pattern); $this->pattern_fields = $pattern_fields; // Listing $pattern = $base . '/'; $pattern_len = strlen($pattern); foreach ($this->func->get_existpages(false, $pattern) as $_page) { $name = substr($_page, $pattern_len); if (preg_match($this->cont['PLUGIN_TRACKER_LIST_EXCLUDE_PATTERN'], $name)) { continue; } $this->add($_page, $name); } }