summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php')
-rw-r--r--www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php110
1 files changed, 110 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php
new file mode 100644
index 00000000..5af209bd
--- /dev/null
+++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/PersonalUrls.php
@@ -0,0 +1,110 @@
+<?php
+
+namespace SMW\MediaWiki\Hooks;
+
+use SkinTemplate;
+use SMW\MediaWiki\JobQueue;
+
+/**
+ * @see https://www.mediawiki.org/wiki/Manual:Hooks/PersonalUrls
+ *
+ * @license GNU GPL v2+
+ * @since 3.0
+ *
+ * @author mwjames
+ */
+class PersonalUrls extends HookHandler {
+
+ /**
+ * @var SkinTemplate
+ */
+ private $skin;
+
+ /**
+ * @var JobQueue
+ */
+ private $jobQueue;
+
+ /**
+ * @since 3.0
+ *
+ * @param SkinTemplate $skin
+ * @param JobQueue $jobQueue
+ */
+ public function __construct( SkinTemplate $skin, JobQueue $jobQueue ) {
+ $this->skin = $skin;
+ $this->jobQueue = $jobQueue;
+ }
+
+ /**
+ * @since 3.0
+ *
+ * @param array &$personalUrls
+ *
+ * @return true
+ */
+ public function process( array &$personalUrls ) {
+
+ $watchlist = $this->getOption( 'smwgJobQueueWatchlist', [] );
+
+ if ( $this->getOption( 'prefs-jobqueue-watchlist' ) !== null && $watchlist !== [] ) {
+ $this->addJobQueueWatchlist( $watchlist, $personalUrls );
+ }
+
+ return true;
+ }
+
+ private function addJobQueueWatchlist( $watchlist, &$personalUrls ) {
+
+ $queue = [];
+
+ foreach ( $watchlist as $job ) {
+ $size = $this->jobQueue->getQueueSize( $job );
+
+ if ( $size > 0 ) {
+ $queue[$job] = $this->humanReadable( $size );
+ }
+ }
+
+ $out = $this->skin->getOutput();
+ $personalUrl = [];
+
+ $out->addModules( 'ext.smw.personal' );
+ $out->addJsConfigVars( 'smwgJobQueueWatchlist', $queue );
+
+ $personalUrl['smw-jobqueue-watchlist'] = [
+ 'text' => 'ⅉ [ ' . ( $queue === [] ? '0' : implode( ' | ', $queue ) ) . ' ]' ,
+ 'href' => '#',
+ 'class' => 'smw-personal-jobqueue-watchlist is-disabled',
+ 'active' => true
+ ];
+
+ $keys = array_keys( $personalUrls );
+
+ // Insert the link before the watchlist
+ $personalUrls = $this->splice(
+ $personalUrls,
+ $personalUrl,
+ array_search( 'watchlist', $keys )
+ );
+ }
+
+ // https://stackoverflow.com/questions/1783089/array-splice-for-associative-arrays
+ private function splice( $array, $values, $offset ) {
+ return array_slice( $array, 0, $offset, true ) + $values + array_slice( $array, $offset, NULL, true );
+ }
+
+ private function humanReadable( $num, $decimals = 0 ) {
+
+ if ( $num < 1000 ) {
+ $num = number_format( $num );
+ } else if ( $num < 1000000) {
+ $num = number_format( $num / 1000, $decimals ) . 'K';
+ } else {
+ $num = number_format( $num / 1000000, $decimals ) . 'M';
+ }
+
+ return $num;
+ }
+
+}