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

Reply via email to