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