diff options
Diffstat (limited to 'inc/fulltext.php')
-rw-r--r-- | inc/fulltext.php | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/inc/fulltext.php b/inc/fulltext.php index b10cbde8e..a0be280bf 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -153,6 +153,56 @@ function ft_backlinks($id){ } /** + * Returns the pages that use a given media file + * + * Does a quick lookup with the fulltext index, then + * evaluates the instructions of the found pages + * + * Aborts after $max found results + */ +function ft_mediause($id,$max){ + global $conf; + $swfile = DOKU_INC.'inc/lang/'.$conf['lang'].'/stopwords.txt'; + $stopwords = @file_exists($swfile) ? file($swfile) : array(); + + if(!$max) $max = 1; // need to find at least one + + $result = array(); + + // quick lookup of the mediafile + $media = noNS($id); + $matches = idx_lookup(idx_tokenizer($media,$stopwords)); + $docs = array_keys(ft_resultCombine(array_values($matches))); + if(!count($docs)) return $result; + + // go through all found pages + $found = 0; + $pcre = preg_quote($media,'/'); + foreach($docs as $doc){ + $ns = getNS($doc); + preg_match_all('/\{\{([^|}]*'.$pcre.'[^|}]*)(|[^}]+)?\}\}/i',rawWiki($doc),$matches); + foreach($matches[1] as $img){ + $img = trim($img); + if(preg_match('/^https?:\/\//i',$img)) continue; // skip external images + list($img) = explode('?',$img); // remove any parameters + resolve_mediaid($ns,$img,$exists); // resolve the possibly relative img + + if($img == $id){ // we have a match + $result[] = $doc; + $found++; + break; + } + } + if($found >= $max) break; + } + + sort($result); + return $result; +} + + + +/** * Quicksearch for pagenames * * By default it only matches the pagename and ignores the |