http://www.mediawiki.org/wiki/Special:Code/MediaWiki/95953

Revision: 95953
Author:   catrope
Date:     2011-09-01 09:38:10 +0000 (Thu, 01 Sep 2011)
Log Message:
-----------
RL2: Add gadgetpagelist table and track .js and .css pages in it

* Rename existing hook functions for tracking stuff in the Gadget definition: 
namespace
* Add hook functions for tracking CSS/JS pages
* Add GadgetPageList class to interface with the gadgetpagelist table

Modified Paths:
--------------
    branches/RL2/extensions/Gadgets/GadgetHooks.php
    branches/RL2/extensions/Gadgets/Gadgets.php
    branches/RL2/extensions/Gadgets/sql/gadgets.sql

Added Paths:
-----------
    branches/RL2/extensions/Gadgets/backend/GadgetPageList.php
    branches/RL2/extensions/Gadgets/sql/patch-gadgetpagelist.sql

Modified: branches/RL2/extensions/Gadgets/GadgetHooks.php
===================================================================
--- branches/RL2/extensions/Gadgets/GadgetHooks.php     2011-09-01 09:27:26 UTC 
(rev 95952)
+++ branches/RL2/extensions/Gadgets/GadgetHooks.php     2011-09-01 09:38:10 UTC 
(rev 95953)
@@ -22,7 +22,7 @@
         * @param $reason String: Deletion summary
         * @param $id Int: Page ID
         */
