Phuedx has uploaded a new change for review.
https://gerrit.wikimedia.org/r/266249
Change subject: [WIP] Load references only when necessary
......................................................................
[WIP] Load references only when necessary
Bug: T123290
Change-Id: I8e9d50a286f0230af289233ddf97645d3789ec82
---
M MobileFrontend.php
M includes/config/Legacy.php
A includes/references/CiteReferencesParser.php
A includes/references/Hooks.php
A includes/references/ReferencesService.php
A includes/references/api/ApiMFReferences.php
M resources/mobile.references/references.js
7 files changed, 197 insertions(+), 10 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/MobileFrontend
refs/changes/49/266249/1
diff --git a/MobileFrontend.php b/MobileFrontend.php
index 8d0dafb..408a7fd 100644
--- a/MobileFrontend.php
+++ b/MobileFrontend.php
@@ -97,6 +97,11 @@
'MobileFrontend\MenuBuilder' => 'MenuBuilder',
'MobileFrontend\MenuEntry' => 'MenuBuilder',
+
+ 'MobileFrontend\\References\\Hooks' => 'references/Hooks',
+ 'MobileFrontend\\References\\CiteReferencesParser' =>
'references/CiteReferencesParser',
+ 'MobileFrontend\\References\\ReferencesService' =>
'references/ReferencesService',
+ 'MobileFrontend\\References\\Api\\ApiMFReferences' =>
'references/api/ApiMFReferences',
);
foreach ( $autoloadClasses as $className => $classFilename ) {
@@ -104,6 +109,8 @@
}
$wgAPIModules['mobileview'] = 'ApiMobileView';
+
+$wgAPIPropModules['mfreferences'] =
'MobileFrontend\\References\\Api\\ApiMFReferences';
$wgHooks['APIGetAllowedParams'][] = 'ApiParseExtender::onAPIGetAllowedParams';
$wgHooks['APIAfterExecute'][] = 'ApiParseExtender::onAPIAfterExecute';
@@ -154,6 +161,7 @@
$wgHooks['AfterBuildFeedLinks'][] =
'MobileFrontendHooks::onAfterBuildFeedLinks';
$wgHooks['MakeGlobalVariablesScript'][] =
'MobileFrontendHooks::onMakeGlobalVariablesScript';
$wgHooks['TitleSquidURLs'][] = 'MobileFrontendHooks::onTitleSquidURLs';
+$wgHooks['ParserAfterParse'][] =
'MobileFrontend\References\Hooks::onParserAfterParse';
$wgSpecialPages += array(
'History' => 'SpecialMobileHistory',
diff --git a/includes/config/Legacy.php b/includes/config/Legacy.php
index 4e40859..c9782e4 100644
--- a/includes/config/Legacy.php
+++ b/includes/config/Legacy.php
@@ -42,7 +42,9 @@
// These rules will be used for all transformations
'base' => array(),
// HTML view
- 'HTML' => array(),
+ 'HTML' => array(
+ '.references'
+ ),
);
/**
diff --git a/includes/references/CiteReferencesParser.php
b/includes/references/CiteReferencesParser.php
new file mode 100644
index 0000000..34c5d1b
--- /dev/null
+++ b/includes/references/CiteReferencesParser.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace MobileFrontend\References;
+
+use Cite;
+
+class CiteReferencesParser
+{
+ public function parse($citeReferences) {
+ if (!$citeReferences) {
+ return array();
+ }
+
+ $result = array();
+
+ foreach ( $citeReferences as $group => $references ) {
+ foreach ( $references as $name => $reference ) {
+ $key = $this->createKey( $reference, $name );
+ $result[$key] = $reference['text'];
+ }
+ }
+
+ return $result;
+ }
+
+ private function createKey( $reference, $key ) {
+ if ( $reference['count'] < 0 ) {
+ return Cite::referencesKey( $reference['key'] );
+ }
+
+ return Cite::referencesKey( $key . '-' . $reference['key'] );
+ }
+}
diff --git a/includes/references/Hooks.php b/includes/references/Hooks.php
new file mode 100644
index 0000000..a0ff5fd
--- /dev/null
+++ b/includes/references/Hooks.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace MobileFrontend\References;
+
+use Parser;
+use MobileFrontend\References\CiteReferencesParser;
+use MobileFrontend\References\ReferencesService;
+
+class Hooks {
+ public static function onParserAfterParse(Parser $parser) {
+ global $wgMemc;
+
+ $citeReferences = $parser->extCite->mRefs;
+
+ if ( !$parser->extCite->mRefs ) {
+ return true;
+ }
+
+ $referencesParser = new CiteReferencesParser();
+ $references = $referencesParser->parse( $citeReferences );
+
+ $referencesService = new ReferencesService( $wgMemc );
+ $referencesService->setReferences( $parser->Title(),
$references );
+
+ return true;
+ }
+}
diff --git a/includes/references/ReferencesService.php
b/includes/references/ReferencesService.php
new file mode 100644
index 0000000..86637f9
--- /dev/null
+++ b/includes/references/ReferencesService.php
@@ -0,0 +1,40 @@
+<?php
+
+namespace MobileFrontend\References;
+
+use Title;
+use BagOStuff;
+
+class ReferencesService
+{
+ private static $CACHE_LIFETIME = 86400;
+
+ private $cache;
+
+ public function __construct( BagOStuff $cache ) {
+ $this->cache = $cache;
+ }
+
+ public function setReferences( Title $title, $references ) {
+ $key = $this->createCacheKey( $title );
+
+ return $this->cache->set( $key, $references,
self::$CACHE_LIFETIME );
+ }
+
+ public function getReferences( Title $title ) {
+ $key = $this->createCacheKey( $title );
+
+ return $this->cache->get( $key );
+ }
+
+ public function hasReferences( Title $title ) {
+ return $this->getReferences( $title ) === null;
+ }
+
+ private function createCacheKey( Title $title ) {
+ return wfMemcKey(
+ 'MobileFrontend\\References\\ReferencesService',
+ $title->getArticleID()
+ );
+ }
+}
diff --git a/includes/references/api/ApiMFReferences.php
b/includes/references/api/ApiMFReferences.php
new file mode 100644
index 0000000..9b099b5
--- /dev/null
+++ b/includes/references/api/ApiMFReferences.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace MobileFrontend\References\Api;
+
+use ApiQueryBase;
+use ApiQuery;
+use MobileFrontend\References\ReferencesService;
+
+class ApiMFReferences extends ApiQueryBase
+{
+ private $referencesService;
+
+ public function __construct(
+ ApiQuery $query,
+ $moduleName,
+ ReferencesService $referencesService = null
+ ) {
+ global $wgMemc;
+
+ parent::__construct( $query, $moduleName, 'mfr' );
+
+ $this->referencesService = $referencesService ?: new
ReferencesService( $wgMemc );
+ }
+
+ public function execute() {
+ $titles = $this->getPageSet()->getGoodTitles();
+ $result = $this->getResult();
+
+ foreach ( $titles as $title ) {
+ $references = $this->referencesService->getReferences(
$title );
+
+ if ( $references !== null ) {
+ $result->addValue(
+ array( 'query', 'pages' ),
+ $title->getArticleID(),
+ array(
+ 'mfreferences' => $references
+ )
+ );
+ }
+ }
+ }
+}
diff --git a/resources/mobile.references/references.js
b/resources/mobile.references/references.js
index 371c865..0b8eec1 100644
--- a/resources/mobile.references/references.js
+++ b/resources/mobile.references/references.js
@@ -1,5 +1,30 @@
( function ( M, $ ) {
- var ReferencesDrawer, drawer;
+ var ReferencesDrawer,
+ drawer,
+ references,
+ api = new mw.Api();
+
+ function getReferences() {
+ var result = $.Deferred();
+
+ if ( references ) {
+ return $.Deferred()
+ .resolve( references )
+ .promise();
+ }
+
+ return api.get( {
+ action: 'query',
+ titles: mw.config.get( 'wgTitle' ),
+ prop: 'mfreferences',
+ format: 'json',
+ formatversion: 2
+ } ).then( function ( response ) {
+ references = response.query.pages[0]['mfreferences'];
+
+ return references;
+ } );
+ }
/**
* Return the matched reference among the children of ol.references
@@ -12,9 +37,14 @@
// Escape (almost) all CSS selector meta characters
// see
http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
var meta = /[!"$%&'()*+,.\/:;<=>?@[\\\]^`{|}~]/g;
- id = id.replace( meta, '\\$&' );
- // Use find rather than string concatenation
- return $( 'ol.references' ).find( id );
+
+ id = id.substring( 1 )
+ .replace( meta, '\\$&' );
+
+ return getReferences()
+ .then( function ( references ) {
+ return references[id];
+ } );
}
/**
@@ -30,10 +60,15 @@
if ( !drawer ) {
drawer = new ReferencesDrawer();
}
- drawer.render( {
- title: $dest.text(),
- text: getReference( href ).html()
- } );
+
+ getReference( href )
+ .then( function (reference) {
+ drawer.render( {
+ title: $dest.text(),
+ text: reference
+ } );
+ } );
+
ev.preventDefault();
// don't hide drawer (stop propagation of click) if it is
already shown (e.g. click another reference)
if ( drawer.isVisible() ) {
@@ -56,7 +91,6 @@
mw.loader.using( 'mobile.references' ).done( function () {
ReferencesDrawer = M.require(
'mobile.references/ReferencesDrawer' );
$container.find( 'sup a' ).off( 'click' ).on( 'click',
showReference );
- $container.find( '.mw-cite-backlink a' ).off( 'click' );
} );
}
--
To view, visit https://gerrit.wikimedia.org/r/266249
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8e9d50a286f0230af289233ddf97645d3789ec82
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/MobileFrontend
Gerrit-Branch: master
Gerrit-Owner: Phuedx <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits