summaryrefslogtreecommitdiff
path: root/www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
diff options
context:
space:
mode:
Diffstat (limited to 'www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js')
-rw-r--r--www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js181
1 files changed, 181 insertions, 0 deletions
diff --git a/www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js b/www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
new file mode 100644
index 00000000..d25dbd12
--- /dev/null
+++ b/www/wiki/extensions/WikiEditor/modules/jquery.wikiEditor.preview.js
@@ -0,0 +1,181 @@
+/* Preview module for wikiEditor */
+( function ( $, mw ) {
+ $.wikiEditor.modules.preview = {
+
+ /**
+ * Compatibility map
+ */
+ browsers: {
+ // Left-to-right languages
+ ltr: {
+ msie: [ [ '>=', 9 ] ],
+ firefox: [ [ '>=', 4 ] ],
+ opera: [ [ '>=', '10.5' ] ],
+ safari: [ [ '>=', 5 ] ],
+ chrome: [ [ '>=', 5 ] ]
+ },
+ // Right-to-left languages
+ rtl: {
+ msie: [ [ '>=', 9 ] ],
+ firefox: [ [ '>=', 4 ] ],
+ opera: [ [ '>=', '10.5' ] ],
+ safari: [ [ '>=', 5 ] ],
+ chrome: [ [ '>=', 5 ] ]
+ }
+ },
+
+ /**
+ * Internally used functions
+ */
+ fn: {
+ /**
+ * Creates a preview module within a wikiEditor
+ *
+ * @param {Object} context Context object of editor to create module in
+ */
+ create: function ( context ) {
+ var loadingMsg,
+ api = new mw.Api();
+
+ if ( 'initialized' in context.modules.preview ) {
+ return;
+ }
+ context.modules.preview = {
+ initialized: true,
+ previewText: null,
+ changesText: null
+ };
+ context.modules.preview.$preview = context.fn.addView( {
+ name: 'preview',
+ titleMsg: 'wikieditor-preview-tab',
+ init: function ( context ) {
+ // Gets the latest copy of the wikitext
+ var wikitext = context.$textarea.textSelection( 'getContents' );
+ // Aborts when nothing has changed since the last preview
+ if ( context.modules.preview.previewText === wikitext ) {
+ return;
+ }
+ context.modules.preview.$preview.find( '.wikiEditor-preview-contents' ).empty();
+ context.modules.preview.$preview.find( '.wikiEditor-preview-loading' ).show();
+ api.post( {
+ formatversion: 2,
+ action: 'parse',
+ title: mw.config.get( 'wgPageName' ),
+ text: wikitext,
+ pst: '',
+ prop: 'text|modules|jsconfigvars',
+ preview: true,
+ disableeditsection: true,
+ useskin: mw.config.get( 'skin' ),
+ uselang: mw.config.get( 'wgUserLanguage' )
+ } ).always( function () {
+ context.modules.preview.$preview.find( '.wikiEditor-preview-loading' ).hide();
+ } ).done( function ( data ) {
+ var loadmodules, $content;
+ if ( !data.parse || !data.parse.text ) {
+ return;
+ }
+
+ if ( data.parse.jsconfigvars ) {
+ mw.config.set( data.parse.jsconfigvars );
+ }
+ loadmodules = data.parse.modules.concat(
+ data.parse.modulescripts,
+ data.parse.modulestyles
+ );
+ mw.loader.load( loadmodules );
+
+ context.modules.preview.previewText = wikitext;
+ $content = context.modules.preview.$preview.find( '.wikiEditor-preview-contents' )
+ .detach()
+ .html( data.parse.text );
+ $content.append( '<div class="visualClear"></div>' )
+ .find( 'a:not([href^="#"])' )
+ .click( false );
+
+ mw.hook( 'wikipage.content' ).fire( $content );
+ context.modules.preview.$preview.append( $content );
+ } );
+ }
+ } );
+
+ context.$changesTab = context.fn.addView( {
+ name: 'changes',
+ titleMsg: 'wikieditor-preview-changes-tab',
+ init: function ( context ) {
+ // Gets the latest copy of the wikitext
+ var section, postdata, postPromise,
+ wikitext = context.$textarea.textSelection( 'getContents' );
+ // Aborts when nothing has changed since the last time
+ if ( context.modules.preview.changesText === wikitext ) {
+ return;
+ }
+ context.$changesTab.find( 'table.diff tbody' ).empty();
+ context.$changesTab.find( '.wikiEditor-preview-loading' ).show();
+
+ section = $( '[name="wpSection"]' ).val();
+ postdata = {
+ formatversion: 2,
+ action: 'query',
+ prop: 'revisions',
+ titles: mw.config.get( 'wgPageName' ),
+ rvdifftotext: wikitext,
+ rvdifftotextpst: true,
+ rvprop: '',
+ rvsection: section === '' ? undefined : section
+ };
+ postPromise = api.post( postdata );
+
+ $.when( postPromise, mw.loader.using( 'mediawiki.diff.styles' ) )
+ .always( function () {
+ context.$changesTab.find( '.wikiEditor-preview-loading' ).hide();
+ } )
+ .done( function ( postResult ) {
+ var diff;
+ try {
+ diff = postResult[ 0 ].query.pages[ 0 ]
+ .revisions[ 0 ].diff.body;
+
+ context.$changesTab.find( 'table.diff tbody' )
+ .html( diff )
+ .append( '<div class="visualClear"></div>' );
+ mw.hook( 'wikipage.diff' )
+ .fire( context.$changesTab.find( 'table.diff' ) );
+ context.modules.preview.changesText = wikitext;
+ } catch ( e ) {
+ // "data.blah is undefined" error, ignore
+ }
+ } );
+ }
+ } );
+
+ loadingMsg = mw.msg( 'wikieditor-preview-loading' );
+ context.modules.preview.$preview
+ .add( context.$changesTab )
+ .append( $( '<div>' )
+ .addClass( 'wikiEditor-preview-loading' )
+ .append( $( '<img>' )
+ .addClass( 'wikiEditor-preview-spinner' )
+ .attr( {
+ src: $.wikiEditor.imgPath + 'dialogs/loading.gif',
+ valign: 'absmiddle',
+ alt: loadingMsg,
+ title: loadingMsg
+ } )
+ )
+ .append(
+ $( '<span>' ).text( loadingMsg )
+ )
+ )
+ .append( $( '<div>' )
+ .addClass( 'wikiEditor-preview-contents' )
+ );
+ context.$changesTab.find( '.wikiEditor-preview-contents' )
+ .html( '<table class="diff"><col class="diff-marker"/><col class="diff-content"/>' +
+ '<col class="diff-marker"/><col class="diff-content"/><tbody/></table>' );
+ }
+ }
+
+ };
+
+}( jQuery, mediaWiki ) );