X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FCategoryfinder.php;h=7c1c2856701dbd100a559b1530eec06f84dc6134;hb=246d7c081a7dd9b6b6c65bfd0377f62967dd8765;hp=7a9d4277d0ef6a056fbb2915358419004508144b;hpb=505149550405af739e670a2f51fed14b8921364a;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Categoryfinder.php b/includes/Categoryfinder.php index 7a9d4277d0..7c1c285670 100644 --- a/includes/Categoryfinder.php +++ b/includes/Categoryfinder.php @@ -7,8 +7,8 @@ * articles are in one or all of a given subset of categories. * * Example use : - * - * # Determines wether the article with the page_id 12345 is in both + * + * # Determines whether the article with the page_id 12345 is in both * # "Category 1" and "Category 2" or their subcategories, respectively * * $cf = new Categoryfinder ; @@ -19,7 +19,7 @@ * ) ; * $a = $cf->run() ; * print implode ( "," , $a ) ; - * + * * */ class Categoryfinder { @@ -35,7 +35,7 @@ class Categoryfinder { /** * Constructor (currently empty). - */ + */ function __construct() { } @@ -53,17 +53,19 @@ class Categoryfinder { # Set the list of target categories; convert them to DBKEY form first $this->targets = array () ; foreach ( $categories AS $c ) { - $ct = Title::newFromText ( $c , NS_CATEGORY ) ; - $c = $ct->getDBkey () ; - $this->targets[$c] = $c ; + $ct = Title::makeTitleSafe( NS_CATEGORY, $c ); + if( $ct ) { + $c = $ct->getDBkey(); + $this->targets[$c] = $c; + } } } /** * Iterates through the parent tree starting with the seed values, * then checks the articles if they match the conditions - @return array of page_ids (those given to seed() that match the conditions) - */ + * @return array of page_ids (those given to seed() that match the conditions) + */ function run () { $this->dbr = wfGetDB( DB_SLAVE ); while ( count ( $this->next ) > 0 ) { @@ -84,11 +86,17 @@ class Categoryfinder { /** * This functions recurses through the parent representation, trying to match the conditions - @param $id The article/category to check - @param $conds The array of categories to match - @return bool Does this match the conditions? - */ - function check ( $id , &$conds ) { + * @param $id The article/category to check + * @param $conds The array of categories to match + * @param $path used to check for recursion loops + * @return bool Does this match the conditions? + */ + function check ( $id , &$conds, $path=array() ) { + // Check for loops and stop! + if( in_array( $id, $path ) ) + return false; + $path[] = $id; + # Shortcut (runtime paranoia): No contitions=all matched if ( count ( $conds ) == 0 ) return true ; @@ -120,7 +128,7 @@ class Categoryfinder { # No sub-parent continue ; } - $done = $this->check ( $this->name2id[$pname] , $conds ) ; + $done = $this->check ( $this->name2id[$pname] , $conds, $path ); if ( $done OR count ( $conds ) == 0 ) { # Subparents have done it! return true ; @@ -131,7 +139,7 @@ class Categoryfinder { /** * Scans a "parent layer" of the articles/categories in $this->next - */ + */ function scan_next_layer () { $fname = "Categoryfinder::scan_next_layer" ; @@ -188,5 +196,3 @@ class Categoryfinder { } } # END OF CLASS "Categoryfinder" - -?>