http://www.mediawiki.org/wiki/Special:Code/MediaWiki/56421
Revision: 56421 Author: catrope Date: 2009-09-16 17:47:04 +0000 (Wed, 16 Sep 2009) Log Message: ----------- wmf-deployment-work: Merge r56417 (pre-deployment usability fixes) from trunk. Also merge r56195 (NTOC bugfix), made conflict resolution easier. Modified Paths: -------------- branches/wmf-deployment-work/extensions/UsabilityInitiative/ClickTracking/ClickTracking.hooks.php branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.hooks.php branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.i18n.php branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.php branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.php branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.js branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.min.js Added Paths: ----------- branches/wmf-deployment-work/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-ilink.png branches/wmf-deployment-work/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-xlink.png Property Changed: ---------------- branches/wmf-deployment-work/extensions/UsabilityInitiative/ branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js Property changes on: branches/wmf-deployment-work/extensions/UsabilityInitiative ___________________________________________________________________ Added: svn:mergeinfo + /branches/REL1_15/phase3/extensions/UsabilityInitiative:51646 /trunk/extensions/UsabilityInitiative:56207,56209,56296,56333,56355,56417 /trunk/phase3/extensions/UsabilityInitiative:56213,56215-56216,56218,56325,56334-56336,56338,56340,56343,56345,56347,56350 Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/ClickTracking/ClickTracking.hooks.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/ClickTracking/ClickTracking.hooks.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/ClickTracking/ClickTracking.hooks.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -62,7 +62,7 @@ 'wgTrackingToken' => ClickTrackingHooks::get_session_id() ) ); - UsabilityInitiativeHooks::addLiteralVariables( + UsabilityInitiativeHooks::addVariables( array( 'wgClickTrackingIsThrottled' => ClickTrackingHooks::isUserThrottled() ) Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.hooks.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -15,7 +15,9 @@ * Intercept the display of the toolbar, replacing the content of $toolbar */ public static function addToolbar( &$toolbar ) { - global $wgUser, $wgEditToolbarGlobalEnable, $wgEditToolbarUserEnable; + global $wgUser, $wgEditToolbarGlobalEnable; + global $wgEditToolbarUserEnable, $wgEditToolbarCGDGlobalEnable; + global $wgEditToolbarCGDUserEnable; // Only proceed if some specific conditions are met if ( $wgEditToolbarGlobalEnable || ( $wgEditToolbarUserEnable && $wgUser->getOption( 'usebetatoolbar' ) ) ) { @@ -25,6 +27,9 @@ UsabilityInitiativeHooks::addScript( 'EditToolbar/EditToolbar.js', $wgEditToolbarStyleVersion ); + UsabilityInitiativeHooks::addVariables( array( + 'wgEditToolbarCGD' => $wgEditToolbarCGDGlobalEnable || ( $wgEditToolbarCGDUserEnable && $wgUser->getOption( 'usebetatoolbar-cgd' ) ) + ) ); // Internationalization wfLoadExtensionMessages( 'EditToolbar' ); UsabilityInitiativeHooks::addMessages( @@ -35,6 +40,10 @@ 'edittoolbar-tool-bold-example', 'edittoolbar-tool-italic', 'edittoolbar-tool-italic-example', + 'edittoolbar-tool-ilink', + 'edittoolbar-tool-ilink-example', + 'edittoolbar-tool-xlink', + 'edittoolbar-tool-xlink-example', 'edittoolbar-tool-link', 'edittoolbar-tool-link-title', 'edittoolbar-tool-link-int', @@ -85,6 +94,7 @@ 'edittoolbar-tool-gallery-example', 'edittoolbar-tool-newline', 'edittoolbar-tool-table', + 'edittoolbar-tool-table-example-old', 'edittoolbar-tool-table-example', 'edittoolbar-tool-table-example-header', 'edittoolbar-tool-table-title', @@ -196,15 +206,9 @@ */ public static function addPreferences( $user, &$defaultPreferences ) { global $wgEditToolbarGlobalEnable, $wgEditToolbarUserEnable; + global $wgEditToolbarCGDGlobalEnable, $wgEditToolbarCGDUserEnable; - // Checks if... - if ( - // Toolbar is NOT globablly enabled - !$wgEditToolbarGlobalEnable && - // And Toolbar is per-user enablable - $wgEditToolbarUserEnable - ) { - // Internationalization + if ( !$wgEditToolbarGlobalEnable && $wgEditToolbarUserEnable ) { wfLoadExtensionMessages( 'EditToolbar' ); // Adds preference for opting in $defaultPreferences['usebetatoolbar'] = @@ -214,6 +218,15 @@ 'section' => 'editing/advancedediting', ); } + + if ( !$wgEditToolbarGlobalEnable && $wgEditToolbarUserEnable ) { + wfLoadExtensionMessages( 'EditToolbar' ); + $defaultPreferences['usebetatoolbar-cgd'] = array( + 'type' => 'toggle', + 'label-message' => 'edittoolbar-cgd-preference', + 'section' => 'editing/advancedediting', + ); + } return true; } } Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.i18n.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -15,12 +15,17 @@ 'edittoolbar' => 'Editing toolbar', 'edittoolbar-desc' => 'Edit page toolbar with enhanced usability', 'edittoolbar-preference' => 'Enable enhanced editing toolbar', + 'edittoolbar-cgd-preference' => 'Enable content generation dialogs in enhanced editing toolbar', 'edittoolbar-loading' => 'Loading...', /* Main Section */ 'edittoolbar-tool-bold' => 'Bold', 'edittoolbar-tool-bold-example' => 'Bold text', 'edittoolbar-tool-italic' => 'Italic', 'edittoolbar-tool-italic-example' => 'Italic text', + 'edittoolbar-tool-ilink' => 'Internal link', + 'edittoolbar-tool-ilink-example' => 'Link title', + 'edittoolbar-tool-xlink' => 'External link (remember http:// prefix)', + 'edittoolbar-tool-xlink-example' => 'http://www.example.com link title', 'edittoolbar-tool-link' => 'Link', 'edittoolbar-tool-link-title' => 'Insert link', 'edittoolbar-tool-link-int' => 'To a wiki page', @@ -72,6 +77,18 @@ {{ns:file}}:Example.jpg|Caption2", 'edittoolbar-tool-newline' => 'New line', 'edittoolbar-tool-table' => 'Table', + 'edittoolbar-tool-table-example-old' => "- +! header 1 +! header 2 +! header 3 +|- +| row 1, cell 1 +| row 1, cell 2 +| row 1, cell 3 +|- +| row 2, cell 1 +| row 2, cell 2 +| row 2, cell 3", 'edittoolbar-tool-table-example' => 'Row $1, cell $2', 'edittoolbar-tool-table-example-header' => 'Row $1, cell $2 (header)', 'edittoolbar-tool-table-title' => 'Insert table', Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.js 2009-09-16 17:47:04 UTC (rev 56421) @@ -1,6 +1,10 @@ /* JavaScript for EditToolbar extension */ js2AddOnloadHook( function() { + // Only show content generation dialogs if enabled + if ( typeof wgEditToolbarCGD != 'undefined' && wgEditToolbarCGD ) + $j( '#wpTextbox1' ).addClass( 'withCGD' ); + if ( $j.wikiEditor != undefined && $j.wikiEditor.isSupported() || !$j.wikiEditor.isSupportKnown() ) { // Remove the old toolbar $j( '#toolbar' ).remove(); @@ -47,10 +51,39 @@ }, 'insert': { tools: { - 'link': { + 'xlink': { + labelMsg: 'edittoolbar-tool-xlink', + type: 'button', + icon: 'insert-xlink.png', + filters: [ '#wpTextbox1:not(.withCGD)' ], + action: { + type: 'encapsulate', + options: { + pre: "[", + periMsg: 'edittoolbar-tool-xlink-example', + post: "]" + } + } + }, + 'ilink': { + labelMsg: 'edittoolbar-tool-ilink', + type: 'button', + icon: 'insert-ilink.png', + filters: [ '#wpTextbox1:not(.withCGD)' ], + action: { + type: 'encapsulate', + options: { + pre: "[[", + periMsg: 'edittoolbar-tool-ilink-example', + post: "]]" + } + } + }, + 'linkCGD': { labelMsg: 'edittoolbar-tool-link', type: 'button', icon: 'insert-link.png', + filters: [ '#wpTextbox1.withCGD' ], action: { type: 'dialog', module: 'insert-link' @@ -271,15 +304,30 @@ } } }, - 'table': { + 'tableCGD': { labelMsg: 'edittoolbar-tool-table', type: 'button', icon: 'insert-table.png', + filters: [ '#wpTextbox1.withCGD' ], action: { type: 'dialog', module: 'insert-table' } }, + 'table': { + labelMsg: 'edittoolbar-tool-table', + type: 'button', + icon: 'insert-table.png', + filters: [ '#wpTextbox1:not(.withCGD)' ], + action: { + type: 'encapsulate', + options: { + pre: "{| class=\"wikitable\" border=\"1\"\n|", + periMsg: 'edittoolbar-tool-table-example-old', + post: "\n|}" + } + } + }, 'newline': { labelMsg: 'edittoolbar-tool-newline', type: 'button', @@ -299,6 +347,7 @@ labelMsg: 'edittoolbar-tool-replace', type: 'button', icon: 'search-replace.png', + filters: [ '#wpTextbox1.withCGD' ], action: { type: 'dialog', module: 'search-and-replace' Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/EditToolbar/EditToolbar.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -19,7 +19,7 @@ /* Configuration */ // Bump the version number every time you change any of the .css/.js files -$wgEditToolbarStyleVersion = 28; +$wgEditToolbarStyleVersion = 33; // Set this to true to simply override the stock toolbar for everyone $wgEditToolbarGlobalEnable = false; @@ -29,6 +29,15 @@ // will not do anything) $wgEditToolbarUserEnable = true; +// Set this to true to enable content generation dialogs for everyone who gets +// the toolbar +$wgEditToolbarCGDGlobalEnable = false; + +// Set this to true to add a preference to the editing section of preferences +// which enabled and disables content generation dialogs +// If $wgEditToolbatCGDGlobalEnable is true, this will be ignored +$wgEditToolbarCGDUserEnable = true; + // Set if we should include a client-side testing script $wgEditToolbarRunTests = false; Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.hooks.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.hooks.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.hooks.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -15,14 +15,36 @@ * Adds the TOC to the edit form */ public static function addTOC( &$toolbar ) { - global $wgNavigableTOCStyleVersion, $wgParser, $wgUser; - global $wgEnableParserCache; + global $wgNavigableTOCStyleVersion, $wgUser; + global $wgNavigableTOCGlobalEnable, $wgNavigableTOCUserEnable; - // Adds script to document - UsabilityInitiativeHooks::initialize(); - UsabilityInitiativeHooks::addScript( - 'NavigableTOC/NavigableTOC.js', $wgNavigableTOCStyleVersion - ); + if ( $wgNavigableTOCGlobalEnable || ( $wgNavigableTOCUserEnable && $wgUser->getOption( 'usenavigabletoc' ) ) ) { + // Adds script to document + UsabilityInitiativeHooks::initialize(); + UsabilityInitiativeHooks::addScript( + 'NavigableTOC/NavigableTOC.js', $wgNavigableTOCStyleVersion + ); + } return true; } + + /** + * GetPreferences hook + * Add NTOC-related items to the preferences + */ + public static function addPreferences( $user, &$defaultPreferences ) { + global $wgNavigableTOCGlobalEnable, $wgNavigableTOCUserEnable; + + if ( !$wgNavigableTOCGlobalEnable && $wgNavigableTOCUserEnable ) { + wfLoadExtensionMessages( 'NavigableTOC' ); + // Adds preference for opting in + $defaultPreferences['usenavigabletoc'] = + array( + 'type' => 'toggle', + 'label-message' => 'navigabletoc-preference', + 'section' => 'editing/advancedediting', + ); + } + return true; + } } Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.i18n.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.i18n.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.i18n.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -14,6 +14,7 @@ $messages['en'] = array( 'navigabletoc' => 'Navigable table of contents', 'navigabletoc-desc' => 'Adds a table of contents to the edit form that scrolls the text box when a section is clicked', + 'navigabletoc-preference' => 'Enable navigable table of contents', ); /** Afrikaans (Afrikaans) Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/NavigableTOC/NavigableTOC.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -18,6 +18,14 @@ /* Configuration */ +// Set this to true to simply force NavigableTOC on everyone +$wgNavigableTOCGlobalEnable = false; + +// Set this to true to add a preference to the editing section of preferences +// which enables and disables NavigableTOC (if $wgNavigableTOCGlobalEnable, this +// will not do anything) +$wgNavigableTOCUserEnable = true; + // Bump the version number every time you change any of the .css/.js files $wgNavigableTOCStyleVersion = 3; @@ -45,4 +53,5 @@ dirname( __FILE__ ) . '/NavigableTOC.i18n.php'; // Registers Hooks -$wgHooks['EditPageBeforeEditToolbar'][] = 'NavigableTOCHooks::addTOC'; \ No newline at end of file +$wgHooks['EditPageBeforeEditToolbar'][] = 'NavigableTOCHooks::addTOC'; +$wgHooks['GetPreferences'][] = 'NavigableTOCHooks::addPreferences'; Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.hooks.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -62,17 +62,17 @@ array( 'src' => 'js/plugins/jquery.namespaceSelect.js', 'version' => 0 ), array( 'src' => 'js/plugins/jquery.suggestions.js', 'version' => 2 ), array( 'src' => 'js/plugins/jquery.textSelection.js', 'version' => 9 ), - array( 'src' => 'js/plugins/jquery.wikiEditor.js', 'version' => 4 ), + array( 'src' => 'js/plugins/jquery.wikiEditor.js', 'version' => 5 ), array( 'src' => 'js/plugins/jquery.wikiEditor.toolbar.js', 'version' => 11 ), - array( 'src' => 'js/plugins/jquery.wikiEditor.dialogs.js', 'version' => 1 ), + array( 'src' => 'js/plugins/jquery.wikiEditor.dialogs.js', 'version' => 2 ), array( 'src' => 'js/plugins/jquery.wikiEditor.toc.js', 'version' => 6 ), array( 'src' => 'js/js2/jquery-ui-1.7.2.js', 'version' => '1.7.2x' ), ), 'combined' => array( - array( 'src' => 'js/plugins.combined.js', 'version' => 17 ), + array( 'src' => 'js/plugins.combined.js', 'version' => 22 ), ), 'minified' => array( - array( 'src' => 'js/plugins.combined.min.js', 'version' => 17 ), + array( 'src' => 'js/plugins.combined.min.js', 'version' => 22 ), ), ), ); @@ -124,31 +124,7 @@ if ( !self::$doOutput ) return true; - // Transforms variables into javascript global variables - foreach ( self::$variables as $key => $value ) { - $escapedVariableValue = Xml::escapeJsString( $value ); - $escapedVariableKey = Xml::escapeJsString( $key ); - self::$variables[$key] = - "var {$escapedVariableKey} = '{$escapedVariableValue}';"; - } - //literal variables, ie ones we do not want escaped as strings - foreach( self::$literalVariables as $key => $value){ - $escapedVariableValue = Xml::escapeJsString( $value ); - $escapedVariableKey = Xml::escapeJsString( $key ); - self::$variables[$key] = - "var {$escapedVariableKey} = {$escapedVariableValue};"; - } - if ( count( self::$variables ) > 0 ) { - $out->addScript( - Xml::tags( - 'script', - array( 'type' => $wgJsMimeType ), - implode( self::$variables ) - ) - ); - } - // Loops over each script foreach ( self::$scripts as $script ) { // Add javascript to document @@ -198,6 +174,14 @@ } return true; } + + /** + * MakeGlobalVariablesScript hook + */ + public static function addJSVars( &$vars ) { + $vars = array_merge( $vars, self::$variables ); + return true; + } /** * Adds a reference to a javascript file to the head of the document @@ -233,13 +217,4 @@ public static function addVariables( $variables ) { self::$variables = array_merge( self::$variables, $variables ); } - - /** - * Adds variables that will be turned into global variables in JS, but not escaped as strings - * @param $variables array of "name" => "value" - */ - public static function addLiteralVariables( $variables ) { - self::$literalVariables = array_merge( self::$literalVariables, $variables ); - } - } Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.php =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.php 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/UsabilityInitiative.php 2009-09-16 17:47:04 UTC (rev 56421) @@ -45,3 +45,4 @@ // Registers Hooks $wgHooks['BeforePageDisplay'][] = 'UsabilityInitiativeHooks::addResources'; +$wgHooks['MakeGlobalVariablesScript'][] = 'UsabilityInitiativeHooks::addJSVars'; \ No newline at end of file Copied: branches/wmf-deployment-work/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-ilink.png (from rev 56417, trunk/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-ilink.png) =================================================================== (Binary files differ) Copied: branches/wmf-deployment-work/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-xlink.png (from rev 56417, trunk/extensions/UsabilityInitiative/images/wikiEditor/toolbar/insert-xlink.png) =================================================================== (Binary files differ) Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.js 2009-09-16 17:47:04 UTC (rev 56421) @@ -65,96 +65,88 @@ // gets called again we can pick up where we left off var context = $(this).data( 'wikiEditor-context' ); -/* API */ -// The first time this is called, we expect context to be undefined, meaning -// the editing UI has not yet been, and still needs to be, built. However, each -// additional call after that is expected to be an API call, which contains a -// string as the first argument which corresponds to a supported API call -if ( typeof context !== 'undefined' ) { - // Since javascript gives arguments as an object, we need to convert them - // so they can be used more easily - arguments = $.makeArray( arguments ); - if ( arguments.length > 0 ) { - // Handle API calls - var call = arguments.shift(); - if ( call in context.api ) { - context.api[call]( context, arguments[0] == undefined ? {} : arguments[0] ); - } - // Store the context for next time and return - return $(this).data( 'context', context ); - } - // Nothing to do, just return - return $(this); -} - -/* Construction */ - -var instance = $.wikiEditor.instances.length; -context = { '$textarea': $(this), 'modules': {}, 'data': {}, 'instance': instance }; -$.wikiEditor.instances[instance] = $(this); - -// Encapsulate the textarea with some containers for layout -$(this) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui' ).attr( 'id', 'wikiEditor-ui' ) ) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-bottom' ).attr( 'id', 'wikiEditor-ui-bottom' ) ) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-text' ).attr( 'id', 'wikiEditor-ui-text' ) ); - -// Get a reference to the outer container -context.$ui = $(this).parent().parent().parent(); -context.$ui.after( $( '<div style="clear:both;"></div>' ) ); -// Attach a container in the top -context.$ui.prepend( $( '<div></div>' ).addClass( 'wikiEditor-ui-top' ).attr( 'id', 'wikiEditor-ui-top' ) ); - -// Create a set of standard methods for internal and external use -context.api = { - /** - * Accepts either a string of the name of a module to add without any - * additional configuration parameters, or an object with members keyed with - * module names and valued with configuration objects - */ - addModule: function( context, data ) { - // A safe way of calling an API function on a module - function callModuleApi( module, call, data ) { - if ( - module in $.wikiEditor.modules && - 'fn' in $.wikiEditor.modules[module] && - call in $.wikiEditor.modules[module].fn - ) { - $.wikiEditor.modules[module].fn[call]( context, data ); +if ( typeof context == 'undefined' ) { + /* Construction */ + var instance = $.wikiEditor.instances.length; + context = { '$textarea': $(this), 'modules': {}, 'data': {}, 'instance': instance }; + $.wikiEditor.instances[instance] = $(this); + + // Encapsulate the textarea with some containers for layout + $(this) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui' ).attr( 'id', 'wikiEditor-ui' ) ) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-bottom' ).attr( 'id', 'wikiEditor-ui-bottom' ) ) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-text' ).attr( 'id', 'wikiEditor-ui-text' ) ); + + // Get a reference to the outer container + context.$ui = $(this).parent().parent().parent(); + context.$ui.after( $( '<div style="clear:both;"></div>' ) ); + // Attach a container in the top + context.$ui.prepend( $( '<div></div>' ).addClass( 'wikiEditor-ui-top' ).attr( 'id', 'wikiEditor-ui-top' ) ); + + // Create a set of standard methods for internal and external use + context.api = { + /** + * Accepts either a string of the name of a module to add without any + * additional configuration parameters, or an object with members keyed with + * module names and valued with configuration objects + */ + addModule: function( context, data ) { + // A safe way of calling an API function on a module + function callModuleApi( module, call, data ) { + if ( + module in $.wikiEditor.modules && + 'fn' in $.wikiEditor.modules[module] && + call in $.wikiEditor.modules[module].fn + ) { + $.wikiEditor.modules[module].fn[call]( context, data ); + } } - } - if ( typeof data == 'string' ) { - callModuleApi( data, 'create', {} ); - } else if ( typeof data == 'object' ) { - for ( module in data ) { - if ( typeof module == 'string' ) { - callModuleApi( module, 'create', data[module] ); + if ( typeof data == 'string' ) { + callModuleApi( data, 'create', {} ); + } else if ( typeof data == 'object' ) { + for ( module in data ) { + if ( typeof module == 'string' ) { + callModuleApi( module, 'create', data[module] ); + } } } } - } -}; -// Allow modules to extend the API -for ( module in $.wikiEditor.modules ) { - if ( 'api' in $.wikiEditor.modules[module] ) { - for ( call in $.wikiEditor.modules[module].api ) { - // Modules may not overwrite existing API functions - first come, - // first serve - if ( !( call in context.api ) ) { - context.api[call] = $.wikiEditor.modules[module].api[call]; + }; + // Allow modules to extend the API + for ( module in $.wikiEditor.modules ) { + if ( 'api' in $.wikiEditor.modules[module] ) { + for ( call in $.wikiEditor.modules[module].api ) { + // Modules may not overwrite existing API functions - first come, + // first serve + if ( !( call in context.api ) ) { + context.api[call] = $.wikiEditor.modules[module].api[call]; + } } } } + //Each browser seems to do this differently, so let's keep our editor + //consistent by always starting at the begining + context.$textarea.scrollToCaretPosition( 0 ); } + // If there was a configuration passed, it's assumed to be for the addModule -// API call, so we can just send it on it's way right now +// API call if ( arguments.length > 0 && typeof arguments[0] == 'object' ) { context.api.addModule( context, arguments[0] ); +} else { + // Since javascript gives arguments as an object, we need to convert them + // so they can be used more easily + arguments = $.makeArray( arguments ); + if ( arguments.length > 0 ) { + // Handle API calls + var call = arguments.shift(); + if ( call in context.api ) { + context.api[call]( context, arguments[0] == undefined ? {} : arguments[0] ); + } + } } -//Each browser seems to do this differently, so let's keep our editor -//consistent by always starting at the begining -context.$textarea.scrollToCaretPosition( 0 ); + // Store the context for next time, and support chaining return $(this).data( 'wikiEditor-context', context ); Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js 2009-09-16 17:47:04 UTC (rev 56421) @@ -45,7 +45,7 @@ context.$textarea .bind( 'keyup encapsulateSelection', function( event ) { - var context = $(this).data( 'context' ); + var context = $(this).data( 'wikiEditor-context' ); $(this).eachAsync( { bulk: 0, loop: function() { @@ -55,9 +55,9 @@ } ); } ) - .bind( 'mouseup scrollToPosition', + .bind( 'mouseup scrollToPosition focus', function( event ) { - var context = $(this).data( 'context' ); + var context = $(this).data( 'wikiEditor-context' ); $(this).eachAsync( { bulk: 0, loop: function() { @@ -65,15 +65,23 @@ } } ); } - ); + ) + .blur( function() { + var context = $(this).data( 'wikiEditor-context' ); + $.wikiEditor.modules.toc.fn.unhighlight( context ); + }); }, + + unhighlight: function( context ) { + context.modules.$toc.find( 'a' ).removeClass( 'currentSelection' ); + }, /** * Highlight the section the cursor is currently within * * @param {Object} context */ update: function( context ) { - context.modules.$toc.find( 'a' ).removeClass( 'currentSelection' ); + $.wikiEditor.modules.toc.fn.unhighlight( context ); var position = context.$textarea.getCaretPosition(); var section = 0; if ( context.data.outline.length > 0 ) { @@ -220,4 +228,4 @@ } } -}; } ) ( jQuery ); \ No newline at end of file +}; } ) ( jQuery ); Property changes on: branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js ___________________________________________________________________ Added: svn:mergeinfo + /branches/REL1_15/phase3/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js:51646 /trunk/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js:56195,56207,56209,56296,56333,56355,56417 /trunk/phase3/extensions/UsabilityInitiative/js/plugins/jquery.wikiEditor.toc.js:56213,56215-56216,56218,56325,56334-56336,56338,56340,56343,56345,56347,56350 Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.js =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.js 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.js 2009-09-16 17:47:04 UTC (rev 56421) @@ -1000,13 +1000,76 @@ // gets called again we can pick up where we left off var context = $(this).data( 'wikiEditor-context' ); -/* API */ -// The first time this is called, we expect context to be undefined, meaning -// the editing UI has not yet been, and still needs to be, built. However, each -// additional call after that is expected to be an API call, which contains a -// string as the first argument which corresponds to a supported API call -if ( typeof context !== 'undefined' ) { +if ( typeof context == 'undefined' ) { + /* Construction */ + var instance = $.wikiEditor.instances.length; + context = { '$textarea': $(this), 'modules': {}, 'data': {}, 'instance': instance }; + $.wikiEditor.instances[instance] = $(this); + + // Encapsulate the textarea with some containers for layout + $(this) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui' ).attr( 'id', 'wikiEditor-ui' ) ) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-bottom' ).attr( 'id', 'wikiEditor-ui-bottom' ) ) + .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-text' ).attr( 'id', 'wikiEditor-ui-text' ) ); + + // Get a reference to the outer container + context.$ui = $(this).parent().parent().parent(); + context.$ui.after( $( '<div style="clear:both;"></div>' ) ); + // Attach a container in the top + context.$ui.prepend( $( '<div></div>' ).addClass( 'wikiEditor-ui-top' ).attr( 'id', 'wikiEditor-ui-top' ) ); + + // Create a set of standard methods for internal and external use + context.api = { + /** + * Accepts either a string of the name of a module to add without any + * additional configuration parameters, or an object with members keyed with + * module names and valued with configuration objects + */ + addModule: function( context, data ) { + // A safe way of calling an API function on a module + function callModuleApi( module, call, data ) { + if ( + module in $.wikiEditor.modules && + 'fn' in $.wikiEditor.modules[module] && + call in $.wikiEditor.modules[module].fn + ) { + $.wikiEditor.modules[module].fn[call]( context, data ); + } + } + if ( typeof data == 'string' ) { + callModuleApi( data, 'create', {} ); + } else if ( typeof data == 'object' ) { + for ( module in data ) { + if ( typeof module == 'string' ) { + callModuleApi( module, 'create', data[module] ); + } + } + } + } + }; + // Allow modules to extend the API + for ( module in $.wikiEditor.modules ) { + if ( 'api' in $.wikiEditor.modules[module] ) { + for ( call in $.wikiEditor.modules[module].api ) { + // Modules may not overwrite existing API functions - first come, + // first serve + if ( !( call in context.api ) ) { + context.api[call] = $.wikiEditor.modules[module].api[call]; + } + } + } + } + //Each browser seems to do this differently, so let's keep our editor + //consistent by always starting at the begining + context.$textarea.scrollToCaretPosition( 0 ); +} + +// If there was a configuration passed, it's assumed to be for the addModule +// API call +if ( arguments.length > 0 && typeof arguments[0] == 'object' ) { + context.api.addModule( context, arguments[0] ); +} else { // Since javascript gives arguments as an object, we need to convert them // so they can be used more easily arguments = $.makeArray( arguments ); @@ -1016,80 +1079,9 @@ if ( call in context.api ) { context.api[call]( context, arguments[0] == undefined ? {} : arguments[0] ); } - // Store the context for next time and return - return $(this).data( 'context', context ); } - // Nothing to do, just return - return $(this); } -/* Construction */ - -var instance = $.wikiEditor.instances.length; -context = { '$textarea': $(this), 'modules': {}, 'data': {}, 'instance': instance }; -$.wikiEditor.instances[instance] = $(this); - -// Encapsulate the textarea with some containers for layout -$(this) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui' ).attr( 'id', 'wikiEditor-ui' ) ) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-bottom' ).attr( 'id', 'wikiEditor-ui-bottom' ) ) - .wrap( $( '<div></div>' ).addClass( 'wikiEditor-ui-text' ).attr( 'id', 'wikiEditor-ui-text' ) ); - -// Get a reference to the outer container -context.$ui = $(this).parent().parent().parent(); -context.$ui.after( $( '<div style="clear:both;"></div>' ) ); -// Attach a container in the top -context.$ui.prepend( $( '<div></div>' ).addClass( 'wikiEditor-ui-top' ).attr( 'id', 'wikiEditor-ui-top' ) ); - -// Create a set of standard methods for internal and external use -context.api = { - /** - * Accepts either a string of the name of a module to add without any - * additional configuration parameters, or an object with members keyed with - * module names and valued with configuration objects - */ - addModule: function( context, data ) { - // A safe way of calling an API function on a module - function callModuleApi( module, call, data ) { - if ( - module in $.wikiEditor.modules && - 'fn' in $.wikiEditor.modules[module] && - call in $.wikiEditor.modules[module].fn - ) { - $.wikiEditor.modules[module].fn[call]( context, data ); - } - } - if ( typeof data == 'string' ) { - callModuleApi( data, 'create', {} ); - } else if ( typeof data == 'object' ) { - for ( module in data ) { - if ( typeof module == 'string' ) { - callModuleApi( module, 'create', data[module] ); - } - } - } - } -}; -// Allow modules to extend the API -for ( module in $.wikiEditor.modules ) { - if ( 'api' in $.wikiEditor.modules[module] ) { - for ( call in $.wikiEditor.modules[module].api ) { - // Modules may not overwrite existing API functions - first come, - // first serve - if ( !( call in context.api ) ) { - context.api[call] = $.wikiEditor.modules[module].api[call]; - } - } - } -} -// If there was a configuration passed, it's assumed to be for the addModule -// API call, so we can just send it on it's way right now -if ( arguments.length > 0 && typeof arguments[0] == 'object' ) { - context.api.addModule( context, arguments[0] ); -} -//Each browser seems to do this differently, so let's keep our editor -//consistent by always starting at the begining -context.$textarea.scrollToCaretPosition( 0 ); // Store the context for next time, and support chaining return $(this).data( 'wikiEditor-context', context ); @@ -1782,7 +1774,7 @@ context.$textarea .bind( 'keyup encapsulateSelection', function( event ) { - var context = $(this).data( 'context' ); + var context = $(this).data( 'wikiEditor-context' ); $(this).eachAsync( { bulk: 0, loop: function() { @@ -1792,9 +1784,9 @@ } ); } ) - .bind( 'mouseup scrollToPosition', + .bind( 'mouseup scrollToPosition focus', function( event ) { - var context = $(this).data( 'context' ); + var context = $(this).data( 'wikiEditor-context' ); $(this).eachAsync( { bulk: 0, loop: function() { @@ -1802,15 +1794,23 @@ } } ); } - ); + ) + .blur( function() { + var context = $(this).data( 'wikiEditor-context' ); + $.wikiEditor.modules.toc.fn.unhighlight( context ); + }); }, + + unhighlight: function( context ) { + context.modules.$toc.find( 'a' ).removeClass( 'currentSelection' ); + }, /** * Highlight the section the cursor is currently within * * @param {Object} context */ update: function( context ) { - context.modules.$toc.find( 'a' ).removeClass( 'currentSelection' ); + $.wikiEditor.modules.toc.fn.unhighlight( context ); var position = context.$textarea.getCaretPosition(); var section = 0; if ( context.data.outline.length > 0 ) { @@ -1957,4 +1957,4 @@ } } -}; } ) ( jQuery ); \ No newline at end of file +}; } ) ( jQuery ); Modified: branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.min.js =================================================================== --- branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.min.js 2009-09-16 17:17:16 UTC (rev 56420) +++ branches/wmf-deployment-work/extensions/UsabilityInitiative/js/plugins.combined.min.js 2009-09-16 17:47:04 UTC (rev 56421) @@ -68,13 +68,11 @@ return this.each(function(){$(this).focus();if(this.selectionStart||this.selectionStart=='0'){this.selectionStart=pos;this.selectionEnd=pos;$(this).scrollTop(getCaretScrollPosition(this));}else if(document.selection&&document.selection.createRange){var range=document.selection.createRange();var oldPos=$(this).getCaretPosition();var goBack=false;if(oldPos==pos){pos++;goBack=true;} range.moveToElementText(this);range.collapse();range.move('character',pos);range.select();this.scrollTop+=range.offsetTop;if(goBack){range.move('character',-1);range.select();}} $(this).trigger('scrollToPosition');});}});})(jQuery);(function($){$.wikiEditor={'modules':{},'instances':[],'supportedBrowsers':{'ltr':{'msie':7,'firefox':2,'opera':9,'safari':3,'chrome':1,'camino':1},'rtl':{'msie':8,'firefox':2,'opera':9,'safari':3,'chrome':1,'camino':1}},imgPath:wgScriptPath+'/extensions/UsabilityInitiative/images/wikiEditor/'};$.wikiEditor.isSupportKnown=function(){return(function(supportedBrowsers){return $.browser.name in supportedBrowsers;})($.wikiEditor.supportedBrowsers[$('body.rtl').size()?'rtl':'ltr']);};$.wikiEditor.isSupported=function(){return(function(supportedBrowsers){return $.browser.name in supportedBrowsers&&$.browser.versionNumber>=supportedBrowsers[$.browser.name];})($.wikiEditor.supportedBrowsers[$('body.rtl').size()?'rtl':'ltr']);};$.wikiEditor.autoMsg=function(object,property){if(typeof property=='object'){for(i in property){if(property[i]in object||property[i]+'Msg'in object){property=property[i];break;}}} -if(property in object){return object[property];}else if(property+'Msg'in object){return gM(object[property+'Msg']);}else{return'';}};$.fn.wikiEditor=function(){var context=$(this).data('wikiEditor-context');if(typeof context!=='undefined'){arguments=$.makeArray(arguments);if(arguments.length>0){var call=arguments.shift();if(call in context.api){context.api[call](context,arguments[0]==undefined?{}:arguments[0]);} -return $(this).data('context',context);} -return $(this);} -var instance=$.wikiEditor.instances.length;context={'$textarea':$(this),'modules':{},'data':{},'instance':instance};$.wikiEditor.instances[instance]=$(this);$(this).wrap($('<div></div>').addClass('wikiEditor-ui').attr('id','wikiEditor-ui')).wrap($('<div></div>').addClass('wikiEditor-ui-bottom').attr('id','wikiEditor-ui-bottom')).wrap($('<div></div>').addClass('wikiEditor-ui-text').attr('id','wikiEditor-ui-text'));context.$ui=$(this).parent().parent().parent();context.$ui.after($('<div style="clear:both;"></div>'));context.$ui.prepend($('<div></div>').addClass('wikiEditor-ui-top').attr('id','wikiEditor-ui-top'));context.api={addModule:function(context,data){function callModuleApi(module,call,data){if(module in $.wikiEditor.modules&&'fn'in $.wikiEditor.modules[module]&&call in $.wikiEditor.modules[module].fn){$.wikiEditor.modules[module].fn[call](context,data);}} +if(property in object){return object[property];}else if(property+'Msg'in object){return gM(object[property+'Msg']);}else{return'';}};$.fn.wikiEditor=function(){var context=$(this).data('wikiEditor-context');if(typeof context=='undefined'){var instance=$.wikiEditor.instances.length;context={'$textarea':$(this),'modules':{},'data':{},'instance':instance};$.wikiEditor.instances[instance]=$(this);$(this).wrap($('<div></div>').addClass('wikiEditor-ui').attr('id','wikiEditor-ui')).wrap($('<div></div>').addClass('wikiEditor-ui-bottom').attr('id','wikiEditor-ui-bottom')).wrap($('<div></div>').addClass('wikiEditor-ui-text').attr('id','wikiEditor-ui-text'));context.$ui=$(this).parent().parent().parent();context.$ui.after($('<div style="clear:both;"></div>'));context.$ui.prepend($('<div></div>').addClass('wikiEditor-ui-top').attr('id','wikiEditor-ui-top'));context.api={addModule:function(context,data){function callModuleApi(module,call,data){if(module in $.wikiEditor.modules&&'fn'in $.wikiEditor.modules[module]&&call in $.wikiEditor.modules[module].fn){$.wikiEditor.modules[module].fn[call](context,data);}} if(typeof data=='string'){callModuleApi(data,'create',{});}else if(typeof data=='object'){for(module in data){if(typeof module=='string'){callModuleApi(module,'create',data[module]);}}}}};for(module in $.wikiEditor.modules){if('api'in $.wikiEditor.modules[module]){for(call in $.wikiEditor.modules[module].api){if(!(call in context.api)){context.api[call]=$.wikiEditor.modules[module].api[call];}}}} -if(arguments.length>0&&typeof arguments[0]=='object'){context.api.addModule(context,arguments[0]);} -context.$textarea.scrollToCaretPosition(0);return $(this).data('wikiEditor-context',context);};})(jQuery);RegExp.escape=function(s){return s.replace(/([.*+?^${}()|\/\\[\]])/g,'\\$1');};(function($){$.wikiEditor.modules.dialogs={api:{addDialog:function(context,data){$.wikiEditor.modules.dialogs.fn.create(context,{'modules':data})},openDialog:function(context,data){if(data.dialog in $.wikiEditor.modules.dialogs.modules){$('#'+$.wikiEditor.modules.dialogs.modules[data.dialog].id).dialog('open');}},closeDialog:function(context,data){if(data.dialog in $.wikiEditor.modules.dialogs.modules){$('#'+$.wikiEditor.modules.dialogs.modules[data.dialog].id).dialog('close');}}},fn:{create:function(context,config){for(module in config){$.wikiEditor.modules.dialogs.modules[module]=config[module];} +context.$textarea.scrollToCaretPosition(0);} +if(arguments.length>0&&typeof arguments[0]=='object'){context.api.addModule(context,arguments[0]);}else{arguments=$.makeArray(arguments);if(arguments.length>0){var call=arguments.shift();if(call in context.api){context.api[call](context,arguments[0]==undefined?{}:arguments[0]);}}} +return $(this).data('wikiEditor-context',context);};})(jQuery);RegExp.escape=function(s){return s.replace(/([.*+?^${}()|\/\\[\]])/g,'\\$1');};(function($){$.wikiEditor.modules.dialogs={api:{addDialog:function(context,data){$.wikiEditor.modules.dialogs.fn.create(context,{'modules':data})},openDialog:function(context,data){if(data.dialog in $.wikiEditor.modules.dialogs.modules){$('#'+$.wikiEditor.modules.dialogs.modules[data.dialog].id).dialog('open');}},closeDialog:function(context,data){if(data.dialog in $.wikiEditor.modules.dialogs.modules){$('#'+$.wikiEditor.modules.dialogs.modules[data.dialog].id).dialog('close');}}},fn:{create:function(context,config){for(module in config){$.wikiEditor.modules.dialogs.modules[module]=config[module];} for(module in $.wikiEditor.modules.dialogs.modules){var module=$.wikiEditor.modules.dialogs.modules[module];if($('#'+module.id).size()==0){var configuration=module.dialog;configuration.bgiframe=true;configuration.autoOpen=false;configuration.modal=true;configuration.title=$.wikiEditor.autoMsg(module,'title');for(msg in configuration.buttons){configuration.buttons[gM(msg)]=configuration.buttons[msg];delete configuration.buttons[msg];} $('<div /> ').attr('id',module.id).html(module.html).data('context',context).appendTo($('body')).each(module.init).dialog(configuration);}}}},'modules':{}};})(jQuery);(function($){$.wikiEditor.modules.toolbar={api:{addToToolbar:function(context,data){for(type in data){switch(type){case'sections':var $sections=context.modules.$toolbar.find('div.sections');var $tabs=context.modules.$toolbar.find('div.tabs');for(section in data[type]){if(section=='main'){context.modules.$toolbar.prepend($.wikiEditor.modules.toolbar.fn.buildSection(context,section,data[type][section]));continue;} $sections.append($.wikiEditor.modules.toolbar.fn.buildSection(context,section,data[type][section]));$tabs.append($.wikiEditor.modules.toolbar.fn.buildTab(context,section,data[type][section]));} @@ -123,7 +121,7 @@ return $section;},updateBookletSelection:function(context,id,$pages,$index){var cookie='wikiEditor-'+context.instance+'-booklet-'+id+'-page';var selected=$.cookie(cookie);var $selectedIndex=$index.find('*[rel='+selected+']');if($selectedIndex.size()==0){selected=$index.children().eq(0).attr('rel');$.cookie(cookie,selected);} $pages.children().hide();$pages.find('*[rel='+selected+']').show();$index.children().removeClass('current');$selectedIndex.addClass('current');},build:function(context,config){var $tabs=$('<div />').addClass('tabs').appendTo(context.modules.$toolbar);var $sections=$('<div />').addClass('sections').appendTo(context.modules.$toolbar);context.modules.$toolbar.append($('<div />').css('clear','both'));var sectionQueue=[];for(section in config){if(section=='main'){context.modules.$toolbar.prepend($.wikiEditor.modules.toolbar.fn.buildSection(context,section,config[section]));}else{sectionQueue.push({'$sections':$sections,'context':context,'id':section,'config':config[section]});$tabs.append($.wikiEditor.modules.toolbar.fn.buildTab(context,section,config[section]));}} $.eachAsync(sectionQueue,{'bulk':0,'end':function(){$('body').css('position','static');$('body').css('position','relative');},'loop':function(i,s){s.$sections.append($.wikiEditor.modules.toolbar.fn.buildSection(s.context,s.id,s.config));}});}}};})(jQuery);(function($){$.wikiEditor.modules.toc={api:{},fn:{create:function(context,config){if('$toc'in context.modules){return;} -context.modules.$toc=$('<div></div>').addClass('wikiEditor-ui-toc').attr('id','wikiEditor-ui-toc');$.wikiEditor.modules.toc.fn.build(context,config);context.$ui.find('.wikiEditor-ui-bottom').append(context.modules.$toc);context.modules.$toc.height(context.$ui.find('.wikiEditor-ui-bottom').height());context.modules.$toc.css('width','12em').css('marginTop',-(context.$ui.find('.wikiEditor-ui-bottom').height()));context.$ui.find('.wikiEditor-ui-text').css(($('body.rtl').size()?'marginLeft':'marginRight'),'12em');$.wikiEditor.modules.toc.fn.build(context);$.wikiEditor.modules.toc.fn.update(context);context.$textarea.bind('keyup encapsulateSelection',function(event){var context=$(this).data('context');$(this).eachAsync({bulk:0,loop:function(){$.wikiEditor.modules.toc.fn.build(context);$.wikiEditor.modules.toc.fn.update(context);}});}).bind('mouseup scrollToPosition',function(event){var context=$(this).data('context');$(this).eachAsync({bulk:0,loop:function(){$.wikiEditor.modules.toc.fn.update(context);}});});},update:function(context){context.modules.$toc.find('a').removeClass('currentSelection');var position=context.$textarea.getCaretPosition();var section=0;if(context.data.outline.length>0){if(!(position<context.data.outline[0].position-1)){while(section<context.data.outline.length&&context.data.outline[section].position-1<position){section++;} +context.modules.$toc=$('<div></div>').addClass('wikiEditor-ui-toc').attr('id','wikiEditor-ui-toc');$.wikiEditor.modules.toc.fn.build(context,config);context.$ui.find('.wikiEditor-ui-bottom').append(context.modules.$toc);context.modules.$toc.height(context.$ui.find('.wikiEditor-ui-bottom').height());context.modules.$toc.css('width','12em').css('marginTop',-(context.$ui.find('.wikiEditor-ui-bottom').height()));context.$ui.find('.wikiEditor-ui-text').css(($('body.rtl').size()?'marginLeft':'marginRight'),'12em');$.wikiEditor.modules.toc.fn.build(context);$.wikiEditor.modules.toc.fn.update(context);context.$textarea.bind('keyup encapsulateSelection',function(event){var context=$(this).data('wikiEditor-context');$(this).eachAsync({bulk:0,loop:function(){$.wikiEditor.modules.toc.fn.build(context);$.wikiEditor.modules.toc.fn.update(context);}});}).bind('mouseup scrollToPosition focus',function(event){var context=$(this).data('wikiEditor-context');$(this).eachAsync({bulk:0,loop:function(){$.wikiEditor.modules.toc.fn.update(context);}});}).blur(function(){var context=$(this).data('wikiEditor-context');$.wikiEditor.modules.toc.fn.unhighlight(context);});},unhighlight:function(context){context.modules.$toc.find('a').removeClass('currentSelection');},update:function(context){$.wikiEditor.modules.toc.fn.unhighlight(context);var position=context.$textarea.getCaretPosition();var section=0;if(context.data.outline.length>0){if(!(position<context.data.outline[0].position-1)){while(section<context.data.outline.length&&context.data.outline[section].position-1<position){section++;} section=Math.max(0,section);} context.modules.$toc.find('a.section-'+section).addClass('currentSelection');}},build:function(context){function buildStructure(outline,offset,level){if(offset==undefined)offset=0;if(level==undefined)level=1;var sections=[];for(var i=offset;i<outline.length;i++){if(outline[i].nLevel==level){var sub=buildStructure(outline,i+1,level+1);if(sub.length){outline[i].sections=sub;} sections[sections.length]=outline[i];}else if(outline[i].nLevel<level){break;}} _______________________________________________ MediaWiki-CVS mailing list MediaWiki-CVS@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs