From 8527e33475184220c2b767518ec64e2c87a01e2a Mon Sep 17 00:00:00 2001 From: Santhosh Thottingal Date: Thu, 14 Jun 2012 18:28:42 +0530 Subject: [PATCH] Skeleton extension for Universal Language Selector * Basic extension code with i18n * Adds a link to personal links to trigger ULS * Core uls javascript code, to plug to the given trigger. * Qunit, PHPUnit framework in place. * and lot of TODOs and FIXMEs Patch set 2: * A tiny whitespace fix. Change-Id: I300647a21e0b7f65b7d9dc6101014ea9389c9f2a --- README | 12 ++++ UniversalLanguageSelector.hooks.php | 52 ++++++++++++++ UniversalLanguageSelector.i18n.php | 18 +++++ UniversalLanguageSelector.php | 58 ++++++++++++++++ resources/css/ext.uls.css | 49 +++++++++++++ resources/ext.uls.core.js | 103 ++++++++++++++++++++++++++++ resources/ext.uls.init.js | 14 ++++ resources/images/icon-language.png | Bin 0 -> 1407 bytes resources/images/world_map.png | Bin 0 -> 18136 bytes tests/phpunit/Makefile | 2 + tests/qunit/ext.uls.tests.js | 18 +++++ 11 files changed, 326 insertions(+) create mode 100644 README create mode 100644 UniversalLanguageSelector.hooks.php create mode 100644 UniversalLanguageSelector.i18n.php create mode 100644 UniversalLanguageSelector.php create mode 100644 resources/css/ext.uls.css create mode 100644 resources/ext.uls.core.js create mode 100644 resources/ext.uls.init.js create mode 100644 resources/images/icon-language.png create mode 100644 resources/images/world_map.png create mode 100644 tests/phpunit/Makefile create mode 100644 tests/qunit/ext.uls.tests.js diff --git a/README b/README new file mode 100644 index 00000000..b3c92b59 --- /dev/null +++ b/README @@ -0,0 +1,12 @@ +== Copying == +See http://www.gnu.org/licenses/gpl2.html + +== Installation == +For very very quick start add the following to LocalSettings.php: + +include("$IP/extensions/UniversalLanguageSelector/UniversalLanguageSelector.php"); + +More documenation is at + http://www.mediawiki.org/wiki/Universal_Language_Selector + +== Change log == diff --git a/UniversalLanguageSelector.hooks.php b/UniversalLanguageSelector.hooks.php new file mode 100644 index 00000000..9af3b102 --- /dev/null +++ b/UniversalLanguageSelector.hooks.php @@ -0,0 +1,52 @@ +addModules( 'ext.uls.init' ); + return true; + } + /** + * ResourceLoaderTestModules hook handler. + * @param $testModules: array of javascript testing modules. 'qunit' is fed using tests/qunit/QUnitTestResources.php. + * @param $resourceLoader object + * @return bool + */ + public static function addTestModules( array &$testModules, ResourceLoader &$resourceLoader ) { + $testModules['qunit']['ext.uls.tests'] = array( + 'scripts' => array( 'tests/qunit/ext.uls.tests.js' ), + 'dependencies' => array( 'ext.uls.init' ), + 'localBasePath' => dirname( __FILE__ ), + 'remoteExtPath' => 'UniversalLanguageSelector', + ); + return true; + } + /** + * Add some tabs for navigation for users who do not use Ajax interface. + * Hooks: SkinTemplateNavigation, SkinTemplateTabs + */ + static function addTrigger( array &$personal_urls, &$title ) { + global $wgLang; + $tabindex = 2; + $personal_urls = array( 'uls'=> array( + 'text' => $wgLang->getLanguageName( $wgLang->getCode() ), + 'href' => '#', + 'class' => 'uls-trigger', + 'active' => true + ) ) + $personal_urls; + return true; + } + +} diff --git a/UniversalLanguageSelector.i18n.php b/UniversalLanguageSelector.i18n.php new file mode 100644 index 00000000..9dd57915 --- /dev/null +++ b/UniversalLanguageSelector.i18n.php @@ -0,0 +1,18 @@ + 'Universal Language Selector', + 'uls-desc' => 'Universal Language Selector', + 'uls-select-content-language' => 'Select Content Language', +); diff --git a/UniversalLanguageSelector.php b/UniversalLanguageSelector.php new file mode 100644 index 00000000..8636df22 --- /dev/null +++ b/UniversalLanguageSelector.php @@ -0,0 +1,58 @@ + __FILE__, + 'name' => 'UniversalLanguageSelector', + 'version' => '0.1', + 'author' => array( 'Santhosh Thottingal' ), + 'url' => 'https://www.mediawiki.org/wiki/Extension:UniversalLanguageSelector', + 'descriptionmsg' => 'uls-desc', +); + +$dir = dirname( __FILE__ ); + +// Internationalization +$wgExtensionMessagesFiles['UniversalLanguageSelector'] = "$dir/UniversalLanguageSelector.i18n.php"; + +// Register auto load for the page class +$wgAutoloadClasses['UniversalLanguageSelectorHooks'] = "$dir/UniversalLanguageSelector.hooks.php"; + +$wgHooks['BeforePageDisplay'][] = 'UniversalLanguageSelectorHooks::addModules'; +$wgHooks['PersonalUrls'][] = 'UniversalLanguageSelectorHooks::addTrigger'; + +$wgResourceModules['ext.uls.init'] = array( + 'scripts' => 'resources/ext.uls.init.js', + 'localBasePath' => $dir, + 'remoteExtPath' => 'UniversalLanguageSelector', + 'dependencies' => 'ext.uls.core', + 'position' => 'top', +); + +$wgResourceModules['ext.uls.core'] = array( + 'scripts' => array( 'resources/ext.uls.core.js' ), + 'styles' => 'resources/css/ext.uls.css', + 'localBasePath' => $dir, + 'remoteExtPath' => 'UniversalLanguageSelector', + 'dependencies' => array( + 'mediawiki.util', + ), + 'messages' => array( + 'uls-select-content-language', + ), + 'position' => 'top', +); diff --git a/resources/css/ext.uls.css b/resources/css/ext.uls.css new file mode 100644 index 00000000..485a1f1e --- /dev/null +++ b/resources/css/ext.uls.css @@ -0,0 +1,49 @@ +.uls-trigger { + /* @embed */ + background: url('../images/icon-language.png') no-repeat scroll left center transparent; + padding-left: 36px; +} + +.uls-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 400px; + min-height: 400px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + width: 50% +} +.uls-menu h2 { + float:left; +} +a.close{ + float: right; + padding: 10px; +} + +div#worldmap { + /* @embed */ + background: url('../images/world_map.png') no-repeat scroll left center transparent; + float: right; + width: 400px; + height: 200px; +} diff --git a/resources/ext.uls.core.js b/resources/ext.uls.core.js new file mode 100644 index 00000000..e4749cd7 --- /dev/null +++ b/resources/ext.uls.core.js @@ -0,0 +1,103 @@ +(function($) { + "use strict"; + + var ULS = function(element, options) { + this.$element = $( element ); + this.options = $.extend( {}, $.fn.uls.defaults, options ); + this.$menu = $( this.options.menu ).appendTo( 'body' ); + this.shown = false; + this.render(); + this.listen(); + } + + ULS.prototype = { + constructor : ULS, + show : function() { + var pos = $.extend( {}, this.$element.offset(), { + height : this.$element[0].offsetHeight + } ); + + this.$menu.css( { + top : pos.top + pos.height, + left : '25%' //pos.left // FIXME + } ); + + this.$menu.show(); + this.shown = true; + return this; + }, + hide : function() { + this.$menu.hide(); + this.shown = false; + return this; + }, + render: function(){ + // TODO : All UI construction code to go here. + var $heading = $("

