'WikiFilePage' => 'includes/WikiFilePage.php',
'WikiImporter' => 'includes/Import.php',
'WikiPage' => 'includes/WikiPage.php',
+ 'WikiPageFactory' => 'includes/WikiPageFactory.php',
'WikiRevision' => 'includes/Import.php',
'WikiMap' => 'includes/WikiMap.php',
'WikiReference' => 'includes/WikiMap.php',
--- /dev/null
+<?php
+/**
+ * Factory class for classes representing a MediaWiki article and history.
+ */
+class WikiPageFactory {
+ /**
+ * Create an WikiPage object of the appropriate class for the given title.
+ *
+ * @param $title Title
+ * @return WikiPage object
+ */
+ public static function newFromTitle( Title $title ) {
+ switch( $title->getNamespace() ) {
+ case NS_MEDIA:
+ throw new MWException( "NS_MEDIA is a virtual namespace" );
+ case NS_FILE:
+ $page = new WikiFilePage( $title );
+ break;
+ case NS_CATEGORY:
+ $page = new WikiCategoryPage( $title );
+ break;
+ default:
+ $page = new WikiPage( $title );
+ }
+
+ return $page;
+ }
+}
"Article static functions" );
}
+ function testWikiPageFactory() {
+ $title = Title::makeTitle( NS_FILE, 'Someimage.png' );
+ $page = WikiPageFactory::newFromTitle( $title );
+ $this->assertEquals( 'WikiFilePage', get_class( $page ) );
+
+ $title = Title::makeTitle( NS_CATEGORY, 'SomeCategory' );
+ $page = WikiPageFactory::newFromTitle( $title );
+ $this->assertEquals( 'WikiCategoryPage', get_class( $page ) );
+
+ $title = Title::makeTitle( NS_MAIN, 'SomePage' );
+ $page = WikiPageFactory::newFromTitle( $title );
+ $this->assertEquals( 'WikiPage', get_class( $page ) );
+ }
}