summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/Cite/CiteHooks.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/Cite/CiteHooks.php')
-rw-r--r--www/wiki/extensions/Cite/CiteHooks.php245
1 files changed, 245 insertions, 0 deletions
diff --git a/www/wiki/extensions/Cite/CiteHooks.php b/www/wiki/extensions/Cite/CiteHooks.php
new file mode 100644
index 00000000..91f0eb33
--- /dev/null
+++ b/www/wiki/extensions/Cite/CiteHooks.php
@@ -0,0 +1,245 @@
+<?php
+/**
+ * Cite extension hooks
+ *
+ * @file
+ * @ingroup Extensions
+ * @copyright 2011-2016 Cite VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see MIT-LICENSE.txt
+ */
+
+class CiteHooks {
+ /**
+ * Convert the content model of a message that is actually JSON to JSON. This
+ * only affects validation and UI when saving and editing, not loading the
+ * content.
+ *
+ * @param Title $title
+ * @param string $model
+ * @return bool
+ */
+ public static function onContentHandlerDefaultModelFor( Title $title, &$model ) {
+ if (
+ $title->inNamespace( NS_MEDIAWIKI ) &&
+ $title->getText() == 'Visualeditor-cite-tool-definition.json'
+ ) {
+ $model = CONTENT_MODEL_JSON;
+ }
+
+ return true;
+ }
+
+ /**
+ * Conditionally register the unit testing module for the ext.cite.visualEditor module
+ * only if that module is loaded
+ *
+ * @param array $testModules The array of registered test modules
+ * @param ResourceLoader $resourceLoader The reference to the resource loader
+ * @return true
+ */
+ public static function onResourceLoaderTestModules(
+ array &$testModules,
+ ResourceLoader &$resourceLoader
+ ) {
+ $resourceModules = $resourceLoader->getConfig()->get( 'ResourceModules' );
+
+ if (
+ isset( $resourceModules[ 'ext.visualEditor.mediawiki' ] ) ||
+ $resourceLoader->isModuleRegistered( 'ext.visualEditor.mediawiki' )
+ ) {
+ $testModules['qunit']['ext.cite.visualEditor.test'] = array(
+ 'scripts' => array(
+ 'modules/ve-cite/tests/ve.dm.citeExample.js',
+ 'modules/ve-cite/tests/ve.dm.Converter.test.js',
+ 'modules/ve-cite/tests/ve.dm.InternalList.test.js',
+ 'modules/ve-cite/tests/ve.dm.Transaction.test.js',
+ ),
+ 'dependencies' => array(
+ 'ext.cite.visualEditor',
+ 'ext.visualEditor.test'
+ ),
+ 'localBasePath' => __DIR__,
+ 'remoteExtPath' => 'Cite',
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Conditionally register resource loader modules that depends on the
+ * VisualEditor MediaWiki extension.
+ *
+ * @param $resourceLoader
+ * @return true
+ */
+ public static function onResourceLoaderRegisterModules( &$resourceLoader ) {
+
+ if ( ! class_exists( 'VisualEditorHooks' ) ) {
+ return true;
+ }
+
+ $dir = __DIR__ . DIRECTORY_SEPARATOR;
+
+ $resourceLoader->register( "ext.cite.visualEditor.core", [
+ 'localBasePath' => $dir . 'modules',
+ 'remoteExtPath' => 'Cite/modules',
+ "scripts" => [
+ "ve-cite/ve.dm.MWReferenceModel.js",
+ "ve-cite/ve.dm.MWReferencesListNode.js",
+ "ve-cite/ve.dm.MWReferenceNode.js",
+ "ve-cite/ve.ce.MWReferencesListNode.js",
+ "ve-cite/ve.ce.MWReferenceNode.js",
+ "ve-cite/ve.ui.MWReferencesListCommand.js"
+ ],
+ "styles" => [
+ "ve-cite/ve.ce.MWReferencesListNode.css",
+ "ve-cite/ve.ce.MWReferenceNode.css"
+ ],
+ "dependencies" => [
+ "ext.visualEditor.mwcore"
+ ],
+ "messages" => [
+ "cite-ve-referenceslist-isempty",
+ "cite-ve-referenceslist-isempty-default",
+ "cite-ve-referenceslist-missingref"
+ ],
+ "targets" => [
+ "desktop",
+ "mobile"
+ ]
+ ] );
+
+ $resourceLoader->register( "ext.cite.visualEditor.data",
+ [ "class" => "CiteDataModule" ] );
+
+ $resourceLoader->register( "ext.cite.visualEditor", [
+ 'localBasePath' => $dir . 'modules',
+ 'remoteExtPath' => 'Cite/modules',
+ "scripts" => [
+ "ve-cite/ve.ui.MWReferenceGroupInputWidget.js",
+ "ve-cite/ve.ui.MWReferenceSearchWidget.js",
+ "ve-cite/ve.ui.MWReferenceResultWidget.js",
+ "ve-cite/ve.ui.MWUseExistingReferenceCommand.js",
+ "ve-cite/ve.ui.MWCitationDialog.js",
+ "ve-cite/ve.ui.MWReferencesListDialog.js",
+ "ve-cite/ve.ui.MWReferenceDialog.js",
+ "ve-cite/ve.ui.MWReferenceDialogTool.js",
+ "ve-cite/ve.ui.MWCitationDialogTool.js",
+ "ve-cite/ve.ui.MWReferenceContextItem.js",
+ "ve-cite/ve.ui.MWReferencesListContextItem.js",
+ "ve-cite/ve.ui.MWCitationContextItem.js",
+ "ve-cite/ve.ui.MWCitationAction.js",
+ "ve-cite/ve.ui.MWReference.init.js"
+ ],
+ "styles" => [
+ "ve-cite/ve.ui.MWReferenceContextItem.css",
+ "ve-cite/ve.ui.MWReferenceGroupInputWidget.css",
+ "ve-cite/ve.ui.MWReferenceIcons.css",
+ "ve-cite/ve.ui.MWReferenceResultWidget.css",
+ "ve-cite/ve.ui.MWReferenceSearchWidget.css"
+ ],
+ "dependencies" => [
+ "ext.cite.visualEditor.core",
+ "ext.cite.visualEditor.data",
+ "ext.cite.style",
+ "ext.visualEditor.mwtransclusion",
+ "ext.visualEditor.mediawiki"
+ ],
+ "messages" => [
+ "cite-ve-dialog-reference-editing-reused",
+ "cite-ve-dialog-reference-options-group-label",
+ "cite-ve-dialog-reference-options-group-placeholder",
+ "cite-ve-dialog-reference-options-name-label",
+ "cite-ve-dialog-reference-options-section",
+ "cite-ve-dialog-reference-title",
+ "cite-ve-dialog-reference-useexisting-full-label",
+ "cite-ve-dialog-reference-useexisting-label",
+ "cite-ve-dialog-reference-useexisting-tool",
+ "cite-ve-dialog-referenceslist-contextitem-description-general",
+ "cite-ve-dialog-referenceslist-contextitem-description-named",
+ "cite-ve-dialog-referenceslist-title",
+ "cite-ve-dialogbutton-citation-educationpopup-title",
+ "cite-ve-dialogbutton-citation-educationpopup-text",
+ "cite-ve-dialogbutton-reference-full-label",
+ "cite-ve-dialogbutton-reference-tooltip",
+ "cite-ve-dialogbutton-reference-title",
+ "cite-ve-dialogbutton-referenceslist-tooltip",
+ "cite-ve-reference-input-placeholder",
+ "cite-ve-toolbar-group-label"
+ ],
+ "targets" => [
+ "desktop",
+ "mobile"
+ ]
+ ] );
+ return true;
+ }
+
+ /**
+ * Callback for LinksUpdate hook
+ * Post-output processing of references property, for proper db storage
+ * Deferred to avoid performance overhead when outputting the page
+ *
+ * @param LinksUpdate $linksUpdate
+ */
+ public static function onLinksUpdate( LinksUpdate &$linksUpdate ) {
+ global $wgCiteStoreReferencesData, $wgCiteCacheRawReferencesOnParse;
+ if ( !$wgCiteStoreReferencesData ) {
+ return;
+ }
+ $refData = $linksUpdate->getParserOutput()->getExtensionData( Cite::EXT_DATA_KEY );
+ if ( $refData === null ) {
+ return;
+ }
+ if ( $wgCiteCacheRawReferencesOnParse ) {
+ // caching
+ $cache = ObjectCache::getMainWANInstance();
+ $articleID = $linksUpdate->getTitle()->getArticleID();
+ $key = $cache->makeKey( Cite::EXT_DATA_KEY, $articleID );
+ $cache->set( $key, $refData, Cite::CACHE_DURATION_ONPARSE );
+ }
+ // JSON encode
+ $ppValue = FormatJson::encode( $refData, false, FormatJson::ALL_OK );
+ // GZIP encode references data at maximum compression
+ $ppValue = gzencode( $ppValue, 9 );
+ // split the string in smaller parts that can fit into a db blob
+ $ppValues = str_split( $ppValue, Cite::MAX_STORAGE_LENGTH );
+ foreach ( $ppValues as $num => $ppValue ) {
+ $key = 'references-' . intval( $num + 1 );
+ $linksUpdate->mProperties[$key] = $ppValue;
+ }
+ $linksUpdate->getParserOutput()->setExtensionData( Cite::EXT_DATA_KEY, null );
+ }
+
+ /**
+ * Callback for LinksUpdateComplete hook
+ * If $wgCiteCacheRawReferencesOnParse is set to false, purges the cache
+ * when references are modified
+ *
+ * @param LinksUpdate $linksUpdate
+ */
+ public static function onLinksUpdateComplete( LinksUpdate &$linksUpdate ) {
+ global $wgCiteStoreReferencesData, $wgCiteCacheRawReferencesOnParse;
+ if ( !$wgCiteStoreReferencesData || $wgCiteCacheRawReferencesOnParse ) {
+ return;
+ }
+ // if we can, avoid clearing the cache when references were not changed
+ if ( method_exists( $linksUpdate, 'getAddedProperties' )
+ && method_exists( $linksUpdate, 'getRemovedProperties' )
+ ) {
+ $addedProps = $linksUpdate->getAddedProperties();
+ $removedProps = $linksUpdate->getRemovedProperties();
+ if ( !isset( $addedProps['references-1'] )
+ && !isset( $removedProps['references-1'] )
+ ) {
+ return;
+ }
+ }
+ $cache = ObjectCache::getMainWANInstance();
+ $articleID = $linksUpdate->getTitle()->getArticleID();
+ $key = $cache->makeKey( Cite::EXT_DATA_KEY, $articleID );
+ // delete with reduced hold off period (LinksUpdate uses a master connection)
+ $cache->delete( $key, WANObjectCache::MAX_COMMIT_DELAY );
+ }
+}