").text(mw.msg("uls-select-content-language")); + this.$menu.append($heading); + var $wordldMap = $("
"); + this.$menu.append($wordldMap); + }, + listen : function() { + // Register all event listeners to the ULS here. + this.$element.on( 'click', $.proxy( this.click, this ) ); + this.$menu.on( 'keyup', $.proxy( this.click, this ) ) + .on( 'keypress', $.proxy( this.click, this ) ); + }, + keyup : function(e) { + switch(e.keyCode) { + case 27: + // escape + if (!this.shown ) { + return this.hide(); + } + break; + } + + e.stopPropagation(); + e.preventDefault(); + }, + keypress : function(e) { + if (!this.shown ) + return; + + switch(e.keyCode) { + case 27: + // escape + e.preventDefault(); + break; + } + e.stopPropagation(); + }, + click : function(e) { + e.stopPropagation(); + e.preventDefault(); + if ( !this.shown ) { + this.show(); + } else { + this.hide(); + } + }, + } + + /* ULS PLUGIN DEFINITION + * =========================== */ + + $.fn.uls = function(option) { + return this.each( function() { + var $this = $( this ), data = $this.data( 'uls' ), options = typeof option == 'object' && option; + if (!data ) + $this.data( 'uls', ( data = new ULS(this, options)) ); + if ( typeof option == 'string' ) + data[option](); + } ) + }; + + $.fn.uls.defaults = { + // FIXME Menu template. Can it come from PHP? + menu : '', + }; + + $.fn.uls.Constructor = ULS; + +} )( jQuery ); diff --git a/resources/ext.uls.init.js b/resources/ext.uls.init.js new file mode 100644 index 00000000..57fb3462 --- /dev/null +++ b/resources/ext.uls.init.js @@ -0,0 +1,14 @@ +/** + * ULS startup script + */ +( function( $ ) { + $( document ).ready( function() { + /* Create a trigger somewhere in the page. + $trigger = $("") + .addClass( 'uls-trigger' ) + .text("English"); // FIXME proper trigger text to go here. + $('#mw-head').append( $trigger );*/ + // Bind ULS to the trigger. + $('.uls-trigger').uls(); + } ); +} )( jQuery ); diff --git a/resources/images/icon-language.png b/resources/images/icon-language.png new file mode 100644 index 0000000000000000000000000000000000000000..c4c289cb69dee80f67919a50cb85c67ad95c9b24 GIT binary patch literal 1407 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 IM6N<$f?}Qd&j0`b literal 0 HcmV?d00001 diff --git a/tests/phpunit/Makefile b/tests/phpunit/Makefile new file mode 100644 index 00000000..be366553 --- /dev/null +++ b/tests/phpunit/Makefile @@ -0,0 +1,2 @@ +default: + php ../../../tests/phpunit/phpunit.php . diff --git a/tests/qunit/ext.uls.tests.js b/tests/qunit/ext.uls.tests.js new file mode 100644 index 00000000..0859d0c8 --- /dev/null +++ b/tests/qunit/ext.uls.tests.js @@ -0,0 +1,18 @@ +/** + * QUnit tests for ULS + * + * @file + * @author Santhosh Thottingal + * @copyright Copyright © 2012 Santhosh Thottingal + * @license http://www.gnu.org/copyleft/gpl.html GNU General Public License 2.0 or later + */ +( function () { + +module( "ext.uls", QUnit.newMwEnvironment() ); + +test( "-- Initial check", function() { + expect( 2 ); + ok( $.fn.uls, "$.fn.uls is defined" ); +} ); + +}());