mediawiki-extensions-Visual.../VisualEditor.hooks.php
Roan Kattouw 92c38eab85 The great directory split of 2013
Move all MW-specific files into the ve-mw directory, in preparation
for moving them out into a separate repo.

All MW-specific files were moved into a parallel directory structure
in modules/ve-mw . Files with both generic and MW-specific things were
split up. Files in ve/init/mw/ were moved to ve-mw/init/ rather than
ve-mw/init/mw ; they're still named ve.init.mw.* but we should change
that. Some of the test files for core classes had MW-specific test cases,
so those were split up and the test runner was duplicated; we should
refactor our tests to use data providers so we can add cases more easily.

Split files:
* ve.ce.Node.css
* ve.ce.ContentBranchNode.test.js (MWEntityNode)
* ve.ce.Document.test.js (some core test cases genericized)
* ve.dm.InternalList.test.js (uses mwReference test document)
* ve.dm.SurfaceFragment.test.js, ve.ui.FormatAction.test.js
** Made core tests use heading instead of mwHeading
** Updated core tests because normal headings don't break out of lists
** Moved test runners into ve.test.utils.js
* ve.ui.Icons-*.css
* ve.ui.Dialog.css (MW parts into ve.ui.MWDialog.css)
* ve.ui.Tool.css
* ve.ui.Widget.css (move ve-ui-rtl and ve-ui-ltr to ve.ui.css)

ve.dm.Converter.test.js: Moved runner functions into ve.test.utils.js

ve.dm.example.js:
* Refactored createExampleDocument so mwExample can use it
* Removed wgExtensionAssetsPath detection, moved into mw-preload.js
* Genericized withMeta example document (original version copied to mwExample)
* Moved references example document to mwExample

ve.dm.mwExample.js:
* Move withMeta and references example documents from ve.dm.example.js
* Add createExampleDocument function

ve-mw/test/index.php: Runner for MW-specific tests only

ve-mw/test/mw-preload.js: Sets VE_TESTDIR for Special:JavaScriptTest only

ve.ui.Window.js:
* Remove magic path interpolation in addLocalStyleSheets()
* Pass full(er) paths to addLocalStyleSheets(), here and in subclasses

ve.ui.MWDialog.js: Subclass of Dialog that adds MW versions of stylesheets

ve.ui.MW*Dialog.js:
* Subclass MWDialog rather than Dialog
* Load both core and MW versions of stylesheets that have both

ve.ui.PagedDialog.js: Converted to a mixin rather than an abstract base class
* Don't inherit ve.ui.Dialog
* Rather than overriding initialize(), provide initializePages() which the
  host class is supposed to call from its initialize()
* Rename onOutlineSelect to onPageOutlineSelect

ve.ui.MWMetaDialog.js, ve.ui.MWTransclusionDialog.js:
* Use PagedDialog as a mixin rather than a base class, inherit MWDialog

bullet-icon.png: Unused, deleted

Stuff we should do later:
* Refactor tests to use data providers
* Write utility function for SVG compat check
* Separate omnibus CSS files such as ve.ui.Widget.css
* Separate omnibus RL modules
* Use icon classes in ViewPageTarget

Change-Id: I1b28f8ba7f2d2513e5c634927a854686fb9dd5a5
2013-07-02 20:51:38 -07:00

258 lines
8.3 KiB
PHP

