Linux anchor 4.4.0-210-generic #242-Ubuntu SMP Fri Apr 16 09:57:56 UTC 2021 x86_64
Apache/2.4.18 (Ubuntu)
Server IP : 10.10.100.4 & Your IP : 216.73.217.150
Domains :
Cant Read [ /etc/named.conf ]
User : www-data
Terminal
Auto Root
Create File
Create Folder
Localroot Suggester
Backdoor Destroyer
Readme
/
var /
www /
backup /
extensions /
WikiEditor /
modules /
Delete
Unzip
Name
Size
Permission
Date
Action
images
[ DIR ]
drwxr-xr-x
2012-03-22 16:23
contentCollector.js
11.48
KB
-rw-r--r--
2010-12-06 23:51
ext.wikiEditor.css
483
B
-rw-r--r--
2010-09-20 22:06
ext.wikiEditor.dialogs.js
385
B
-rw-r--r--
2011-02-25 01:01
ext.wikiEditor.highlight.js
174
B
-rw-r--r--
2010-09-20 22:06
ext.wikiEditor.js
136
B
-rw-r--r--
2010-09-20 22:06
ext.wikiEditor.preview.js
180
B
-rw-r--r--
2011-06-07 01:18
ext.wikiEditor.previewDialog.js
186
B
-rw-r--r--
2010-09-20 22:06
ext.wikiEditor.publish.js
172
B
-rw-r--r--
2011-06-07 01:18
ext.wikiEditor.templateEditor.js
300
B
-rw-r--r--
2011-06-26 21:25
ext.wikiEditor.templates.js
276
B
-rw-r--r--
2011-06-26 21:25
ext.wikiEditor.tests.toolbar.js
5.42
KB
-rw-r--r--
2011-07-02 11:09
ext.wikiEditor.toc.js
181
B
-rw-r--r--
2010-09-20 22:06
ext.wikiEditor.toolbar.hideSig.js
598
B
-rw-r--r--
2011-11-09 15:51
ext.wikiEditor.toolbar.js
453
B
-rw-r--r--
2011-02-24 02:45
jquery.wikiEditor.css
2.02
KB
-rw-r--r--
2011-01-12 01:06
jquery.wikiEditor.dialogs.config.css
5.32
KB
-rw-r--r--
2011-04-21 10:59
jquery.wikiEditor.dialogs.config.js
45.15
KB
-rw-r--r--
2011-11-09 17:12
jquery.wikiEditor.dialogs.css
1.31
KB
-rw-r--r--
2010-09-16 23:44
jquery.wikiEditor.dialogs.js
7.59
KB
-rw-r--r--
2011-08-28 17:32
jquery.wikiEditor.highlight.js
12.42
KB
-rw-r--r--
2010-09-15 05:08
jquery.wikiEditor.html
3.78
KB
-rw-r--r--
2011-01-04 13:03
jquery.wikiEditor.iframe.js
50.21
KB
-rw-r--r--
2011-06-26 21:25
jquery.wikiEditor.js
21.04
KB
-rw-r--r--
2011-06-26 21:25
jquery.wikiEditor.preview.css
522
B
-rw-r--r--
2010-09-16 00:40
jquery.wikiEditor.preview.js
4.81
KB
-rw-r--r--
2011-07-08 20:00
jquery.wikiEditor.previewDialog.css
826
B
-rw-r--r--
2010-09-17 00:57
jquery.wikiEditor.previewDialog.js
3.78
KB
-rw-r--r--
2011-06-26 21:25
jquery.wikiEditor.publish.js
4.92
KB
-rw-r--r--
2011-06-07 01:18
jquery.wikiEditor.templateEditor.js
28.4
KB
-rw-r--r--
2011-01-04 13:53
jquery.wikiEditor.templates.js
1.8
KB
-rw-r--r--
2010-09-15 05:08
jquery.wikiEditor.toc.css
3.38
KB
-rw-r--r--
2011-01-12 01:06
jquery.wikiEditor.toc.js
24.09
KB
-rw-r--r--
2011-06-26 21:25
jquery.wikiEditor.toolbar.config.js
45.44
KB
-rw-r--r--
2011-10-20 23:36
jquery.wikiEditor.toolbar.css
6.88
KB
-rw-r--r--
2011-02-19 16:02
jquery.wikiEditor.toolbar.js
24.43
KB
-rw-r--r--
2011-11-14 18:59
Save
Rename
/* TemplateEditor module for wikiEditor */ ( function( $ ) { $.wikiEditor.modules.templateEditor = { /** * Name mappings, dirty hack which will be removed once "TemplateInfo" extension is more fully supported */ 'nameMappings': { //keep these all lowercase to navigate web of redirects "infobox skyscraper": "building_name", "infobox settlement": "official_name" }, /** * Compatability map */ 'browsers': { // Left-to-right languages 'ltr': { 'msie': [['>=', 8]], 'firefox': [['>=', 3]], 'opera': [['>=', 10]], 'safari': [['>=', 4]] }, // Right-to-left languages 'rtl': { 'msie': false, 'firefox': [['>=', 3]], 'opera': [['>=', 10]], 'safari': [['>=', 4]] } }, /** * Core Requirements */ 'req': [ 'iframe' ], /** * Event handlers */ evt: { mark: function( context, event ) { // The markers returned by this function are skipped on realchange, so don't regenerate them in that case if ( context.modules.highlight.currentScope == 'realchange' ) { return; } // Get references to the markers and tokens from the current context var markers = context.modules.highlight.markers; var tokenArray = context.modules.highlight.tokenArray; // Collect matching level 0 template call boundaries from the tokenArray var level = 0; var tokenIndex = 0; while ( tokenIndex < tokenArray.length ){ while ( tokenIndex < tokenArray.length && tokenArray[tokenIndex].label != 'TEMPLATE_BEGIN' ) { tokenIndex++; } //open template if ( tokenIndex < tokenArray.length ) { var beginIndex = tokenIndex; var endIndex = -1; //no match found var openTemplates = 1; var templatesMatched = false; while ( tokenIndex < tokenArray.length - 1 && endIndex == -1 ) { tokenIndex++; if ( tokenArray[tokenIndex].label == 'TEMPLATE_BEGIN' ) { openTemplates++; } else if ( tokenArray[tokenIndex].label == 'TEMPLATE_END' ) { openTemplates--; if ( openTemplates == 0 ) { endIndex = tokenIndex; } //we can stop looping } }//while finding template ending if ( endIndex != -1 ) { markers.push( { start: tokenArray[beginIndex].offset, end: tokenArray[endIndex].offset, type: 'template', anchor: 'wrap', afterWrap: function( node ) { // Generate model var model = $.wikiEditor.modules.templateEditor.fn.updateModel( $( node ) ); if ( model.isCollapsible() ) { $.wikiEditor.modules.templateEditor.fn.wrapTemplate( $( node ) ); $.wikiEditor.modules.templateEditor.fn.bindTemplateEvents( $( node ) ); } else { $( node ).addClass( 'wikiEditor-template-text' ); } }, beforeUnwrap: function( node ) { if ( $( node ).parent().hasClass( 'wikiEditor-template' ) ) { $.wikiEditor.modules.templateEditor.fn.unwrapTemplate( $( node ) ); } }, onSkip: function( node ) { if ( $( node ).html() == $( node ).data( 'oldHTML' ) ) { // No change return; } // Text changed, regenerate model var model = $.wikiEditor.modules.templateEditor.fn.updateModel( $( node ) ); // Update template name if needed if ( $( node ).parent().hasClass( 'wikiEditor-template' ) ) { var $label = $( node ).parent().find( '.wikiEditor-template-label' ); var displayName = $.wikiEditor.modules.templateEditor.fn.getTemplateDisplayName( model ); if ( $label.text() != displayName ) { $label.text( displayName ); } } // Wrap or unwrap the template if needed if ( $( node ).parent().hasClass( 'wikiEditor-template' ) && !model.isCollapsible() ) { $.wikiEditor.modules.templateEditor.fn.unwrapTemplate( $( node ) ); } else if ( !$( node ).parent().hasClass( 'wikiEditor-template' ) && model.isCollapsible() ) { $.wikiEditor.modules.templateEditor.fn.wrapTemplate( $( node ) ); $.wikiEditor.modules.templateEditor.fn.bindTemplateEvents( $( node ) ); } }, getAnchor: function( ca1, ca2 ) { return $( ca1.parentNode ).is( 'span.wikiEditor-template-text' ) ? ca1.parentNode : null; }, context: context, skipDivision: 'realchange' } ); } else { //else this was an unmatched opening tokenArray[beginIndex].label = 'TEMPLATE_FALSE_BEGIN'; tokenIndex = beginIndex; } }//if opentemplates } }, //mark keydown: function( context, event ) { // Reset our ignoreKeypress variable if it's set to true if ( context.$iframe.data( 'ignoreKeypress' ) ) { context.$iframe.data( 'ignoreKeypress', false ); } var $evtElem = event.jQueryNode; if ( $evtElem.hasClass( 'wikiEditor-template-label' ) ) { // Allow anything if the command or control key are depressed if ( event.ctrlKey || event.metaKey ) return true; switch ( event.which ) { case 13: // Enter $evtElem.click(); event.preventDefault(); return false; case 32: // Space $evtElem.parent().siblings( '.wikiEditor-template-expand' ).click(); event.preventDefault(); return false; case 37:// Left case 38:// Up case 39:// Right case 40: //Down return true; default: // Set the ignroreKeypress variable so we don't allow typing if the key is held context.$iframe.data( 'ignoreKeypress', true ); // Can't type in a template name event.preventDefault(); return false; } } else if ( $evtElem.hasClass( 'wikiEditor-template-text' ) ) { switch ( event.which ) { case 13: // Enter // Ensure that the user can't break this by holding in the enter key context.$iframe.data( 'ignoreKeypress', true ); // FIXME: May be a more elegant way to do this, but this works too context.fn.encapsulateSelection( { 'pre': '\n', 'peri': '', 'post': '' } ); event.preventDefault(); return false; default: return true; } } }, keyup: function( context, event ) { // Rest our ignoreKeypress variable if it's set to true if ( context.$iframe.data( 'ignoreKeypress' ) ) { context.$iframe.data( 'ignoreKeypress', false ); } return true; }, keypress: function( context, event ) { // If this event is from a keydown event which we want to block, ignore it return ( context.$iframe.data( 'ignoreKeypress' ) ? false : true ); } }, /** * Regular expressions that produce tokens */ exp: [ { 'regex': /{{/, 'label': "TEMPLATE_BEGIN" }, { 'regex': /}}/, 'label': "TEMPLATE_END", 'markAfter': true } ], /** * Configuration */ cfg: { }, /** * Internally used functions */ fn: { /** * Creates template form module within wikieditor * @param context Context object of editor to create module in * @param config Configuration object to create module from */ create: function( context, config ) { // Initialize module within the context context.modules.templateEditor = {}; }, /** * Turns a simple template wrapper (really just a <span>) into a complex one * @param $wrapper Wrapping <span> */ wrapTemplate: function( $wrapper ) { var model = $wrapper.data( 'model' ); var context = $wrapper.data( 'marker' ).context; var $template = $wrapper .wrap( '<span class="wikiEditor-template"></span>' ) .addClass( 'wikiEditor-template-text wikiEditor-template-text-shrunken' ) .parent() .addClass( 'wikiEditor-template-collapsed' ) .prepend( '<span class="wikiEditor-template-expand wikiEditor-noinclude"></span>' + '<span class="wikiEditor-template-name wikiEditor-noinclude">' + '<span class="wikiEditor-template-label wikiEditor-noinclude">' + $.wikiEditor.modules.templateEditor.fn.getTemplateDisplayName( model ) + '</span>' + '<span class="wikiEditor-template-dialog wikiEditor-noinclude"></span>' + '</span>' ); }, /** * Turn a complex template wrapper back into a simple one * @param $wrapper Wrapping <span> */ unwrapTemplate: function( $wrapper ) { $wrapper.parent().replaceWith( $wrapper ); }, /** * Bind events to a template * @param $wrapper Original wrapper for the template to bind events to */ bindTemplateEvents: function( $wrapper ) { var $template = $wrapper.parent( '.wikiEditor-template' ); if ( typeof ( opera ) == "undefined" ) { $template.parent().attr('contentEditable', 'false'); } $template.click( function(event) {event.preventDefault(); return false;} ); $template.find( '.wikiEditor-template-name' ) .click( function( event ) { $.wikiEditor.modules.templateEditor.fn.createDialog( $wrapper ); event.stopPropagation(); return false; } ) .mousedown( function( event ) { event.stopPropagation(); return false; } ); $template.find( '.wikiEditor-template-expand' ) .click( function( event ) { $.wikiEditor.modules.templateEditor.fn.toggleWikiTextEditor( $wrapper ); event.stopPropagation(); return false; } ) .mousedown( function( event ) { event.stopPropagation(); return false; } ); }, /** * Toggle the visisbilty of the wikitext for a given template * @param $wrapper The origianl wrapper we want expand/collapse */ toggleWikiTextEditor: function( $wrapper ) { var context = $wrapper.data( 'marker' ).context; var $template = $wrapper.parent( '.wikiEditor-template' ); context.fn.purgeOffsets(); $template .toggleClass( 'wikiEditor-template-expanded' ) .toggleClass( 'wikiEditor-template-collapsed' ) ; var $templateText = $template.find( '.wikiEditor-template-text' ); $templateText.toggleClass( 'wikiEditor-template-text-shrunken' ); $templateText.toggleClass( 'wikiEditor-template-text-visible' ); if( $templateText.hasClass('wikiEditor-template-text-shrunken') ){ //we just closed the template // Update the model if we need to if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) { var templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText ); //this is the only place the template name can be changed; keep the template name in sync var $tLabel = $template.find( '.wikiEditor-template-label' ); $tLabel.text( $.wikiEditor.modules.templateEditor.fn.getTemplateDisplayName( templateModel ) ); } } }, /** * Create a dialog for editing a given template and open it * @param $wrapper The origianl wrapper for which to create the dialog */ createDialog: function( $wrapper ) { var context = $wrapper.data( 'marker' ).context; var $template = $wrapper.parent( '.wikiEditor-template' ); var dialog = { 'titleMsg': 'wikieditor-template-editor-dialog-title', 'id': 'wikiEditor-template-dialog', 'html': '\ <fieldset>\ <div class="wikiEditor-template-dialog-title" />\ <div class="wikiEditor-template-dialog-fields" />\ </fieldset>', init: function() { $(this).find( '[rel]' ).each( function() { $(this).text( mediaWiki.msg( $(this).attr( 'rel' ) ) ); } ); }, immediateCreate: true, dialog: { width: 600, height: 400, dialogClass: 'wikiEditor-toolbar-dialog', buttons: { 'wikieditor-template-editor-dialog-submit': function() { // More user feedback var $templateDiv = $( this ).data( 'templateDiv' ); context.fn.highlightLine( $templateDiv ); var $templateText = $templateDiv.children( '.wikiEditor-template-text' ); var templateModel = $templateText.data( 'model' ); $( this ).find( '.wikiEditor-template-dialog-field-wrapper textarea' ).each( function() { // Update the value templateModel.setValue( $( this ).data( 'name' ), $( this ).val() ); }); //keep text consistent $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText, templateModel ); $( this ).dialog( 'close' ); }, 'wikieditor-template-editor-dialog-cancel': function() { $(this).dialog( 'close' ); } }, open: function() { var $templateDiv = $( this ).data( 'templateDiv' ); var $templateText = $templateDiv.children( '.wikiEditor-template-text' ); var templateModel = $templateText.data( 'model' ); // Update the model if we need to if ( $templateText.html() != $templateText.data( 'oldHTML' ) ) { templateModel = $.wikiEditor.modules.templateEditor.fn.updateModel( $templateText ); } // Build the table // TODO: Be smart and recycle existing table var params = templateModel.getAllInitialParams(); var $fields = $( this ).find( '.wikiEditor-template-dialog-fields' ); // Do some bookkeeping so we can recycle existing rows var $rows = $fields.find( '.wikiEditor-template-dialog-field-wrapper' ); for ( var paramIndex in params ) { var param = params[paramIndex]; if ( typeof param.name == 'undefined' ) { // param is the template name, skip it continue; } var paramText = typeof param == 'string' ? param.name.replace( /[\_\-]/g, ' ' ) : param.name; var paramVal = templateModel.getValue( param.name ); if ( $rows.length > 0 ) { // We have another row to recycle var $row = $rows.eq( 0 ); $row.children( 'label' ).text( paramText ); $row.children( 'textarea' ) .data( 'name', param.name ) .val( paramVal ) .each( function() { $(this).css( 'height', $(this).val().length > 24 ? '4.5em' : '1.5em' ); } ); $rows = $rows.not( $row ); } else { // Create a new row var $paramRow = $( '<div />' ) .addClass( 'wikiEditor-template-dialog-field-wrapper' ); $( '<label />' ) .text( paramText ) .appendTo( $paramRow ); $( '<textarea />' ) .data( 'name', param.name ) .val( paramVal ) .each( function() { $(this).css( 'height', $(this).val().length > 24 ? '4.5em' : '1.5em' ); } ) .data( 'expanded', false ) .bind( 'cut paste keypress click change', function( e ) { // If this was fired by a tab keypress, let it go if ( e.keyCode == '9' ) return true; var $this = $( this ); setTimeout( function() { var expanded = $this.data( 'expanded' ); if ( $this.val().indexOf( '\n' ) != -1 || $this.val().length > 24 ) { if ( !expanded ) { $this.animate( { 'height': '4.5em' }, 'fast' ); $this.data( 'expanded', true ); } } else { if ( expanded ) { $this.animate( { 'height': '1.5em' }, 'fast' ); $this.data( 'expanded', false ); } } }, 0 ); } ) .appendTo( $paramRow ); $paramRow .append( '<div style="clear:both"></div>' ) .appendTo( $fields ); } } // Remove any leftover rows $rows.remove(); $fields.find( 'label' ).autoEllipsis(); // Ensure our close button doesn't recieve the ui-state-focus class $( this ).parent( '.ui-dialog' ).find( '.ui-dialog-titlebar-close' ) .removeClass( 'ui-state-focus' ); // Set tabindexes on form fields if needed // First unset the tabindexes on the buttons and existing form fields // so the order doesn't get messed up var $needTabindex = $( this ).closest( '.ui-dialog' ).find( 'button, textarea' ); if ( $needTabindex.not( '[tabindex]' ).length ) { // Only do this if there actually are elements missing a tabindex $needTabindex.removeAttr( 'tabindex' ); $.wikiEditor.modules.dialogs.fn.setTabindexes( $needTabindex ); } } } }; // Lazy-create the dialog at this time context.$textarea.wikiEditor( 'addDialog', { 'templateEditor': dialog } ); $( '#' + dialog.id ) .data( 'templateDiv', $template ) .dialog( 'open' ); }, /** * Update a template's model and HTML * @param $templateText Wrapper <span> containing the template text * @param model Template model to use, will be generated if not set * @return model object */ updateModel: function( $templateText, model ) { var context = $templateText.data( 'marker' ).context; var text; if ( typeof model == 'undefined' ) { text = context.fn.htmlToText( $templateText.html() ); } else { text = model.getText(); } // To keep stuff simple but not break it, we need to do encode newlines as <br>s $templateText.text( text ); $templateText.html( $templateText.html().replace( /\n/g, '<br />' ) ); $templateText.data( 'oldHTML', $templateText.html() ); if ( typeof model == 'undefined' ) { model = new $.wikiEditor.modules.templateEditor.fn.model( text ); $templateText.data( 'model', model ); } return model; }, /** * Gets template display name */ getTemplateDisplayName: function ( model ) { var tName = model.getName(); if( model.getValue( 'name' ) != '' ) { return tName + ': ' + model.getValue( 'name' ); } else if( model.getValue( 'Name' ) != '' ) { return tName + ': ' + model.getValue( 'Name' ); } else if( tName.toLowerCase() in $.wikiEditor.modules.templateEditor.nameMappings ) { return tName + ': ' + model.getValue( $.wikiEditor.modules.templateEditor.nameMappings[tName.toLowerCase()] ); } return tName; }, /** * Builds a template model from given wikitext representation, allowing object-oriented manipulation of the contents * of the template while preserving whitespace and formatting. * * @param wikitext String of wikitext content */ model: function( wikitext ) { /* Private members */ var collapsible = true; /* Private Functions */ /** * Builds a Param object. * * @param name * @param value * @param number * @param nameIndex * @param equalsIndex * @param valueIndex */ function Param( name, value, number, nameIndex, equalsIndex, valueIndex ) { this.name = name; this.value = value; this.number = number; this.nameIndex = nameIndex; this.equalsIndex = equalsIndex; this.valueIndex = valueIndex; } /** * Builds a Range object. * * @param begin * @param end */ function Range( begin, end ) { this.begin = begin; this.end = end; } /** * Set 'original' to true if you want the original value irrespective of whether the model's been changed * * @param name * @param value * @param original */ function getSetValue( name, value, original ) { var valueRange; var rangeIndex; var retVal; if ( isNaN( name ) ) { // It's a string! if ( typeof paramsByName[name] == 'undefined' ) { // Does not exist return ""; } rangeIndex = paramsByName[name]; } else { // It's a number! rangeIndex = parseInt( name ); } if ( typeof params[rangeIndex] == 'undefined' ) { // Does not exist return ""; } valueRange = ranges[params[rangeIndex].valueIndex]; if ( typeof valueRange.newVal == 'undefined' || original ) { // Value unchanged, return original wikitext retVal = wikitext.substring( valueRange.begin, valueRange.end ); } else { // New value exists, return new value retVal = valueRange.newVal; } if ( value != null ) { ranges[params[rangeIndex].valueIndex].newVal = value; } return retVal; }; /* Public Functions */ /** * Get template name */ this.getName = function() { if( typeof ranges[templateNameIndex].newVal == 'undefined' ) { return wikitext.substring( ranges[templateNameIndex].begin, ranges[templateNameIndex].end ); } else { return ranges[templateNameIndex].newVal; } }; /** * Set template name (if we want to support this) * * @param name */ this.setName = function( name ) { ranges[templateNameIndex].newVal = name; }; /** * Set value for a given param name / number * * @param name * @param value */ this.setValue = function( name, value ) { return getSetValue( name, value, false ); }; /** * Get value for a given param name / number * * @param name */ this.getValue = function( name ) { return getSetValue( name, null, false ); }; /** * Get original value of a param * * @param name */ this.getOriginalValue = function( name ) { return getSetValue( name, null, true ); }; /** * Get a list of all param names (numbers for the anonymous ones) */ this.getAllParamNames = function() { return paramsByName; }; /** * Get the initial params */ this.getAllInitialParams = function(){ return params; }; /** * Get original template text */ this.getOriginalText = function() { return wikitext; }; /** * Get modified template text */ this.getText = function() { newText = ""; for ( i = 0 ; i < ranges.length; i++ ) { if( typeof ranges[i].newVal == 'undefined' ) { newText += wikitext.substring( ranges[i].begin, ranges[i].end ); } else { newText += ranges[i].newVal; } } return newText; }; this.isCollapsible = function() { return collapsible; }; /** * Update ranges if there's been a change in one or more 'segments' of the template. * Removes adjustment function so adjustment is only made once ever. */ this.updateRanges = function() { var adjustment = 0; for (var i = 0 ; i < ranges.length; i++ ) { ranges[i].begin += adjustment; if( typeof ranges[i].adjust != 'undefined' ) { adjustment += ranges[i].adjust(); // NOTE: adjust should be a function that has the information necessary to calculate the length of // this 'segment' delete ranges[i].adjust; } ranges[i].end += adjustment; } }; // Whitespace* {{ whitespace* nonwhitespace: if ( wikitext.match( /\s*{{\s*[^\s|]*:/ ) ) { collapsible = false; // is a parser function } /* * Take all template-specific characters that are not particular to the template we're looking at, namely {|=}, * and convert them into something harmless, in this case 'X' */ // Get rid of first {{ with whitespace var sanatizedStr = wikitext.replace( /{{/, " " ); // Replace end endBraces = sanatizedStr.match( /}}\s*$/ ); if ( endBraces ) { sanatizedStr = sanatizedStr.substring( 0, endBraces.index ) + " " + sanatizedStr.substring( endBraces.index + 2 ); } //treat HTML comments like whitespace while ( sanatizedStr.indexOf( '<!' ) != -1 ) { startIndex = sanatizedStr.indexOf( '<!' ); endIndex = sanatizedStr.indexOf('-->') + 3; if( endIndex < 3 ){ break; } sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /\S/g , ' ' ); sanatizedStr = sanatizedStr.substring( 0, startIndex ) + sanatizedSegment + sanatizedStr.substring( endIndex ); } // Match the open braces we just found with equivalent closing braces note, works for any level of braces while ( sanatizedStr.indexOf( '{{' ) != -1 ) { startIndex = sanatizedStr.indexOf( '{{' ) + 1; openBraces = 2; endIndex = startIndex; while ( (openBraces > 0) && (endIndex < sanatizedStr.length) ) { var brace = sanatizedStr[++endIndex]; openBraces += brace == '}' ? -1 : brace == '{' ? 1 : 0; } sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[{}|=]/g , 'X' ); sanatizedStr = sanatizedStr.substring( 0, startIndex ) + sanatizedSegment + sanatizedStr.substring( endIndex ); } //links, images, etc, which also can nest while ( sanatizedStr.indexOf( '[[' ) != -1 ) { startIndex = sanatizedStr.indexOf( '[[' ) + 1; openBraces = 2; endIndex = startIndex; while ( (openBraces > 0) && (endIndex < sanatizedStr.length) ) { var brace = sanatizedStr[++endIndex]; openBraces += brace == ']' ? -1 : brace == '[' ? 1 : 0; } sanatizedSegment = sanatizedStr.substring( startIndex,endIndex ).replace( /[\[\]|=]/g , 'X' ); sanatizedStr = sanatizedStr.substring( 0, startIndex ) + sanatizedSegment + sanatizedStr.substring( endIndex ); } /* * Parse 1 param at a time */ var ranges = []; var params = []; var templateNameIndex = 0; var doneParsing = false; oldDivider = 0; divider = sanatizedStr.indexOf( '|', oldDivider ); if ( divider == -1 ) { divider = sanatizedStr.length; doneParsing = true; collapsible = false; //zero params } nameMatch = sanatizedStr.substring( 0, divider ).match( /[^\s]/ ); if ( nameMatch != null ) { ranges.push( new Range( 0 ,nameMatch.index ) ); //whitespace and squiggles upto the name nameEndMatch = sanatizedStr.substring( 0 , divider ).match( /[^\s]\s*$/ ); //last nonwhitespace character templateNameIndex = ranges.push( new Range( nameMatch.index, nameEndMatch.index + 1 ) ); templateNameIndex--; //push returns 1 less than the array ranges[templateNameIndex].old = wikitext.substring( ranges[templateNameIndex].begin, ranges[templateNameIndex].end ); } else { ranges.push(new Range(0,0)); ranges[templateNameIndex].old = ""; } params.push( ranges[templateNameIndex].old ); //put something in params (0) /* * Start looping over params */ var currentParamNumber = 0; var valueEndIndex = ranges[templateNameIndex].end; var paramsByName = []; while ( !doneParsing ) { currentParamNumber++; oldDivider = divider; divider = sanatizedStr.indexOf( '|', oldDivider + 1 ); if ( divider == -1 ) { divider = sanatizedStr.length; doneParsing = true; } currentField = sanatizedStr.substring( oldDivider+1, divider ); if ( currentField.indexOf( '=' ) == -1 ) { // anonymous field, gets a number //default values, since we'll allow empty values valueBeginIndex = oldDivider + 1; valueEndIndex = oldDivider + 1; valueBegin = currentField.match( /\S+/ ); //first nonwhitespace character if( valueBegin != null ){ valueBeginIndex = valueBegin.index + oldDivider+1; valueEnd = currentField.match( /[^\s]\s*$/ ); //last nonwhitespace character if( valueEnd == null ){ //ie continue; } valueEndIndex = valueEnd.index + oldDivider + 2; } ranges.push( new Range( ranges[ranges.length-1].end, valueBeginIndex ) ); //all the chars upto now nameIndex = ranges.push( new Range( valueBeginIndex, valueBeginIndex ) ) - 1; equalsIndex = ranges.push( new Range( valueBeginIndex, valueBeginIndex ) ) - 1; valueIndex = ranges.push( new Range( valueBeginIndex, valueEndIndex ) ) - 1; params.push( new Param( currentParamNumber, wikitext.substring( ranges[valueIndex].begin, ranges[valueIndex].end ), currentParamNumber, nameIndex, equalsIndex, valueIndex ) ); paramsByName[currentParamNumber] = currentParamNumber; } else { // There's an equals, could be comment or a value pair currentName = currentField.substring( 0, currentField.indexOf( '=' ) ); // Still offset by oldDivider - first nonwhitespace character nameBegin = currentName.match( /\S+/ ); if ( nameBegin == null ) { // This is a comment inside a template call / parser abuse. let's not encourage it currentParamNumber--; continue; } nameBeginIndex = nameBegin.index + oldDivider + 1; // Last nonwhitespace and non } character nameEnd = currentName.match( /[^\s]\s*$/ ); if( nameEnd == null ){ //ie continue; } nameEndIndex = nameEnd.index + oldDivider + 2; // All the chars upto now ranges.push( new Range( ranges[ranges.length-1].end, nameBeginIndex ) ); nameIndex = ranges.push( new Range( nameBeginIndex, nameEndIndex ) ) - 1; currentValue = currentField.substring( currentField.indexOf( '=' ) + 1); oldDivider += currentField.indexOf( '=' ) + 1; //default values, since we'll allow empty values valueBeginIndex = oldDivider + 1; valueEndIndex = oldDivider + 1; // First nonwhitespace character valueBegin = currentValue.match( /\S+/ ); if( valueBegin != null ){ valueBeginIndex = valueBegin.index + oldDivider + 1; // Last nonwhitespace and non } character valueEnd = currentValue.match( /[^\s]\s*$/ ); if( valueEnd == null ){ //ie continue; } valueEndIndex = valueEnd.index + oldDivider + 2; } // All the chars upto now equalsIndex = ranges.push( new Range( ranges[ranges.length-1].end, valueBeginIndex) ) - 1; valueIndex = ranges.push( new Range( valueBeginIndex, valueEndIndex ) ) - 1; params.push( new Param( wikitext.substring( nameBeginIndex, nameEndIndex ), wikitext.substring( valueBeginIndex, valueEndIndex ), currentParamNumber, nameIndex, equalsIndex, valueIndex ) ); paramsByName[wikitext.substring( nameBeginIndex, nameEndIndex )] = currentParamNumber; } } // The rest of the string ranges.push( new Range( valueEndIndex, wikitext.length ) ); // Save vars this.ranges = ranges; this.wikitext = wikitext; this.params = params; this.paramsByName = paramsByName; this.templateNameIndex = templateNameIndex; } //model } }; } )( jQuery );