re; } function callback($match) { trigger_error(get_class($this)." does nothing with ${match[0]}", E_USER_WARNING); return $match[0]; } } class WikiWordHandler extends Handler { var $re = "(?:[.]?|[\\#]?)\b[A-Z][0-9a-z']*[A-Z][0-9a-z'A-Z]*"; function callback($match) { return wiki_hyperlink($match[0], $match[0]); } } class URLHandler extends Handler { function URLHandler() { $this->re = '('.REGEX_URL.')'; } function callback($match) { return wiki_hyperlink($match[0], $match[0]); } } class ThePageHandler extends Handler { function ThePageHandler() { $this->re = '([Tt]he\s+)('.REGEX_PROPERNAME.')(\s+[Pp]age)'; } function callback($match) { return wiki_hyperlink($match[2], $match[1].$match[2].$match[3]); } } class BracketLinkNaturalHandler extends Handler { function BracketLinkNaturalHandler() { $this->re = '(["].*?["]|'.REGEX_PROPERNAME.')\s+'. '\(('.REGEX_URL.'|'.REGEX_WIKIWORD.')\)'; } function callback($match) { $match[1] = trim($match[1], '"'); return(wiki_hyperlink($match[2], $match[1])); } } class PersonalPageLinkHandler extends Handler { function PersonalPageLinkHandler() { $this->re = "(--)((?:[A-Z][a-z]+\\s?)+([A-Z]{1,2}[.]?)?)". "|((?:[A-Z][a-z]+\\s?)*[A-Z][a-z]+". "(?:\\s[A-Z]{1,2}[.]?)?)('s [pP]age)". "|(?$text"); } function preg_subexpressions($re) { return substr_count($re, '(') - substr_count($re, '\\(') - substr_count($re, '(?'); } function wiki_do_links($data) { $handlers = array(); $handlers[] = new BracketLinkNaturalHandler(); $handlers[] = new PersonalPageLinkHandler(); $handlers[] = new ThePageHandler(); $handlers[] = new WikiWordHandler(); $handlers[] = new URLHandler(); $res = array(); $subexphandlers = array(); $reversemin = array(); $reversemax = array(); $offset = 0; foreach($handlers as $handler) { $t = preg_subexpressions($handler->regex()) + 1; for($i = 0; $i < $t; $i++) { $subexphandlers[$offset++] = $handler; $reversemax[get_class($handler)] = $offset - 1; if(!$reversemin[get_class($handler)]) $reversemin[get_class($handler)] = $offset - 1; } $res[] = $handler->regex(); } # print('
');ob_start('htmlentities');print_r($res);ob_end_flush();print(''); $res = array_map(create_function('$a', 'return "($a)";'), $res); $re = '#('.join($res, '|').')#msu'; # print("
Offsets:\n");ob_start('htmlentities');print_r($subexphandlers);ob_end_flush();print(''); # print("
".htmlentities(wordwrap($re, 76, "\n", 1)).""); # print($data."\n"); $o = ''; if(preg_match_all($re, $data, $matches, PREG_SET_ORDER)) { # print("
\n
Matches:\n");ob_start('htmlentities');print_r($matches);ob_end_flush();print(''); $parts = preg_split($re, $data); foreach($matches as $i => $match) { array_shift($match); array_shift($match); #$n = count($match) - 1; #$match = array_filter($match, create_function('$n', 'return $n;')); $n = 0; while(list($k, $v) = each($match)) { if($v) { break; } else { array_shift($match); $n++; continue; } } $h = $subexphandlers[$n]; $s = $reversemin[get_class($h)]; $e = $reversemax[get_class($h)]; $l = $e - $s + 1; # print('
');print_r($match);print(' -> '.get_class($h)); # print(" handler $n starts at $s and ends at $e"); # print('
'.htmlentities(wordwrap($data, 76, "\n", 1)).' | '.wiki_do_links($data).' |