-       public static function articleDeleteComplete( $article, $user, $reason, 
$id ) {
+       public static function gadgetDefinitionDelete( $article, $user, 
$reason, $id ) {
                // FIXME: AARGH, duplication, refactor this
                $title = $article->getTitle();
                $name = $title->getText();
@@ -52,7 +52,7 @@
         * @param $flags: Int: Bitmap of flags passed to WikiPage::doEdit()
         * @param $revision: Revision object for the new revision
         */
-       public static function articleSaveComplete( $article, $user, $text, 
$summary, $isMinor,
+       public static function gadgetDefinitionSave( $article, $user, $text, 
$summary, $isMinor,
                        $isWatch, $section, $flags, $revision )
        {
                $title = $article->getTitle();
@@ -80,8 +80,14 @@
                
                return true;
        }
-       
-       public static function articleUndelete( $title, $created, $comment ) {
+
+       /**
+        * ArticleUndelete hook handler
+        * @param $title Title object
+        * @param $created Bool: Whether this undeletion recreated the page
+        * @param $comment String: Undeletion summary
+        */
+       public static function gadgetDefinitionUndelete( $title, $created, 
$comment ) {
                // FIXME: AARGH, duplication, refactor this
                $name = $title->getText();
                // Check that the deletion is in the Gadget definition: 
namespace and that the name ends in .js
@@ -114,6 +120,74 @@
        }
 
        /**
+        * ArticleDeleteComplete hook handler.
+        * 
+        * @param $article Article
+        * @param $user User
+        * @param $reason String: Deletion summary
+        * @param $id Int: Page ID
+        */
+       public static function cssJsPageDelete( $article, $user, $reason, $id ) 
{
+               GadgetPageList::delete( $article->getTitle() );
+               return true;
+       }
+       
+       /**
+        * ArticleSaveComplete hook handler.
+        * 
+        * @param $article Article
+        * @param $user User
+        * @param $text String: New page text
+        * @param $summary String: Edit summary
+        * @param $isMinor Bool: Whether this was a minor edit
+        * @param $isWatch unused
+        * @param $section unused
+        * @param $flags: Int: Bitmap of flags passed to WikiPage::doEdit()
+        * @param $revision: Revision object for the new revision
+        */
+       public static function cssOrJsPageSave(  $article, $user, $text, 
$summary, $isMinor,
+                       $isWatch, $section, $flags, $revision )
+       {
+               $title = $article->getTitle();
+               if ( $title->isCssOrJsPage() || $title->isCssJsSubpage() ) {
+                       if ( $title->isRedirect() ) {
+                               GadgetPageList::delete( $title );
+                       } else {
+                               GadgetPageList::add( $title );
+                       }
+               }
+               return true;
+       }
+
+       /**
+        * ArticleUndelete hook handler
+        * @param $title Title object
+        * @param $created Bool: Whether this undeletion recreated the page
+        * @param $comment String: Undeletion summary
+        */
+       public static function cssOrJsPageUndelete( $title, $created, $comment 
) {
+               if ( ( $title->isCssOrJsPage() || $title->isCssJsSubpage() ) && 
!$title->isRedirect() ) {
+                       GadgetPageList::add( $title );
+               }
+               return true;
+       }
+
+       public static function cssOrJsPageMove( $oldTitle, $newTitle, $user, 
$pageid, $redirid ) {
+               // Delete the old title from the list. Even if it still exists 
after the move,
+               // it'll be a redirect and we don't want those in there
+               GadgetPageList::delete( $oldTitle );
+               
+               if ( $newTitle->isCssOrJsPage() || $newTitle->isCssJsSubpage() 
) {
+                       if ( $title->isRedirect() ) {
+                               GadgetPageList::delete( $newTitle );
+                       } else {
+                               GadgetPageList::add( $newTitle );
+                       }
+               }
+               return true;
+       }
+
+       /**
         * GetPreferences hook handler.
         * @param $user User
         * @param $preferences Array: Preference descriptions
@@ -233,6 +307,7 @@
        public static function loadExtensionSchemaUpdates( $updater ) {
                $dir = dirname( __FILE__ );
                $updater->addExtensionUpdate( array( 'addtable', 'gadgets', 
"$dir/sql/gadgets.sql", true ) );
+               $updater->addExtensionUpdate( array( 'addtable', 
'gadgetpagelist', "$dir/sql/patch-gadgetpagelist.sql", true ) );
                return true;
        }
 

Modified: branches/RL2/extensions/Gadgets/Gadgets.php
===================================================================
--- branches/RL2/extensions/Gadgets/Gadgets.php 2011-09-01 09:27:26 UTC (rev 
95952)
+++ branches/RL2/extensions/Gadgets/Gadgets.php 2011-09-01 09:38:10 UTC (rev 
95953)
@@ -92,9 +92,12 @@
        'gadgets-definition-delete'
 ) );
 
-$wgHooks['ArticleDeleteComplete'][]         = 
'GadgetHooks::articleDeleteComplete';
-$wgHooks['ArticleSaveComplete'][]           = 
'GadgetHooks::articleSaveComplete';
-$wgHooks['ArticleUndelete'][]               = 'GadgetHooks::articleUndelete';
+$wgHooks['ArticleDeleteComplete'][]         = 
'GadgetHooks::gadgetDefinitionDelete';
+$wgHooks['ArticleDeleteComplete'][]         = 'GadgetHooks::cssJsPageDelete';
+$wgHooks['ArticleSaveComplete'][]           = 
'GadgetHooks::gadgetDefinitionSave';
+$wgHooks['ArticleSaveComplete'][]           = 'GadgetHooks::cssOrJsPageSave';
+$wgHooks['ArticleUndelete'][]               = 
'GadgetHooks::gadgetDefinitionUndelete';
+$wgHooks['ArticleUndelete'][]               = 
'GadgetHooks::cssOrJsPageUndelete';
 $wgHooks['BeforePageDisplay'][]             = 'GadgetHooks::beforePageDisplay';
 $wgHooks['CanonicalNamespaces'][]           = 
'GadgetHooks::canonicalNamespaces';
 $wgHooks['GetPreferences'][]                = 'GadgetHooks::getPreferences';
@@ -102,6 +105,7 @@
 $wgHooks['ResourceLoaderRegisterModules'][] = 'GadgetHooks::registerModules';
 $wgHooks['TitleIsCssOrJsPage'][]            = 
'GadgetHooks::titleIsCssOrJsPage';
 $wgHooks['TitleIsMovable'][]                = 'GadgetHooks::titleIsMovable';
+$wgHooks['TitleMoveComplete'][]             = 'GadgetHooks::cssOrJsPageMove';
 $wgHooks['getUserPermissionsErrors'][]      = 
'GadgetHooks::getUserPermissionsErrors';
 #$wgHooks['UnitTestsList'][]                 = 'GadgetHooks::unitTestsList'; 
// FIXME: broken
 
@@ -116,6 +120,7 @@
 $wgAutoloadClasses['ForeignDBGadgetRepo'] = $dir . 
'backend/ForeignDBGadgetRepo.php';
 $wgAutoloadClasses['Gadget'] = $dir . 'backend/Gadget.php';
 $wgAutoloadClasses['GadgetHooks'] = $dir . 'GadgetHooks.php';
+$wgAutoloadClasses['GadgetPageList'] = $dir . 'backend/GadgetPageList.php';
 $wgAutoloadClasses['GadgetRepo'] = $dir . 'backend/GadgetRepo.php';
 $wgAutoloadClasses['GadgetResourceLoaderModule'] = $dir . 
'backend/GadgetResourceLoaderModule.php';
 $wgAutoloadClasses['LocalGadgetRepo'] = $dir . 'backend/LocalGadgetRepo.php';

Added: branches/RL2/extensions/Gadgets/backend/GadgetPageList.php
===================================================================
--- branches/RL2/extensions/Gadgets/backend/GadgetPageList.php                  
        (rev 0)
+++ branches/RL2/extensions/Gadgets/backend/GadgetPageList.php  2011-09-01 
09:38:10 UTC (rev 95953)
@@ -0,0 +1,56 @@
+<?php
+/**
+ * Gadgets extension - lets users select custom javascript gadgets
+ *
+ *
+ * For more info see http://mediawiki.org/wiki/Extension:Gadgets
+ *
+ * @file
+ * @ingroup Extensions
+ * @author Roan Kattouw
+ * @copyright © 2011 Roan Kattouw
+ * @license GNU General Public Licence 2.0 or later
+ */
+
+/**
+ * Class with static methods for accessing the gadgetpagelist table
+ */
+class GadgetPageList {
+       /**
+        * Determine the extension of a title ('css' or 'js')
+        * @param $title Title object
+        * @return string The extension of the title, or empty string
+        */
+       public static function determineExtension( $title ) {
+               $m = null;
+               preg_match( '!\.(css|js)$!u', $title->getText(), $m );
+               return isset( $m[1] ) ? $m[1] : '';
+       }
+       
+       /**
+        * Add a title to the gadgetpagelist table
+        * @param $title Title object
+        */
+       public static function add( $title ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->insert( 'gadgetpagelist', array(
+                               'gpl_extension' => self::determineExtension( 
$title ),
+                               'gpl_namespace' => $title->getNamespace(),
+                               'gpl_title' => $title->getPrefixedDBKey()
+                       ), __METHOD__, array( 'IGNORE' )
+               );
+       }
+       
+       /**
+        * Delete a title from the gadgetpagelist table
+        * @param $title Title object
+        */
+       public static function delete( $title ) {
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'gadgetpagelist', array(
+                               'gpl_namespace' => $title->getNamespace(),
+                               'gpl_title' => $title->getPrefixedDBKey()
+                       ), __METHOD__
+               );
+       }
+}


Property changes on: branches/RL2/extensions/Gadgets/backend/GadgetPageList.php
___________________________________________________________________
Added: svn:eol-style
   + native

Modified: branches/RL2/extensions/Gadgets/sql/gadgets.sql
===================================================================
--- branches/RL2/extensions/Gadgets/sql/gadgets.sql     2011-09-01 09:27:26 UTC 
(rev 95952)
+++ branches/RL2/extensions/Gadgets/sql/gadgets.sql     2011-09-01 09:38:10 UTC 
(rev 95953)
@@ -13,3 +13,16 @@
 
 CREATE INDEX /*i*/gd_shared_name ON /*_*/gadgets (gd_shared, gd_name);
 CREATE INDEX /*i*/gd_name_timestamp ON /*_*/gadgets (gd_name, gd_timestamp);
+
+-- Table tracking .js and .css pages to make efficient prefix searches by 
extension possible
+-- (used for AJAX autocompletion)
+CREATE TABLE /*_*/gadgetpagelist (
+       -- Extension of the page. Right now this can only be 'js' or 'css' but 
this may change in the future
+       gpl_extension varchar(32) NOT NULL,
+       -- Namespace
+       gpl_namespace int NOT NULL,
+       -- Page title
+       gpl_title varchar(255) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/gpl_namespace_title ON /*_*/gadgetpagelist 
(gpl_namespace, gpl_title);
+CREATE INDEX /*i*/gpl_extension_namespace_title ON /*_*/gadgetpagelist 
(gpl_extension, gpl_namespace, gpl_title);

Added: branches/RL2/extensions/Gadgets/sql/patch-gadgetpagelist.sql
===================================================================
--- branches/RL2/extensions/Gadgets/sql/patch-gadgetpagelist.sql                
                (rev 0)
+++ branches/RL2/extensions/Gadgets/sql/patch-gadgetpagelist.sql        
2011-09-01 09:38:10 UTC (rev 95953)
@@ -0,0 +1,7 @@
+CREATE TABLE /*_*/gadgetpagelist (
+       gpl_extension varchar(32) NOT NULL,
+       gpl_namespace int NOT NULL,
+       gpl_title varchar(255) NOT NULL
+) /*$wgDBTableOptions*/;
+CREATE UNIQUE INDEX /*i*/gpl_namespace_title ON /*_*/gadgetpagelist 
(gpl_namespace, gpl_title);
+CREATE INDEX /*i*/gpl_extension_namespace_title ON /*_*/gadgetpagelist 
(gpl_extension, gpl_namespace, gpl_title);


Property changes on: 
branches/RL2/extensions/Gadgets/sql/patch-gadgetpagelist.sql
___________________________________________________________________
Added: svn:eol-style
   + native


_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs

Reply via email to