<?php
/**
* VisualEditor extension hooks
*
* @file
* @ingroup Extensions
* @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
* @license The MIT License (MIT); see LICENSE.txt
*/
class VisualEditorHooks {
/** List of skins VisualEditor integration supports */
protected static $supportedSkins = array( 'vector', 'apex', 'monobook' );
public static function onSetup() {
global $wgVisualEditorEnableEventLogging, $wgResourceModules,
$wgVisualEditorEnableGenderSurvey;
if ( $wgVisualEditorEnableEventLogging ) {
if ( class_exists( 'ResourceLoaderSchemaModule' ) ) {
// EventLogging schema module for logging edit events.
// See <http://meta.wikimedia.org/wiki/Schema:Edit>
$wgResourceModules['schema.Edit'] = array(
'class' => 'ResourceLoaderSchemaModule',
'schema' => 'Edit',
'revision' => 5570274,
);
if ( $wgVisualEditorEnableGenderSurvey ) {
$wgResourceModules['schema.GenderSurvey'] = array(
'class' => 'ResourceLoaderSchemaModule',
'schema' => 'GenderSurvey',
'revision' => 5607845,
);
}
} else {
wfWarn( 'VisualEditor is configured to use EventLogging, but the extension is ' .
' not available. Disabling wgVisualEditorEnableEventLogging.' );
$wgVisualEditorEnableEventLogging = false;
}
}
}
/**
* Adds VisualEditor JS to the output if in the correct namespace.
*
* This is attached to the MediaWiki 'BeforePageDisplay' hook.
*
* @param $output OutputPage
* @param $skin Skin
*/
public static function onBeforePageDisplay( &$output, &$skin ) {
global $wgVisualEditorNamespaces, $wgVisualEditorEnableEventLogging,
$wgVisualEditorDisableForAnons;
if (
// Bug 50000: Allow disabling for anonymous users separately from changing
// the default preference
!( $wgVisualEditorDisableForAnons && $skin->getUser()->isAnon() ) &&
// Bug 47328: Disable on redirect pages until redirects are editable
!$skin->getTitle()->isRedirect() &&
// User has the 'visualeditor-enable' preference set
$skin->getUser()->getOption(
'visualeditor-enable',
/*default=*/ false,
// HACK: Allows us to suppress the option in preferences when it's on for all.
/*ignoreHidden=*/ true
) &&
// The user's current skin is supported
in_array( $skin->getSkinName(), self::$supportedSkins ) &&
(
// Article in the VisualEditor namespace
in_array( $skin->getTitle()->getNamespace(), $wgVisualEditorNamespaces ) ||
// Special page action for an article in the VisualEditor namespace
in_array( $skin->getRelevantTitle()->getNamespace(), $wgVisualEditorNamespaces )
) &&
// Only use VisualEditor if the page is wikitext, not CSS/JS
$skin->getTitle()->getContentModel() === CONTENT_MODEL_WIKITEXT
) {
if ( $wgVisualEditorEnableEventLogging ) {
$output->addModules( array( 'schema.Edit' ) );
}
$output->addModules( array( 'ext.visualEditor.viewPageTarget' ) );
} else {
if ( $wgVisualEditorEnableEventLogging ) {
$output->addModules( array( 'schema.Edit', 'ext.visualEditor.splitTest' ) );
}
}
return true;
}
// Temporary survey in conjuction with split test (bug 49604)
// To be removed once no longer needed.
// Depends on GuidedTour and EventLogging
public static function onBeforeWelcomeCreation( &$welcomeCreationMsg, &$injectHtml ) {
global $wgOut, $wgVisualEditorEnableGenderSurvey;
if ( $wgVisualEditorEnableGenderSurvey ) {
$wgOut->addModules( array(
'ext.guidedTour.lib',
'ext.guidedTour.tour.vegendersurvey',
'ext.visualEditor.genderSurvey'
) );
}
return true;
}
public static function onGetPreferences( $user, &$preferences ) {
$preferences['visualeditor-enable'] = array(
'type' => 'toggle',
'label-message' => 'visualeditor-preference-enable',
'section' => 'editing/beta'
);
return true;
}
public static function onListDefinedTags( &$tags ) {
$tags[] = 'visualeditor';
$tags[] = 'visualeditor-needcheck';
return true;
}
/**
* Adds extra variables to the page config.
*/
public static function onMakeGlobalVariablesScript( array &$vars, OutputPage $out ) {
global $wgStylePath, $wgContLang;
$vars['wgVisualEditor'] = array(
'isPageWatched' => $out->getUser()->isWatched( $out->getTitle() ),
'pageLanguageCode' => $out->getTitle()->getPageLanguage()->getHtmlCode(),
'pageLanguageDir' => $out->getTitle()->getPageLanguage()->getDir(),
// Same as in Linker.php
'magnifyClipIconURL' => $wgStylePath .
'/common/images/magnify-clip' .
( $wgContLang->isRTL() ? '-rtl' : '' ) . '.png'
);
return true;
}
/**
* Adds extra variables to the global config
*/
public static function onResourceLoaderGetConfigVars( array &$vars ) {
global $wgVisualEditorEnableEventLogging,
$wgVisualEditorEnableExperimentalCode, $wgVisualEditorTabLayout;
$vars['wgVisualEditorConfig'] = array(
'enableExperimentalCode' => $wgVisualEditorEnableExperimentalCode,
'enableEventLogging' => $wgVisualEditorEnableEventLogging,
'tabLayout' => $wgVisualEditorTabLayout,
);
return true;
}
public static function onResourceLoaderTestModules(
array &$testModules,
ResourceLoader &$resourceLoader
) {
$testModules['qunit']['ext.visualEditor.test'] = array(
'scripts' => array(
// MW config preload
've-mw/test/mw-preload.js',
// QUnit plugin
've/test/ve.qunit.js',
// VisualEditor Tests
've/test/ve.test.utils.js',
've/test/ve.test.js',
've/test/ve.Document.test.js',
've/test/ve.Element.test.js',
've/test/ve.Node.test.js',
've/test/ve.BranchNode.test.js',
've/test/ve.LeafNode.test.js',
've/test/ve.Factory.test.js',
// VisualEditor DataModel Tests
've/test/dm/ve.dm.example.js',
've/test/dm/ve.dm.AnnotationSet.test.js',
've/test/dm/ve.dm.NodeFactory.test.js',
've/test/dm/ve.dm.Node.test.js',
've/test/dm/ve.dm.Converter.test.js',
've/test/dm/ve.dm.BranchNode.test.js',
've/test/dm/ve.dm.LeafNode.test.js',
've/test/dm/ve.dm.LinearData.test.js',
've/test/dm/nodes/ve.dm.TextNode.test.js',
've-mw/test/dm/nodes/ve.dm.MWTransclusionNode.test.js',
've/test/dm/ve.dm.Document.test.js',
've/test/dm/ve.dm.DocumentSynchronizer.test.js',
've/test/dm/ve.dm.IndexValueStore.test.js',
've/test/dm/ve.dm.InternalList.test.js',
've/test/dm/ve.dm.Transaction.test.js',
've/test/dm/ve.dm.TransactionProcessor.test.js',
've/test/dm/ve.dm.Surface.test.js',
've/test/dm/ve.dm.SurfaceFragment.test.js',
've/test/dm/ve.dm.ModelRegistry.test.js',
've/test/dm/ve.dm.MetaList.test.js',
've/test/dm/ve.dm.Model.test.js',
've/test/dm/lineardata/ve.dm.ElementLinearData.test.js',
've/test/dm/lineardata/ve.dm.MetaLinearData.test.js',
've-mw/test/dm/ve.dm.mwExample.js',
've-mw/test/dm/ve.dm.MWConverter.test.js',
// VisualEditor ContentEditable Tests
've/test/ce/ve.ce.test.js',
've/test/ce/ve.ce.Document.test.js',
've/test/ce/ve.ce.NodeFactory.test.js',
've/test/ce/ve.ce.Node.test.js',
've/test/ce/ve.ce.BranchNode.test.js',
've/test/ce/ve.ce.ContentBranchNode.test.js',
've/test/ce/ve.ce.LeafNode.test.js',
've/test/ce/nodes/ve.ce.TextNode.test.js',
// VisualEditor Actions Tests
've/test/ui/actions/ve.ui.FormatAction.test.js',
've/test/ui/actions/ve.ui.IndentationAction.test.js',
've/test/ui/actions/ve.ui.ListAction.test.js',
// VisualEditor initialization Tests
've/test/init/ve.init.Platform.test.js',
've-mw/test/init/targets/ve.init.mw.ViewPageTarget.test.js',
),
'dependencies' => array(
'ext.visualEditor.standalone',
'ext.visualEditor.core',
'ext.visualEditor.experimental',
'ext.visualEditor.viewPageTarget',
),
'localBasePath' => dirname( __FILE__ ) . '/modules',
'remoteExtPath' => 'VisualEditor/modules',
);
return true;
}
/**
* Sets user preference to enable the VisualEditor account if their new
* account's userID is even, if $wgVisualEditorEnableSplitTest is true.
*
* Added per bug 49604; to be removed once no longer needed.
*/
public static function onAddNewAccount( $user, $byEmail ) {
global $wgVisualEditorEnableSplitTest;
if ( $wgVisualEditorEnableSplitTest &&
$user->isLoggedin() &&
( ( $user->getId() % 2 ) === 0 ) ) {
$user->setOption( 'visualeditor-enable', 1 );
$user->saveSettings();
}
return true;
}
}