http://www.mediawiki.org/wiki/Special:Code/MediaWiki/89810
Revision: 89810
Author: brion
Date: 2011-06-10 01:11:18 +0000 (Fri, 10 Jun 2011)
Log Message:
-----------
Partway through integrating CodeEditor more closely with WikiEditor. Special
character insertions now work! Bold, link etc will insert their sample text,
which is less useful but hey.
Modified Paths:
--------------
trunk/extensions/CodeEditor/CodeEditor.php
trunk/extensions/CodeEditor/modules/ext.codeEditor.js
Added Paths:
-----------
trunk/extensions/CodeEditor/modules/jquery.codeEditor.js
Modified: trunk/extensions/CodeEditor/CodeEditor.php
===================================================================
--- trunk/extensions/CodeEditor/CodeEditor.php 2011-06-09 22:56:43 UTC (rev
89809)
+++ trunk/extensions/CodeEditor/CodeEditor.php 2011-06-10 01:11:18 UTC (rev
89810)
@@ -27,13 +27,21 @@
$tpl = array(
'localBasePath' => dirname( __FILE__ ) . '/modules',
'remoteExtPath' => 'CodeEditor/modules',
- 'group' => 'ext.codeEditor',
+ 'group' => 'ext.wikiEditor',
);
$wgResourceModules['ext.codeEditor'] = array(
'scripts' => 'ext.codeEditor.js',
'dependencies' => array(
'ext.wikiEditor',
+ 'jquery.codeEditor'
+ ),
+) + $tpl;
+
+$wgResourceModules['jquery.codeEditor'] = array(
+ 'scripts' => 'jquery.codeEditor.js',
+ 'dependencies' => array(
+ 'jquery.wikiEditor',
'ext.codeEditor.ace',
),
) + $tpl;
Modified: trunk/extensions/CodeEditor/modules/ext.codeEditor.js
===================================================================
--- trunk/extensions/CodeEditor/modules/ext.codeEditor.js 2011-06-09
22:56:43 UTC (rev 89809)
+++ trunk/extensions/CodeEditor/modules/ext.codeEditor.js 2011-06-10
01:11:18 UTC (rev 89810)
@@ -35,56 +35,11 @@
* - ctrl+R, ctrl+L, ctrl+T are taken over by the editor, which is SUPER
annoying
* https://github.com/ajaxorg/ace/issues/210
*/
-(function(mw, $) {
- // This should point to a checkout of Ace source.
- var editorBase = mw.config.get('wgExtensionAssetsPath') +
'/CodeEditor/modules/ace/';
+/*
+ * JavaScript for WikiEditor Table of Contents
+ */
- $(function() {
- var box = $('#wpTextbox1');
- if (box.length > 0) {
- var matches = /\.(js|css)$/.exec(wgTitle);
- if (matches && (wgNamespaceNumber == 2 /* User: */ ||
wgNamespaceNumber == 8 /* MediaWiki: */)) {
- var ext = matches[1];
- var map = {js: 'javascript', css: 'css'};
- var lang = map[ext];
-
- // Ace doesn't like replacing a textarea
directly.
- // We'll stub this out to sit on top of it...
- // line-height is needed to compensate for
oddity in WikiEditor extension, which zeroes the line-height on a parent
container
- var container = $('<div style="position:
relative"><div class="editor" style="line-height: 1.5em; top: 0px; left: 0px;
right: 0px; bottom: 0px; border: 1px solid
gray"></div></div>').insertAfter(box);
- var editdiv = container.find('.editor');
-
- box.css('display', 'none');
- container.width(box.width())
- .height(box.height());
-
- editdiv.text(box.val());
- var editor = ace.edit(editdiv[0]);
- box.closest('form').submit(function(event) {
- box.val(editor.getSession().getValue());
- });
- editor.getSession().setMode(new
(require("ace/mode/" + lang).Mode));
-
- // Force the box to resize horizontally to
match in future :D
- var resize = function() {
- container.width(box.width());
- };
- $(window).resize(resize);
- // Use jquery.ui.resizable so user can make the
box taller too
- container.resizable({
- handles: 's',
- minHeight: box.height(),
- resize: function() {
- editor.resize();
- }
- });
-
- var summary = $('#wpSummary');
- if (summary.val() == '') {
- summary.val('/* using
[[mw:CodeEditor|CodeEditor]] */ ');
- }
- }
- }
- });
-
-})(mediaWiki, jQuery);
+$( document ).ready( function() {
+ // Add code editor module
+ $( '#wpTextbox1' ).wikiEditor( 'addModule', 'codeEditor' );
+} );
Added: trunk/extensions/CodeEditor/modules/jquery.codeEditor.js
===================================================================
--- trunk/extensions/CodeEditor/modules/jquery.codeEditor.js
(rev 0)
+++ trunk/extensions/CodeEditor/modules/jquery.codeEditor.js 2011-06-10
01:11:18 UTC (rev 89810)
@@ -0,0 +1,207 @@
+/* Ace syntax-highlighting code editor extension for wikiEditor */
+
+( function( $ ) {
+
+$.wikiEditor.modules.codeEditor = {
+
+/**
+ * Core Requirements
+ */
+'req': [ 'codeEditor' ],
+/**
+ * Configuration
+ */
+cfg: {
+ //
+},
+/**
+ * API accessible functions
+ */
+api: {
+ //
+},
+/**
+ * Event handlers
+ */
+evt: {
+ //
+},
+/**
+ * Internally used functions
+ */
+fn: {
+}
+
+};
+
+$.wikiEditor.extensions.codeEditor = function( context ) {
+
+/*
+ * Event Handlers
+ *
+ * These act as filters returning false if the event should be ignored or
returning true if it should be passed
+ * on to all modules. This is also where we can attach some extra information
to the events.
+ */
+context.evt = $.extend( context.evt, {
+ /**
+ * Filters change events, which occur when the user interacts with the
contents of the iframe. The goal of this
+ * function is to both classify the scope of changes as 'division' or
'character' and to prevent further
+ * processing of events which did not actually change the content of
the iframe.
+ */
+ 'keydown': function( event ) {
+ },
+ 'change': function( event ) {
+ },
+ 'delayedChange': function( event ) {
+ },
+ 'cut': function( event ) {
+ },
+ 'paste': function( event ) {
+ },
+ 'ready': function( event ) {
+ }
+} );
+
+/**
+ * Internally used functions
+ */
+context.fn = $.extend( context.fn, {
+ 'saveCursorAndScrollTop': function() {
+ // Stub out textarea behavior
+ return;
+ },
+ 'restoreCursorAndScrollTop': function() {
+ // Stub out textarea behavior
+ return;
+ },
+ 'saveSelection': function() {
+ },
+ 'restoreSelection': function() {
+ },
+ /**
+ * Sets up the iframe in place of the textarea to allow more advanced
operations
+ */
+ 'setupCodeEditor': function() {
+ var box = context.$textarea;
+
+ var matches = /\.(js|css)$/.exec(wgTitle);
+ if (matches && (wgNamespaceNumber == 2 /* User: */ ||
wgNamespaceNumber == 8 /* MediaWiki: */)) {
+ var ext = matches[1];
+ var map = {js: 'javascript', css: 'css'};
+ var lang = map[ext];
+
+ // Ace doesn't like replacing a textarea directly.
+ // We'll stub this out to sit on top of it...
+ // line-height is needed to compensate for oddity in
WikiEditor extension, which zeroes the line-height on a parent container
+ var container = $('<div style="position: relative"><div
class="editor" style="line-height: 1.5em; top: 0px; left: 0px; right: 0px;
bottom: 0px; border: 1px solid gray"></div></div>').insertAfter(box);
+ var editdiv = container.find('.editor');
+
+ box.css('display', 'none');
+ container.width(box.width())
+ .height(box.height());
+
+ editdiv.text(box.val());
+ context.codeEditor = ace.edit(editdiv[0]);
+
+ // fakeout for bug 29328
+ context.$iframe = [
+ {
+ contentWindow: {
+ focus: function() {
+
context.codeEditor.focus();
+ }
+ }
+ }
+ ];
+ box.closest('form').submit(function(event) {
+
box.val(context.codeEditor.getSession().getValue());
+ });
+ context.codeEditor.getSession().setMode(new
(require("ace/mode/" + lang).Mode));
+
+ // Force the box to resize horizontally to match in
future :D
+ var resize = function() {
+ container.width(box.width());
+ };
+ $(window).resize(resize);
+ // Use jquery.ui.resizable so user can make the box
taller too
+ container.resizable({
+ handles: 's',
+ minHeight: box.height(),
+ resize: function() {
+ context.codeEditor.resize();
+ }
+ });
+
+ var summary = $('#wpSummary');
+ if (summary.val() == '') {
+ summary.val('/* using
[[mw:CodeEditor|CodeEditor]] */ ');
+ }
+ // Let modules know we're ready to start working with
the content
+ context.fn.trigger( 'ready' );
+ }
+ },
+
+ /*
+ * Compatibility with the $.textSelection jQuery plug-in. When the
iframe is in use, these functions provide
+ * equivilant functionality to the otherwise textarea-based
functionality.
+ */
+
+ 'getElementAtCursor': function() {
+ },
+
+ /**
+ * Gets the currently selected text in the content
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ */
+ 'getSelection': function() {
+ return context.$codeEditor.getSelectionRange();
+ },
+ /**
+ * Inserts text at the begining and end of a text selection, optionally
inserting text at the caret when
+ * selection is empty.
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ */
+ 'encapsulateSelection': function( options ) {
+ // Hack! Handle actual selection logic.
+ var text = options.pre + options.peri + options.post;
+ context.codeEditor.insert( text );
+ },
+ /**
+ * Gets the position (in resolution of bytes not nessecarily
characters) in a textarea
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ */
+ 'getCaretPosition': function( options ) {
+ },
+ /**
+ * Sets the selection of the content
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ *
+ * @param start Character offset of selection start
+ * @param end Character offset of selection end
+ * @param startContainer Element in iframe to start selection in. If
not set, start is a character offset
+ * @param endContainer Element in iframe to end selection in. If not
set, end is a character offset
+ */
+ 'setSelection': function( options ) {
+ },
+ /**
+ * Scroll a textarea to the current cursor position. You can set the
cursor position with setSelection()
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ */
+ 'scrollToCaretPosition': function( options ) {
+ //context.fn.scrollToTop( context.fn.getElementAtCursor(), true
);
+ },
+ /**
+ * Scroll an element to the top of the iframe
+ * DO NOT CALL THIS DIRECTLY, use $.textSelection( 'functionname',
options ) instead
+ *
+ * @param $element jQuery object containing an element in the iframe
+ * @param force If true, scroll the element even if it's already visible
+ */
+ 'scrollToTop': function( $element, force ) {
+ }
+} );
+
+/* Setup the editor */
+context.fn.setupCodeEditor();
+
+} } )( jQuery );
Property changes on: trunk/extensions/CodeEditor/modules/jquery.codeEditor.js
___________________________________________________________________
Added: svn:eol-style
+ native
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs