User:Cacycle/wikEd dev.js: Difference between revisions

Content deleted Content added
0.9.92 target
Maintenance: Remove use of deprecated wgEnableAPI (always true) - mw:RL/MGU
 
(46 intermediate revisions by one other user not shown)
Line 1:
// <syntaxhighlight lang="JavaScript">
// <pre><nowiki>
 
// versionJSHint infooptions
/* jshint -W004, -W100, newcap: false, browser: true, jquery: true, sub: true, bitwise: true, curly: true, evil: true, forin: true, freeze: true, globalstrict: true, immed: true, latedef: true, loopfunc: true, quotmark: single, strict: true, undef: true */
window.wikEdProgramVersion = window.wikEdProgramVersion || '0.9.92';
/* global GM_getValue, GM_setValue, GM_xmlhttpRequest, console */
window.wikEdProgramDate = window.wikEdProgramDate || 'September 15, 2010';
 
// turn on ECMAScript 5 strict mode
/*
'use strict';
 
// define global object
Program description and Greasemonkey metadata
var wikEd; if (wikEd === undefined) { wikEd = {}; }
 
wikEd is a full-featured JavaScript in-browser editor for Wikipedia and other MediaWiki edit pages.
The program works currently ONLY for Mozilla, Firefox, SeaMonkey, Safari, and Chrome browsers.
The code has to be saved as UTF-8 in your editor to preserve Unicode characters like ♥ (heart)
 
wikEd.Meta = function () {/*
// ==UserScript==
// @name wikEd
// @version 0.9.145
// @namespace http://en.wikipedia.org/wiki/User:Cacycle/
// @date November 04, 2014
// @description A full-featured in-browser editor for Wikipedia and other MediaWiki edit pages
// @namespace https://en.wikipedia.org/wiki/User:Cacycle/
// @description A full-featured in-browser editor for Wikipedia and other MediaWikis
// @include *
// @homepage https://en.wikipedia.org/wiki/User:Cacycle/wikEd
// @exclude
// @source https://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
//
// @homepageauthor http Cacycle (https://en.wikipedia.org/wiki/User:Cacycle/wikEd)
// @source http://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
// @author Cacycle (http://en.wikipedia.org/wiki/User:Cacycle)
// @license Released into the public ___domain
// @grant GM_getValue
// @grant GM_xmlhttpRequest
// ==/UserScript==
 
wikEd is a full-featured edit page text editor for regular to advanced users on Wikipedia and other MediaWikis.
== Installation on a MediaWiki wiki (using monobook.js) ==
wikEd features syntax highlighting, reference, template, and code folding,
on-page Show preview and Show changes, and advanced search and replace functions.
wikEd works under all web browsers except Internet Explorer.
This code has to be saved as UTF-8 in your editor to preserve Unicode characters like ♥ (heart symbol).
 
*/};
1. PLEASE DO NOT COPY THE WHOLE PROGRAM (in order to get the frequent updates and bug fixes and to save disk space)
2. See http://en.wikipedia.org/wiki/User:Cacycle/wikEd for more detailed instructions
3. Copy the following short block of code to [[User:YOURUSERNAME/monobook.js]]
4. Click SHIFT-Reload to update to the newest version
 
// define global objects
// ---- START wikEd INSTALLATION CODE ----
var wikEdConfig;
 
var wikEdText;
// install [[User:Cacycle/wikEd]] in-browser text editor
var WED;
document.write('<script type="text/javascript" src="'
var WikEdDiff;
+ 'http://en.wikipedia.org/w/index.php?title=User:Cacycle/wikEd.js'
+ '&action=raw&ctype=text/javascript"></script>');
 
// ---- END wikEd INSTALLATION CODE ----
 
== General installation for all MediaWiki wikis (using Greasemonkey) ==
 
1. Install Greasemonkey for Firefox from:
https://addons.mozilla.org/en-US/firefox/addon/748
2. Install wikEd by opening this address:
http://en.wikipedia.org/w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd.user.js
 
*/
 
//
// start of user configurable variables
//
 
//
// WikEdInitGlobalsConfigswikEd.InitGlobalsConfigs: initialize user configurable variables
//
 
windowwikEd.WikEdInitGlobalConfigsInitGlobalConfigs = function () {
 
// user readable texts, copy changes to httphttps://en.wikipedia.org/wiki/User:Cacycle/wikEd_international_en.js, also defined in wikEdDiff.js
if (typeof(wikEdConfig['wikEd.config.text']) === 'undefined') { wikEdConfig['wikEd.config.text'] = {}; }
 
// WikEdInitTextwikEd.InitText: define built-in user interface texts
windowwikEd.WikEdInitTextInitText = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.text'], {
 
// logo
'wikEdLogo alt': 'wikEd',
'wikEdLogo title': 'wikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable',
Line 73 ⟶ 66:
'wikEdLogo browser title': 'Browser not supported - wikEd {wikEdProgramVersion} ({wikEdProgramDate})',
'wikEdLogo incompatible alt': '(wikEd)',
'wikEdLogo incompatible title': 'Incompatible script, gadget, or gadgetadd-on: {wikEdParameter} - wikEd {wikEdProgramVersion} ({wikEdProgramDate})',
'wikEdLogo disabled alt': '(wikEd)',
'wikEdLogo disabled title': 'Disabled - wikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to enable',
'wikEdLogo testVersion alt': 'wikEd_dev',
'wikEdLogo testVersion title': 'wikEd_dev (unstable test version) {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable',
 
// top jumper
'wikEdScrollToEdit4 alt': 'Scroll to edit',
'wikEdScrollToEdit4 title': 'Scroll to edit field',
 
// button bar grip titles
'wikEdGripFormat title': 'Formatting buttons (click to hide or show)',
'wikEdGripTextify title': 'Textify and wikify buttons (click to hide or show)',
Line 90 ⟶ 85:
'wikEdGripControl title': 'wikEd control buttons (click to hide or show)',
 
// button bar background titles
// formatting buttons, top row
'wikEdBarFormat title': '',
'wikEdBarTextify title': '',
'wikEdBarCustom1 title': '',
'wikEdBarFind title': '',
'wikEdBarFix title': '',
'wikEdBarCustom2 title': '',
'wikEdBarControl title': 'wikEd {wikEdProgramVersion} ({wikEdProgramDate})',
'wikEdBarPreview title': '',
'wikEdBarPreview2 title': '',
'wikEdBarJump title': '',
'wikEdBarPasted title': '',
 
// formatting buttons, top row
'wikEdUndo alt': 'Undo',
'wikEdUndo title': 'Undo',
Line 114 ⟶ 122:
'wikEdCase title': 'Toggle between lowercase, uppercase first, and uppercase',
'wikEdSort alt': 'Sort',
'wikEdSort title': 'Sort lines alphabetically',
'wikEdRedirect alt': 'Redirect',
'wikEdRedirect title': 'Create redirect, deletes whole text',
Line 122 ⟶ 130:
'wikEdRedoAll title': 'Redo all changes',
 
// formatting buttons, bottom row
'wikEdWikiLink alt': 'Link',
'wikEdWikiLink title': 'Wiki link',
Line 142 ⟶ 150:
'wikEdTable title': 'Table',
'wikEdReferences alt': 'References',
'wikEdReferences title': 'References ___location (shift-click: Referencesreferences section)',
'wikEdSign alt': 'Signature',
'wikEdSign title': 'Signature ~~~~ (shift-click: name only ~~~)',
 
// textify buttons
'wikEdWikify alt': 'Wikify',
'wikEdWikify title': 'Convert pasted content to wiki code, update highlighting',
'wikEdTextify alt': 'Textify',
'wikEdTextify title': 'Convert pasted content to plain text, update highlighting (shift-click: forced highlighting)',
'wikEdPastedWikify alt': 'Wikify pasted',
'wikEdPastedWikify title': 'Convert pasted content to wiki code',
'wikEdPastedTextify alt': 'Textify pasted',
'wikEdPastedTextify title': 'Convert pasted content to plain text',
'wikEdPastedClose alt': 'x',
'wikEdPastedClose title': 'Close',
 
// find and replace buttons, top row
'wikEdFindAll alt': 'Find all',
'wikEdFindAll title': 'Find all matches',
Line 163 ⟶ 179:
'wikEdJumpNext title': 'Find the selected text forwards',
 
// find and replace buttons, bottom row
'wikEdReplaceAll alt': 'Replace all',
'wikEdReplaceAll title': 'Replace all matches in whole text or selection',
Line 178 ⟶ 194:
'wikEdFindAhead title': 'Find ahead as you type (case-insensitive non-regexp search)',
 
// fix buttons, top row
'wikEdFixBasic alt': 'Fix basic',
'wikEdFixBasic title': 'Fix blanks and empty lines, also done by other fixing functions',
Line 192 ⟶ 208:
'wikEdFixRedirect title': 'Fix redirects',
 
// fix buttons, bottom row
'wikEdFixDashes alt': 'Fix dashes',
'wikEdFixDashes title': 'Fix dashes',
Line 206 ⟶ 222:
'wikEdFixRegExTypo title': 'Fix typos using the AutoWikiBrowser RegExTypoFixer rules',
 
// wikEd control buttons, top row
'wikEdRefHide alt': '[REF, TEMPL]',
'wikEdRefHide title': 'ToggleSimple [REF]view: hide refs, templates, and [TEMPL]table hidingcode',
'wikEdRefButtonTooltip': 'Click to display hidden reference',
'wikEdTemplButtonTooltip': 'Click to display hidden template',
'wikEdCharEntityButtonTooltip': 'Click to display hidden character entity',
'wikEdTableButtonTooltip': 'Click to display hidden table code',
'wikEdRefButtonShowTooltip': 'Click to hide reference',
'wikEdTemplButtonShowTooltip': 'Click to hide template',
'wikEdCharEntityButtonShowTooltip': 'Click to hide character entity',
'wikEdTableButtonShowTooltip': 'Click to hide table code',
'wikEdTextZoom alt': 'Text zoom',
'wikEdTextZoom title': 'Text zoom cycling (shift-click: reverse)',
Line 224 ⟶ 242:
'wikEdScrollToEdit title': 'Scroll to edit field',
 
// wikEd control buttons, bottom row
'wikEdUseWikEd alt': 'Use wikEd',
'wikEdUseWikEd title': 'ToggleUse betweenwikEd instead of classic text area and wikEd',
'wikEdHighlightSyntax alt': 'Syntax',
'wikEdHighlightSyntax title': 'Toggle automatic syntaxSyntax highlighting',
'wikEdSource alt': 'Source',
'wikEdCloseToolbar title': 'Close the standard non-wikEd toolbar',
'wikEdCloseToolbar alt': 'Close toolbar',
'wikEdSource title': 'Show the source code for testing purposes',
'wikEdUsing alt': 'Using',
'wikEdUsing title': 'Automatically add \'\'…using wikEd\'\' to summaries',
'wikEdDiff alt': 'wikEdDiff',
'wikEdDiff title': 'Toggle automatic improved diff view',
'wikEdFullScreen alt': 'Fullscreen',
'wikEdFullScreen title': 'Toggle the fullscreenFullscreen mode',
'wikEdTableMode alt': 'Table modeas tables',
'wikEdTableMode title': 'ToggleEdit tabletables editas modetables',
 
// summary buttons
'wikEdClearSummary alt': 'Clear summary',
'wikEdClearSummary title': 'Clear the summary field',
Line 253 ⟶ 269:
'wikEdSummaryUsing': '…using [[en:User:Cacycle/wikEd|wikEd]]',
 
// toolbar
// button title acceskey
'wikEdCodeEditorButtonDisabled': ' (disabled by wikEd)',
 
// button title acceskey
'alt-shift': 'alt-shift-',
 
// submit buttons
'wikEdLocalPreviewImg alt': 'Preview below',
'wikEdLocalPreview title': 'Show preview below',
Line 263 ⟶ 282:
'wikEdHelpPageLink': ' | <a href="{wikEdHomeBaseUrl}wiki/User:Cacycle/wikEd_help" target="helpwindow">wikEd help</a>', // use full link without {wikEdHomeBaseUrl} if the page is not on the English Wikipedia
 
// preview and changes buttons, top
'wikEdClose alt': 'Close',
'wikEdClose title': 'Close preview box',
Line 273 ⟶ 292:
'wikEdScrollToEdit2 title': 'Scroll to edit field',
 
// preview and changes buttons, bottom
'wikEdScrollToPreview3 alt': 'Scroll to preview',
'wikEdScrollToPreview3 title': 'Scroll to preview field',
Line 279 ⟶ 298:
'wikEdScrollToEdit3 title': 'Scroll to edit field',
 
// preview field
'wikEdPreviewLoading': '...',
'diffNotLoaded': 'Error: Local diff script not installed.',
 
// formatting functions
'image filename': 'filename',
'image width': 'width',
Line 290 ⟶ 310:
'redirect article link': 'article link',
 
// fixing functions
'External links': 'External links',
'See also': 'See also',
'References': 'References',
 
// language specific wiki code
'wikicode Image': 'Image',
'wikicode File': 'File',
'wikicode Media': 'Media',
'wikicode Category': 'Category',
'wikicode Template': 'Template',
Line 304 ⟶ 325:
'history page': 'history',
'talk namespace': 'Talk',
'talk namespace suffix': '_talk$1_talk', //// in'$1_talk', French'_talk', itor is a prefix (Discussion_Utilisateur)'talk_'
 
// hiding buttons, type
'hideRef': 'REF',
'hideTempl': 'TEMPL',
'hideTable': '',
 
// hiding buttons, details
// shortened button texts
'hideTableStart': 'Table',
'hideTableEnd': 'Table end',
'hideTableCaption': 'Caption',
'hideTableRow': 'Row',
'hideTableHeader': 'Header',
'hideTableCell': 'Cell',
 
// shortened button texts
'shortenedPreview': 'Preview',
'shortenedChanges': 'Changes',
 
// follow link popup
'followLink': '(ctrl-click)',
'followLinkMac': '(cmd-click)',
'redirect': ', redirect to:',
'redlink': ' (page does not exist)',
 
// auto updating
// error message popups
'wikEdGreasemonkeyAutoUpdate': 'wikEd Update:\n\nA new version of the Greasemonkey script "wikEd" is available.\n\n\nIt will be installed from:\n\n{updateURL}',
'wikEdTableModeError': 'The table wikicode contains errors',
'wikEdGreasemonkeyAutoUpdateBugfix': 'Important wikEd Bugfix:\n\nA bugfix for the Greasemonkey script "wikEd" is available.\n\n\nIt will be installed from:\n\n{updateURL}',
 
// highlighting popups
// auto updating
'hyphenDash': 'Standard hyphen',
'wikEdGreasemonkeyAutoUpdate': 'wikEd Update:\n\nA new version of the GreaseMonkey script "wikEd" is available.\n\n\nIt will be downloaded from:\n\n{updateURL}',
'figureDash': 'Figure dash',
'enDash': 'En dash',
'emDash': 'Em dash',
'barDash': 'Horizontal bar',
'minusDash': 'Minus sign',
'softHyphen': 'Soft hyphen',
'tab': 'Tab',
'enSpace': 'En space',
'emSpace': 'Em space',
'thinSpace': 'Thin space',
'ideographicSpace': 'Ideographic space',
 
// highlighting popups
'wikEdHyphenDash': 'Standard hyphen',
'wikEdFigureDash': 'Figure dash',
'wikEdEnDash': 'En dash',
'wikEdEmDash': 'Em dash',
'wikEdBarDash': 'Horizontal bar',
'wikEdMinusDash': 'Minus sign',
'wikEdSoftHyphen': 'Soft hyphen',
'wikEdTab': 'Tab',
'wikEdEnSpace': 'En space',
'wikEdEmSpace': 'Em space',
'wikEdThinSpace': 'Thin space',
'wikEdIdeographicSpace': 'Ideographic space',
 
// highlighting
'wikEdSignature3': 'Sign with username only',
'wikEdSignature4': 'Sign with user name and date',
'wikEdSignature5': 'Sign with date only',
 
// highlighting errors
'wikEdErrorHtmlUnknown': 'Unsupported HTML tag',
'wikEdErrorBoldItalic': 'Invalid bold / italic',
Line 358 ⟶ 388:
'wikEdErrorCodeInParamName': 'Wikicode in template parameter name',
 
// highlighting image preview
'wikEdFilePreview': 'Image preview',
 
// ___location search string functions
'iconPage': 'All icons and images used by wikEd. Save page as <i>web page, complete</i> to download all files into one folder.<br><br>',
 
// duplicated message
}, wikEdConfig['showMissingTranslations']);
'clonedWarningsNote': 'Duplicated edit warnings (wikEd):'
 
}, wikEd.config.showMissingTranslations);
};
 
// define built-in user interface texts
WikEdInitTextwikEd.InitText();
 
// use local copies of images for testing (set to true in local copy of edit page), also defined in wikEdDiff.js
if (wikEd.config.useLocalImages === undefined) { wikEd.config.useLocalImages = false; }
 
// usepath to local copies ofwikEd images for testing (set to true in local copy of edit page), also defined in wikEdDiff.js
if (typeof(wikEdConfig['useLocalImages'])wikEd.config.imagePathLocal === 'undefined') { wikEdConfig['useLocalImages']wikEd.config.imagePathLocal = false'file:///D:/wikEd/images/'; }
 
// path to localwikEd images for testing, also defined in wikEdDiff.js
if (typeof(wikEdConfig['imagePathLocal'])wikEd.config.imagePath === 'undefined') { wikEdConfig['imagePathLocal']wikEd.config.imagePath = 'file://upload.wikimedia.org/D:/wikEdwikipedia/imagescommons/'; }
 
// pathwikEd toimage imagesfilenames, also defined in wikEdDiff.js
if (typeof(wikEdConfig['imagePath'])wikEd.config.image === 'undefined') { wikEdConfig['imagePath']wikEd.config.image = 'http://upload.wikimedia.org/wikipedia/commons/'{}; }
 
// wikEd.InitImages: define built-in image URLs
// image filenames, also defined in wikEdDiff.js
wikEd.InitImages = function () {
if (typeof(wikEdConfig['image']) == 'undefined') { wikEdConfig['image'] = {}; }
 
wikEd.InitImage(wikEd.config.image, {
// WikedInitImages: define built-in image URLs
window.WikedInitImages = function() {
WikEdInitImage(wikEdConfig['image'], {
'barDash': '5/52/WikEd_bar_dash.png',
'bold': '5/59/WikEd_bold.png',
Line 394 ⟶ 428:
'clearSummary': '2/2c/WikEd_clear_summary.png',
'close': '9/97/WikEd_close.png',
'closePasted': 'b/bc/WikEd_close_pasted.png',
'closeToolbar': '1/1d/WikEd_close_toolbar.png',
'ctrl': '1/10/WikEd_ctrl.png',
Line 426 ⟶ 461:
'getFind': '9/96/WikEd_get_selection.png',
'grip': 'a/ad/WikEd_grip.png',
'gripHidden': 'a/a8/WikEd_grip_hidden.png',
'heading': '0/07/WikEd_heading.png',
'highlightSyntax': '6/67/WikEd_syntax.png',
'ideographicSpace': 'c/c6/WikEd_ideographic_space.png',
'image': '3/37/WikEd_image.png',
'incompatible': '03/073e/WikEd_disabledWikEd_error.png',
'indentList': '7/7a/WikEd_indent_list.png',
'italic': 'd/d4/WikEd_italic.png',
Line 446 ⟶ 482:
'refHide': '0/0b/WikEd_ref_hide.png',
'references': '6/66/WikEd_references.png',
'sign': 'd/d5/WikEd_sign.png',
'redoAll': '2/2d/WikEd_redo_all.png',
'resizeGrip': 'e/e1/WikEd_resize_grip.png',
Line 465 ⟶ 502:
'table': 'b/bd/WikEd_table.png',
'tableMode': 'e/ee/WikEd_table_edit.png',
'tableBGtestVersion': '83/8a3e/WikEd_unknownWikEd_error.png',
'textify': 'c/cd/WikEd_textify.png',
'thinSpace': '5/56/WikEd_thin_space.png',
Line 475 ⟶ 512:
'using': 'e/e0/WikEd_using.png',
'webLink': '1/16/WikEd_weblink.png',
'wikEdDiff': 'c/c6/WikEdDiff.png',
'wikify': '9/9f/WikEd_wikify.png',
'wikiLink': '2/21/WikEd_wikilink.png'
Line 481 ⟶ 517:
};
 
// edit-frame css rules
if (typeof(wikEdConfig['wikEd.config.frameCSS']) === 'undefined') { wikEdConfig['wikEd.config.frameCSS'] = {}; }
 
// WikedInitFrameCSSwikEd.InitFrameCSS: define built-in edit frame css
windowwikEd.WikedInitFrameCSSInitFrameCSS = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.frameCSS'], {
 
// frame
'.wikEdFrameHtml': 'height: 100%; width: 100%; padding: 0; margin: 0; background: transparent; background-image: url({wikEdImage:resizeGrip}); background-attachment: fixed; background-position: right bottom; background-repeat: no-repeat; line-height: normal;',
'.wikEdFrameBodyPlain': 'height: auto; min-height: 100%; width: auto; background: transparent; margin: 0; padding: 0; padding-left: 0.25em; overflow: auto; font-family: monospace;',
'.wikEdFrameBodySyntax': 'height: auto; min-height: 100%; width: auto; background: transparent; margin: 0; padding: 0; padding-left: 0.25em; overflow: auto; font-family: monospace;',
 
'.wikEdFrameBodySyntax': 'height: auto; min-height: 100%; width: auto; background: transparent; margin: 0; padding: 0; padding-left: 0.25em; overflow: auto; font-family: monospace; text-shadow: white -1px -1px 0, white -1px 0 0, white -1px 1px 0, white 0 -1px 0, white 0 1px 0, white 1px -1px 0, white 1px 0 0, white 1px 1px 0;',
 
'.wikEdFrameBodyNewbie': 'height: auto; min-height: 100%; width: auto; background: transparent; margin: 0; padding: 0; padding-left: 0.25em; overflow: auto; font-family: monospace;',
 
// reselection / scroll to selection
'.wikEdScrollLineHeight': 'position: absolute;',
 
// syntax highlighting
'.wikEdError': 'background-image: url({wikEdImage:unknown}); color: black; font-weight: normal; font-style: normal; text-decoration: none; text-shadow: white -1px -1px 0, white -1px 0 0, white -1px 1px 0, white 0 -1px 0, white 0 1px 0, white 1px -1px 0, white 1px 0 0, white 1px 1px 0;',
'.wikEdHighlightError': 'color: black; background: #faa;',
 
'.wikEdHtml': 'background: #e8e8e8; text-shadow: none;',
'.wikEdHtmlTag': 'color: #777;',
'.wikEdHtmlTagButtons': 'color: #777;',
'.wikEdHtmlUnknown': 'background-image: url({wikEdImage:unknown}); color: black; font-weight: normal; font-style: normal; text-shadow: white -1px -1px 0, white -1px 0 0, white -1px 1px 0, white 0 -1px 0, white 0 1px 0, white 1px -1px 0, white 1px 0 0, white 1px 1px 0;',
'.wikEdParsingNote': 'border: 1px outset #fcc; padding: 0 0.5em 0 0.5em; margin: 0 0.25em 0 0.25em; color: black; background: #fcc; text-shadow: none; font-weight: normal; font-size: smaller; font-style: normal; text-decoration: none; font-family: sans-serif;',
 
'.wikEdSubscript': 'position: relative; top: 0.3em;',
Line 514 ⟶ 548:
'.wikEdItalic': 'font-style: italic;',
 
'.wikEdComment': 'background: #fff0d0; text-shadow: none; color: black; font-weight: normal; font-style: normal; text-decoration: none;',
'.wikEdKeep': '',
'.wikEdDel': 'text-decoration: line-through;',
'.wikEdIns': 'text-decoration: underline;',
 
'.wikEdPre': 'background: #e8e8e8; text-shadow: nonef8e8e0;',
'.wikEdMath': 'background: #e8e8e8; text-shadow: nonee8f0ff;',
'.wikEdNowikiwikEdScore': 'background: #e8e8e8; text-shadow: nonefff8e0;',
'.wikEdNowiki': 'background: #f8e8e8;',
 
// horizontal rule
'.wikEdHr': 'background: #666; text-shadow: none; color: #ffffff;',
 
// wiki code
'.wikEdWiki': 'color: #777;',
'.wikEdRedir': 'color: #c00; font-weight: bold;',
'.wikEdSignature': 'color: #f00; font-weight: bold;',
'.wikEdMagic': 'color: #666; font-weight: bold; background: #e8e8e8; text-shadow: none;',
'.wikEdParserFunct': 'color: #f00;',
 
// headings
'.wikEdFrameBodySyntax .wikEdHeading': 'color: #000; font-weight: bold;',
'.wikEdFrameBodySyntax .wikEdHeadingWP': 'color: #000; font-weight: bold; background: #e8e8e8; text-shadow: none;',
'.wikEdFrameBodyNewbie .wikEdHeading': 'color: #000; font-weight: bold; color: #000; background: #eee; padding: 0 0.25em; border: 1px solid #ddd; font-size: larger; line-height: 1.5;',
'.wikEdFrameBodyNewbie .wikEdHeadingWP': 'color: #000; font-weight: bold; color: #000; background: #eeeddd; padding: 0 0.25em; border: 1px solid #dddccc; font-size: larger; line-height: 1.5; text-shadow: white -1px -1px 0; ',
'.wikEdFrameBodyNewbie .wikEdHeadingWP':
'color: #000; font-weight: bold; color: #000; background: #ddd; padding: 0 0.25em; border: 1px solid #ccc; font-size: larger; line-height: 1.5; text-shadow: #eee -1px -1px 0; ',
 
// tables
'.wikEdTableBlock': '',
'.wikEdTable': 'color: #000; background: #e8e8e8; text-shadow: none;',
'.wikEdTableTag': 'color: #777;',
 
'.wikEdTableCode': 'color: #888; background: #ccc;',
// list
'.wikEdListwikEdTableTag': 'color: #000; background: #e8e8e8; text-shadow: noneccc;',
'.wikEdTableCaption': 'color: #000; background: #fff;',
'.wikEdTableRow': 'color: #000; background: #ccc;',
'.wikEdTableHeader': 'color: #000; background: #e8e8e8;',
'.wikEdTableCell': 'color: #000; background: #f0f0f0;',
 
'.wikEdFrameBodyNewbie .wikEdTableCode': 'color: #888; background: transparent;',
'.wikEdFrameBodyNewbie .wikEdTableTag, .wikEdFrameBodyNewbie .wikEdTableTagBR': 'background: #d8d8d8;',
'.wikEdFrameBodyNewbie .wikEdTableCaption, .wikEdFrameBodyNewbie .wikEdTableCaptionBR': 'color: #000; background: #fff;',
'.wikEdFrameBodyNewbie .wikEdTableRow, .wikEdFrameBodyNewbie .wikEdTableRowBR': 'color: #000; background: #d8d8d8;',
'.wikEdFrameBodyNewbie .wikEdTableHeader, .wikEdFrameBodyNewbie .wikEdTableHeaderBR': 'color: #000; background: #f2f2f2;',
'.wikEdFrameBodyNewbie .wikEdTableCell, .wikEdFrameBodyNewbie .wikEdTableCellBR': 'color: #000; background: #fbfbfb;',
 
'br.wikEdTableBR': 'display: none;',
'.wikEdTableTagAttrib .wikEdTableCode, .wikEdTableCaptionAttrib .wikEdTableCode, .wikEdTableRowAttrib .wikEdTableCode, .wikEdTableHeaderAttrib .wikEdTableCode, .wikEdTableCellAttrib .wikEdTableCode':
'background: transparent;',
'.wikEdTableTagAttrib, .wikEdTableRowAttrib': 'color: #666;',
'.wikEdTableCaptionAttrib, .wikEdTableHeaderAttrib, .wikEdTableCellAttrib': 'color: #888;',
 
'table.wikEdTableMode': 'border: 1px solid #aaa; background: #d8d8d8; color: #000; border-collapse: separate; border-spacing: 0.25em 2px; margin: 0.5em 0;',
'td.wikEdTableCaption, td.wikEdTableHeader, td.wikEdTableCell, td.wikEdTableCaptionBR, td.wikEdTableHeaderBR, td.wikEdTableCellBR': 'border: 1px solid #aaa;',
'td.wikEdTableTag, td.wikEdTableRow, td.wikEdTableTagBR, td.wikEdTableRowBR': 'border: none; border-spacing: 0;',
 
// list
'.wikEdList': 'color: #000; background: #e8e8e8;',
'.wikEdListTag': 'font-weight: bold; font-family: monospace; vertical-align: text-bottom;',
 
// space-pre
'.wikEdSpace': 'color: #000; background: #e8e8e8; text-shadow: none;',
'.wikEdSpaceTag': 'background: #e8e8e8; text-shadow: none;',
 
// links
'.wikEdLinkTag': 'color: #777;',
 
// wiki links
'.wikEdLink': 'color: #00a;',
'.wikEdLinkCrossNs': 'background: #ddd; text-shadowcolor: none#00a;',
'.wikEdLinkInter': 'color: #000; background: #ddd; text-shadow: none;',
'.wikEdLinkNs': 'color: #000; background: #ddd; text-shadow: none;',
'.wikEdLinkName': 'color: #00e; font-weight: bold;',
'.wikEdLinkTarget': 'color: #00e;',
'.wikEdLinkText': 'color: #00e; font-weight: bold;',
 
'.wikEdPMID': 'color: #00e;',
'.wikEdISBN': 'color: #00e;',
Line 571 ⟶ 629:
'span.wikEdISBN:hover': 'text-decoration: underline;',
 
// external links
'.wikEdURL': '',
'.wikEdURLName': 'color: #00e; font-weight: bold;',
Line 579 ⟶ 637:
'span.wikEdURLText:hover': 'text-decoration: underline;',
 
// imagesfiles
'.wikEdFile': 'background: rgb(213, 255, 176); background: rgba(199, 255, 149, 0.75); text-shadowcolor: none#00e;',
'.wikEdFrameBodyNewbie .wikEdFile':
'background: rgb(213, 255, 176); padding: 0.25em; margin-right: 0.25em; display: inline-block; border: 1px solid #082; margin: 1px;',
'.wikEdFileTag': 'color: #444;',
'.wikEdFileName': 'color: #00e;',
'.wikEdFileParam': 'color: #666;',
'.wikEdFileCaption': 'color: #000;',
'.wikEdFilePreview': 'border: 1px solid #c0ffa0; background: rgb(192, 192, 192) no-repeat 50% 50%; background: rgba(192, 192, 192, 0.75); text-shadow: none; position: absolute; right: 0; margin: 0.1em 0.25em; z-index: -1; border: none; padding: 1px; display: block;',
'.wikEdFrameBodyNewbie .wikEdFilePreview':
'position: static; float: right; clear: both; background: transparent; padding: 0; ',
 
// categories
'.wikEdCat': 'background: #ccc; text-shadowcolor: none#00e;',
'.wikEdCatName': 'color: #00e;',
'.wikEdCat .wikEdLinkInter': 'color: #000; background: #aaa; text-shadow: none;',
'.wikEdCat .wikEdLinkNs': 'color: #000; background: #ccc; text-shadow: none;',
'.wikEdCat .wikEdLinkText': 'color: #000; font-weight: normal;',
'.wikEdCat span.wikEdLinkText:hover': 'text-decoration: none;',
 
// refs
'.wikEdFrameBodySyntax .wikEdRefContainer': 'display: noneblock; position: fixed; left: -10000em;',
 
'.wikEdRefContainer': 'position: relative; top: 1em;',
'.wikEdRefContainer button': 'padding: 0.1em; position: relative; top: -1em;',
 
'.wikEdRefButton': 'border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; text-shadow: none;',
'.wikEdRefButtonShow': 'border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; text-shadow: none;',
'.wikEdRef, .wikEdRefShow': 'background: #e8e8e8; text-shadow: none; color: #666;',
 
'.wikEdReferences': 'background: #eee; text-shadow: none;',
'.wikEdReferencesTag': 'color: #444;',
'.wikEdFrameBodyNewbie .wikEdReferences':
'background: #eee; padding: 0.25em; display: inline-block; border: 1px solid black; vertical-align: middle;',
'.wikEdRefList': 'background: #eee; text-shadow: none;',
'.wikEdFrameBodyNewbie .wikEdRefList':
'background: #e8e8e8; padding: 0.25em; display: inline-block; border: 1px solid black; vertical-align: middle;',
'.wikEdRefName': 'color: #000;',
 
// templates
'.wikEdFrameBodySyntax .wikEdTemplContainer': 'display: noneblock; position: fixed; left: -10000em;',
'.wikEdTemplContainer': 'position: relative; top: 1em;',
'.wikEdTemplContainer button': 'padding: 0.1em; position: relative; top: -1em;',
'.wikEdTemplButton': 'border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; text-shadow: none;',
'.wikEdTemplButtonShow': 'border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; text-shadow: none;',
 
'.wikEdTempl, .wikEdTemplShow': 'background: #e8e8e8; text-shadow: none; color: #666509;',
'.wikEdTemplNs, .wikEdTemplNsShow': 'background: #ccc; text-shadow: none;',
 
'.wikEdTemplTag': 'color: #777;',
'.wikEdTemplName': 'color: #509;',
'.wikEdTemplParam': 'color: #666;',
'.wikEdTemplMod': 'color: #f00; font-weight: bold;',
 
'.wikEdParam': 'background: #e8e8e8; text-shadow: none;',
'.wikEdParamName': 'color: #900;',
'.wikEdParamDefault': 'color: #000;',
 
// missing article for links, cats, refs, and templates
// character entities
'.wikEdRedlink': 'color: #c00;',
'.wikEdFrameBodySyntax .wikEdCharEntityContainer': 'display: none;',
 
// character entities
'.wikEdFrameBodySyntax .wikEdCharEntityContainer': 'display: block; position: fixed; left: -10000em;',
'.wikEdCharEntityContainer': 'position: relative; right: -0.25em;',
 
'.wikEdCharEntityContainer button':
'padding: 0; color: #000; font-weight: normal; font-family: monospace; position: relative; right: 0.25em; line-height: 0.75em;',
 
'.wikEdCharEntityButton':
'border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; border-color: rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5) rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75); background: rgba(192, 192, 192, 0.3); text-shadow: none;',
 
'.wikEdCharEntityButtonShow':
'border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; border-color: rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75) rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5); background: rgba(192, 192, 192, 0.3); text-shadow: none;',
 
'.wikEdCharEntity, .wikEdCharEntityShow':
'color: #000; background: #e8e8e8; text-shadow: none;',
 
// tables
// links in references and templates
'.wikEdFrameBodySyntax .wikEdTableContainer': 'display: block; position: fixed; left: -10000em;',
'.wikEdTableContainer': 'position: relative;',
'.wikEdTableContainer button':
'padding: 0.1em; position: relative; vertical-align: top;',
'.wikEdTableButton': 'border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0;',
'.wikEdTableButtonShow':
'border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0;',
'.wikEdTable, .wikEdTableShow': '',
'.wikEdTableButton:before, .wikEdTableButtonShow:before':
'line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif;',
 
// links in references and templates
'.wikEdFrameBodySyntax .wikEdRef .wikEdURLName, .wikEdFrameBodySyntax .wikEdTempl .wikEdURLName, .wikEdFrameBodySyntax .wikEdRef .wikEdURLTarget, .wikEdFrameBodySyntax .wikEdTempl .wikEdURLTarget, .wikEdFrameBodySyntax .wikEdRef .wikEdURLText, .wikEdFrameBodySyntax .wikEdTempl .wikEdURLText': 'color: #66f; font-weight: normal;',
'.wikEdFrameBodySyntax .wikEdRef .wikEdLinkName, .wikEdFrameBodySyntax .wikEdTempl .wikEdLinkName, .wikEdFrameBodySyntax .wikEdRef .wikEdLinkTarget, .wikEdFrameBodySyntax .wikEdTempl .wikEdLinkTarget, .wikEdFrameBodySyntax .wikEdRef .wikEdLinkText, .wikEdFrameBodySyntax .wikEdTempl .wikEdLinkText': 'color: #66f; font-weight: normal;',
 
// wikEdFrameBodyNewbie ref and template hiding
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRef, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTempl, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNs,':
'position: fixed; left: -10000em;',
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRefShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNsShow':
'display: noneblock; position: relative; color: #000; background: #f8f8f8; font-weight: normal; border: 1px solid; border-color: #444 #ccc #ccc #444; padding: 1em 0.25em 1em5em 0.25em; position: relative;',
'.wikEdFrameBodyNewbie .wikEdRefButton:before, .wikEdFrameBodyNewbie .wikEdTemplButton:before, .wikEdFrameBodyNewbie .wikEdTableButton:before, .wikEdFrameBodyNewbie .wikEdRefButtonShow:before, .wikEdFrameBodyNewbie .wikEdTemplButtonShow:before, .wikEdFrameBodyNewbie .wikEdTableButtonShow:before':
 
'.wikEdFrameBodyNewbie .wikEdRefButton:before, .wikEdFrameBodyNewbie .wikEdTemplButton:before, .wikEdFrameBodyNewbie .wikEdRefButtonShow:before, .wikEdFrameBodyNewbie .wikEdTemplButtonShow:before':
'line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif;',
 
'.wikEdRefButton:before, .wikEdTemplButton:before, .wikEdRefButtonShow:before, .wikEdTemplButtonShow:before':
'line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif;',
 
'.wikEdCharEntityButton:before, .wikEdCharEntityButtonShow:before':
'',
 
'.wikEdFrameBodyNewbie .wikEdRefButton:before, .wikEdFrameBodyNewbie .wikEdRefButtonShow:before':
'content: "{wikEdText:hideRef}"',
 
'.wikEdFrameBodyNewbie .wikEdCharEntity, .wikEdFrameBodyNewbie .wikEdCharEntityShow':
'display: none; color: #000; border: 1px solid; border-color: #444 #ccc #ccc #444; background: #f8f8f8; border-color: rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75) rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5); background: rgba(192, 192, 192, 0.3); font-weight: normal;position: relative;',
 
'.wikEdFrameBodyNewbie .wikEdTemplButton:before, .wikEdFrameBodyNewbie .wikEdTemplButtonShow:before':
'content: "{wikEdText:hideTempl}";',
 
// wikEdFrameBodyNewbie char entity hiding
// table edit
'.wikEdFrameBodyNewbie .wikEdCharEntity':
'.wikEdTableEdit': 'border: solid black; border-width: 1px 1px 0 0; background: red; text-shadow: none; background-image: url({wikEdImage:tableBG}); border-collapse: separate; border-spacing: 0;',
'position: fixed; left: -10000em;',
'.wikEdTableEdit td': 'border: solid black; border-width: 0 0 1px 1px; background: white; text-shadow: none;',
'.wikEdFrameBodyNewbie .wikEdCharEntityShow':
'.wikEdTableEdit th': 'border: solid black; border-width: 0 0 1px 1px; background: lightgrey; text-shadow: none; font-weight: bold;',
'.wikEdTableEditdisplay: tr'inline; position: relative; color: #000; 'background: lightgrey#f8f8f8; text-shadowborder: none1px solid; font-weight: boldnormal; background: rgba(192, 192, 192, 0.3); border: 1px inset;',
'.wikEdCharEntityButton:before, .wikEdCharEntityButtonShow:before':
'.wikEdTableEdit caption': 'background: lightgrey; text-shadow: none; font-weight: normal;',////
'',
 
// wikEdFrameBodyNewbie table hiding
'.wikEdFrameBodyNewbie .wikEdTableContainer + .wikEdTable':
'position: fixed; left: -10000em;',
'.wikEdFrameBodyNewbie .wikEdTableContainer + .wikEdTableShow':
'display: inline-block; position: relative; color: #000; font-weight: normal; background: rgba(255, 255, 255, 0.2); border: 1px inset;',
'.wikEdFrameBodyNewbie .wikEdTableButton:before, .wikEdFrameBodyNewbie .wikEdTableButtonShow:before':
'content: "{wikEdText:hideTable}";',
 
// insert wikicode here
'.wikEdInsertHere': 'background: orange; text-shadow: none; font-style: italic;',
 
// colors
'.wikEdColorsLight': 'color: black; text-shadow: none;',
'.wikEdColorsDark': 'color: white; text-shadow: none;',
 
// dashes
'.wikEdFigureDash': 'background-image: url({wikEdImage:figureDash}); background-position: top right; background-repeat: no-repeat;',
'.wikEdEmDash': 'background-image: url({wikEdImage:emDash}); background-position: top left; background-repeat: no-repeat;',
Line 704 ⟶ 773:
'.wikEdHyphenDash': '',
 
// dashes, invisibles, control chars, and strange spaces
'.wikEdTab': 'white-space: pre; background-image: url({wikEdImage:tab}); background-position: bottom right; background-repeat: no-repeat;',
'.wikEdTabPlain': 'white-space: pre;',
Line 717 ⟶ 786:
};
 
// main window css rules
if (typeof(wikEdConfig['wikEd.config.mainCSS']) === 'undefined') { wikEdConfig['wikEd.config.mainCSS'] = {}; }
 
// WikedInitMainCSSwikEd.InitMainCSS: define built-in main window css
windowwikEd.WikedInitMainCSSInitMainCSS = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.mainCSS'], {
 
// logo
'.wikEdLogoList': 'list-style-type: none;',
'.wikEdLogo': 'margin-left: 0.5em;',
Line 731 ⟶ 800:
};
 
// main window css rules for edit pages only
if (typeof(wikEdConfig['wikEd.config.mainEditCSS']) === 'undefined') { wikEdConfig['wikEd.config.mainEditCSS'] = {}; }
 
// WikedInitMainEditCSSwikEd.InitMainEditCSS: define built-in main window css for edit pages only
windowwikEd.WikedInitMainEditCSSInitMainEditCSS = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.mainEditCSS'], {
 
// combo input box
'.wikEdCombo': 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin: 0 0.1em 0 0.1em; height: 1.6em; vertical-align: bottom;',
 
// wikEd button areas
 
// button bar margins
'.wikEdButtonBarFormat': 'margin: 0 8px 3px 1px; float: left;',
'.wikEdButtonBarTextify': 'margin: 0 8px 3px 1px; float: left;',
Line 751 ⟶ 820:
'.wikEdButtonBarCustom2': 'margin: 0 8px 3px 1px; float: left;',
'.wikEdButtonBarControl': 'margin: 0 1px 3px 0; float: right;',
'.wikEdButtonBarPreview': 'margin: 0.4em 0.75em 0.15em 0.6em; float: right;',
'.wikEdButtonBarPreviewFull': 'margin: -0.2em 0 0 0.6em; float: right;',
'.wikEdButtonBarPreview2': 'margin: 0.2em 0 0.4em 0; float: right;',
'.wikEdButtonBarJump': 'margin: 0 0 0 0.6em; float: right;',
'.wikEdButtonBarPasted': 'position: absolute;',
 
// button bar inner wrapper: border (hidden: invisible)
'.wikEdButtonBarInnerWrapperVisible': 'border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
'.wikEdButtonBarInnerWrapperHidden': '',
 
// button bar grip wrapper: invisible (hidden: border)
'.wikEdButtonBarGripWrapperVisible': 'float: left; border: 1px solid; border-color: #e4e0dc #c4c0bc #c4c0bc #e4e0dc;',
'.wikEdButtonBarGripWrapperHidden': 'float: left; border: 1px solid; border-color: #e0e0e0e4e0dc #808080c4c0bc #808080c4c0bc #e0e0e0e4e0dc;',
 
// button bar buttons wrapper: invisible (hidden: border)
'.wikEdButtonBarButtonsWrapperVisible, .wikEdButtonBarButtonsWrapperHidden': 'float: left; background: #d4d0cc; border: 1px solid; border-color: #e4e0dc #c4c0bc #c4c0bc #e4e0dc; background: #d4d0cc; z-index: 4;',
'.wikEdButtonBarButtonsWrapperHidden': 'float: left; background: #d4d0cc; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; z-index: 4;',
 
// button bar grip
'.wikEdButtonBarGrip': 'background: #d4d0cc; paddingcursor: 0pointer; background-imagerepeat: url({wikEdImage:grip})no-repeat; background-repeatposition: repeat-y; cursor: pointercenter;',
'.wikEdButtonBarGripWrapperVisible .wikEdButtonBarGrip': 'background-image: url({wikEdImage:grip});',
'.wikEdButtonBarGripWrapperHidden .wikEdButtonBarGrip': 'background-image: url({wikEdImage:gripHidden});',
 
// button bar buttons
'.wikEdButtonsFormat': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsTextify': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsCustom1': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsFind': 'background: #d4d0cc; padding: 0px2px 2px 0 0px;',
'.wikEdButtonsFix': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsCustom2': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsControl': 'background: #d4d0cc; padding: 2px 2px 0 1px;',
'.wikEdButtonsPasted': 'padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; background: rgba(212, 208, 204, 0.6);',
'.wikEdButtonsPasted:hover': 'background-color: #e4e0dc;',
'.wikEdButtonsPasted img': 'border-color: rgba(0, 0, 0, 0) !important; background-color: rgba(0, 0, 0, 0);',
'.wikEdButtonsPasted img:hover': 'background-color: #e4e0dc;',
'.wikEdButtonsPreview': 'padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; background: #d4d0cc;',
'.wikEdButtonsPreviewFull': 'padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; background: #d4d0cc;',
'.wikEdButtonsPreview2': 'padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; background: #d4d0cc;',
'.wikEdButtonsJump': 'border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; background: #d4d0cc;',
 
// wikEd buttons (!important for devmo skin)
'.wikEdButtonsPreview': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
'.wikEdButtonsPreviewFull': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
'.wikEdButtonsPreview2': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
'.wikEdButtonsJump': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0;',
 
// wikEd buttons (!important for devmo skin)
'.wikEdButton': 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #d4d0cc; border: 1px #d4d0cc solid !important; cursor: pointer;',
'.wikEdButton:hover': 'background: #e4e0dde4e0dc; border: 1px outset !important; cursor: pointer;',
'.wikEdButton:active': 'background: #e4e0dc; border: 1px inset !important; cursor: pointer;',
'.wikEdButtonSolo': 'vertical-aligndisplay: text-topblock; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0.2em; background: #d4d0cc; border: 1px #d4d0cc solid !important; cursor: pointer;',
'.wikEdButtonSolo:hover': 'background: #e4e0dde4e0dc; border: 1px outset !important; cursor: pointer;',
'.wikEdButtonChecked': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid !important; border-color: black white white black !important; cursor: pointer;',
'.wikEdButtonUnchecked': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ddd8d3; border: 1px solid !important; border-color: white black black white !important; cursor: pointer;',
'.wikEdButtonPressed': 'vertical-align: text-top; font-size: small; text-decoration: none; margin: 1px 2px; padding: 0; background: #ccc8c3; border: 1px solid !important; border-color: black white white black !important; cursor: wait;',
'.wikEdButtonInactive': 'vertical-align: text-top; font-size: small; text-decoration: underline; margin: 1px 2px; padding: 0; background: #c0c0c0rgba(160, 160, 160, 0.5) !important; border: 1px #b0b0b0 solid !important; cursor: not-allowed',
'.wikEdLocalPreview': 'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;',
'.wikEdLocalDiff': 'vertical-align: top; margin: 0 0.33em 0 0.15em; padding: 0;',
Line 800 ⟶ 874:
'.wikEdButtonDummy': 'vertical-align: text-top; margin: 1px 2px; padding: 1px; background: #d4d0cc;',
 
// preview box
'.wikEdPreviewBoxOuterwikEdPreviewArticle': 'clearmargin: both0.75em 0 0.2em; marginpadding: 0.5em; border-width: 1px; border-style:solid solid#c0c0c0; border-colorbackground: #808080 #d0d0d0 #d0d0d0 #808080faf8f6;',
'.wikEdPreviewDiff': 'margin: 0.75em 0 0.5em;',
'.wikEdPreviewBox': 'background: #faf8f6; padding: 5px; border-width: 1px; border-style: solid; border-color: #404040 #ffffff #ffffff #404040;',
'.wikEdPreviewRefs': 'margin-top: 1.5em; padding-top: 1em; border-top: 1px solid #a0a0a0;',
'.wikEdPreviewDiffError': 'padding: 0.5em; font-weight: bold; color: red; text-align: center;',
 
// find fieldand replace fields
'.wikEdFindComboInput, .wikEdReplaceComboInput': 'position: relative; paddingmargin: 0 5px; margintop: 0 0.2em-1px; white-space: nowrap; topvertical-align: bottom; padding: 0; verticalline-alignheight: bottom20px; font-size: 13px;',
'#wikEdFindText': , #wikEdReplaceText'vertical-align: 0%; 'font-family: monospace; paddingmargin: 0; marginposition: absolute; left: 0; positiontop: absolute0; z-index: 2; vertical-mozalign: bottom; width: 170px; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 1pxborder-box; height: 14px; width: 170px18px;',
'#wikEdFindSelect': , #wikEdReplaceSelect'vertical-align: 0%; 'font-family: monospace; paddingmargin: 0; marginposition: relative; left: 0; positiontop: relative0; z-index: 1; vertical-mozalign: bottom; width: 190px; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 0pxborder-box; height: 18px; border: none;',
 
// replacesummary field
'.wikEdReplaceComboInputwikEdSummaryComboInput': 'position: relative; paddingmargin: 0 0 0 2px; margintop: 0 0.2em; white-space: nowrap; toppadding: 0; vertical-alignwebkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-size: bottom13px;',
'#wikEdReplaceText.wikEdSummaryText': 'vertical-alignpadding: 0%; font-familymargin: monospace0; paddingposition: 0absolute; marginleft: 0; positiontop: absolute0; z-index: 2; vertical-mozalign: bottom; width: auto; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 1pxborder-box; height: 14px; width: 170px21px;',
'#wikEdReplaceSelect.wikEdSummarySelect': 'vertical-alignpadding: 0%; font-familymargin: monospace0; paddingposition: 0relative; marginleft: 0; positiontop: relative0; z-index: 1; vertical-mozalign: text-top; width: auto; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 0pxborder-box; height: 18px21px; border: none; ',
 
// space around submit buttons
// summary field
'.wikEdSummaryComboInput': 'position: relative; padding: 0; margin: 0 0 0 0.1em; white-space: nowrap; top: 0; vertical-align: text-bottom;',
'.wikEdSummaryText': 'vertical-align: 0%; padding: 0; margin: 0; position: absolute; z-index: 2; -moz-box-sizing: content-box; left: 0; top: 0px; height: 18px; width: auto;',
'.wikEdSummarySelect': 'vertical-align: 0%; padding: 0; margin: 0; position: relative; z-index: 1; -moz-box-sizing: content-box; left: 0; top: 1px; height: 21px; border: none;',
 
// space around submit buttons
'.editButtons': '',
 
// frame (frame container border will be removed if textarea has none; frame must not have a border)
'.wikEdFrameOuter': 'float: left; width: auto; border: 1px solid; border-color: #808080 #d0d0d0 #d0d0d0 #808080; position: relative;',
'.wikEdFrameInner': 'float: left; width: auto; background: white; border: 1px solid; border-color: #404040 #ffffff #ffffff #404040; line-height: 0; position: relative;',
'.wikEdFrame': 'float: left; width: 100%; border: 0;',
 
// summary
'.wikEdSummaryWrapper': 'margin: 0 0.4em 0.4em75em 0; widthline-height: 100%26px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;',
'.wikEdConsoleTopWrapper': 'clear: both; background: #f0f0f0; border: 1px solid #c0c0c0; position: relative; padding: 0 0 0.6em; margin: 0 0 0.5em;',
'.wikEdSummaryWrapperTop': 'margin: 0.1em 0 0.4em 0; width: 100%',
'#wpSummaryLabel': 'margin: 0 0.2em 0 0;',
'.editOptions': 'positionpadding: relative0; topborder: none; margin: 0 0.1em75em; float: left',
'.wikEdClearSummaryForm': 'display: inline;',
'.wikEdClearSummary': 'vertical-align: middle; margin: 0 0.1em 0 0.5em; padding: 01px; 0height: 0.2em19px; 0width: 18px; ',
'#wikEdClearSummaryImg': 'vertical-align: 10%; ',
 
// input wrapper
'.wikEdInputWrapper': 'z-indexposition: 100; clear: bothrelative; margin-top: 0.5em; clear: both;',
'.wikEdInputWrapperFullwikEdFullscreen .wikEdInputWrapper ': 'position: fixed; margin-top: 0; lefttop: 0; rightleft: 0; paddingright: 4px0; background: white; z-index: 100#f0f0f0;',
'body.wikEdFullscreen': 'overflow: hidden;',
'.wikEdFullscreen .portlet ': 'z-index: 0 !important;', // for monobook
 
// other wrappers
'.wikEdEditorWrapper': '',
'.wikEdToolbarWrapper': 'margin: 0 0 0.25em 0;',
'.wikEdButtonBarWrapper': 'line-height: 14px; float: left; width: 100%; padding: 0.2em 0;',
'.wikEdCaptchaWrapper': '',
'.wikEdDebugWrapper': 'clearposition: bothrelative; margin: 0 0 0.25em 05em;',
'.wikEdDebugTextarea': 'width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box;',
'.wikEdEditWrapper': 'clear: both;',
'.wikEdEditWrapperFull': 'float: left; clear: both; width: 100%;',
'.wikEdTextareaWrapper': '',
'.wikEdFrameWrapper': '',
'.wikEdConsoleWrapper': 'clear: both; paddingbackground: #f0f0f0; border: 1px solid #c0c0c0; border-top: none; padding: 0 0 0.25em4em; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; width: 100%;',
'.wikEdButtonsWrapper': '',
'.wikEdButtonsWrapperFull': 'float: left; clear: both; width: 100%;',
'.wikEdSummaryInputWrapper': 'display: inline; white-space: nowrap;',
'.wikEdSummaryOptionswikEdSubmitWrapper': 'display: inline;',
'.wikEdSubmitWrapperwikEdSubmitButtonsWrapper': 'float: left; margin: 0.4em 0.75em '0;',
'.wikEdEditOptionsWrapper': 'float: left; margin: 0.4em 0.75em 0;',
'.wikEdSubmitButtonsWrapper': '',
'.wikEdLocalPrevWrapperwikEdEditHelp': 'margin: 0.5em 0 0 0 'white-space: nowrap;',
'.wikEdInsertWrapper': 'float: left; clear: both; margin-top: 0.25em;',
'.wikEdFullscreen .wikEdInsertWrapper p': 'display: inline; margin: 0;',
 
'.wikEdLocalPrevWrapper': 'float: left; width: 100%;',
// various
'.wikEdEditOptions': 'display: inline; vertical-align: baseline; margin-right: 0.75em; white-space: nowrap;',
'.wikEdEditHelp': 'vertical-align: baseline; margin-right: 0.5em; white-space: nowrap;',
'#editpage-specialchars': 'clear: both;',
 
// wDiff
'.wDiffParagraph:before': 'content: "¶";'
 
// various
'.editCheckboxes': 'margin-bottom: 0;',
'.wikEdEditOptions': 'display: inline-block; white-space: nowrap; vertical-align: text-top;',
'.wikEdEditOptions label': 'vertical-align: text-bottom;',
'#editpage-copywarn': '',
'#editpage-specialchars': '',
'#wikEdClonedWarnings': '',
'#wikEdClonedWarningsNote': 'background: #fff; color: #888; font-size: 75%; display: inline;',
'.editButtons input:first-child': 'margin-left: 0; margin-right: 0.33em;',
'fieldset#templatesandbox-editform': 'margin: 0 0 0.5em 0; float: left;',
'#templatesandbox-editform legend': 'padding-top: 0;',
});
};
 
// buttons
// buttons (id, class, popup title, image src, width, height, alt text, click code)
if (typeof(wikEdConfig['wikEd.config.button']) === 'undefined') { wikEdConfig['wikEd.config.button'] = {}; }
 
// wikEd.InitButton: define built-in buttons
// WikedInitButton: define built-in buttons (id, class, popup title, image src, width, height, alt text, click handler code were obj is the button element)
windowwikEd.WikedInitButtonInitButton = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.button'], {
 
// button number: [id, class, tooltip, image url, width, height, alt text, onclick handler code were obj is the button element]
// workaround for mozilla 3.0 bug 441087: objId = obj.id; eventShiftKey = event.shiftKey;
 
// format top
1: ['wikEdUndo', 'wikEdButtonInactive', wikEdConfig['wikEd.config.text']['wikEdUndo title'], wikEdConfig['wikEd.config.image']['undo'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdUndo alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
2: ['wikEdRedo', 'wikEdButtonInactive', wikEdConfig['wikEd.config.text']['wikEdRedo title'], wikEdConfig['wikEd.config.image']['redo'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRedo alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
3: ['wikEdBold', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdBold title'], wikEdConfig['wikEd.config.image']['bold'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdBold alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
4: ['wikEdItalic', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdItalic title'], wikEdConfig['wikEd.config.image']['italic'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdItalic alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
5: ['wikEdUnderline', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdUnderline title'], wikEdConfig['wikEd.config.image']['underline'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdUnderline alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
6: ['wikEdStrikethrough', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdStrikethrough title'], wikEdConfig['wikEd.config.image']['strikethrough'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdStrikethrough alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
7: ['wikEdNowiki', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdNowiki title'], wikEdConfig['wikEd.config.image']['nowiki'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdNowiki alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
8: ['wikEdSuperscript', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdSuperscript title'], wikEdConfig['wikEd.config.image']['superscript'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdSuperscript alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
9: ['wikEdSubscript', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdSubscript title'], wikEdConfig['wikEd.config.image']['subscript'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdSubscript alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
10: ['wikEdRef', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdRef title'], wikEdConfig['wikEd.config.image']['ref'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRef alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, \'wikEdRef\'); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdRefNamed\'); }' ],
12: ['wikEdCase', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdCase title'], wikEdConfig['wikEd.config.image']['case'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdCase alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
80: ['wikEdSort', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdSort title'], wikEdConfig['wikEd.config.image']['sort'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdSort alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
25: ['wikEdRedirect', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdRedirect title'], wikEdConfig['wikEd.config.image']['redirect'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRedirect alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
13: ['wikEdUndoAll', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdUndoAll title'], wikEdConfig['wikEd.config.image']['undoAll'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdUndoAll alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
14: ['wikEdRedoAll', 'wikEdButtonInactive', wikEdConfig['wikEd.config.text']['wikEdRedoAll title'], wikEdConfig['wikEd.config.image']['redoAll'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRedoAll alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
 
// format bottom
15: ['wikEdWikiLink', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdWikiLink title'], wikEdConfig['wikEd.config.image']['wikiLink'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdWikiLink alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
16: ['wikEdWebLink', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdWebLink title'], wikEdConfig['wikEd.config.image']['webLink'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdWebLink alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
17: ['wikEdHeading', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdHeading title'], wikEdConfig['wikEd.config.image']['heading'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdHeading alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, \'wikEdIncreaseHeading\'); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdDecreaseHeading\'); }' ],
19: ['wikEdBulletList', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdBulletList title'], wikEdConfig['wikEd.config.image']['bulletList'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdBulletList alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, \'wikEdIncreaseBulletList\'); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdDecreaseBulletList\'); }' ],
20: ['wikEdNumberList', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdNumberList title'], wikEdConfig['wikEd.config.image']['numberList'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdNumberList alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, \'wikEdIncreaseNumberList\'); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdDecreaseNumberList\'); }' ],
21: ['wikEdIndentList', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdIndentList title'], wikEdConfig['wikEd.config.image']['indentList'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdIndentList alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, \'wikEdIncreaseIndentList\'); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdDecreaseIndentList\'); }' ],
22: ['wikEdDefinitionList', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdDefinitionList title'], wikEdConfig['wikEd.config.image']['definitionList'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdDefinitionList alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
23: ['wikEdImage', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdImage title'], wikEdConfig['wikEd.config.image']['image'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdImage alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
24: ['wikEdTable', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdTable title'], wikEdConfig['wikEd.config.image']['table'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdTable alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
11: ['wikEdReferences', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdReferences title'], wikEdConfig['wikEd.config.image']['references'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdReferences alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id); } else { WikEdEditButtonwikEd.EditButton(obj, \'wikEdReferencesSection\'); }' ],
84: ['wikEdSign', 'wikEdButton', wikEd.config.text['wikEdSign title'], wikEd.config.image['sign'], '16', '16', wikEd.config.text['wikEdSign alt'], 'if (!event.shiftKey) { wikEd.EditButton(obj, obj.id); } else { wikEd.EditButton(obj, \'wikEdSignName\'); }' ],
 
// wikify, textify
26: ['wikEdWikify', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdWikify title'], wikEdConfig['wikEd.config.image']['wikify'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdWikify alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
27: ['wikEdTextify', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdTextify title'], wikEdConfig['wikEd.config.image']['textify'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdTextify alt'], 'if (eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id); }' ],
 
// control top
77: ['wikEdRefHide', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdRefHide title'], wikEdConfig['wikEd.config.image']['refHide'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRefHide alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
29: ['wikEdTextZoom', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdTextZoom title'], wikEdConfig['wikEd.config.image']['textZoom'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdTextZoom alt'], 'if (!eventShiftKeyevent.shiftKey) { WikEdButtonwikEd.Button(obj, \'wikEdTextZoomDown\'); } else { WikEdButtonwikEd.Button(obj, \'wikEdTextZoomUp\'); }' ],
30: ['wikEdClearHistory', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdClearHistory title'], wikEdConfig['wikEd.config.image']['clearHistory'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdClearHistory alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
31: ['wikEdScrollToPreview', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview title'], wikEdConfig['wikEd.config.image']['scrollToPreviewDown'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
32: ['wikEdScrollToEdit', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit title'], wikEdConfig['wikEd.config.image']['scrollToEditDown'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
 
// control bottom
33: ['wikEdUseWikEd', 'wikEdButtonChecked', wikEdConfig['wikEd.config.text']['wikEdUseWikEd title'], wikEdConfig['wikEd.config.image']['useWikEd'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdUseWikEd alt'], 'WikEdButtonif (!event.ctrlKey) { wikEd.Button(obj, objIdobj.id, true); } else { wikEd.DebugInfo(event); }' ],
34: ['wikEdHighlightSyntax', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdHighlightSyntax title'], wikEdConfig['wikEd.config.image']['highlightSyntax'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdHighlightSyntax alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
35: ['wikEdSource', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdSource title'], wikEdConfig['wikEd.config.image']['source'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdSource alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
75: ['wikEdCloseToolbar', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdCloseToolbar title'], wikEdConfig['wikEd.config.image']['closeToolbar'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdCloseToolbar alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
36: ['wikEdUsing', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdUsing title'], wikEdConfig['wikEd.config.image']['using'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdUsing alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
37: ['wikEdFullScreen', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdFullScreen title'], wikEdConfig['wikEd.config.image']['fullScreen'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFullScreen alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
79: ['wikEdTableMode', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdTableMode title'], wikEdConfig['wikEd.config.image']['tableMode'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdTableMode alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
 
// find top
39: ['wikEdFindAll', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFindAll title'], wikEdConfig['wikEd.config.image']['findAll'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFindAll alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
40: ['wikEdFindPrev', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFindPrev title'], wikEdConfig['wikEd.config.image']['findPrev'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFindPrev alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
41: ['wikEdFindNext', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFindNext title'], wikEdConfig['wikEd.config.image']['findNext'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFindNext alt'], 'if (eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id); }' ],
43: ['wikEdJumpPrev', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdJumpPrev title'], wikEdConfig['wikEd.config.image']['jumpPrev'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdJumpPrev alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
44: ['wikEdJumpNext', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdJumpNext title'], wikEdConfig['wikEd.config.image']['jumpNext'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdJumpNext alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
 
// find bottom
46: ['wikEdReplaceAll', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdReplaceAll title'], wikEdConfig['wikEd.config.image']['replaceAll'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdReplaceAll alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
47: ['wikEdReplacePrev', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdReplacePrev title'], wikEdConfig['wikEd.config.image']['replacePrev'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdReplacePrev alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
48: ['wikEdReplaceNext', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdReplaceNext title'], wikEdConfig['wikEd.config.image']['replaceNext'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdReplaceNext alt'], 'if (eventShiftKeyevent.shiftKey) { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { WikEdEditButtonwikEd.EditButton(obj, objIdobj.id); }' ],
49: ['wikEdCaseSensitive', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdCaseSensitive title'], wikEdConfig['wikEd.config.image']['caseSensitive'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdCaseSensitive alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
50: ['wikEdRegExp', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdRegExp title'], wikEdConfig['wikEd.config.image']['regExp'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdRegExp alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
51: ['wikEdFindAhead', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdFindAhead title'], wikEdConfig['wikEd.config.image']['findAhead'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFindAhead alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id, true);' ],
 
// fix top
52: ['wikEdFixBasic', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixBasic title'], wikEdConfig['wikEd.config.image']['fixBasic'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixBasic alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
53: ['wikEdFixHtml', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixHtml title'], wikEdConfig['wikEd.config.image']['fixHtml'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixHtml alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
54: ['wikEdFixCaps', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixCaps title'], wikEdConfig['wikEd.config.image']['fixCaps'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixCaps alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
55: ['wikEdFixUnicode', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixUnicode title'], wikEdConfig['wikEd.config.image']['fixUnicode'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixUnicode alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
81: ['wikEdFixRedirect', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixRedirect title'], wikEdConfig['wikEd.config.image']['fixRedirect'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixRedirect alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
56: ['wikEdFixAll', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixAll title'], wikEdConfig['wikEd.config.image']['fixAll'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixAll alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
57: ['wikEdFixRegExTypo', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixRegExTypo title'], wikEdConfig['wikEd.config.image']['fixRegExTypo'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixRegExTypo alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
 
// fix bottom
58: ['wikEdFixDashes', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixDashes title'], wikEdConfig['wikEd.config.image']['fixDash'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixDashes alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
59: ['wikEdFixPunct', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixPunct title'], wikEdConfig['wikEd.config.image']['fixPunct'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixPunct alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
60: ['wikEdFixMath', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixMath title'], wikEdConfig['wikEd.config.image']['fixMath'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixMath alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
61: ['wikEdFixChem', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixChem title'], wikEdConfig['wikEd.config.image']['fixChem'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixChem alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
62: ['wikEdFixUnits', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdFixUnits title'], wikEdConfig['wikEd.config.image']['fixUnits'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdFixUnits alt'], 'WikEdEditButtonwikEd.EditButton(obj, objIdobj.id);' ],
 
// preview top
65: ['wikEdClose', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdClose title'], wikEdConfig['wikEd.config.image']['close'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdClose alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
66: ['wikEdScrollToPreview2', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview2 title'], wikEdConfig['wikEd.config.image']['scrollToPreviewDown'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview2 alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
67: ['wikEdScrollToEdit2', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit2 title'], wikEdConfig['wikEd.config.image']['scrollToEdit'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit2 alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
 
// preview bottom
70: ['wikEdClose2', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdClose2 title'], wikEdConfig['wikEd.config.image']['close'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdClose2 alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
71: ['wikEdScrollToPreview3', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview3 title'], wikEdConfig['wikEd.config.image']['scrollToPreview'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToPreview3 alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
72: ['wikEdScrollToEdit3', 'wikEdButton', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit3 title'], wikEdConfig['wikEd.config.image']['scrollToEdit'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdScrollToEdit3 alt'], 'WikEdButtonwikEd.Button(obj, objIdobj.id);' ],
 
// jump
7874: ['wikEdDiffwikEdScrollToEdit4', 'wikEdButtonSolo', 'wikEdButtonUnchecked', wikEdConfig['wikEd.config.text']['wikEdDiffwikEdScrollToEdit4 title'], wikEdConfig['wikEd.config.image']['wikEdDiffscrollToEditDown'], '16', '16', wikEdConfig['wikEd.config.text']['wikEdDiffwikEdScrollToEdit4 alt'], 'WikEdButtonwikEd.Button(obj, objId, trueobj.id);' ],
74: ['wikEdScrollToEdit4', 'wikEdButtonSolo', wikEdConfig['text']['wikEdScrollToEdit4 title'], wikEdConfig['image']['scrollToEditDown'], '16', '16', wikEdConfig['text']['wikEdScrollToEdit4 alt'], 'WikEdButton(obj, objId);' ],
 
// dummy (empty placeholder)
76: ['wikEdDummy', 'wikEdButtonDummy', '', wikEdConfig[' wikEd.config.image']['dummy'], '16', '16', '', '' ],
 
// wikEd.InitButton: define built-in buttons (id, class, popup title, image src, width, height, alt text, click handler code were obj is the button element)
82: ['wikEdLocalPreview', 'wikEdLocalPreview', wikEd.config.text['wikEdLocalPreview title'], wikEd.config.image['preview'], '16', '16', wikEd.config.text['wikEdLocalPreviewImg alt'], 'wikEd.Button(obj, obj.id);' ],
83: ['wikEdLocalDiff', 'wikEdLocalDiff', wikEd.config.text['wikEdLocalDiff title'], wikEd.config.image['diff'], '16', '16', wikEd.config.text['wikEdLocalDiffImg alt'], 'wikEd.Button(obj, obj.id);' ],
 
// pasted
85: ['wikEdPastedTextify', 'wikEdButtonInactive', wikEd.config.text['wikEdPastedTextify title'], wikEd.config.image['textify'], '16', '16', wikEd.config.text['wikEdPastedTextify alt'], 'wikEd.EditButton(obj, obj.id);' ],
86: ['wikEdPastedWikify', 'wikEdButtonInactive', wikEd.config.text['wikEdPastedWikify title'], wikEd.config.image['wikify'], '16', '16', wikEd.config.text['wikEdPastedWikify alt'], 'wikEd.EditButton(obj, obj.id);' ],
87: ['wikEdPastedClose', 'wikEdButton', wikEd.config.text['wikEdPastedClose title'], wikEd.config.image['closePasted'], '16', '16', wikEd.config.text['wikEdPastedClose alt'], 'wikEd.PastedClose();' ]
});
};
 
// button access keys
if (typeof(wikEdConfig['wikEd.config.buttonKey']) === 'undefined') { wikEdConfig['wikEd.config.buttonKey'] = {}; }
 
// wikEd.InitButtonKey: define accesskeys for edit buttons
wikEd.InitButtonKey = function () {
wikEd.InitObject(wikEd.config.buttonKey, {
 
// WikedInitButtonKey: define accesskeys for edit buttons (wikEd button number: [key string, JS key code])
window.WikedInitButtonKey = function() {
WikEdInitObject(wikEdConfig['buttonKey'], {
26: ['b', 66], // wikify
27: ['o', 79], // textify
Line 991 ⟶ 1,084:
};
 
// button bars (id, class, button numbers)
if (typeof(wikEdConfig['wikEd.config.buttonBar']) === 'undefined') { wikEdConfig['wikEd.config.buttonBar'] = {}; }
 
// WikedInitButtonBarwikEd.InitButtonBar: define built-in button bars (id outer, class outer, id inner, class inner, height, grip title, button numbers)
windowwikEd.WikedInitButtonBarInitButtonBar = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.buttonBar'], {
 
'format': ['wikEdButtonBarFormat', 'wikEdButtonBarFormat', 'wikEdButtonsFormat', 'wikEdButtonsFormat', 44, wikEdConfig['text']['wikEdGripFormat title'], [1,2,3,4,5,6,7,8,9,10,12,13,14,'br',15,16,17,19,20,21,22,23,24,11,80,25,76] ],
// button name: [id outer, class outer, id inner, class inner, height, grip title, button numbers, bar title
'textify': ['wikEdButtonBarTextify', 'wikEdButtonBarTextify', 'wikEdButtonsTextify', 'wikEdButtonsTextify', 44, wikEdConfig['text']['wikEdGripTextify title'], [26,'br',27] ],
'format': ['wikEdButtonBarFormat', 'wikEdButtonBarFormat', 'wikEdButtonsFormat', 'wikEdButtonsFormat', 44, wikEd.config.text['wikEdGripFormat title'], [1,2,3,4,5,6,7,8,9,10,12,13,14,'br',15,16,17,19,20,21,22,23,24,11,80,25,84], wikEd.config.text['wikEdBarFormat title'] ],
'custom1': ['wikEdButtonBarCustom1', 'wikEdButtonBarCustom1', 'wikEdButtonsCustom1', 'wikEdButtonsCustom1', 44, wikEdConfig['text']['wikEdGripCustom1 title'], [ ] ],
'findtextify': ['wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonsFindwikEdButtonsTextify', 'wikEdButtonsFindwikEdButtonsTextify', 44, wikEdConfig['wikEd.config.text']['wikEdGripFindwikEdGripTextify title'], [39,40,'find',41,76,43,4426,'br',46,4727], wikEd.config.text['replacewikEdBarTextify title',48,49,50,51] ],
'fixcustom1': ['wikEdButtonBarFixwikEdButtonBarCustom1', 'wikEdButtonBarFixwikEdButtonBarCustom1', 'wikEdButtonsFixwikEdButtonsCustom1', 'wikEdButtonsFixwikEdButtonsCustom1', 44, wikEdConfig['wikEd.config.text']['wikEdGripFixwikEdGripCustom1 title'], [ ], wikEd.config.text[52,53,54,55,56,81,'brwikEdBarCustom1 title',58,59,60,61,62,57] ],
'find': ['wikEdButtonBarFind', 'wikEdButtonBarFind', 'wikEdButtonsFind', 'wikEdButtonsFind', 44, wikEd.config.text['wikEdGripFind title'], [39,40,'find',41,76,43,44,'br',46,47,'replace',48,49,50,51], wikEd.config.text['wikEdBarFind title'] ],
'custom2': ['wikEdButtonBarCustom2', 'wikEdButtonBarCustom2', 'wikEdButtonsCustom2', 'wikEdButtonsCustom2', 44, wikEdConfig['text']['wikEdGripCustom2 title'], [ ] ],
'controlfix': ['wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonsControlwikEdButtonsFix', 'wikEdButtonsControlwikEdButtonsFix', 44, wikEdConfig['wikEd.config.text']['wikEdGripControlwikEdGripFix title'], [7752,2953,3054,3555,3156,3281,'br',3358,3459,7960,7561,3662,7857],37 wikEd.config.text['wikEdBarFix title'] ],
'custom2': ['wikEdButtonBarCustom2', 'wikEdButtonBarCustom2', 'wikEdButtonsCustom2', 'wikEdButtonsCustom2', 44, wikEd.config.text['wikEdGripCustom2 title'], [ ], wikEd.config.text['wikEdBarCustom2 title'] ],
'preview': ['wikEdButtonBarPreview', 'wikEdButtonBarPreview', 'wikEdButtonsPreview', 'wikEdButtonsPreview', 0, null, [66,67,65] ],
'control': ['wikEdButtonBarControl', 'wikEdButtonBarControl', 'wikEdButtonsControl', 'wikEdButtonsControl', 44, wikEd.config.text['wikEdGripControl title'], [77,29,30,35,31,32,'br',33,34,79,75,36,37], wikEd.config.text['wikEdBarControl title'] ],
'preview2': ['wikEdButtonBarPreview2', 'wikEdButtonBarPreview2', 'wikEdButtonsPreview2', 'wikEdButtonsPreview2', 0, null, [71,72,70] ],
'preview': ['wikEdButtonBarPreview', 'wikEdButtonBarPreview', 'wikEdButtonsPreview', 'wikEdButtonsPreview', 0, null, [66,67,65], wikEd.config.text['wikEdBarPreview title'] ],
'jump': ['wikEdButtonBarJump', 'wikEdButtonBarJump', 'wikEdButtonsJump', 'wikEdButtonsJump', 0, null, [74] ]
'preview2': ['wikEdButtonBarPreview2', 'wikEdButtonBarPreview2', 'wikEdButtonsPreview2', 'wikEdButtonsPreview2', 0, null, [71,72,70], wikEd.config.text['wikEdBarPreview2 title'] ],
'jump': ['wikEdButtonBarJump', 'wikEdButtonBarJump', 'wikEdButtonsJump', 'wikEdButtonsJump', 0, null, [74], wikEd.config.text['wikEdBarJump title'] ],
'pasted': ['wikEdButtonBarPasted', 'wikEdButtonBarPasted', 'wikEdButtonsPasted', 'wikEdButtonsPasted', 0, null, [85,86,87], wikEd.config.text['wikEdBarPasted title'] ]
});
};
 
// history length for find, replace, and summary fields
if (typeof(wikEdConfig['wikEd.config.historyLength']) === 'undefined') { wikEdConfig['wikEd.config.historyLength'] = {}; }
windowwikEd.WikedInitHistoryLengthInitHistoryLength = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.historyLength'], {
'find': 10,
'replace': 10,
Line 1,020 ⟶ 1,116:
};
 
// presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script
if (typeof(wikEdConfig['wikEd.config.comboPresetOptions']) === 'undefined') { wikEdConfig['wikEd.config.comboPresetOptions'] = {}; }
if (typeof(wikEdConfig['wikEd.config.comboPresetOptions']['.summary']) === 'undefined') { wikEdConfig['wikEd.config.comboPresetOptions']['.summary'] = wikEdConfig['wikEd.config.text']['.wikEdPresetSummary']; }
 
// text for summary link to this script
if (typeof(wikEdConfig['wikEd.config.summaryUsing']) === 'undefined') { wikEdConfig['wikEd.config.summaryUsing'] = wikEdConfig['wikEd.config.text']['.wikEdSummaryUsing']; }
 
// expiration time span for permanent cookies in seconds, also defined in wikEdDiff.js
if (typeof(wikEdConfig['wikEd.config.cookieExpireSec']) === 'undefined') { wikEdConfig['wikEd.config.cookieExpireSec'] = 1 * 30 * 24 * 60 * 60; }
 
// disable wikEd preset
if (typeof(wikEdConfig['wikEd.config.disabledPreset']) === 'undefined') { wikEdConfig['wikEd.config.disabledPreset'] = false; }
 
// find ahead as you type checkbox preset
if (typeof(wikEdConfig['wikEd.config.findAheadSelected']) === 'undefined') { wikEdConfig['wikEd.config.findAheadSelected'] = true; }
 
// highlight syntax preset
if (typeof(wikEdConfig['wikEd.config.highlightSyntaxPreset']) === 'undefined') { wikEdConfig['wikEd.config.highlightSyntaxPreset'] = true; }
 
// enable wikEd preset
if (typeof(wikEdConfig['wikEd.config.useWikEdPreset']) === 'undefined') { wikEdConfig['wikEd.config.useWikEdPreset'] = true; }
 
// add '...using wikEd' to summary preset
if (typeof(wikEdConfig['wikEd.config.usingPreset']) === 'undefined') { wikEdConfig['wikEd.config.usingPreset'] = false; }
 
// scroll to edit field on non-preview pages
if (typeof(wikEdConfig['wikEd.config.scrollToEdit']) === 'undefined') { wikEdConfig['wikEd.config.scrollToEdit'] = true; }
 
// focus the edit field on non-preview pages
if (typeof(wikEdConfig['wikEd.config.focusEdit']) === 'undefined') { wikEdConfig['wikEd.config.focusEdit'] = true; }
 
// wikEdDifffullscreen mode preset
if (typeof(wikEdConfig['diffPreset'])wikEd.config.fullScreenModePreset === 'undefined') { wikEdConfig['diffPreset']wikEd.config.fullScreenModePreset = false; }
 
// fullscreenshow modeMediaWiki toolbar preset
if (typeof(wikEdConfig['fullScreenModePreset'])wikEd.config.closeToolbarPreset === 'undefined') { wikEdConfig['fullScreenModePreset']wikEd.config.closeToolbarPreset = false; }
 
// showhide MediaWikiref toolbartags preset
if (typeof(wikEdConfig['closeToolbarPreset'])wikEd.config.refHidePreset === 'undefined') { wikEdConfig['closeToolbarPreset']wikEd.config.refHidePreset = false; }
 
// text size adjustment for edit window (percentage)
// hide ref tags preset
if (typeof(wikEdConfig['refHidePreset'])wikEd.config.textSizeAdjust === 'undefined') { wikEdConfig['refHidePreset']wikEd.config.textSizeAdjust = false100; }
 
// remove invisible syntax highlighting comments after closing tag
// text size adjustment for edit window (percentage)
if (typeof(wikEdConfig['textSizeAdjust'])wikEd.config.removeHighlightComments === 'undefined') { wikEdConfig['textSizeAdjust']wikEd.config.removeHighlightComments = 100true; }
 
// show the text-to-source button for testing purposes
// remove invisible syntax highlighting comments after closing tag
if (typeof(wikEdConfig['removeHighlightComments'])wikEd.config.showSourceButton === 'undefined') { wikEdConfig['removeHighlightComments']wikEd.config.showSourceButton = truefalse; }
 
// show the textusing-to-sourcewikEd button for testing purposes
if (typeof(wikEdConfig['showSourceButton'])wikEd.config.showUsingButton === 'undefined') { wikEdConfig['showSourceButton']wikEd.config.showUsingButton = false; }
 
// the wikEd help page link to be displayed after the editing help link, an empty string disables the link
// show the using-wikEd button
if (typeof(wikEdConfig['showUsingButton'])wikEd.config.helpPageLink === 'undefined') { wikEdConfig['showUsingButton']wikEd.config.helpPageLink = falsewikEd.config.text.wikEdHelpPageLink; }
 
// enable external diff script
// the wikEd help page link to be displayed after the editing help link, an empty string disables the link
if (typeof(wikEdConfig['helpPageLink'])wikEd.config.loadDiffScript === 'undefined') { wikEdConfig['helpPageLink']wikEd.config.loadDiffScript = wikEdConfig['text']['wikEdHelpPageLink']true; }
 
// enable external diffwikEdDiff script
if (typeof(wikEdConfig['loadDiffScript'])wikEd.config.loadDiff === 'undefined') { wikEdConfig['loadDiffScript']wikEd.config.loadDiff = true; }
 
// RegExTypoFix rules page, the address must have the exact same ___domain name as the used wiki
// enable external wikEdDiff script
if (wikEd.config.regExTypoFixURL === undefined) { wikEd.config.regExTypoFixURL = wikEd.config.homeBaseUrl + 'w/index.php?title=Wikipedia:AutoWikiBrowser/Typos&action=raw'; }
if (typeof(wikEdConfig['loadDiff']) == 'undefined') { wikEdConfig['loadDiff'] = true; }
 
// enable RegExTypoFix button (https://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix)
// enable external InstaView script
if (typeof(wikEdConfig['loadInstaView'])wikEd.config.regExTypoFix === 'undefined') { wikEdConfig['loadInstaView']wikEd.config.regExTypoFix = truefalse; }
 
// enable externalhighlighting IERangeas scriptlinks
if (typeof(wikEdConfig['loadIERange'])wikEd.config.followHighlightedLinks === 'undefined') { wikEdConfig['loadIERange']wikEd.config.followHighlightedLinks = truefalse; }
 
// skip the browser detection to run wikEd under IE and Opera
// RegExTypoFix rules page, the address must have the exact same ___domain name as the used wiki
if (wikEd.config.skipBrowserTest === undefined) { wikEd.config.skipBrowserTest = false; }
if (typeof(wikEdConfig['regExTypoFixURL']) == 'undefined') { wikEdConfig['regExTypoFixURL'] = wikEdConfig['homeBaseUrl'] + 'w/index.php?title=Wikipedia:AutoWikiBrowser/Typos&action=raw'; }
 
// skip the script test that disables wikEd if certain scripts are present
// enable RegExTypoFix button (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix)
if (typeof(wikEdConfig['regExTypoFix'])wikEd.config.skipScriptTest === 'undefined') { wikEdConfig['regExTypoFix']wikEd.config.skipScriptTest = false; }
 
// skip the add-on test that disables wikEd if certain add-ons are present
// enable highlighting as links
if (typeof(wikEdConfig['followHighlightedLinks'])wikEd.config.skipAddonTest === 'undefined') { wikEdConfig['followHighlightedLinks']wikEd.config.skipAddonTest = false; }
 
// skip the browserread-only detection to run wikEd under IE and Opera
if (typeof(wikEdConfig['skipBrowserTest'])wikEd.config.skipReadOnlyTest === 'undefined') { wikEdConfig['skipBrowserTest']wikEd.config.skipReadOnlyTest = false; }
 
// skip the script test that disablesdisable wikEd if certainincompatible scripts are presentactive
if (typeof(wikEdConfig['skipScriptTest'])wikEd.config.incompatibleScripts === 'undefined') { wikEdConfig['skipScriptTest']wikEd.config.incompatibleScripts = false{}; }
 
// wikEd.InitIncompatibleScripts: disable wikEd if incompatible scripts are active
// skip the read-only detection
// 'name in error message': 'regexp', case insensitive for script file name from URL w/o .js, use '\\' for '\'
if (typeof(wikEdConfig['skipReadOnlyTest']) == 'undefined') { wikEdConfig['skipReadOnlyTest'] = false; }
wikEd.InitIncompatibleScripts = function () {
 
wikEd.InitObject(wikEd.config.incompatibleScripts, {
// button access keys
'CKEditor': '\\bckeditor',
if (typeof(wikEdConfig['incompatibleScripts']) == 'undefined') { wikEdConfig['incompatibleScripts'] = {}; }
'FCKEditor': 'fckeditor',
 
'less edit clutter': 'less.?edit.?clutter', // [[User:Magnus_Manske/less_edit_clutter.js]]
// WikedInitButtonKey: define accesskeys for edit buttons (wikEd button number: [key string, JS key code])
'MagnusEditBox': 'MagnusEditBox' // less_edit_clutter gadget on fr
window.WikedInitIncompatibleScripts = function() {
WikEdInitObject(wikEdConfig['incompatibleScripts'], {
'CKEditor': 'ckeditor.js',
'FCKEditor': 'fckeditor.js'
});
};
 
// disable beta toolbar CodeEditor button
// set the button bar grip width in px
if (typeof(wikEdConfig['buttonBarGripWidth'])wikEd.config.disableCodeEditorButton === 'undefined') { wikEdConfig['buttonBarGripWidth']wikEd.config.disableCodeEditorButton = 8true; }
 
// set the button bar grip width in px
// enable local preview (Pilaf's InstaView)
if (typeof(wikEdConfig['useLocalPreview'])wikEd.config.buttonBarGripWidth === 'undefined') { wikEdConfig['useLocalPreview']wikEd.config.buttonBarGripWidth = true7; }
 
// enable server preview (Ajax)
// allow ajax requests from local copy for testing, also defined in wikEdDiff.js
if (typeof(wikEdConfig['allowLocalAjax'])wikEd.config.useAjaxPreview === 'undefined') { wikEdConfig['allowLocalAjax']wikEd.config.useAjaxPreview = falsetrue; }
 
// enable serverauto previewupdate (Ajax)
if (typeof(wikEdConfig['useAjaxPreview'])wikEd.config.autoUpdate === 'undefined') { wikEdConfig['useAjaxPreview']wikEd.config.autoUpdate = true; }
 
// hours between update check (monobook.js)
// enable appending '<references/> for Ajax section previews
if (typeof(wikEdConfig['SectionPreviewRefs'])wikEd.config.autoUpdateHours === 'undefined') { wikEdConfig['SectionPreviewRefs']wikEd.config.autoUpdateHours = true20; }
 
// enablehours autobetween update check (AjaxGreasemonkey)
if (typeof(wikEdConfig['autoUpdate'])wikEd.config.autoUpdateHoursGM === 'undefined') { wikEdConfig['autoUpdate']wikEd.config.autoUpdateHoursGM = true40; }
 
// hours betweenauto update: version checkurl (monobook.jsAjax)
if (wikEd.config.autoUpdateUrl === undefined) { wikEd.config.autoUpdateUrl = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/wikEd_current_version&action=raw&maxage=0'; }
if (typeof(wikEdConfig['autoUpdateHours']) == 'undefined') { wikEdConfig['autoUpdateHours'] = 20; }
 
// hours betweenauto update: checkscript url for (Greasemonkey) update
if (wikEd.config.autoUpdateScriptUrl === undefined) { wikEd.config.autoUpdateScriptUrl = wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd.user.js'; }
if (typeof(wikEdConfig['autoUpdateHoursGM']) == 'undefined') { wikEdConfig['autoUpdateHoursGM'] = 40; }
 
// auto update: script url for Greasemonkey bugfix (fix script duplication after @namespace change in version 0.9.127)
// auto update: version url (Ajax)
if (typeof(wikEdConfig['autoUpdateUrl'])wikEd.config.autoUpdateScriptUrlBugfix === 'undefined') { wikEdConfig['autoUpdateUrl']wikEd.config.autoUpdateScriptUrlBugfix = wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd_current_version&action=raw&maxage=0bugfix_wikEd.user.js'; }
 
// make links ctrl-clickable
// auto update: script url for Greasemonkey update
if (wikEd.config.linkify === undefined) { wikEd.config.linkify = true; }
if (typeof(wikEdConfig['autoUpdateScriptUrl']) == 'undefined') { wikEdConfig['autoUpdateScriptUrl'] = wikEdConfig['homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd.user.js'; }
 
// absolute instead of relative linkify links, URL with "$1" as article name placeholder
// show complete unshortened article text for local diff, also defined in wikEdDiff.js
if (typeof(wikEdConfig['fullDiff'])wikEd.config.linkifyArticlePath === 'undefined') { wikEdConfig['fullDiff']wikEd.config.linkifyArticlePath = falsenull; }
 
// hide refs and templates in newbie mode
// make links ctrl-clickable
if (typeof(wikEdConfig['linkify'])wikEd.config.hideContent === 'undefined') { wikEdConfig['linkify']wikEd.config.hideContent = true; }
 
// hideunhide refs and templates in newbie mode by hover-shift instead of mouseover
if (typeof(wikEdConfig['hideContent'])wikEd.config.unhideShift === 'undefined') { wikEdConfig['hideContent']wikEd.config.unhideShift = truefalse; }
 
// wikify table parameters, replaces original table parameters with this string
if (typeof(wikEdConfig['wikEd.config.wikifyTableParameters']) === 'undefined') { wikEdConfig['wikEd.config.wikifyTableParameters'] = ''; }
 
// do not rearrange page elements
if (typeof(wikEdConfig['wikEd.config.noRearrange']) === 'undefined') { wikEdConfig['wikEd.config.noRearrange'] = false; }
 
// use French rules for fix punctuation
if (typeof(wikEdConfig['wikEd.config.fixPunctFrench']) === 'undefined') { wikEdConfig['wikEd.config.fixPunctFrench'] = false; }
 
// wikEdConfig['wikEd.config.setupHook'], executed after wikEd has been set up, usage: wikEdConfig['wikEd.config.setupHook'].push(YourFunction);
if (typeof(wikEdConfig['wikEd.config.setupHook']) === 'undefined') { wikEdConfig['wikEd.config.setupHook'] = []; }
 
// wikEdConfig['wikEd.config.onHook'], executed after wikEd has been re-enabled by logo click, usage: wikEdConfig['wikEd.config.onHook'].push(YourFunction);
if (typeof(wikEdConfig['wikEd.config.onHook']) === 'undefined') { wikEdConfig['wikEd.config.onHook'] = []; }
 
// wikEdConfig['wikEd.config.offHook'], executed after wikEd has been disabled by logo click, usage: wikEdConfig['wikEd.config.offHook'].push(YourFunction);
if (typeof(wikEdConfig['wikEd.config.offHook']) === 'undefined') { wikEdConfig['wikEd.config.offHook'] = []; }
 
// wikEdConfig['wikEd.config.textareaHook'], executed after classic textarea has been enabled by user, usage: wikEdConfig['wikEd.config.textareaHook'].push(YourFunction);
if (typeof(wikEdConfig['wikEd.config.textareaHook']) === 'undefined') { wikEdConfig['wikEd.config.textareaHook'] = []; }
 
// wikEdConfig['wikEd.config.frameHook'], executed after wikEd edit frame has been enabled by user, usage: wikEdConfig['wikEd.config.frameHook'].push(YourFunction);
if (typeof(wikEdConfig['wikEd.config.frameHook']) === 'undefined') { wikEdConfig['wikEd.config.frameHook'] = []; }
 
// wikEd.config.previewHook, executed after the local preview has been added to the page, usage: wikEd.config.previewHook.push(YourFunction);
// custom edit form id instead of 'editform'
if (typeof(wikEdConfig['customEditFormId'])wikEd.config.previewHook === 'undefined') { wikEdConfig['customEditFormId']wikEd.config.previewHook = ''[]; }
 
// wikEd.config.diffHook, executed after the local changes diff has been added to the page, usage: wikEd.config.diffHook.push(YourFunction);
// custom textarea id instead of 'wpTextbox1'
if (typeof(wikEdConfig['customTextAreaId'])wikEd.config.dHook === 'undefined') { wikEdConfig['customTextAreaId']wikEd.config.diffHook = ''[]; }
 
// custom saveedit buttonform id instead of 'wpSaveeditform'
if (typeof(wikEdConfig['customSaveButtonId'])wikEd.config.customEditFormId === 'undefined') { wikEdConfig['customSaveButtonId']wikEd.config.customEditFormId = ''; }
 
// custom textarea id instead of 'wpTextbox1'
// show table mode togle button
if (typeof(wikEdConfig['showTableModeButton'])wikEd.config.customTextAreaId === 'undefined') { wikEdConfig['showTableModeButton']wikEd.config.customTextAreaId = false''; }
 
// custom save button id instead of 'wpSave'
// maximal time for syntax highlighting in ms
if (typeof(wikEdConfig['maxHighlightTime'])wikEd.config.customSaveButtonId === 'undefined') { wikEdConfig['maxHighlightTime']wikEd.config.customSaveButtonId = 3000''; }
 
// display tables as editable html tables (table mode)
// first char of article names is case sensitive (e.g. Wiktionary)
if (typeof(wikEdConfig['articlesCaseSensitive'])wikEd.config.tableMode === 'undefined') { wikEdConfig['articlesCaseSensitive']wikEd.config.tableMode = falsetrue; }
 
// show table mode toggle button
// force immediate update if this version string is newer
if (typeof(wikEdConfig['forcedUpdate'])wikEd.config.showTableModeButton === 'undefined') { wikEdConfig['forcedUpdate']wikEd.config.showTableModeButton = ''false; }
 
// maximal time for syntax highlighting in ms
// display highlighting error messages in text
if (typeof(wikEdConfig['highlightError'])wikEd.config.maxHighlightTime === 'undefined') { wikEdConfig['highlightError']wikEd.config.maxHighlightTime = false3000; }
 
// first char of article names is case sensitive (e.g. Wiktionary)
// display preview of files in text
if (typeof(wikEdConfig['filePreview'])wikEd.config.articlesCaseSensitive === 'undefined') { wikEdConfig['filePreview']wikEd.config.articlesCaseSensitive = truefalse; }
 
// force immediate update if this version string is newer
// file preview image size in pixels
if (typeof(wikEdConfig['filePreviewSize'])wikEd.config.forcedUpdate === 'undefined') { wikEdConfig['filePreviewSize']wikEd.config.forcedUpdate = 75''; }
 
// filedisplay previewhighlighting imageerror sizemessages in pixelstext
if (typeof(wikEdConfig['antiHighlightBleeding'])wikEd.config.highlightError === 'undefined') { wikEdConfig['antiHighlightBleeding']wikEd.config.highlightError = truefalse; }
 
// display preview of files in text
// do not hide templates shorter than this number of chars
if (typeof(wikEdConfig['templNoHideLength'])wikEd.config.filePreview === 'undefined') { wikEdConfig['templNoHideLength']wikEd.config.filePreview = 40true; }
 
// debugfile windowpreview maximalimage lengthsize in charspixels
if (typeof(wikEdConfig['debugMaxLength'])wikEd.config.filePreviewSize === 'undefined') { wikEdConfig['debugMaxLength']wikEd.config.filePreviewSize = 5000075; }
 
// move cursor/caret outside syntax highlighted element
// debug display of DOM nodes: maximal length of innerHTML in chars
if (typeof(wikEdConfig['debugInnerHtmlLength'])wikEd.config.antiHighlightBleeding === 'undefined') { wikEdConfig['debugInnerHtmlLength']wikEd.config.antiHighlightBleeding = 150false; }
 
// debug window maximal length in chars
if (wikEd.config.debugMaxLength === undefined) { wikEd.config.debugMaxLength = 500000; }
 
// debug display of DOM nodes: maximal length of innerHTML in chars
if (wikEd.config.debugInnerHtmlLength === undefined) { wikEd.config.debugInnerHtmlLength = 150; }
 
// WikiMedia Commons (or other external file repository) script url for redlink detection
if (wikEd.config.externalApiUrl === undefined) { wikEd.config.externalApiUrl = '//commons.wikimedia.org/w/api.php'; }
 
// origin domains allowed to call externalScriptURL API for redlink detection via Ajax cross-origin request (CORS) (comma separated list)
if (wikEd.config.externalApiDomains === undefined) { wikEd.config.externalApiDomains = 'wikipedia.org,wiktionary.org,wikibooks.org,wikinews.org,wikiquote.org,wikisource.org,wikiversity.org,wikivoyage.org,wikidata.org,mediawiki.org,wikimedia.org,wikimediafoundation.org'; }
 
// wikibase data repository url default
if (wikEd.config.wbRepoUrl === undefined) { wikEd.config.wbRepoUrl = '//www.wikidata.org'; }
 
// wikibase data repository article path default
if (wikEd.config.wbRepoArticlePath === undefined) { wikEd.config.wbRepoArticlePath = '/wiki/$1'; }
 
// interlanguage name of default wiki on wikibase data repository default
if (wikEd.config.wbGlobalSiteId === undefined) { wikEd.config.wbGlobalSiteId = 'enwiki'; }
 
// copy textarea background color to wikEd edit frame
if (wikEd.config.frameBackgroundColor === undefined) { wikEd.config.frameBackgroundColor = false; }
 
// convert all &nbsp; character entities to actual characters for textarea editing and saving (not recommended)
if (wikEd.config.nbspToChar === undefined) { wikEd.config.nbspToChar = false; }
 
return;
Line 1,230 ⟶ 1,350:
 
// init config
if (typeof(wikEdConfig)wikEd.config === 'undefined') { windowwikEd.wikEdConfigconfig = {}; }
 
// wikEd code home base URL, foralso httpsdefined compatibilityin wikEdDiff.js
if (typeof(wikEdConfig['homeBaseUrlStandard'])wikEd.config.homeBaseUrl === 'undefined') { wikEdConfig['homeBaseUrlStandard']wikEd.config.homeBaseUrl = 'http://en.wikipedia.org/'; }
if (typeof(wikEdConfig['homeBaseUrlSecure']) == 'undefined') { wikEdConfig['homeBaseUrlSecure'] = 'https://secure.wikimedia.org/wikipedia/en/'; }
 
// diff library URL, also defined in wikEdDiff.js
// set wikEd home base url depending on current page address: standard (http:) or secure (https:)
if (wikEd.config.diffScriptSrc === undefined) { wikEd.config.diffScriptSrc = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/diff.js&action=raw&ctype=text/javascript'; }
if (window.___location.protocol == 'https:') {
wikEdConfig['homeBaseUrl'] = wikEdConfig['homeBaseUrlSecure'];
}
else {
wikEdConfig['homeBaseUrl'] = wikEdConfig['homeBaseUrlStandard'];
}
 
// diff script URL
if (typeof(wikEdConfig['diffScriptSrc']) == 'undefined') { wikEdConfig['diffScriptSrc'] = wikEdConfig['homeBaseUrl'] + 'w/index.php?title=User:Cacycle/diff.js&action=raw&ctype=text/javascript'; }
 
// wikEdDiff script URL, also defined in wikEdDiff.js
if (typeof(wikEdConfig['wikEd.config.diffSrc']) === 'undefined') { wikEdConfig['wikEd.config.diffSrc'] = wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?title=User:Cacycle/wikEdDiff.js&action=raw&ctype=text/javascript'; }
 
// InstaView script URL
if (typeof(wikEdConfig['instaViewSrc']) == 'undefined') { wikEdConfig['instaViewSrc'] = wikEdConfig['homeBaseUrl'] + 'w/index.php?title=User:Pilaf/include/instaview.js&action=raw&ctype=text/javascript'; }
 
// IERange script URL (MS IE compatibility library)
if (typeof(wikEdConfig['IERangeSrc']) == 'undefined') { wikEdConfig['IERangeSrc'] = wikEdConfig['homeBaseUrl'] + 'w/index.php?title=User:Cacycle/ierange.js&action=raw&ctype=text/javascript'; }
 
// wikEd-as-gadget detection, set to true if gadget script name is not MediaWiki:Gadget-wikEd.js
if (typeof(wikEdConfig['wikEd.config.gadget']) === 'undefined') { wikEdConfig['wikEd.config.gadget'] = null; }
 
// duplicate edit warnings from the top of the page to above the edit window
if (typeof(wikEdConfig['wikEd.config.doCloneWarnings']) === 'undefined') { wikEdConfig['wikEd.config.doCloneWarnings'] = true; }
 
// startup debugging
if (typeof(wikEdConfig['wikEd.config.debugStartUp']) === 'undefined') { wikEdConfig['wikEd.config.debugStartUp'] = ''; }
 
// show missing translations
if (typeof(wikEdConfig['wikEd.config.showMissingTranslations']) === 'undefined') { wikEdConfig['wikEd.config.showMissingTranslations'] = false; }
 
// content language default, also used for wikEd UI localization
if (typeof(wikEdConfig['wikEd.config.languageDefault']) === 'undefined') { windowwikEd.config.wikEdConfig['languageDefault'] = ''; }
 
// load external translation
if (typeof(wikEdConfig['wikEd.config.loadTranslation']) === 'undefined') { windowwikEd.config.wikEdConfig['loadTranslation'] = true; }
 
// translation javascript URLs
if (typeof(wikEdConfig['wikEd.config.translations']) === 'undefined') { wikEdConfig['wikEd.config.translations'] = {}; }
 
// WikedInitTranslationswikEd.InitTranslations: define translation javascript URLs ('': internal default)
windowwikEd.WikedInitTranslationsInitTranslations = function () {
WikEdInitObjectwikEd.InitObject(wikEdConfig['wikEd.config.translations'], {
'en': '',
'araf': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:ترجمان05Arnobarnard/wikEd_international_arwikEd_international_af.js',
'zh-hansar': wikEdConfig[' wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Shibo77ترجمان05/wikEd_international_zhwikEd_international_ar.js',
'zh-hanthans': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Quest_for_TruthShibo77/wikEd_international_zh-hant.js',
'cszh-hant': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Sevela.pLiflon/wikEd_international_cswikEd_international_zh-hant.js',
'nlcs': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:JeronevwSevela.p/wikEd_international_nlwikEd_international_cs.js',
'eonl': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:ArnoLagrangeJeronevw/wikEd-eowikEd_international_nl.js',
'fieo': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Ejs-80Tlustulimu/wikEd international fiwikEd_international_eo.js',
'frfi': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:LeagEjs-80/wikEd-frwikEd_international_fi.js',
'defr': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Matthias_M.Leag/wikEd_international_dewikEd-fr.js',
'hegl': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:שמוליקToliño/wikEd_international_hewikEd_international_gl.js',
'hude': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Csörföly DPerfektesChaos/wikEd-huwikEd_international_de.js',
'ithe': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Jaloשמוליק/wikEd_international_itwikEd_international_he.js',
'jahr': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:HatukanezumiSpeedyGonsales/wikEd_international_jawikEd_international_hr.js',
'kohu': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:IlovesabbathTsch81/wikEd_international_kowikEd-hu.js',
'dsbit': wikEdConfig[' wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:MichalwikiJalo/wikEd_international_dsbwikEd_international_it.js',
'msja': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:AviatorHatukanezumi/wikEd_international_mswikEd_international_ja.js',
'nokk': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:DvyjonesArystanbek/wikEd_international_nowikEd_international_kk.js',
'nnko': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:FrokorIlovesabbath/wikEd_international_nnwikEd_international_ko.js',
'pldsb': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:KonradekMichalwiki/wikEd_international_plwikEd_international_dsb.js',
'ptms': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:MoscaAviator/wikEd_international_ptwikEd_international_ms.js',
'rono': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:RoamataaDvyjones/wikEd_international_rowikEd_international_no.js',
'scnnn': wikEdConfig[' wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:MeloscnFrokor/wikEd_international_scnwikEd_international_nn.js',
'skfa': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Helix84Reza1615/wikEd_international_skwikEd_international_fa.js',
'slpl': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:EleassarKonradek/wikEd_international_slwikEd_international_pl.js',
'espt': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:AxeleiHe7d3r/Tools/wikEd_international_eswikEd_international_pt.js',
'svro': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Where_next_Columbus?Roamataa/wikEd_international_svwikEd_international_ro.js',
'hsbru': wikEdConfig[' wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:MichalwikiIGW/wikEd_international_hsbwikEd_international_ru.js',
'trscn': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:Vito_GenoveseMeloscn/wikEd_international_trwikEd_international_scn.js',
'visk': wikEdConfig['wikEd.config.homeBaseUrl'] + 'w/index.php?action=raw&ctype=text/javascript&title=User:VinhtantranHelix84/wikEd_international_viwikEd_international_sk.js',
'sl': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Eleassar/wikEd_international_sl.js',
'es': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Axelei/wikEd_international_es.js',
'sv': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Where_next_Columbus?/wikEd_international_sv.js',
'tr': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Vito_Genovese/wikEd_international_tr.js',
'hsb': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Michalwiki/wikEd_international_hsb.js',
'vi': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Vinhtantran/wikEd_international_vi.js'
});
};
 
// Mediawiki page and skin detection, logo placement
if (typeof(wikEdConfig['MediaWikiSkinIds'])wikEd.config.mediaWikiSkinIds === 'undefined') { wikEdConfig['MediaWikiSkinIds']wikEd.config.mediaWikiSkinIds = {}; }
 
// WikedInitMediaWikiSkinIdswikEd.InitMediaWikiSkinIds: define Mediawiki page and skin detection, logo placement
// format: skin name: [ dom element to add logo to ('': top right), logo to this list or list contained in this parent element, rearrange page elements, [skin detection element id list], enable local preview / diff ],
windowwikEd.WikedInitMediaWikiSkinIdsInitMediaWikiSkinIds = function () {
wikEd.InitObject(wikEd.config.mediaWikiSkinIds, {
WikEdInitObject(wikEdConfig['MediaWikiSkinIds'], {
 
// monobook, also detects simple and myskin
monobook: [ 'p-personal', true, true, ['column-content', 'content', 'bodyContent', 'siteSub', 'contentSub', 'column-one', 'p-cactions'] ],
 
// vector (see https://bugzilla.wikimedia.org/show_bug.cgi?id=19527)
vector_old: [ 'personal', true, true, ['content', 'bodyContent', 'siteSub', 'contentSub', 'left-navigation', 'namespaces'] ],
vector_new: [ 'p-personal', true, true, ['content', 'bodyContent', 'siteSub', 'contentSub', 'left-navigation', 'p-namespaces', 'p-cactions'] ],
 
// citizendium.org
pinkwich5: [ 'p-personal', true, true, ['column-content', 'content', 'bodycontent', 'sitesub', 'contentSub', 'column-one', 'p-cactions'] ],
 
// other MediaWiki skins
standard: [ 'quickbar', false, true, ['content', 'topbar', 'article', 'footer', 'pagestats'] ],
nostalgia: [ 'topbar', false, true, ['content', 'specialpages', 'article', 'footer'] ],
Line 1,337 ⟶ 1,448:
modern: [ 'p-personal', true, true, ['mw_header', 'mw_main', 'mw_contentwrapper'] ],
 
// wikia.com
monaco: [ 'userData', false, false, ['background_strip', 'siteSub', 'contentSub', 'monaco_footer'] ],
quartz: [ 'welcome', false, true, ['articleWrapper', 'bodyContent', 'siteSub', 'contentSub', 'sidebar'] ],
searchwikia: [ 'header-li-buttons', false, true, ['header', 'header-container', 'header-go-button', 'article-container', 'article', 'article-text'] ],
oasis: [ 'AccountNavigation', false, false, ['WikiaHeader', 'WikiaPage'], false ],
 
// custom skins developed on wiki.mozilla.org and developer.mozilla.org
cavendish: [ '', false, true, ['internal', 'container', 'header', 'contentTop', 'mBody', 'side', 'nav', 'siteSub', 'contentSub'] ],
devmo: [ 'personal', false, true, ['developer-mozilla-org', 'container', 'header', 'navigation', 'bar', 'page', 'sidebar', 'sidebarslideup', 'contentTop', 'siteSub', 'contentSub'] ],
 
// custom skins
gumaxgumaxdd: [ 'gumax-p-login', true, true, ['gumax-header', 'gumax-content-body'] ],
pixeled: [ 'topright', true, true, ['contentwrapper', 'catnav', 'morefoot'] ],
 
// custom MediaWiki identifier
mediawiki: [ '', false, false, ['mediawiki'] ]
});
Line 1,360 ⟶ 1,473:
 
//
// WikEdInitGlobalswikEd.InitGlobals: initialize non-configurable variables
//
 
windowwikEd.WikEdInitGlobalsInitGlobals = function () {
 
// global variables
windowwikEd.wikEdTurnedOnturnedOn = false;
windowwikEd.wikEdDisableddisabled = true;
windowwikEd.wikEdUploadEditdebugOpen = false;
wikEd.pageNamespace = null;
window.wikEdViewDeleted = false;
wikEd.frameLoaded = false;
window.wikEdLanguage = '';
window.wikEdWatchlistEdit = false;
window.wikEdDebugOpen = false;
window.wikEdPageName = null;
window.wikEdPageNamespace = null;
 
// edit page types
// history
wikEd.editArticle = false;
window.wikEdFieldHist = [];
wikEd.editUpload = false;
window.wikEdSavedName = [];
wikEd.editReadOnly = false;
window.wikEdInputElement = [];
wikEd.editSemanticForm = false;
window.wikEdSelectElement = [];
wikEd.viewDeleted = false;
wikEd.editWatchlist = false;
wikEd.cssPage = false;
wikEd.jsPage = false;
wikEd.editSection = null;
 
// beta toolbar, CodeEditor
window.wikEdCheckMarker = [];
wikEd.useBetaToolbar = false;
window.wikEdCheckMarker[true] = '♦';
wikEd.useCodeEditor = false;
window.wikEdCheckMarker[false] = '◊';
wikEd.codeEditorButtonPollCount = 0;
 
// history
// undo all, redo all
wikEd.fieldHist = [];
window.wikEdOrigVersion = '';
wikEd.savedName = [];
window.wikEdLastVersion = null;
wikEd.inputElement = [];
wikEd.selectElement = [];
 
wikEd.checkMarker = [];
// global dom elements
wikEd.checkMarker[true] = '♦';
window.wikEdLogo = null;
wikEd.checkMarker[false] = '◊';
window.wikEdLogoList = null;
 
// undo all, redo all
window.wikEdDebug = null;
wikEd.origVersion = '';
window.wikEdWikiEditor = null;
windowwikEd.wikEdWikiEditorFramelastVersion = null;
window.wikEdWikiEditorTop = null;
window.wikEdWikiEditorBar = null;
window.wikEdWikiEditorBottom = null;
window.wikEdWikiEditorText = null;
window.wikEdTextareaContainer = null;
window.wikEdToolbar = null;
window.wikEdFrameInner = null;
window.wikEdFrameOuter = null;
window.wikEdFrame = null;
window.wikEdFrameBody = null;
window.wikEdFrameDocument = null;
window.wikEdFrameWindow = null;
 
// global dom elements
window.wikEdInputWrapper = null;
windowwikEd.wikEdEditorWrapperlogo = null;
windowwikEd.wikEdToolbarWrapperlogoList = null;
windowwikEd.wikEdCaptchaWrapperbodyContent = null;
windowwikEd.wikEdDebugWrapperdebug = null;
windowwikEd.wikEdEditWrapperwikiEditor = null;
windowwikEd.wikEdTextareaWrapperwikiEditorFrame = null;
windowwikEd.wikEdFrameWrapperwikiEditorTop = null;
windowwikEd.wikEdConsoleWrapperwikiEditorLeft = null;
windowwikEd.wikEdButtonsWrapperwikiEditorBar = null;
windowwikEd.wikEdSummaryWrapperwikiEditorBottom = null;
windowwikEd.wikEdSummaryInputWrapperwikiEditorText = null;
windowwikEd.wikEdSummaryOptionstextareaContainer = null;
windowwikEd.wikEdSubmitWrappertoolbar = null;
windowwikEd.wikEdSubmitButtonsWrapperframeInner = null;
windowwikEd.wikEdLocalPrevWrapperframeOuter = null;
windowwikEd.wikEdInsertWrapperframe = null;
wikEd.frameDocument = null;
wikEd.frameBody = null;
wikEd.frameHtml = null;
wikEd.frameWindow = null;
 
wikEd.inputWrapper = null;
// edit form fields
windowwikEd.wikEdEditFormeditorWrapper = null;
windowwikEd.wikEdEdittimetoolbarWrapper = null;
windowwikEd.wikEdEditTokenbuttonBarWrapper = null;
windowwikEd.wikEdTextareacaptchaWrapper = null;
wikEd.debugWrapper = null;
wikEd.editWrapper = null;
wikEd.textareaWrapper = null;
wikEd.frameWrapper = null;
wikEd.consoleWrapper = null;
wikEd.buttonsWrapper = null;
wikEd.summaryWrapper = null;
wikEd.consoleTopWrapper = null;
wikEd.summaryInputWrapper = null;
wikEd.editOptionsWrapper = null;
wikEd.submitWrapper = null;
wikEd.submitButtonsWrapper = null;
wikEd.localPrevWrapper = null;
wikEd.wikiPreview = null;
wikEd.catLinks = null;
wikEd.insertWrapper = null;
wikEd.textBoxTable = null;
 
// edit form fields
window.wikEdButtonsWrapperWidth = {};
windowwikEd.wikEdButtonBarFormateditForm = null;
windowwikEd.wikEdButtonBarTextifystarttime = null;
windowwikEd.wikEdButtonBarCustom1edittime = null;
windowwikEd.wikEdButtonBarFindeditToken = null;
windowwikEd.wikEdButtonBarFixautoSummary = null;
windowwikEd.wikEdButtonBarCustom2textarea = null;
window.wikEdButtonBarControl = null;
window.wikEdButtonBarPreview = null;
window.wikEdButtonBarPreview2 = null;
window.wikEdButtonBarJump = null;
window.wikEdPreviewBox = null;
window.wikEdClearSummary = null;
window.wikEdClearSummaryImg = null;
 
wikEd.buttonsWrapperWidth = {};
window.wikEdCaseSensitive = null;
windowwikEd.wikEdRegExpbuttonBarFormat = null;
windowwikEd.wikEdFindAheadbuttonBarTextify = null;
wikEd.buttonBarCustom1 = null;
wikEd.buttonBarFind = null;
wikEd.buttonBarFix = null;
wikEd.buttonBarCustom2 = null;
wikEd.buttonBarControl = null;
wikEd.buttonBarPreview = null;
wikEd.buttonBarPreview2 = null;
wikEd.buttonBarJump = null;
wikEd.buttonBarPasted = null;
wikEd.previewArticle = null;
wikEd.previewDiff = null;
wikEd.clearSummary = null;
wikEd.clearSummaryImg = null;
 
windowwikEd.wikEdFindTextcaseSensitive = null;
windowwikEd.wikEdReplaceTextregExp = null;
windowwikEd.wikEdSummaryTextfindAhead = null;
windowwikEd.wikEdSummarySelectfixRegExTypo = null;
window.wikEdSummaryTextWidth = null;
 
windowwikEd.wikEdEditOptionsfindText = null;
windowwikEd.wikEdEditHelpreplaceText = null;
wikEd.summaryText = null;
wikEd.summarySelect = null;
wikEd.summaryTextWidth = null;
 
windowwikEd.wikEdSaveButtoneditHelp = null;
windowwikEd.wikEdPreviewButtonsaveButton = null;
windowwikEd.wikEdLDiffButtonpreviewButton = null;
windowwikEd.wikEdLocalPreviewlDiffButton = null;
windowwikEd.wikEdLocalDiffdiffPreviewButton = null;
windowwikEd.wikEdDiffPreviewButtonsummaryLabel = null;
window.wikEdSummaryLabel = null;
 
wikEd.highlightNamedHideButtonsStylesheet = null;
window.WikEdHighlightNamedHideButtonsStylesheet = null;
 
// frame resizing
windowwikEd.wikEdResizeGripWidthresizeGripWidth = 16;
windowwikEd.wikEdResizeGripHeightresizeGripHeight = 16;
wikEd.resizeFramePageYStart = 0;
window.wikEdResizeFramePageYStart = 0;
wikEd.resizeFramePageXStart = 0;
window.wikEdResizeFramePageXStart = 0;
wikEd.resizeFrameOffsetHeight = 0;
window.wikEdResizeFrameOffsetHeight = 0;
wikEd.resizeFrameOffsetWidth = 0;
window.wikEdResizeFrameOffsetWidth = 0;
windowwikEd.wikEdResizeFrameMouseOverGripresizeFrameMouseOverGrip = false;
windowwikEd.wikEdResizeFrameActiveresizeFrameActive = false;
windowwikEd.wikEdFrameHeightframeHeight = '';
windowwikEd.wikEdFrameWidthframeWidth = '';
windowwikEd.wikEdTextareaHeighttextareaHeight = '';
windowwikEd.wikEdTextareaWidthtextareaWidth = '';
 
// various
windowwikEd.wikEdInsertCounterinsertCounter = 0;
windowwikEd.wikEdEditButtonHandlereditButtonHandler = {};
wikEd.textareaBorderHeight = 0;
window.wikEdTextareaBorderHeight = 0;
wikEd.frameBorderHeight = 0;
window.wikEdFrameBorderHeight = 0;
windowwikEd.wikEdFrameBorderWidthframeBorderWidth = 0;
wikEd.textareaOffsetHeightInitial = 0;
window.wikEdTextareaOffsetHeightInitial = 0;
windowwikEd.wikEdClearSummaryWidthclearSummaryWidth = null;
window.wikEdFullScreenMode = false;
window.wikEdAddNewSection = null;
window.wikEdBrowserNotSupported = false;
window.wikEdFrameScrollTop = null;
window.wikEdTextareaUpdated = null;
window.wikEdPreviewIsAjax = null;
window.wikEdButtonKeyCode = [];
window.wikEdDirection = null;
window.wikEdTextSize = 0;
window.wikEdTextSizeInit = 0;
window.wikEdPreviewPage = false;
window.wikEdClonedWarnings = false;
window.wikEdGeSHiCSS = [];
 
// fullscreen button state and actual fullscreen state
// override site javascript functions
wikEd.fullScreenMode = false;
window.WikEdInsertTagsOriginal = null;
wikEd.fullscreen = false;
window.WikEdInsertAtCursorOriginal = null;
 
wikEd.addNewSection = null;
// wikEd settings
windowwikEd.wikEdRefHidebrowserNotSupported = false;
wikEd.frameScrollTop = null;
window.wikEdUsing = false;
wikEd.textareaUpdated = true;
window.wikEdUseWikEd = false;
wikEd.buttonKeyCode = [];
window.wikEdCloseToolbar = false;
wikEd.direction = null;
window.wikEdHighlightSyntax = false;
wikEd.textSize = 0;
window.wikEdNoSpellcheck = false;
windowwikEd.wikEdDifftextSizeInit = false0;
windowwikEd.wikEdTableModepreviewPage = false;
windowwikEd.wikEdCleanNodesclonedWarnings = false;
wikEd.syntaxHighlightTagCSS = [];
window.wikEdReadOnly = false;
wikEd.loader = false;
wikEd.wikibase = {};
wikEd.keepSelRange = null;
 
// override site javascript functions
// unicode fixing and char highlighting
windowwikEd.wikEdSupportedCharsInsertTagsOriginal = null;
windowwikEd.wikEdReservedCharsinsertAtCursorOriginal = null;
window.wikEdSpecialChars = null;
window.wikEdProblemChars = null;
 
// wikEd settings
window.wikEdCharEntitiesByName = {};
wikEd.refHide = false;
wikEd.using = false;
wikEd.closeToolbar = false;
wikEd.highlightSyntax = false;
wikEd.noSpellcheck = false;
wikEd.diff = false;
wikEd.tableMode = false;
wikEd.cleanNodes = false;
wikEd.readOnly = false;
 
// unicode fixing and char highlighting
window.wikEdControlCharHighlighting = null;
wikEd.supportedChars = null;
window.wikEdControlCharHighlightingStr = '';
windowwikEd.wikEdCharHighlightingreservedChars = null;
wikEd.specialChars = null;
window.wikEdCharHighlightingStr = '';
wikEd.problemChars = null;
 
wikEd.charEntitiesByName = {};
// linkification and hiding
window.wikEdLinkifyIdNo = 0;
window.wikEdLinkifyArray = [];
window.wikEdReferenceArray = [];
window.wikEdTemplateArray = [];
window.wikEdCharEntityArray = [];
 
wikEd.controlCharHighlighting = null;
// RegExTypoFix rules
wikEd.controlCharHighlightingStr = '';
window.wikEdTypoRulesFind = [];
wikEd.charHighlighting = null;
window.wikEdTypoRulesReplace = [];
wikEd.charHighlightingStr = '';
 
wikEd.letters = '';
// redirect fixing
window.wikEdRedirectsCache = {};
 
// linkification and hiding
// file preview
windowwikEd.wikEdFilePreviewCachewikiLinks = {};
wikEd.referenceArray = [];
window.wikEdFilePreviewRequest = '';
wikEd.templateArray = [];
window.wikEdFilePreviewNo = 0;
windowwikEd.wikEdFilePreviewIdscharEntityArray = [];
wikEd.tableArray = [];
wikEd.scheduledUnhide = null;
 
// RegExtypoFix rules
// debugging time measurement, usage: wikEdDebugTimer.push([1234, new Date]); WikEdDebugTimer();
windowwikEd.wikEdDebugTimertypoRulesFind = [];
wikEd.typoRulesReplace = [];
 
// store link infos (normalizations, redirects, redlinks)
// syntax highlighting
windowwikEd.wikEdParseObjlinkInfo = {};
wikEd.externalLinkInfo = {};
 
// article preview: named reference definitions
// MediaWiki file paths for use in regexps
windowwikEd.wikEdServernamedRefs = ''{};
window.wikEdArticlePath = '';
window.wikEdScript = '';
window.wikEdScriptPath = '';
window.wikEdScriptName = '';
window.wikEdScriptURL = '';
 
// file preview
// magic words and parser functions, see http://www.mediawiki.org/wiki/Help:Magic_words
wikEd.filePreviewCache = {};
// __MAGICWORDS__
wikEd.filePreviewRequest = '';
window.wikEdMagicWords = 'NOTOC|FORCETOC|TOC|NOEDITSECTION|NEWSECTIONLINK|NOGALLERY|HIDDENCAT|NOCONTENTCONVERT|NOCC|NOTITLECONVERT|NOTC|END|START|NOINDEX|INDEX|STATICREDIRECT';
wikEd.filePreviewNo = 0;
wikEd.filePreviewIds = [];
 
// debugging time measurement, usage: wikEd.debugTimer.push([1234, new Date]); wikEd.DebugTimer();
// template, parser function, and parser variable modifiers {{modifier:...}}
wikEd.debugTimer = [];
// see http://meta.wikimedia.org/wiki/Help:Magic_words#Template_modifiers
window.wikEdTemplModifier = 'int|msg|msgnw|raw|subst';
 
// syntax highlighting
// parser variables {{variable}}
wikEd.parseObj = {};
window.wikEdParserVariables = 'CURRENTYEAR|CURRENTMONTH|CURRENTMONTHNAME|CURRENTMONTHNAMEGEN|CURRENTMONTHABBREV|CURRENTDAY|CURRENTDAY2|CURRENTDOW|CURRENTDAYNAME|CURRENTTIME|CURRENTHOUR|CURRENTWEEK|CURRENTTIMESTAMP|LOCALYEAR|LOCALMONTH|LOCALMONTHNAME|LOCALMONTHNAMEGEN|LOCALMONTHABBREV|LOCALDAY|LOCALDAY2|LOCALDOW|LOCALDAYNAME|LOCALTIME|LOCALHOUR|LOCALWEEK|LOCALTIMESTAMP|SITENAME|CURRENTVERSION|CONTENTLANGUAGE|REVISIONID|REVISIONDAY|REVISIONDAY2|REVISIONMONTH|REVISIONYEAR|REVISIONTIMESTAMP|SERVER|SERVERNAME|SCRIPTPATH|FULLPAGENAME|PAGENAME|BASEPAGENAME|SUBPAGENAME|SUBJECTPAGENAME|TALKPAGENAME|FULLPAGENAMEE|PAGENAMEE|BASEPAGENAMEE|SUBPAGENAMEE|SUBJECTPAGENAMEE|TALKPAGENAMEE|NAMESPACE|SUBJECTSPACE|ARTICLESPACE|TALKSPACE|NAMESPACEE|SUBJECTSPACEE|TALKSPACEE|DIRMARK|DIRECTIONMARK|PAGENAME|PAGENAMEE|ARTICLEPATH';
 
// MediaWiki file paths for use in regexps
// parser variables {{variable:R}}
wikEd.server = '';
window.wikEdParserVariablesR = 'NUMBEROFPAGES|NUMBEROFARTICLES|NUMBEROFFILES|NUMBEROFEDITS|NUMBEROFUSERS|NUMBEROFADMINS|NUMBEROFVIEWS|NUMBEROFACTIVEUSERS|PROTECTIONLEVEL';
wikEd.articlePath = '';
wikEd.script = '';
wikEd.scriptPath = '';
wikEd.scriptName = '';
wikEd.scriptURL = '';
wikEd.useExternalApi = false;
 
// pasting object
// parser functions {{FUNCTION:parameter|R}}
wikEd.paste = null;
window.wikEdParserFunctionsR = 'NUMBERINGROUP|PAGESINNS|PAGESINNAMESPACE|PAGESINCATEGORY|PAGESINCAT|PAGESIZE|DEFAULTSORT|DISPLAYTITLE';
 
// magic words and parser functions, {{functionsee https://www.mediawiki.org/wiki/Help:param|param}}Magic_words
// __MAGICWORDS__
window.wikEdParserFunctions = 'localurl|localurle|fullurl|filepath|fullurle|urlencode|urldecode|anchorencode|ns|lc|lcfirst|uc|ucfirst|formatnum|padleft|padright|padright|plural|grammar|gender|int';
wikEd.magicWords = 'NOTOC|FORCETOC|TOC|NOEDITSECTION|NEWSECTIONLINK|NOGALLERY|HIDDENCAT|NOCONTENTCONVERT|NOCC|NOTITLECONVERT|NOTC|END|START|NOINDEX|INDEX|STATICREDIRECT';
 
// template, parser function, and parser variable modifiers {{modifier:...}}
// parser functions {{#function:param|param}}
// see https://meta.wikimedia.org/wiki/Help:Magic_words#Template_modifiers
window.wikEdParserFunctionsHash = 'language|special|tag|tag|expr|if|ifeq|ifexist|ifexpr|switch|time|timel|rel2abs|titleparts|iferror|iferror|special|tag|categorytree|formatdate';
wikEd.templModifier = 'int|msg|msgnw|raw|subst';
 
// parser variables {{variable}}
// define leaf elements for WikEdGetInnerHTML
wikEd.parserVariables = 'CURRENTYEAR|CURRENTMONTH|CURRENTMONTHNAME|CURRENTMONTHNAMEGEN|CURRENTMONTHABBREV|CURRENTDAY|CURRENTDAY2|CURRENTDOW|CURRENTDAYNAME|CURRENTTIME|CURRENTHOUR|CURRENTWEEK|CURRENTTIMESTAMP|LOCALYEAR|LOCALMONTH|LOCALMONTHNAME|LOCALMONTHNAMEGEN|LOCALMONTHABBREV|LOCALDAY|LOCALDAY2|LOCALDOW|LOCALDAYNAME|LOCALTIME|LOCALHOUR|LOCALWEEK|LOCALTIMESTAMP|SITENAME|CURRENTVERSION|CONTENTLANGUAGE|REVISIONID|REVISIONDAY|REVISIONDAY2|REVISIONMONTH|REVISIONYEAR|REVISIONTIMESTAMP|SERVER|SERVERNAME|SCRIPTPATH|FULLPAGENAME|PAGENAME|BASEPAGENAME|SUBPAGENAME|SUBJECTPAGENAME|TALKPAGENAME|FULLPAGENAMEE|PAGENAMEE|BASEPAGENAMEE|SUBPAGENAMEE|SUBJECTPAGENAMEE|TALKPAGENAMEE|NAMESPACE|SUBJECTSPACE|ARTICLESPACE|TALKSPACE|NAMESPACEE|SUBJECTSPACEE|TALKSPACEE|DIRMARK|DIRECTIONMARK|PAGENAME|PAGENAMEE|ARTICLEPATH|NOEXTERNALLANGLINKS';
window.wikEdLeafElements = {
 
// parser variables {{variable:R}}
wikEd.parserVariablesR = 'NUMBEROFPAGES|NUMBEROFARTICLES|NUMBEROFFILES|NUMBEROFEDITS|NUMBEROFUSERS|NUMBEROFADMINS|NUMBEROFVIEWS|NUMBEROFACTIVEUSERS|PROTECTIONLEVEL';
 
// parser functions {{FUNCTION:parameter|R}}
wikEd.parserFunctionsR = 'NUMBERINGROUP|PAGESINNS|PAGESINNAMESPACE|PAGESINCATEGORY|PAGESINCAT|PAGESIZE|DEFAULTSORT|DISPLAYTITLE';
 
// parser functions {{function:param|param}}
wikEd.parserFunctions = 'localurl|localurle|fullurl|filepath|fullurle|urlencode|urldecode|anchorencode|ns|lc|lcfirst|uc|ucfirst|formatnum|padleft|padright|padright|plural|grammar|gender|int|noexternallanglinks';
 
// parser functions {{#function:param|param}}
wikEd.parserFunctionsHash = 'language|special|tag|tag|expr|if|ifeq|ifexist|ifexpr|switch|time|timel|rel2abs|titleparts|iferror|iferror|special|tag|categorytree|formatdate|property|invoke';
 
// define leaf elements for wikEd.GetInnerHTML
wikEd.leafElements = {
'IMG': true,
'HR': true,
Line 1,608 ⟶ 1,757:
 
// hash of loaded scripts, also defined in wikEdDiff.js
if (typeof(wikEdExternalScripts)wikEd.externalScripts === 'undefined') { windowwikEd.wikEdExternalScriptsexternalScripts = null; }
if (typeof(wikEdStartup)wikEd.externalScriptsString === 'undefined') { windowwikEd.wikEdStartupexternalScriptsString = false''; }
if (typeof(wikEdPageLoaded)wikEd.pageLoaded === 'undefined') { windowwikEd.wikEdPageLoadedpageLoaded = false; }
if (wikEd.programVersion === undefined) { wikEd.programVersion = ''; }
if (wikEd.programDate === undefined) { wikEd.programDate = ''; }
 
// browser and os identificationr
if (typeof(wikEdBrowserName)wikEd.browserName === 'undefined') { windowwikEd.wikEdBrowserNamebrowserName = ''; }
if (typeof(wikEdBrowserFlavor)wikEd.browserFlavor === 'undefined') { windowwikEd.wikEdBrowserFlavorbrowserFlavor = ''; }
if (typeof(wikEdBrowserVersion)wikEd.browserVersion === 'undefined') { windowwikEd.wikEdBrowserVersionbrowserVersion = 0; }
if (typeof(wikEdMSIE)wikEd.msie === 'undefined') { windowwikEd.wikEdMSIEmsie = false; }
if (typeof(wikEdMozilla)wikEd.mozilla === 'undefined') { windowwikEd.wikEdMozillamozilla = false; }
if (typeof(wikEdOpera)wikEd.opera === 'undefined') { windowwikEd.wikEdOperaopera = false; }
if (typeof(wikEdSafari)wikEd.safari === 'undefined') { windowwikEd.wikEdSafarisafari = false; }
if (typeof(wikEdWebKit)wikEd.webkit === 'undefined') { windowwikEd.wikEdWebKitwebkit = false; }
if (typeof(wikEdChrome)wikEd.chrome === 'undefined') { windowwikEd.wikEdChromechrome = false; }
if (typeof(wikEdGreasemonkey)wikEd.greasemonkey === 'undefined') { windowwikEd.wikEdGreasemonkeygreasemonkey = false; }
if (typeof(wikEdPlatform)wikEd.testVersion === 'undefined') { windowwikEd.wikEdPlatformtestVersion = nullfalse; }
if (wikEd.platform === undefined) { wikEd.platform = null; }
if (wikEd.installationType === undefined) { wikEd.installationType = ''; }
 
// global variables viafor Greasemonkey ___location hack
if (typeof(wikEdWikiGlobals)wikEd.wikiGlobals === 'undefined') { windowwikEd.wikEdWikiGlobalswikiGlobals = {}; }
if (typeof(wikEdText)wikEd.text === 'undefined') { wikEdTextwikEd.text = {}; }
 
// define global variables
if (typeof(wgServer) == 'undefined') { window.wgServer = null; }
if (typeof(wgTitle) == 'undefined') { window.wgTitle = null; }
if (typeof(wgCanonicalNamespace) == 'undefined') { window.wgCanonicalNamespace = null; }
if (typeof(wgArticlePath) == 'undefined') { window.wgArticlePath = null; }
if (typeof(wgScript) == 'undefined') { window.wgScript = null; }
if (typeof(wgScriptPath) == 'undefined') { window.wgScriptPath = null; }
if (typeof(wgUserName) == 'undefined') { window.wgUserName = null; }
if (typeof(wgCurRevisionId) == 'undefined') { window.wgCurRevisionId = null; }
if (typeof(wgScript) == 'undefined') { window.wgScript = null; }
if (typeof(wgContentLanguage) == 'undefined') { window.wgContentLanguage = null; }
if (typeof(wgUserLanguage) == 'undefined') { window.wgUserLanguage = null; }
if (typeof(wgEnableAPI) == 'undefined') { window.wgEnableAPI = null; }
if (typeof(wgPageName) == 'undefined') { window.wgPageName = null; }
if (typeof(wgNamespaceIds) == 'undefined') { window.wgNamespaceIds = null; }
if (typeof(wgFormattedNamespaces) != 'undefined') { window.wgFormattedNamespaces = null; }
 
// skins
if (typeof(wikEdLogoContainerId)wikEd.logoContainerId === 'undefined') { windowwikEd.wikEdLogoContainerIdlogoContainerId = ''; }
if (typeof(wikEdRearrange)wikEd.rearrange === 'undefined') { windowwikEd.wikEdRearrangerearrange = false; }
if (typeof(wikEdLogoToList)wikEd.logoToList === 'undefined') { windowwikEd.wikEdLogoToListlogoToList = false; }
if (typeof(wikEdSkin)wikEd.enableLocalPreview === 'undefined') { windowwikEd.wikEdSkinenableLocalPreview = ''false; }
if (wikEd.skin === undefined) { wikEd.skin = ''; }
 
// various
if (typeof(wikEdGreasemonkeyToHead)wikEd.gotGlobalsHook === 'undefined') { windowwikEd.wikEdGreasemonkeyToHeadgotGlobalsHook = false[]; }
if (typeof(wikEdGotGlobalsHook)wikEd.getGlobalsCounter === 'undefined') { windowwikEd.wikEdGotGlobalsHookgetGlobalsCounter = []0; }
if (typeof(wikEdLoadingTranslation)wikEd.loadingTranslation === 'undefined') { windowwikEd.wikEdLoadingTranslationloadingTranslation = false; }
if (typeof(wikEdWebStorage)wikEd.webStorage === 'undefined') { windowwikEd.wikEdWebStoragewebStorage = falsenull; }
 
// customization
if (wikEd.useWikEd === undefined) { wikEd.useWikEd = false; }
if (wikEd.wikEdTextAdded === undefined) { wikEd.wikEdTextAdded = false; }
if (wikEd.wikEdConfigAdded === undefined) { wikEd.wikEdConfigAdded = false; }
 
// global dom elements, also defined in wikEdDiff.js
if (wikEd.pageOrigin === undefined) { wikEd.pageOrigin = ''; }
if (wikEd.head === undefined) { wikEd.head = null; }
 
// also defined in wikEdDiff.js
if (wikEd.pageName === undefined) { wikEd.pageName = null; }
 
 
//
// WikEdInitObjectwikEd.InitObject: initialize object, keep pre-defined values (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdInitObjectInitObject = function (target, source, showMissing) {
 
if (typeof( target) == 'object') {
for (var key in source) {
if (typeof( target[key]) == 'undefined') {
target[key] = source[key];
 
// show missing array entries
if (showMissing === true) {
if (typeof( target[key]) == 'string') {
wikEdConfig['wikEd.config.debugStartUp'] += '\t\t\t\'' + key + '\': \'' + target[key].replace(/\n/g, '\\n') + '\',\n';
}
}
Line 1,684 ⟶ 1,833:
 
//
// WikEdAddToObjectwikEd.AddToObject: add or replace properties, replace existing values (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdAddToObjectAddToObject = function (target, source, priority) {
 
if (typeof(target) == 'object') {
if (priority === undefined) {
priority = {};
}
if (typeof target == 'object') {
for (var key in source) {
targetif (priority[key] !== source[key];undefined) {
target[key] = priority[key];
}
else {
target[key] = source[key];
}
}
}
Line 1,698 ⟶ 1,856:
 
//
// WikEdInitImagewikEd.InitImage: initialize images, keep pre-defined values (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdInitImageInitImage = function (arraytarget, presetsource) {
 
var server = window.___location.href.replace(/^(\w+:\/\/.*?)\/.*/, '$1');
for (var key in preset) {
var protocol = server.replace(/^(\w+:)\/\/.*/, '$1');
if (typeof(array[key]) == 'undefined') {
 
for (var key in source) {
// remove MediaWiki path prefixes and add local path
if (wikEdConfigtypeof target['useLocalImages'key] == true'undefined') {
 
array[key] = wikEdConfig['imagePathLocal'] + preset[key].replace(/^[0-9a-f]+\/[0-9a-f]+\//, '');
// remove MediaWiki path prefixes and add local path
if (wikEd.config.useLocalImages === true) {
target[key] = wikEd.config.imagePathLocal + source[key].replace(/^[0-9a-f]+\/[0-9a-f]+\/()/, '');
}
 
// add path
else {
arraytarget[key] = wikEdConfig['wikEd.config.imagePath'] + presetsource[key];
}
 
// Chrome 33.0.1750.146 m bug, not displaying frame html background image without complete URL
if (/^\/\//.test(target[key]) === true) {
target[key] = protocol + target[key];
}
else if (/^\//.test(target[key]) === true) {
target[key] = server + target[key];
}
}
Line 1,722 ⟶ 1,891:
 
//
// WikEdStartupwikEd.Startup: wikEd startup code, called during page load
//
 
windowwikEd.WikEdStartupStartup = function () {
 
// redirect WED shortcut to wikEd.Debug(objectName, object, popup)
// check if this has already been run
WED = wikEd.Debug;
if (wikEdStartup == true) {
 
// extract version info from wikEd.Meta()
var meta = wikEd.Meta.toString();
var regExpMatchVersion = /@version\s+(.*?)[ \t]*\n/.exec(meta);
if ( (regExpMatchVersion !== null) && (regExpMatchVersion[1] !== null) ) {
wikEd.programVersion = regExpMatchVersion[1];
}
var regExpMatchDate = /@date\s+(.*?)[ \t]*\n/.exec(meta);
if ( (regExpMatchDate !== null) && (regExpMatchDate[1] !== null) ) {
wikEd.programDate = regExpMatchDate[1];
}
 
// MediaWiki pages always have their title set, filter out Greasemonkey running on created iframes
if (document.title === '') {
return;
}
wikEdStartup = true;
 
// check if wikEd has already started up
// redirect WED shortcut to WikEdDebug(objectName, object, popup)
if (document.getElementsByName('wikEdStartupFlag')[0] !== undefined) {
window.WED = WikEdDebug;
return;
}
 
// define current window head
wikEd.head = document.getElementsByTagName('head')[0] || null;
 
// set startup flag
var flag = document.createElement('meta');
flag.setAttribute('name', 'wikEdStartupFlag');
wikEd.head.appendChild(flag);
 
// get site of origin (window.___location.href is about:blank if Firefox during page load)
var origin = wikEd.head.baseURI;
if (origin === undefined) {
origin = window.___location.toString();
}
wikEd.pageOrigin = origin.replace(/^((https?|file):\/\/[^\/?#]*)?.*$/, '$1');
 
// check browser and version
var agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(Firefox|Netscape|SeaMonkey|IceWeasel|IceCat|Fennec|Minefield|BonEcho|GranParadiso|Shiretoko|Namoroka)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'Mozilla';
wikEdBrowserFlavorwikEd.browserFlavor = agentMatchregExpMatchAgent[1];
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEdMozillawikEd.mozilla = true;
}
 
// check for MSIE
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/(MSIE)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'MSIE';
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEdMSIEwikEd.msie = true;
}
 
// check for Opera <= version 12 (Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14)
// check for Opera
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(Opera)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'Opera';
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
if (wikEdBrowserVersionwikEd.browserVersion == 9.80) {
var versionMatch = window.navigator.userAgent.match(/(Version)\W+(\d+\.\d+)/i);
if (versionMatch !== null) {
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
}
}
wikEdOperawikEd.opera = true;
}
 
// check for GoogleOpera Chrome>= version 15 (Mozilla/5.0 (Mozilla/5.0 (Windows NT 5.1) AppleWebKit/525537.1336 (KHTML, like Gecko) Chrome/28.0.21500.149.3052 Safari/525537.36 OPR/15.0.1147.13100)
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(ChromeOPR)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'ChromeOpera';
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEdChromewikEd.opera = true;
}
 
// check for Google Chrome (AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.30 Safari/525.13)
// check for Safari
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(SafariChrome)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'SafariChrome';
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEdSafariwikEd.chrome = true;
}
 
// check for other WebKitSafari
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(WebKit)(GTK\+Safari)?\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEdBrowserNamewikEd.browserName = 'WebKitSafari';
wikEdBrowserVersionwikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[32]);
wikEdWebKitwikEd.safari = true;
}
 
// check for other WebKit
else {
regExpMatchAgent = window.navigator.userAgent.match(/\b(WebKit)(GTK\+)?\W+(\d+\.\d+)/i);
if (regExpMatchAgent !== null) {
wikEd.browserName = 'WebKit';
wikEd.browserVersion = parseFloat(regExpMatchAgent[3]);
wikEd.webkit = true;
}
}
}
Line 1,801 ⟶ 2,010:
}
 
// check OS
var osregExpMatchOS = window.navigator.platform.match(/^(win|mac|unix|linux)/i);
if (osregExpMatchOS !== null) {
wikEdPlatformwikEd.platform = osregExpMatchOS[1].toLowerCase();
}
 
// import customization (try now again after page load for user/skin.js)
// detect if run as a head script added by Greasemonkey installer
if ( (wikEdConfig !== undefined) && (wikEd.wikEdConfigAdded === false) ) {
if (document.getElementById('WikEdHeadScript') != null) {
wikEd.AddToObject(wikEd.config, wikEdConfig);
wikEdGreasemonkeyToHead = true;
wikEd.wikEdConfigAdded = true;
}
if ( (wikEdText !== undefined) && (wikEd.wikEdTextAdded === false) ) {
wikEd.AddToObject(wikEd.text, wikEdText, wikEd.config.text);
wikEd.wikEdTextAdded = true;
}
 
// compatibility fixes for older customizations and wikEd-compatibilizations in other scripts
window.wikEdUseWikEd = wikEd.useWikEd;
window.WikEdUpdateTextarea = wikEd.UpdateTextarea;
window.WikEdUpdateFrame = wikEd.UpdateFrame;
window.WikEdGetText = wikEd.GetText;
window.WikEdEditButton = wikEd.EditButton;
 
// check if this runs under Greasemonkey
if (typeof(GM_getValue) GM_info == 'functionobject') {
wikEdGreasemonkeywikEd.greasemonkey = true;
}
 
// parse global-context (MediaWiki) variables into hash (for Greasemonkey)
var globalNames = ['skin', 'wgServer', 'wgTitle', 'wgCanonicalNamespace', 'wgArticlePath', 'wgScript', 'wgScriptPath', 'wgUserName', 'wgCurRevisionId', 'wgContentLanguage', 'wgUserLanguage', 'wgPageName', 'wgNamespaceIds', 'wgFormattedNamespaces', 'wgUseAutomaticEditSummaries', 'wgVersion', 'wgPageContentModel'];
window.addEventListener('message', WikEdGetGlobalsReceiver, false);
if (wikEd.greasemonkey === true) {
var globalNames = [, 'skin', 'wgServer', 'wgTitle', 'wgCanonicalNamespace', 'wgArticlePath', 'wgScript', 'wgScriptPath', 'wgUserName', 'wgCurRevisionId', 'wgScript', 'wgContentLanguage', 'wgUserLanguage', 'wgEnableAPI', 'wgPageName', 'wgNamespaceIds', 'wgFormattedNamespaces'];
if (wikEdGreasemonkey == true) {
globalNames.push('wikEdConfig', 'wikEdText');
}
 
// copy custom config settings and text after values have arrived
var gotGlobalsHook = [
function() {
if ( (typeof wikEd.wikiGlobals.wikEdConfig == 'object') && (wikEd.wikEdConfigAdded === false) ) {
if (wikEdGreasemonkey == true) {
WikEdAddToObjectwikEd.AddToObject(wikEdConfigwikEd.config, wikEdWikiGlobals['wikEd.wikiGlobals.wikEdConfig']);
wikEd.wikEdConfigAdded = true;
WikEdAddToObject(wikEdText, wikEdWikiGlobals['wikEdText']);
}
if ( (typeof wikEd.wikiGlobals.wikEdText == 'object') && (wikEd.wikEdTextAdded === false) ) {
wikEd.AddToObject(wikEd.text, wikEd.wikiGlobals.wikEdText, wikEd.config.text);
wikEd.wikEdTextAdded = true;
}
return;
Line 1,835 ⟶ 2,059:
];
 
// and load translations when done
if ( (wikEdConfig['wikEd.config.loadTranslation'] === true) && (wikEdLoadingTranslationwikEd.loadingTranslation === false) ) {
gotGlobalsHook.push(WikEdLoadTranslationswikEd.LoadTranslations);
}
 
// set listener for GetGlobals messaging
// parse globals (asynchronous)
window.addEventListener('message', wikEd.GetGlobalsReceiver, false);
WikEdGetGlobals(globalNames, gotGlobalsHook);
 
// parse globals (asynchronous)
// check for web storage
wikEd.GetGlobals(globalNames, gotGlobalsHook);
if (typeof(window.localStorage) == 'object') {
 
wikEdWebStorage = true;
// schedule the setup routine; readyState interactive gives GM security error
if (document.readyState == 'complete') {
wikEd.Setup();
}
 
// with DOMContentLoaded event wikEd does not load for first (uncached) section edit
// schedule the setup routine
else {
WikEdAddEventListener(window, 'load', WikEdSetup, false);
window.addEventListener('load', wikEd.Setup, false);
}
 
return;
Line 1,856 ⟶ 2,085:
 
//
// WikEdLoadTranslationswikEd.LoadTranslations: load external wikEd translation and language settings
//
 
windowwikEd.WikEdLoadTranslationsLoadTranslations = function () {
 
if ( (wikEdConfig['wikEd.config.loadTranslation'] === true) && (wikEdLoadingTranslationwikEd.loadingTranslation === false) ) {
var contentLang = wikEdWikiGlobals['wikEd.wikiGlobals.wgContentLanguage'] || '';
var userLang = wikEdWikiGlobals['wikEd.wikiGlobals.wgUserLanguage'] || '';
if ( (wikEdConfig['wikEd.config.languageDefault'] !== '') || (userLang !== '') || (contentLang !== '') ) {
 
// simplified Chinese
if (contentLang == 'zh') {
contentLang = 'zh-hans';
Line 1,874 ⟶ 2,103:
}
 
// traditional Chinese
else if ( (userLang == 'zh-hk') || (userLang == 'zh-tw') ) {
userLang = 'zh-hant';
}
 
WikedInitTranslationswikEd.InitTranslations();
var scriptUrl = wikEdConfig['wikEd.config.translations'][wikEdConfig['wikEd.config.languageDefault']] || '';
if (scriptUrl === '') {
scriptUrl = wikEdConfig['wikEd.config.translations'][userLang] || '';
if (scriptUrl === '') {
scriptUrl = wikEdConfig['wikEd.config.translations'][contentLang] || '';
}
}
if (scriptUrl !== '') {
WikEdAppendScriptwikEd.AppendScript(scriptUrl, function () {
 
// copy custom text after values have arrived
var gotGlobalsHook = function () {
WikEdAddToObjectwikEd.AddToObject(wikEdTextwikEd.text, wikEdWikiGlobals['wikEd.wikiGlobals.wikEdText'], wikEd.config.text);
return;
};
 
// parse globals (asynchronous)
WikEdGetGlobalswikEd.GetGlobals(['wikEdText'], [gotGlobalsHook]);
wikEdLoadingTranslationwikEd.loadingTranslation = true;
});
}
Line 1,908 ⟶ 2,137:
 
//
// WikEdSetupwikEd.Setup: basic setup routine, scheduled after DOM or page load
//
 
windowwikEd.WikEdSetupSetup = function () {
 
document.removeEventListener('DOMContentLoaded', wikEd.Setup, false);
WikEdRemoveEventListener(window, 'load', WikEdSetup, false);
 
window.removeEventListener('load', wikEd.Setup, false);
// check if this has already been run, either as a wiki or a Greasemonkey user script
 
if (document.getElementById('wikEdSetupFlag') != null) {
// check if wikEd has already set up
if (document.getElementsByName('wikEdSetupFlag')[0] !== undefined) {
return;
}
 
// set setup flag
// detect already loaded external scripts
var flag = document.createElement('meta');
if (wikEdExternalScripts == null) {
flag.setAttribute('name', 'wikEdSetupFlag');
wikEdExternalScripts = [];
wikEd.head.appendChild(flag);
 
// import customization (try later again after page load for user/skin.js)
if ( (typeof wikEdConfig == 'object') && (wikEd.wikEdConfigAdded === false) ) {
wikEd.AddToObject(wikEd.config, wikEdConfig);
wikEd.wikEdConfigAdded = true;
}
if ( (typeof wikEdText == 'object') && (wikEd.wikEdTextAdded === false) ) {
wikEd.AddToObject(wikEd.text, wikEdText, wikEd.config.text);
wikEd.wikEdTextAdded = true;
}
 
// detect already loaded external scripts
if (wikEd.externalScripts === null) {
wikEd.externalScripts = [];
var pageScripts = document.getElementsByTagName('script');
for (var i = 0; i < pageScripts.length; i ++) {
var scriptSrc = pageScripts[i].src;
var nameMatchregExpMatchName = scriptSrc.match(/\btitle=([^&]*)/);
if (nameMatchregExpMatchName === null) {
nameMatchregExpMatchName = scriptSrc.match(/\/([^\/]*?)($|\?)/);
}
if (nameMatchregExpMatchName !== null) {
var scriptName = nameMatchregExpMatchName[1] || '';
if (scriptName !== '') {
 
// ignore other diff.js scripts
if ( (scriptName == 'diff.js') && (scriptSrc != wikEdConfig['wikEd.config.diffScriptSrc']) ) {
continue;
}
 
wikEdExternalScripts[scriptName] = true;
// ignore resource loader
if (scriptName == 'load.php') {
continue;
}
 
wikEd.externalScripts[scriptName] = pageScripts[i];
wikEd.externalScriptsString += scriptName + '\n';
}
}
Line 1,944 ⟶ 2,197:
}
 
// detect developer version
// exit if executed as Greasemonkey script if wiki user script is available
if (wikEd.externalScripts['wikEd_dev.js'] !== undefined) {
if (typeof(GM_getValue) == 'function') {
if (wikEdExternalScripts['wikEd.js']testVersion == true) {;
}
wikEdGreasemonkey = false;
 
// exit if executed as Greasemonkey script if wiki user script is available
if (typeof GM_getValue == 'function') {
if (wikEd.externalScripts['wikEd.js'] !== undefined) {
wikEd.greasemonkey = false;
return;
}
else {
wikEdGreasemonkeywikEd.greasemonkey = true;
}
}
 
// detect wikEd running as a gadget
// redirect Greasemonkey debugging function to WikEdDebug if run as a wiki user script
if (wikEd.config.gadget === null) {
else {
if (wikEd.externalScripts['MediaWiki:Gadget-wikEd.js'] !== undefined) {
window.GM_log = window.WikEdDebug;
wikEd.config.gadget = true;
}
}
 
// set installation type
// detect wikEd running as a gadget
if (wikEdConfig['wikEd.config.gadget'] === nulltrue) {
wikEd.installationType += ' G';
if (wikEdExternalScripts['MediaWiki:Gadget-wikEd.js'] == true) {
}
wikEdConfig['gadget'] = true;
else if (wikEd.greasemonkey === true) {
}
wikEd.installationType += ' GM';
}
 
// detect MediaWiki page and its skin
// set already run flag
wikEd.InitMediaWikiSkinIds();
var flag = document.createElement('span');
for (var skin in wikEd.config.mediaWikiSkinIds) {
flag.id = 'wikEdSetupFlag';
if (Object.prototype.hasOwnProperty.call(wikEd.config.mediaWikiSkinIds, skin) === true) {
flag.className = 'wikEdSetupFlag';
var logoContainerId = wikEd.config.mediaWikiSkinIds[skin][0];
flag.style.display = 'none';
var logoToList = wikEd.config.mediaWikiSkinIds[skin][1];
flag.style.visibility = 'hidden';
var rearrange = wikEd.config.mediaWikiSkinIds[skin][2];
document.body.appendChild(flag);
var skinIds = wikEd.config.mediaWikiSkinIds[skin][3];
 
var enableLocalPreview = wikEd.config.mediaWikiSkinIds[skin][4];
// detect MediaWiki page and its skin
WikedInitMediaWikiSkinIds();
for (var skin in wikEdConfig['MediaWikiSkinIds']) {
if (wikEdConfig['MediaWikiSkinIds'].hasOwnProperty(skin) == true) {
var logoContainerId = wikEdConfig['MediaWikiSkinIds'][skin][0];
var logoToList = wikEdConfig['MediaWikiSkinIds'][skin][1];
var rearrange = wikEdConfig['MediaWikiSkinIds'][skin][2];
var skinIds = wikEdConfig['MediaWikiSkinIds'][skin][3];
for (var i = 0; i < skinIds.length; i ++) {
if (document.getElementById(skinIds[i]) === null) {
break;
}
}
if (i == skinIds.length) {
wikEdLogoContainerIdwikEd.logoContainerId = logoContainerId;
wikEdSkinwikEd.skin = skin;
wikEdRearrangewikEd.rearrange = rearrange;
wikEdLogoToListwikEd.logoToList = logoToList;
wikEd.enableLocalPreview = enableLocalPreview;
break;
}
Line 1,998 ⟶ 2,253:
}
 
// not a MediaWiki page
if (wikEdSkinwikEd.skin === '') {
return;
}
 
// initialize user configurable variables
wikEd.InitGlobalConfigs();
WikEdInitGlobalConfigs();
 
// import custom text and translations
wikEd.AddToObject(wikEd.config.text, wikEd.text);
WikEdAddToObject(wikEdConfig['text'], wikEdText);
 
// do not rearrange page elements
if (wikEdConfig['wikEd.config.noRearrange'] !== false) {
wikEdRearrangewikEd.rearrange = false;
}
 
// initialize non-configurable variables
wikEd.InitGlobals();
WikEdInitGlobals();
 
// check for updates
wikEd.AutoUpdate();
WikEdAutoUpdate();
 
// initialize images (needed here for logo)
wikEd.InitImages();
WikedInitImages();
 
// load css for edit and non-edit pages
wikEd.InitMainCSS();
WikedInitMainCSS();
 
// add stylesheet definitions
WikEdApplyCSSwikEd.ApplyCSS(document, wikEdConfig['wikEd.config.mainCSS']);
 
// add image path to image filename
if (wikEdLogowikEd.logo === null) {
 
// create logo
wikEdLogowikEd.logo = document.createElement('img');
wikEdLogowikEd.logo.id = 'wikEdLogoImg';
 
// insert logo into page
var logoContainer;
if (wikEdLogoContainerIdwikEd.logoContainerId !== '') {
logoContainer = document.getElementById(wikEdLogoContainerIdwikEd.logoContainerId);
}
if (logoContainer !== null) {
 
// logo as last element of specified list (e.g. monobook, simple, myskin, gumax)
if (wikEdLogoToListwikEd.logoToList === true) {
wikEdLogoListwikEd.logoList = document.createElement('li');
wikEdLogoListwikEd.logoList.id = 'wikEdLogoList';
wikEdLogoListwikEd.logoList.className = 'wikEdLogoList';
wikEdLogoListwikEd.logoList.appendChild(wikEdLogowikEd.logo);
var list;
var logo;
if (logoContainer.tagName == 'UL') {
list = logoContainer;
Line 2,057 ⟶ 2,311:
list = logoContainer.getElementsByTagName('ul')[0];
}
if (list !== nullundefined) {
list.appendChild(wikEdLogoListwikEd.logoList);
wikEdLogowikEd.logo.className = 'wikEdLogo';
}
}
 
// logo as last child of specified element
else {
logoContainer.appendChild(wikEdLogowikEd.logo);
wikEdLogowikEd.logo.className = 'wikEdLogo';
}
}
 
// logo as first page element, fallback for undetected skin
if (wikEdLogowikEd.logo.className === '') {
document.body.insertBefore(wikEdLogowikEd.logo, document.body.firstChild);
wikEdLogowikEd.logo.className = 'wikEdLogoFallBack';
}
 
// add event listenerlisteners to logo
WikEdAddEventListenerwikEd.logo.addEventListener(wikEdLogo, 'click', WikEdMainSwitchwikEd.MainSwitch, true);
wikEd.logo.addEventListener('click', wikEd.DebugInfo, true);
}
 
// page loaded flag for dynamically loaded scripts
wikEdPageLoadedwikEd.pageLoaded = true;
 
// load the external wikEd diff library script if not already done
if ( (wikEdConfig['wikEd.config.loadDiffScript'] === true) && (wikEdExternalScriptswikEd.externalScripts['diff.js'] === nullundefined) ) {
if (typeof(WDiffString)WikEdDiff === 'undefined') {
var sep = '&';
WikEdAppendScript(wikEdConfig['diffScriptSrc']);
if (wikEd.config.diffScriptSrc.indexOf('?') == -1) {
sep = '?';
}
wikEd.externalScripts['diff.js'] = wikEd.AppendScript(wikEd.config.diffScriptSrc + sep + wikEd.programVersion);
}
wikEdExternalScripts['diff.js'] = true;
}
 
// load the external wikEdDiff script if not already done
if ( (wikEdConfig['wikEd.config.loadDiff'] === true) && (wikEdExternalScriptswikEd.externalScripts['wikEdDiff.js'] === nullundefined) ) {
if (typeof(WikEdDiff)wikEd.Diff === 'undefined') {
var sep = '&';
WikEdAppendScript(wikEdConfig['diffSrc']);
if (wikEd.config.diffSrc.indexOf('?') == -1) {
}
sep = '?';
wikEdExternalScripts['wikEdDiff.js'] = true;
}
 
// load the MS IE selection/range compatibility library IERange
if (wikEdMSIE == true) {
if ( (wikEdConfig['loadIERange'] == true) && (wikEdExternalScripts['ierange.js'] == null) ) {
if (typeof(DOMUtils) == 'undefined') {
WikEdAppendScript(wikEdConfig['IERangeSrc']);
}
wikEd.externalScripts['wikEdDiff.js'] = wikEd.AppendScript(wikEd.config.diffSrc + sep + wikEd.programVersion);
wikEdExternalScripts['ierange.js'] = true;
}
}
 
// init syntax highlighting regExp object
// check if disabled
wikEd.HighlightSyntaxInit();
wikEdDisabled = WikEdGetSavedSetting('wikEdDisabled', wikEdConfig['disabledPreset']);
 
if (wikEdDisabled == true) {
// check if disabled
wikEdUseWikEd = false;
wikEd.disabled = wikEd.GetSavedSetting('wikEdDisabled', wikEd.config.disabledPreset);
WikEdSetLogo();
if (wikEd.disabled === true) {
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.SetLogo();
return;
}
 
// ___location search string function: put all used images and icons on an empty page
// get current page name
if (/(\?|&)wikEd=iconPage\b/i.test(window.___location.search) === true) {
wikEdPageName = wikEdWikiGlobals['wgPageName'];
var str = wikEd.config.text.iconPage;
 
for (var imageKey in wikEd.config.image) {
// get current namespace
if (Object.prototype.hasOwnProperty.call(wikEd.config.image, imageKey) === true) {
if (wikEdPageName != null) {
var imageAddress = wikEd.config.image[imageKey];
var colonPos = wikEdPageName.indexOf(':');
if (colonPostypeof imageAddress == -1'string') {
wikEdPageNamespace = '';
}
else {
wikEdPageNamespace = wikEdPageName.substr(0, colonPos);
}
}
 
// ___location search string function: put all used images and icons on an empty page
if (window.___location.search.match(/(\?|&)wikEd=iconPage\b/i) != null) {
var str = wikEdConfig['text']['iconPage'];
for (var imageKey in wikEdConfig['image']) {
if (wikEdConfig['image'].hasOwnProperty(imageKey) == true) {
var imageAddress = wikEdConfig['image'][imageKey];
if (typeof(imageAddress) == 'string') {
str += '<img src="' + imageAddress + '"> ';
}
Line 2,146 ⟶ 2,387:
}
 
// continue setup
// init syntax highlighting regExp object
wikEd.TurnOn(true);
WikEdHighlightSyntaxInit();
 
// continue setup
WikEdTurnOn(true);
 
return;
Line 2,157 ⟶ 2,395:
 
//
// WikEdTurnOnwikEd.TurnOn: continue setup, can be called repeatedly
//
 
windowwikEd.WikEdTurnOnTurnOn = function (scrollToEditFocus) {
 
// check if setup was already run
if (wikEdTurnedOnwikEd.turnedOn === true) {
return;
}
 
// set error logo
WikEdSetLogowikEd.SetLogo('error');
 
// check for active code editor and .js or .css page
// no id, no wikEd
wikEd.CodeEditorCheck();
if (navigator.appName == null) {
 
wikEdBrowserNotSupported = true;
// no id, no wikEd
if (window.navigator.appName === null) {
wikEd.browserNotSupported = true;
}
 
// check browser versions
switch (wikEdBrowserNamewikEd.browserName) {
 
// check Mozilla version
case 'Mozilla':
if (
(wikEdBrowserFlavorwikEd.browserFlavor == 'Firefox') && (wikEdBrowserVersionwikEd.browserVersion < 1.5) ||
(wikEdBrowserFlavorwikEd.browserFlavor == 'Netscape') && (wikEdBrowserVersionwikEd.browserVersion < 8.0) ||
(wikEdBrowserFlavorwikEd.browserFlavor == 'SeaMonkey') && (wikEdBrowserVersionwikEd.browserVersion < 1.0)
) {
wikEdBrowserNotSupportedwikEd.browserNotSupported = true;
}
break;
 
// check MSIE version
case 'MSIE':
wikEdBrowserNotSupportedwikEd.browserNotSupported = true;
break;
 
// check Opera version
case 'Opera':
if (wikEdBrowserVersionwikEd.browserVersion < 10.5115) {
 
wikEdBrowserNotSupported = true;
// too buggy (inserthtml, parentNode...)
wikEd.browserNotSupported = true;
}
 
// 10.50 beta, 10.51 are too buggy (inserthtml, parentNode...)
wikEdBrowserNotSupported = true;
 
break;
 
// check Google Chrome version
case 'Chrome':
if (wikEdBrowserVersionwikEd.browserVersion < 0.2) {
wikEdBrowserNotSupportedwikEd.browserNotSupported = true;
}
break;
 
// check Safari version
case 'Safari':
if (wikEdBrowserVersionwikEd.browserVersion < 500) {
wikEdBrowserNotSupportedwikEd.browserNotSupported = true;
}
break;
}
 
// browser or version not supported, set error message and exit
if ( (wikEdBrowserNotSupportedwikEd.browserNotSupported === true) && (wikEdConfig['wikEd.config.skipBrowserTest'] === false) ) {
wikEd.disabled = true;
WikEdSetLogo('browser');
wikEd.SetLogo('browser');
return;
}
 
// get form elements
var array;
array = document.getElementsByName('wpEdittime');
if (array[0] !== nullundefined) {
wikEdEdittimewikEd.edittime = array[0].value;
}
var array = document.getElementsByName('wpEditTokenwpStarttime');
if (array[0] !== nullundefined) {
wikEdEditTokenwikEd.starttime = array[0].value;
}
array = document.getElementsByName('wpAutoSummary');
if (array[0] !== undefined) {
wikEd.autoSummary = array[0].value;
}
array = document.getElementsByName('wpEditToken');
if (array[0] !== undefined) {
wikEd.editToken = array[0].value;
}
 
// page type detection
 
// detect custom edit page
if (wikEdConfig['wikEd.config.customEditFormId'] !== '') {
wikEdEditFormwikEd.editForm = document.getElementById(wikEdConfig['wikEd.config.customEditFormId']);
}
if (wikEdConfig['wikEd.config.customTextAreaId'] !== '') {
wikEdTextareawikEd.textarea = document.getElementById(wikEdConfig['wikEd.config.customTextAreaId']);
}
if (wikEdConfig['wikEd.config.customSaveButtonId'] !== '') {
wikEdSaveButtonwikEd.saveButton = document.getElementById(wikEdCustomwikEdSaveButtonIdwikEd.customwikEdSaveButtonId);
}
 
// detect standard edit page
if (wikEdTextareawikEd.textarea === null) {
 
wikEdTextarea = document.getElementsByName('wpTextbox1')[0];
// HotCat injects this textarea into non-edit pages
var textarea = document.getElementsByName('wpTextbox1')[0];
if ( (textarea !== undefined) && (textarea.type != 'hidden') ) {
wikEd.textarea = textarea;
}
}
if (wikEdEditFormwikEd.editForm === null) {
wikEdEditFormwikEd.editForm = document.getElementById('editform');
}
if (wikEdSaveButtonwikEd.saveButton === null) {
wikEdSaveButtonwikEd.saveButton = document.getElementById('wpSave');
}
wikEdDiffPreviewButtonwikEd.diffPreviewButton = document.getElementById('wpDiff');
wikEdPreviewButtonwikEd.previewButton = document.getElementById('wpPreview');
wikEd.editArticle = true;
 
// detect MediaWikiread-only Semanticedit Forms extensionpage
if ( (wikEd.textarea !== null) && (wikEd.editForm === null) && (wikEd.saveButton === null) ) {
if (wikEdTextarea == null) {
wikEd.editReadOnly = true;
wikEdEditForm = document.getElementsByName('createbox')[0];
wikEd.editArticle = false;
wikEdTextarea = document.getElementsByName('free_text')[0];
wikEd.readOnly = true;
}
 
// detect editsemantic rawforms watchlist pageextension
else if ( (wikEdEditFormwikEd.textarea == null) || (wikEdTextarea == null) ) {
wikEdTextareawikEd.editForm = document.getElementById('titlessfForm');
wikEd.textarea = document.getElementById('sf_free_text');
if (wikEdTextarea != null) {
if ( (wikEd.editForm !== null) && (wikEd.textarea !== null) ) {
wikEdRearrange = false;
wikEdWatchlistEditwikEd.editArticle = truefalse;
wikEd.editSemanticForm = true;
}
 
// get watchlistdetect edit formraw watchlist page
else {
var node = wikEdTextarea;
wikEd.textarea = document.getElementById('mw-input-wpTitles');
while (node != null) {
 
node = node.parentNode;
// old version
if (node.tagName == 'FORM') {
if (wikEd.textarea === null) {
break;
wikEd.textarea = document.getElementById('titles');
}
if (wikEd.textarea !== null) {
wikEd.editArticle = false;
wikEd.editWatchlist = true;
 
// get watchlist edit form
var node = wikEd.textarea;
while (node !== null) {
node = node.parentNode;
if (node.tagName == 'FORM') {
break;
}
}
wikEd.editForm = node;
 
// get watchlist submit button
var saveButton = document.getElementsByClassName('mw-htmlform-submit')[0];
if ( (saveButton === undefined) && (wikEd.editForm !== null) ) {
wikEd.saveButton = saveButton;
var submits = wikEd.editForm.getElementsByTagName('input');
for (var i = 0; i < submits.length; i ++) {
if (submits[i].type == 'submit') {
wikEd.saveButton = submits[i];
break;
}
}
}
}
wikEdEditForm = node;
}
 
// detect upload page
// get watchlist submit button
if ( (wikEd.textarea === null) || (wikEd.editForm === null) || (wikEd.saveButton === null) ) {
if (wikEdEditForm != null) {
var submitstextarea = wikEdEditFormdocument.getElementsByTagNamegetElementsByName('inputwpUploadDescription')[0];
var editForm = document.getElementById('mw-upload-form');
for (i = 0; i < submits.length; i ++) {
var saveButton = document.getElementsByName('wpUpload')[0];
if (submits[i].type == 'submit') {
if ( (textarea !== undefined) && (editForm !== null) && (saveButton !== undefined) ) {
wikEdSaveButton = submits[i];
wikEd.textarea = textarea;
break;
wikEd.editForm = editForm;
wikEd.saveButton = saveButton;
wikEd.editArticle = false;
wikEd.editUpload = true;
wikEd.rearrange = false;
}
}
 
// detect view and restore deleted pages (no id on textarea)
if ( (wikEd.textarea === null) || (wikEd.editForm === null) || (wikEd.saveButton === null) ) {
var forms = document.getElementsByTagName('form');
var i = 0;
var form;
while ( (form = forms[i ++]) !== undefined) {
if (/\btitle=Special:Undelete\b/i.test(form.action) === true) {
var textareas = document.getElementsByTagName('textarea');
var j = 0;
var textarea;
while ( (textarea = textareas[j ++]) !== undefined) {
if (textarea.readOnly === true) {
wikEd.textarea = textarea;
wikEd.previewButton = document.getElementsByName('preview')[0] || null;
wikEd.editArticle = false;
wikEd.viewDeleted = true;
wikEd.rearrange = true;
break;
}
}
}
break;
}
}
}
 
// set page detection error indicator
// detect upload page
if (wikEd.textarea === null) {
if ( (wikEdTextarea == null) || (wikEdEditForm == null) || (wikEdSaveButton == null) ) {
wikEd.SetLogo();
wikEdTextarea = document.getElementsByName('wpUploadDescription')[0];
return;
wikEdEditForm = document.getElementById('mw-upload-form');
wikEdSaveButton = document.getElementsByName('wpUpload')[0];
if ( (wikEdTextarea != null) && (wikEdEditForm != null) && (wikEdSaveButton != null) ) {
wikEdUploadEdit = true;
wikEdRearrange = false;
}
}
 
// do not turn on when code editor is active
if (wikEd.useCodeEditor === true) {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', 'Code Editor');
return;
}
 
// check if the textarea is read-only
// detect view and restore deleted pages
if (wikEd.config.skipReadOnlyTest === false) {
if ( (wikEdTextarea == null) || (wikEdEditForm == null) || (wikEdSaveButton == null) ) {
if ( (wikEd.textarea.getAttribute('readonly') !== null) || (wikEd.saveButton === null) ) {
wikEdTextarea = document.getElementsByTagName('textarea')[0];
wikEd.readOnly = true;
if (wikEdTextarea != null) {
}
}
 
// check for section edits
// get form
var nodesection = document.getElementsByName('previewwpSection')[0];
if (
while (node != null) {
section !== null &&
node = node.parentNode;
section.length > 0
if (node.tagName == 'FORM') {
) {
break;
wikEd.editSection = section[0].value;
}
 
// get missing wg variables from footer link (code copied to wikEdDiff.js)
if (wikEd.wikiGlobals.wgArticlePath === undefined) {
var printfooter = document.body.getElementsByClassName('printfooter')[0];
if (printfooter !== undefined) {
var articleLink = printfooter.getElementsByTagName('a')[0];
if (articleLink !== undefined) {
var regExpMatch = /^(https?:\/\/[^\/]*)(\/([^\/]*\/)*)([^\/]*)$/.exec(articleLink.href);
if (regExpMatch !== null) {
wikEd.wikiGlobals.wgServer = regExpMatch[1];
wikEd.wikiGlobals.wgArticlePath = regExpMatch[1] + regExpMatch[2] + '$1';
wikEd.wikiGlobals.wgPageName = regExpMatch[4] || '';
wikEd.wikiGlobals.wgTitle = decodeURIComponent( regExpMatch[4].replace(/_/g, ' ') );
}
}
wikEdEditForm = node;
if (wikEdEditForm != null) {
wikEdPreviewButton = document.getElementsByName('preview')[0];
wikEdViewDeleted = true;
wikEdRearrange = false;
}
}
}
 
// get missing wg variables from form action url
// set page detection error indicator
if (wikEd.wikiGlobals.wgScript === undefined) {
if ( (wikEdTextarea == null) || (wikEdEditForm == null) ) {
var form = wikEd.editForm;
WikEdSetLogo();
if ( form !== null && form.action.indexOf( '/Special:EditWatchlist' ) !== -1 ) {
return;
form = document.getElementById( 'searchform' );
}
if ( form !== null && form.action.indexOf( '/index.php' ) !== -1 ) {
wikEd.wikiGlobals.wgScript = form.action.replace(/^https?:\/\/[^\/]*|\?.*$/g, '');
wikEd.wikiGlobals.wgScriptPath = wikEd.wikiGlobals.wgScript.replace(/\/index\.php/, '');
}
}
 
// get current page name
// check if the textarea is read-only
wikEd.pageName = wikEd.wikiGlobals.wgPageName;
if (wikEdConfig['skipReadOnlyTest'] == false) {
 
if ( (WikEdGetAttribute(wikEdTextarea, 'readonly') != null) || (wikEdSaveButton == null) ) {
// get current namespace
wikEdReadOnly = true;
if (wikEd.pageName !== null) {
var colonPos = wikEd.pageName.indexOf(':');
if (colonPos == -1) {
wikEd.pageNamespace = '';
}
else {
wikEd.pageNamespace = wikEd.pageName.substr(0, colonPos);
}
}
 
// get MediaWiki file paths
// initialize frame css, main css, buttons, and button bars
wikEd.GetPaths();
WikedInitFrameCSS();
WikedInitMainEditCSS();
WikedInitButton();
WikedInitButtonKey();
WikedInitButtonBar();
WikedInitHistoryLength();
WikedInitIncompatibleScripts();
 
// check if we can call external API for incompatibleredlink scriptsdetection
var regExpDomains = new RegExp('//(.*?\\.)?(' + wikEd.config.externalApiDomains.replace(/\s*,\s*/g, '|').replace(/\./g, '\\.') + '$)', 'g');
if (wikEdConfig['skipScriptTest'] == false) {
wikEd.useExternalApi = regExpDomains.test(window.___location.origin);
var scriptNames = '';
 
for (var key in wikEdConfig['incompatibleScripts']) {
// get page elements
if (wikEdConfig['incompatibleScripts'].hasOwnProperty(key) == true) {
wikEd.catLinks = document.getElementById('catlinks');
var generalName = key;
 
var scriptName = wikEdConfig['incompatibleScripts'][key];
// check if mw.loader is available
if (wikEdExternalScripts[scriptName] == true) {
if ( (window.mw !== undefined) && (window.mw.loader !== undefined) && (window.mw.config !== undefined) ) {
if (scriptNames != '') {
scriptNameswikEd.loader += ', 'true;
}
}
 
scriptNames += generalName;
// get wikibase defaults for linkification
}
wikEd.wikibase.currentSite = {};
}
wikEd.wikibase.currentSite.globalSiteId = wikEd.config.wbGlobalSiteId;
wikEd.wikibase.repoUrl = wikEd.config.wbRepoUrl;
wikEd.wikibase.repoArticlePath = wikEd.config.wbRepoArticlePath;
 
// get wikibase infos
if (wikEd.loader === true) {
 
// prevent error if module is not installed
try {
window.mw.loader.using('wikibase.client.currentSite', function () {
wikEd.wikibase.currentSite = window.mw.config.get('wbCurrentSite');
});
}
ifcatch (scriptNames != ''exception) {
}
WikEdSetLogo('incompatible', scriptNames);
 
return;
try {
window.mw.loader.using('wikibase.repoAccess', function () {
wikEd.wikibase.repoUrl = window.mw.config.get('wbRepoUrl');
wikEd.wikibase.repoArticlePath = window.mw.config.get('wbRepoArticlePath');
});
}
catch (exception) {
}
}
 
// initialize frame css, main css, buttons, and button bars
// define Unicode characters for fixing function
wikEd.InitFrameCSS();
WikEdInitUnicode();
wikEd.InitMainEditCSS();
wikEd.InitButton();
wikEd.InitButtonKey();
wikEd.InitButtonBar();
wikEd.InitHistoryLength();
wikEd.InitIncompatibleScripts();
 
// check for incompatible scripts
// detect if we add a new section (+ tab)
var incompatible = '';
if (/(\?|&)section=new\b/.test(window.___location.search) == true) {
if (wikEd.config.skipScriptTest === false) {
wikEdAddNewSection = true;
for (var key in wikEd.config.incompatibleScripts) {
}
if (Object.prototype.hasOwnProperty.call(wikEd.config.incompatibleScripts, key) === true) {
else {
var regExp = new RegExp(wikEd.config.incompatibleScripts[key].replace(/\.js$/g, ''), 'gim');
var section = document.getElementsByName('wpSection');
if (regExp.test(wikEd.externalScriptsString) === true) {
if (section != null) {
if (section.lengthincompatible >!== 0'') {
if (section[0].value incompatible =+= 'new, ') {;
}
wikEdAddNewSection = true;
incompatible += key;
}
}
Line 2,393 ⟶ 2,751:
}
 
// detect incompatible add-ons
// load the external InstaView script
if (wikEd.config.skipAddonTest === false) {
if ( (wikEdGreasemonkey == false) && (wikEdConfig['loadInstaView'] == true) && (wikEdExternalScripts['instaview.js'] == null) ) {
 
if (typeof(InstaView) == 'undefined') {
// Ginger add-on breaks undo history, corrupts text (<tag><!-- -->)
WikEdAppendScript(wikEdConfig['instaViewSrc']);
if (document.body.getAttribute('ginger_software_stylesheet') !== null) {
if (incompatible !== '') {
incompatible += ', ';
}
incompatible += 'Ginger';
}
wikEdExternalScripts['instaview.js'] = true;
}
 
else if ( (wikEdGreasemonkey == false) || (wikEdConfig['loadInstaView'] != true) ) {
// incompatible script or add-on error
wikEdConfig['useLocalPreview'] = false;
if (incompatible !== '') {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', incompatible);
return;
}
 
// define Unicode characters for fixing function
// get initial textarea dimensions
wikEd.InitUnicode();
wikEdTextareaBorderHeight = parseInt(WikEdGetStyle(wikEdTextarea, 'borderTopWidth'), 10) + parseInt(WikEdGetStyle(wikEdTextarea, 'borderBottomWidth'), 10);
 
// detect if we add a new section (+ tab)
if (WikEdGetStyle(wikEdTextarea, 'display') != 'none') {
if (/(\?|&)section=new\b/.test(window.___location.search) === true) {
wikEdTextareaOffsetHeightInitial = wikEdTextarea.offsetHeight;
wikEd.addNewSection = true;
}
else {
var section = document.getElementsByName('wpSection');
wikEdTextareaOffsetHeightInitial = wikEdTextarea.parentNode.clientHeight;
if ( (section[0] !== undefined) && (section[0].value == 'new') ) {
wikEd.addNewSection = true;
}
}
wikEdTextareaOffsetHeightInitial = wikEdTextarea.offsetHeight;
wikEdTextareaHeight = (wikEdTextarea.offsetHeight - wikEdTextareaBorderHeight) + 'px';
wikEdTextareaWidth = '100%';
 
// removeget frame border ifinitial textarea has nonedimensions
wikEd.textareaBorderHeight = parseInt(wikEd.GetStyle(wikEd.textarea, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.textarea, 'borderBottomWidth'), 10);
var styleFrameContainer = '';
if (wikEd.GetStyle(wikEd.textarea, 'display') != 'none') {
if (wikEdTextareaBorderHeight == 0) {
wikEd.textareaOffsetHeightInitial = wikEd.textarea.offsetHeight;
styleFrameContainer = 'border-width: 0;';
}
else {
wikEd.textareaOffsetHeightInitial = wikEd.textarea.parentNode.clientHeight;
}
wikEd.textareaOffsetHeightInitial = wikEd.textarea.offsetHeight;
wikEd.textareaHeight = (wikEd.textarea.offsetHeight - wikEd.textareaBorderHeight) + 'px';
wikEd.textareaWidth = '100%';
 
// setup the undo buffers and save the original text for local changes view
wikEdOrigVersionwikEd.origVersion = wikEdTextareawikEd.textarea.value;
 
// add stylesheet definitions
// Opera 0.9.51
wikEd.ApplyCSS(document, wikEd.config.mainEditCSS);
wikEdOrigVersion = wikEdOrigVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
// get button settings from saved settings
// add stylesheet definitions
wikEd.using = wikEd.GetSavedSetting('wikEdSummaryUsing', wikEd.config.usingPreset);
WikEdApplyCSS(document, wikEdConfig['mainEditCSS']);
wikEd.useWikEd = ! wikEd.GetSavedSetting('wikEdUseClassic', ! wikEd.config.useWikEdPreset);
 
wikEd.highlightSyntax = ! wikEd.GetSavedSetting('wikEdSyntaxOff', ! wikEd.config.highlightSyntaxPreset);
// get button settings from saved settings
wikEd.fullScreenMode = wikEd.GetSavedSetting('wikEdFullscreen', wikEd.config.fullScreenModePreset);
wikEdUsing = WikEdGetSavedSetting('wikEdSummaryUsing', wikEdConfig['usingPreset']);
wikEd.closeToolbar = wikEd.GetSavedSetting('wikEdCloseToolbar', wikEd.config.closeToolbarPreset);
wikEdUseWikEd = ! WikEdGetSavedSetting('wikEdUseClassic', ! wikEdConfig['useWikEdPreset']);
wikEd.refHide = wikEd.GetSavedSetting('wikEdRefHide', wikEd.config.refHidePreset);
wikEdHighlightSyntax = ! WikEdGetSavedSetting('wikEdSyntaxOff', ! wikEdConfig['highlightSyntaxPreset']);
window.wikEdUseWikEd = wikEd.useWikEd;
wikEdFullScreenMode = WikEdGetSavedSetting('wikEdFullscreen', wikEdConfig['fullScreenModePreset']);
if (wikEd.config.tableMode === true) {
wikEdCloseToolbar = WikEdGetSavedSetting('wikEdCloseToolbar', wikEdConfig['closeToolbarPreset']);
wikEd.tableMode = wikEd.refHide;
wikEdRefHide = WikEdGetSavedSetting('wikEdRefHide', wikEdConfig['refHidePreset']);
}
wikEdDiff = WikEdGetSavedSetting('wikEdDiff', wikEdConfig['diffPreset']);
else {
wikEdTableMode = false;
wikEd.tableMode = false;
}
 
// detect preview page
if (window.___location.search.match(/(\?|&)action=submit\b/.test(window.___location.search) !=== nulltrue) {
wikEdPreviewPagewikEd.previewPage = true;
}
 
// disable wikEd for Lupin's autoedit scripts
// no fullscreen for preview and upload pages
if ( /(wikEdUploadEdit \?|&)autoedit== true/.test(window.___location.search) || (wikEdPreviewPage === true) ) {
wikEdFullScreenModewikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
}
 
// disable wikEd for Lupin's.js autoeditand scripts.css pages
if ( (wikEd.jsPage === true) || (wikEd.cssPage === true) ) {
if (window.___location.search.match(/(\?|&)autoedit=/) != null) {
wikEdUseWikEdwikEd.noSpellcheck = falsetrue;
if (wikEd.origVersion.length > 20000) {
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
}
else {
wikEd.highlightSyntax = false;
}
}
 
// disable wikEdhighlighting for jsmodule pagesnamespace (Scribunto/Lua templates)
if (wikEd.wikiGlobals.wgCanonicalNamespace == 'Module') {
if (/\.js$/.test(wikEdWikiGlobals['wgTitle']) == true) {
wikEd.noSpellcheck = true;
if ( (wikEdWikiGlobals['wgCanonicalNamespace'] != 'User_talk') && (wikEdWikiGlobals['wgCanonicalNamespace'] != 'Talk') ) {
wikEd.highlightSyntax = false;
wikEdNoSpellcheck = true;
if (wikEdOrigVersion.length > 20000) {
wikEdUseWikEd = false;
}
else {
wikEdHighlightSyntax = false;
}
}
}
 
// no highlightingspellcheck for watchlist editing
if (wikEdWatchlistEditwikEd.editWatchlist === true) {
wikEdNoSpellcheckwikEd.noSpellcheck = true;
wikEdHighlightSyntax = false;
}
 
// disable spellchecker for textarea
if (wikEdNoSpellcheckwikEd.noSpellcheck === true) {
wikEdTextareawikEd.textarea.setAttribute('spellcheck', false);
}
 
// preset frame related styles to avoid browser crashes
var styleFrameBody;
var styleFrameWrapperPosition;
var styleFrameWrapperVisibility;
var styleTextareaWrapperPosition;
var styleTextareaWrapperVisibility;
if (wikEdUseWikEdwikEd.useWikEd === true) {
styleFrameBody = 'display: block;';
styleFrameWrapperPosition = 'static';
styleFrameWrapperVisibility = 'visible';
Line 2,495 ⟶ 2,868:
}
else {
styleFrameBody = 'display: none;';
styleFrameWrapperPosition = 'absolute';
styleFrameWrapperVisibility = 'hidden';
Line 2,501 ⟶ 2,873:
styleTextareaWrapperVisibility = 'visible';
}
 
var inputWrapperClass;
// find proper insertion point of input wrapper
if (wikEdFullScreenMode == true) {
 
inputWrapperClass = 'wikEdInputWrapperFull';
// inside the wikiEditor interface
var wikiEditor = document.body.getElementsByClassName('wikiEditor-ui')[0];
if (wikiEditor !== undefined) {
wikEd.wikiEditor = wikiEditor;
wikEd.wikiEditorFrame = wikEd.wikiEditor.getElementsByTagName('IFRAME')[0] || null;
wikEd.wikiEditorTop = document.body.getElementsByClassName('wikiEditor-ui-top')[0] || null;
wikEd.wikiEditorLeft = document.body.getElementsByClassName('wikiEditor-ui-left')[0] || null;
wikEd.wikiEditorBar = document.body.getElementsByClassName('wikiEditor-ui-toolbar')[0] || null;
wikEd.wikiEditorBottom = document.body.getElementsByClassName('wikiEditor-ui-bottom')[0] || null;
wikEd.wikiEditorText = document.body.getElementsByClassName('wikiEditor-ui-text')[0] || null;
wikEd.textareaContainer = wikEd.wikiEditor;
if (wikEd.wikiEditorBar === null) {
wikEd.SetLogo('incompatible', 'WikiEditor (delayed)');
return;
}
}
 
// before original textarea container (multiple nested containers for semantic forms)
else {
var node = wikEd.textarea;
inputWrapperClass = 'wikEdInputWrapper';
var parent = node.parentNode;
while (wikEd.GetFirstChildNode(parent) == wikEd.GetLastChildNode(parent) ) {
if (/^(SPAN|DIV|P)$/.test(parent.nodeName) === false) {
break;
}
node = parent;
parent = node.parentNode;
}
wikEd.textareaContainer = node;
}
 
// checkcreate ifinput wewrapper, usecontains the wikEdEditorwhole wikEd and wikiEditor user interface, ofis the vectorfullscreen skincontainer
wikEd.inputWrapper = document.createElement('div');
 
wikEd.inputWrapper.id = 'wikEdInputWrapper';
// wikEdWikiEditor = document.getElementById('wikiEditor-ui');
wikEd.inputWrapper.className = 'wikEdInputWrapper';
wikEdWikiEditor = WikEdGetElementsByClassName('wikiEditor-ui', 'div')[0];
if (wikEd.wikiEditor !== null) {
wikEd.inputWrapper = wikEd.wikiEditor.parentNode.insertBefore(wikEd.inputWrapper, wikEd.wikiEditor);
wikEd.inputWrapper.appendChild(wikEd.wikiEditor);
}
else {
wikEd.textareaContainer.parentNode.insertBefore(wikEd.inputWrapper, wikEd.textareaContainer);
}
 
// create editor wrapper, contains captcha, toolbar, debug, buttons bar, textarea, toc, but not the summary
if (wikEdWikiEditor == null) {
wikEd.editorWrapper = document.createElement('div');
wikEdTextareaContainer = wikEdTextarea;
wikEd.editorWrapper.id = 'wikEdEditorWrapper';
wikEd.editorWrapper.className = 'wikEdEditorWrapper';
if (wikEd.wikiEditor !== null) {
wikEd.wikiEditor.parentNode.insertBefore(wikEd.editorWrapper, wikEd.wikiEditor);
wikEd.editorWrapper.appendChild(wikEd.wikiEditor);
}
else {
wikEd.inputWrapper.appendChild(wikEd.editorWrapper);
wikEdWikiEditorFrame = wikEdWikiEditor.getElementsByTagName('IFRAME')[0];
wikEdWikiEditorTop = WikEdGetElementsByClassName('wikiEditor-ui-top', 'div')[0];
wikEdWikiEditorBar = WikEdGetElementsByClassName('wikiEditor-ui-toolbar', 'div')[0];
wikEdWikiEditorBottom = WikEdGetElementsByClassName('wikiEditor-ui-bottom', 'div')[0];
wikEdWikiEditorText = WikEdGetElementsByClassName('wikiEditor-ui-text', 'div')[0];
wikEdTextareaContainer = wikEdWikiEditor;
}
 
// create inputbuttons wrapper for toolbar, containswikiEditor, theand wholewikEd fullscreenbutton contentbars
wikEdInputWrapperwikEd.buttonsWrapper = document.createElement('div');
wikEdInputWrapperwikEd.buttonsWrapper.id = 'wikEdInputWrapperwikEdButtonsWrapper';
wikEdInputWrapperwikEd.buttonsWrapper.className = inputWrapperClass'wikEdButtonsWrapper';
if (wikEd.wikiEditor !== null) {
wikEdTextareaContainer.parentNode.insertBefore(wikEdInputWrapper, wikEdTextareaContainer);
wikEd.wikiEditorBar.parentNode.insertBefore(wikEd.buttonsWrapper, wikEd.wikiEditorBar);
 
wikEd.buttonsWrapper.appendChild(wikEd.wikiEditorBar);
// create editor wrapper, contains toolbar, textarea, toc, but not the summary
if (wikEdWikiEditor != null) {
wikEdEditorWrapper = wikEdWikiEditor;
}
else {
wikEd.editorWrapper.appendChild(wikEd.buttonsWrapper);
wikEdEditorWrapper = document.createElement('div');
wikEdEditorWrapper.id = 'wikEdEditorWrapper';
wikEdEditorWrapper.className = 'wikEdEditorWrapper';
}
wikEdInputWrapper.appendChild(wikEdEditorWrapper);
 
// create toolbar wrapper
wikEdToolbarWrapperwikEd.toolbarWrapper = document.createElement('div');
wikEdToolbarWrapperwikEd.toolbarWrapper.id = 'wikEdToolbarWrapper';
wikEdToolbarWrapperwikEd.toolbarWrapper.className = 'wikEdToolbarWrapper';
wikEdEditorWrapperwikEd.buttonsWrapper.appendChild(wikEdToolbarWrapperwikEd.toolbarWrapper);
 
// createfill captchatoolbar wrapper
wikEd.toolbar = document.getElementById('toolbar');
var wikEdTextBoxTable;
if (wikEdRearrangewikEd.toolbar !== truenull) {
wikEd.toolbarWrapper.appendChild(wikEd.toolbar);
wikEdCaptchaWrapper = document.createElement('div');
}
wikEdCaptchaWrapper.id = 'wikEdCaptchaWrapper';
if (wikEd.wikiEditorBar !== null) {
wikEdCaptchaWrapper.className = 'wikEdCaptchaWrapper';
wikEdEditorWrapperwikEd.toolbarWrapper.appendChild(wikEdCaptchaWrapperwikEd.wikiEditorBar);
 
// fill captcha wrapper with elements between form and textarea (table)
wikEdTextBoxTable = document.getElementById('textBoxTable');
if ( (wikEdUploadEdit == false) && (wikEdWatchlistEdit == false) ) {
var node = wikEdEditForm.firstChild;
while (node != null) {
if ( (node == wikEdInputWrapper) || (node == wikEdWikiEditor) ) {
break;
}
var nextNode = node.nextSibling;
wikEdCaptchaWrapper.appendChild(node);
node = nextNode;
}
}
}
wikEd.buttonsWrapper.appendChild(wikEd.toolbarWrapper);
 
// create debug textarea wrapper
wikEdDebugWrapperwikEd.debugWrapper = document.createElement('div');
wikEdDebugWrapperwikEd.debugWrapper.id = 'wikEdDebugWrapper';
wikEdDebugWrapperwikEd.debugWrapper.className = 'wikEdDebugWrapper';
wikEdDebugWrapperwikEd.debugWrapper.style.visibilitydisplay = 'hiddennone';
wikEd.editorWrapper.insertBefore(wikEd.debugWrapper, wikEd.editorWrapper.firstChild);
wikEdEditorWrapper.appendChild(wikEdDebugWrapper);
 
// create edit wrapper for textarea and framecaptcha wrapper
if ( (wikEd.rearrange === true) && (wikEd.readOnly === false) ) {
wikEdEditWrapper = document.createElement('div');
wikEd.captchaWrapper = document.createElement('div');
wikEdEditWrapper.id = 'wikEdEditWrapper';
wikEd.captchaWrapper.id = 'wikEdCaptchaWrapper';
wikEdEditWrapper.className = 'wikEdEditWrapper';
wikEd.captchaWrapper.className = 'wikEdCaptchaWrapper';
wikEdEditorWrapper.appendChild(wikEdEditWrapper);
wikEd.editorWrapper.insertBefore(wikEd.captchaWrapper, wikEd.editorWrapper.firstChild);
 
// create textarea wrapper
wikEdTextareaWrapper = document.createElement('div');
wikEdTextareaWrapper.id = 'wikEdTextareaWrapper';
wikEdTextareaWrapper.className = 'wikEdTextareaWrapper';
wikEdTextareaWrapper.style.position = styleTextareaWrapperPosition;
wikEdTextareaWrapper.style.visibility = styleTextareaWrapperVisibility;
wikEdEditWrapper.appendChild(wikEdTextareaWrapper);
 
// create frame wrapper
wikEdFrameWrapper = document.createElement('div');
wikEdFrameWrapper.id = 'wikEdFrameWrapper';
wikEdFrameWrapper.className = 'wikEdFrameWrapper';
wikEdFrameWrapper.style.position = styleFrameWrapperPosition;
wikEdFrameWrapper.style.visibility = styleFrameWrapperVisibility;
wikEdEditWrapper.appendChild(wikEdFrameWrapper);
 
// create console wrapper for buttons, summary, and submit
if (wikEdRearrange == true) {
wikEdConsoleWrapper = document.createElement('div');
wikEdConsoleWrapper.id = 'wikEdConsoleWrapper';
wikEdConsoleWrapper.className = 'wikEdConsoleWrapper';
wikEdInputWrapper.appendChild(wikEdConsoleWrapper);
}
 
// create buttonseditor wrapper, forcontains wikEdtoolbar, buttonstextarea, toc, but not the summary
wikEd.editWrapper = document.createElement('div');
if (wikEdWikiEditor != null) {
wikEd.editWrapper.id = 'wikEdEditWrapper';
wikEdButtonsWrapper = wikEdWikiEditorTop;
wikEd.editWrapper.className = 'wikEdEditWrapper';
if (wikEd.wikiEditor !== null) {
wikEd.textarea.parentNode.appendChild(wikEd.editWrapper);
}
else {
wikEd.inputWrapper.appendChild(wikEd.editWrapper);
wikEdButtonsWrapper = document.createElement('div');
wikEdButtonsWrapper.id = 'wikEdButtonsWrapper';
wikEdButtonsWrapper.className = 'wikEdButtonsWrapper';
}
wikEdEditorWrapper.insertBefore(wikEdButtonsWrapper, wikEdEditWrapper);
 
// create summarytextarea wrapper for summary, minor edit, and watch this page
wikEd.textareaWrapper = document.createElement('div');
if (wikEdRearrange == true) {
wikEd.textareaWrapper.id = 'wikEdTextareaWrapper';
wikEdSummaryWrapper = document.createElement('div');
wikEd.textareaWrapper.className = 'wikEdTextareaWrapper';
wikEdSummaryWrapper.id = 'wikEdSummaryWrapper';
wikEd.textareaWrapper.style.position = styleTextareaWrapperPosition;
wikEd.textareaWrapper.style.visibility = styleTextareaWrapperVisibility;
wikEd.editWrapper.appendChild(wikEd.textareaWrapper);
 
// create frame wrapper
wikEd.frameWrapper = document.createElement('div');
wikEd.frameWrapper.id = 'wikEdFrameWrapper';
wikEd.frameWrapper.className = 'wikEdFrameWrapper';
wikEd.frameWrapper.style.position = styleFrameWrapperPosition;
wikEd.frameWrapper.style.visibility = styleFrameWrapperVisibility;
wikEd.textareaWrapper.parentNode.appendChild(wikEd.frameWrapper);
 
// create console wrapper for buttons, summary, and submit
if (wikEd.rearrange === true) {
wikEd.consoleWrapper = document.createElement('div');
wikEd.consoleWrapper.id = 'wikEdConsoleWrapper';
wikEd.consoleWrapper.className = 'wikEdConsoleWrapper';
wikEd.inputWrapper.appendChild(wikEd.consoleWrapper);
}
 
// create button bar wrapper
wikEd.buttonBarWrapper = document.createElement('div');
wikEd.buttonBarWrapper.id = 'wikEdButtonBarWrapper';
wikEd.buttonBarWrapper.className = 'wikEdButtonBarWrapper';
wikEd.buttonsWrapper.appendChild(wikEd.buttonBarWrapper);
 
// create summary wrapper for summary, minor edit, and watch this page
if (wikEd.rearrange === true) {
wikEd.summaryWrapper = document.createElement('div');
wikEd.summaryWrapper.id = 'wikEdSummaryWrapper';
wikEd.summaryWrapper.className = 'wikEdSummaryWrapper';
 
// add summary above the edit field if we add a new section (+ tab)
if (wikEdAddNewSectionwikEd.addNewSection === true) {
wikEd.consoleTopWrapper = document.createElement('div');
wikEdSummaryWrapper.className = 'wikEdSummaryWrapperTop';
wikEd.consoleTopWrapper.id = 'wikEdConsoleTopWrapper';
wikEdInputWrapper.insertBefore(wikEdSummaryWrapper, wikEdInputWrapper.firstChild);
wikEd.consoleTopWrapper.className = 'wikEdConsoleTopWrapper';
wikEd.consoleTopWrapper.appendChild(wikEd.summaryWrapper);
wikEd.inputWrapper.insertBefore(wikEd.consoleTopWrapper, wikEd.inputWrapper.firstChild);
}
else {
wikEd.consoleWrapper.appendChild(wikEd.summaryWrapper);
wikEdSummaryWrapper.className = 'wikEdSummaryWrapper';
wikEdConsoleWrapper.appendChild(wikEdSummaryWrapper);
}
 
// create summary input wrapper
wikEdSummaryInputWrapperwikEd.summaryInputWrapper = document.createElement('div');
wikEdSummaryInputWrapperwikEd.summaryInputWrapper.id = 'wikEdSummaryInputWrapper';
wikEdSummaryInputWrapperwikEd.summaryInputWrapper.className = 'wikEdSummaryInputWrapper';
wikEdSummaryWrapperwikEd.summaryWrapper.appendChild(wikEdSummaryInputWrapperwikEd.summaryInputWrapper);
 
// create minor edit and watch page wrapper
wikEdSummaryOptionswikEd.editOptionsWrapper = document.createElement('div');
wikEd.editOptionsWrapper.id = 'wikEdEditOptionsWrapper';
wikEdSummaryOptions.id = 'wikEdSummaryOptions';
wikEdSummaryOptionswikEd.editOptionsWrapper.className = 'wikEdSummaryOptionswikEdEditOptionsWrapper';
wikEdSummaryWrapper.appendChild(wikEdSummaryOptions);
 
// create submit wrapper for submit elements
wikEdSubmitWrapperwikEd.submitWrapper = document.createElement('div');
wikEdSubmitWrapperwikEd.submitWrapper.id = 'wikEdSubmitWrapper';
wikEdSubmitWrapperwikEd.submitWrapper.className = 'wikEdSubmitWrapper';
wikEdConsoleWrapperwikEd.consoleWrapper.appendChild(wikEdSubmitWrapperwikEd.submitWrapper);
 
// create submit buttons wrapper for submit buttons and help links
wikEdSubmitButtonsWrapperwikEd.submitButtonsWrapper = document.createElement('div');
wikEdSubmitButtonsWrapperwikEd.submitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper';
wikEdSubmitButtonsWrapperwikEd.submitButtonsWrapper.className = 'wikEdSubmitButtonsWrapper';
wikEdSubmitWrapper.appendChild(wikEdSubmitButtonsWrapper);
}
 
// create preview wrapper for preview and diff box
if (wikEd.enableLocalPreview !== false) {
wikEdLocalPrevWrapper = document.createElement('div');
wikEd.localPrevWrapper = document.createElement('div');
wikEdLocalPrevWrapper.id = 'wikEdLocalPrevWrapper';
wikEdLocalPrevWrapper wikEd.classNamelocalPrevWrapper.id = 'wikEdLocalPrevWrapper';
wikEd.localPrevWrapper.className = 'wikEdLocalPrevWrapper';
wikEdLocalPrevWrapper.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'none';
if (wikEdRearrange == true) {
if (wikEd.rearrange === true) {
wikEdInputWrapper.appendChild(wikEdLocalPrevWrapper);
wikEd.inputWrapper.appendChild(wikEd.localPrevWrapper);
}
}
else if (wikEdSaveButton != null) {
else if (wikEd.saveButton !== null) {
wikEdSaveButton.parentNode.appendChild(wikEdLocalPrevWrapper);
wikEd.saveButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
}
else if (wikEdPreviewButton != null) {
else if (wikEd.previewButton !== null) {
wikEdPreviewButton.parentNode.appendChild(wikEdLocalPrevWrapper);
wikEd.previewButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
}
else if (wikEdDiffPreviewButton != null) {
else if (wikEd.diffPreviewButton !== null) {
wikEdDiffPreviewButton.parentNode.appendChild(wikEdLocalPrevWrapper);
wikEd.diffPreviewButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
}
 
// create insert wrapper for insert special chars links
if (wikEdRearrange == true) {
wikEdInsertWrapper = document.createElement('div');
wikEdInsertWrapper.id = 'wikEdInsertWrapper';
wikEdInsertWrapper.className = 'wikEdInsertWrapper';
wikEdInputWrapper.appendChild(wikEdInsertWrapper);
}
 
// appendcreate inputinsert wrapper tofor documentinsert special chars links
if (wikEdRearrangewikEd.rearrange === true) {
wikEd.insertWrapper = document.createElement('div');
wikEdEditForm.insertBefore(wikEdInputWrapper, wikEdEditForm.firstChild);
wikEd.insertWrapper.id = 'wikEdInsertWrapper';
wikEd.insertWrapper.className = 'wikEdInsertWrapper';
wikEd.inputWrapper.appendChild(wikEd.insertWrapper);
}
 
// fill the wrappers
 
// create debug textarea and add to debug wrapper
wikEdDebugwikEd.debug = document.createElement('textarea');
wikEd.debug.id = 'wikEdDebugTextarea';
wikEdDebug.rows = 20;
wikEd.debug.className = 'wikEdDebugTextarea';
wikEdDebug.style.display = 'none';
wikEd.debug.rows = 20;
wikEdDebug.setAttribute('spellcheck', false);
wikEd.debug.setAttribute('spellcheck', false);
wikEdDebugWrapper.appendChild(wikEdDebug);
wikEd.debugWrapper.appendChild(wikEd.debug);
 
// display startup error messages
if (wikEdConfig['wikEd.config.debugStartUp'] !== '') {
WikEdDebugwikEd.Debug(wikEdConfig['wikEd.config.debugStartUp']);
}
 
// wikEdDiff enhanced ajax diff
if (typeof(wikEdDiffTable) wikEd.diffTable == 'object') {
if ( (wikEdDiffTablewikEd.diffTable !== null) && (wikEdDiffwikEd.diff === true) ) {
if (typeof(WikEdDiff)wikEd.Diff !== 'function'undefined) {
WikEdDiffwikEd.Diff();
}
}
}
 
// add toolbar tohide toolbar wrapper
if (wikEd.closeToolbar === true) {
wikEdToolbar = document.getElementById('toolbar');
wikEd.toolbarWrapper.style.display = 'none';
if (wikEdToolbar == null) {
wikEdToolbar = wikEdWikiEditorBar;
}
if (wikEdCloseToolbar == true) {
wikEdToolbarWrapper.style.display = 'none';
}
else {
wikEdToolbarWrapperwikEd.toolbarWrapper.style.display = 'block';
}
 
// call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none
if (wikEdToolbarwikEd.toolbar !== null) {
if (wikEdToolbarwikEd.toolbar.getElementsByTagName('IMG').length === 0) {
if (typeof(window.mwSetupToolbar) !== 'function'undefined) {
window.mwSetupToolbar();
WikEdRemoveEventListenerwindow.removeEventListener(window, 'load', window.mwSetupToolbar, false);
}
}
}
 
// dropdowns from toolbar should go over wikEd toolbar
if (wikEdWikiEditorBarwikEd.wikiEditorBar !== null) {
wikEdWikiEditorBarwikEd.wikiEditorBar.style.zIndex = '5';
}
 
// move editpage-copywarn out of summary wrapper
var wpSummary = document.getElementsByName('wpSummary');
// needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug)
if (wpSummary.length > 0) {
if (wikEd.rearrange === true) {
wikEdEditOptions = wpSummary[0].parentNode;
var copywarn = document.getElementById('editpage-copywarn');
wikEdEditOptions.className = 'wikEdEditOptions';
if (copywarn !== null) {
wikEd.inputWrapper.parentNode.insertBefore(copywarn, wikEd.inputWrapper.nextSibling);
copywarn.style.clear = 'both';
}
}
 
// add summarya elementslink to summarythe inputwikEd wrapperhelp page
var editHelp = document.getElementsByClassName('editHelp')[0];
if (wikEdRearrange == true) {
if (editHelp !== undefined) {
wikEdSummaryLabel = document.getElementById('wpSummaryLabel');
if (typeof wikEd.config.helpPageLink == 'string') {
if (wikEdSummaryLabel != null) {
wikEd.editHelp = document.createElement('span');
wikEdSummaryInputWrapper.appendChild(wikEdSummaryLabel);
wikEd.editHelp.id = 'wikEdEditHelp';
wikEd.editHelp.className = 'wikEdEditHelp';
wikEd.editHelp.innerHTML = wikEd.config.helpPageLink.replace(/\{wikEdHomeBaseUrl\}/g, wikEd.config.homeBaseUrl);
editHelp.parentNode.insertBefore(wikEd.editHelp, editHelp.nextSibling);
}
wikEdSummaryText = document.getElementsByName('wpSummary')[0];
wikEdSummaryInputWrapper.appendChild(wikEdSummaryText);
}
 
// add submit buttons to submit wrapper, leaving only checkboxes in editOptions
// move editpage-copywarn out of summary wrapper
if (wikEd.rearrange === true) {
// needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug)
var editButtons = document.getElementsByClassName('editButtons')[0];
if (wikEdRearrange == true) {
if (editButtons === undefined) {
var copywarn = document.getElementById('editpage-copywarn');
if (copywarnwikEd.saveButton !== null) {
 
wikEdInputWrapper.parentNode.insertBefore(copywarn, wikEdInputWrapper.nextSibling);
// edit watchlist, semantic forms
if (wikEd.editWatchlist === true) {
editButtons = wikEd.saveButton;
}
 
// semantic forms
else {
editButtons = wikEd.saveButton.parentNode;
}
}
else if (wikEd.previewButton !== null) {
 
// edit watchlist
if (wikEd.editWatchlist === true) {
editButtons = wikEd.previewButton;
}
else {
editButtons = wikEd.previewButton.parentNode;
}
}
else if (wikEd.diffPreviewButton !== null) {
editButtons = wikEd.diffPreviewButton.parentNode;
}
}
if ( (editButtons !== undefined) && (editButtons !== null) ) {
wikEd.submitButtonsWrapper.appendChild(editButtons);
}
}
 
// get edit checkboxes
// add submit buttons to submit wrapper
var editCheckboxes;
if (wikEdRearrange == true) {
if (wikEd.editForm !== null) {
var wpEditButtons = wikEdSaveButton.parentNode;
editCheckboxes = wikEd.editForm.getElementsByClassName('editCheckboxes')[0];
wikEdSubmitWrapper.insertBefore(wpEditButtons, wikEdSubmitButtonsWrapper);
}
 
// non-standard page (old, semantic forms...)
// move edit options after submit buttons; crashes Mozilla when appended after filling the iframe
if (wikEdRearrangeeditCheckboxes === trueundefined) {
var checkbox = document.getElementById('wpMinoredit');
if (wikEdDiffPreviewButton != null) {
if (checkbox === null) {
wikEdDiffPreviewButton.parentNode.insertBefore(wikEdEditOptions, wikEdDiffPreviewButton.nextSibling);
checkbox = document.getElementById('wpWatchthis');
}
var summary = document.getElementsByName('wpSummary')[0];
if ( (summary !== undefined) && (checkbox !== null) ) {
 
// get checkbox container, e.g. semantic forms <p>
// remove linebreak before minor edit checkbox
if ( (summary.nextSibling == checkbox.parentNode) || (summary.parentNode.nextSibling == checkbox.parentNode) ) {
var node = wikEdEditOptions.firstChild;
editCheckboxes = checkbox.parentNode;
while (node != null) {
editCheckboxes.className = 'wikEdEditCheckboxes';
if (node.tagName != null) {
}
if (node.tagName == 'BR') {
 
node.parentNode.removeChild(node);
// old MediaWiki versions: create edit options container
break;
else {
editCheckboxes = document.createElement('div');
editCheckboxes.id = 'wikEdEditCheckboxes';
editCheckboxes.className = 'wikEdEditCheckboxes';
if (summary.nextSibling == checkbox) {
var node = checkbox;
while (node !== null) {
var nextNode = node.nextSibling;
editCheckboxes.appendChild(node);
node = nextNode;
}
}
node = node.nextSibling;
}
}
}
 
// add textBoxTablesummary or textareaelements to editsummary input wrapper
if (wikEdTextBoxTablewikEd.rearrange !=== nulltrue) {
wikEd.summaryLabel = document.getElementById('wpSummaryLabel');
wikEdTextareaWrapper.appendChild(wikEdTextBoxTable);
if (wikEd.summaryLabel !== null) {
}
wikEd.summaryInputWrapper.appendChild(wikEd.summaryLabel);
else if (wikEdWikiEditor != null) {
}
wikEdTextareaWrapper.appendChild(wikEdWikiEditorBottom);
wikEd.summaryText = document.getElementsByName('wpSummary')[0] || null;
}
if (wikEd.summaryText !== null) {
else {
wikEdTextareaWrapper wikEd.summaryInputWrapper.appendChild(wikEdTextareawikEd.summaryText);
}
}
 
// add submit buttons, edit options, and edit help to submit wrapper
// set frame font family
if (wikEd.submitWrapper !== null) {
var classFrameBody;
if (wikEdHighlightSyntaxwikEd.submitButtonsWrapper !== truenull) {
wikEd.submitWrapper.appendChild(wikEd.submitButtonsWrapper);
if (wikEdRefHide == true) {
classFrameBody = 'wikEdFrameBodyNewbie';
}
if (wikEd.editOptionsWrapper !== null) {
else {
wikEd.submitWrapper.appendChild(wikEd.editOptionsWrapper);
classFrameBody = 'wikEdFrameBodySyntax';
if (editCheckboxes !== undefined) {
wikEd.editOptionsWrapper.appendChild(editCheckboxes);
 
// remove linebreak before minor edit checkbox
var node = editCheckboxes.firstChild;
while (node !== null) {
if (node.tagName !== null) {
if (node.tagName == 'BR') {
node.parentNode.removeChild(node);
break;
}
}
node = node.nextSibling;
}
}
}
}
else {
classFrameBody = 'wikEdFrameBodyPlain';
}
 
// add empty editOptions to wikEdConsoleWrapper
// add edit-frame to frame wrapper
if (wikEd.consoleWrapper !== null) {
// any DOM changes to a starting iframe in designmode may crash mozilla, including DOM move, display: none; and position: absolute;
var editOptions = document.getElementsByClassName('editOptions')[0];
 
if (editOptions !== undefined) {
// create the iframe
wikEd.consoleWrapper.appendChild(editOptions);
var html = '';
}
html += '<div id="wikEdFrameOuter" class="wikEdFrameOuter" style="' + styleFrameContainer + '">';
html += '<div id="wikEdFrameInner" class="wikEdFrameInner" style="' + styleFrameContainer + '">';
html += '<iframe id="wikEdFrame" class="wikEdFrame"></iframe>';
html += '</div>';
html += '</div>';
wikEdFrameWrapper.innerHTML = html;
 
// old Mozilla versions crash when designmode is turned on before the frame has loaded completely
// but onload workaround has problems starting with Firefox 3.6 (bug 542727)
var onloadWorkaround = false;
if ( (wikEdMozilla == true) && (
(wikEdBrowserFlavor == 'Firefox') && (wikEdBrowserVersion < 3.0) ||
(wikEdBrowserFlavor == 'Netscape') && (wikEdBrowserVersion < 9.0) ||
(wikEdBrowserFlavor == 'SeaMonkey') && (wikEdBrowserVersion < 2.0) ) ) {
onloadWorkaround = true;
}
 
// add textBoxTable or textarea to textarea wrapper
// fill the frame with content
wikEd.textBoxTable = document.getElementById('textBoxTable');
html = '';
if (wikEd.textBoxTable !== null) {
html += '<html id="wikEdFrameHtml" class="wikEdFrameHtml"><head></head>';
wikEd.textareaWrapper.appendChild(wikEd.textBoxTable);
html += '<body id="wikEdFrameBody" class="' + classFrameBody + '" style="' + styleFrameBody + '"';
 
// disable spellchecker in iframe
if (wikEdNoSpellcheck == true) {
html += ' spellcheck="false"';
}
else {
if (wikEdReadOnly == false) {
wikEd.textareaWrapper.appendChild(wikEd.textarea);
html += ' onload="var doc = window.document; doc.designMode = \'on\'; ';
}
html += 'try { doc.execCommand(\'styleWithCSS\', 0, false); } catch (e) { ';
html += 'try { doc.execCommand(\'useCSS\', 0, true); } catch (e) { ';
html += 'try { doc.execCommand(\'styleWithCSS\', false, false); } catch (e) { } } }"';
html += '></body></html>';
 
// fill captcha wrapper with elements between form and textarea (table)
wikEdFrameOuter = document.getElementById('wikEdFrameOuter');
if (wikEd.captchaWrapper !== null) {
wikEdFrameInner = document.getElementById('wikEdFrameInner');
if ( (wikEd.editUpload === false) && (wikEd.editWatchlist === false) ) {
wikEdFrame = document.getElementById('wikEdFrame');
var node = wikEd.editForm.firstChild;
wikEdFrameWindow = wikEdFrame.contentWindow;
while (node !== null) {
wikEdFrameDocument = wikEdFrameWindow.document;
if ( (node == wikEd.inputWrapper) || (node == wikEd.wikiEditor) || (node == wikEd.captchaWrapper) ) {
 
break;
// set frame width, border divs shrink around
wikEdFrameBorderHeight = parseInt(WikEdGetStyle(wikEdFrameOuter, 'borderTopWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameOuter, 'borderBottomWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameInner, 'borderTopWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameInner, 'borderBottomWidth'), 10);
wikEdFrameBorderWidth = parseInt(WikEdGetStyle(wikEdFrameOuter, 'borderLeftWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameOuter, 'borderRightWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameInner, 'borderLeftWidth'), 10) + parseInt(WikEdGetStyle(wikEdFrameInner, 'borderRightWidth'), 10);
 
wikEdFrameHeight = (wikEdTextareaOffsetHeightInitial - wikEdFrameBorderHeight) + 'px';
wikEdFrameWidth = (wikEdEditorWrapper.clientWidth - wikEdFrameBorderWidth) + 'px';
wikEdFrame.style.height = wikEdFrameHeight;
wikEdFrame.style.width = wikEdFrameWidth;
 
// do not remember sie if started in fullscreen mode
if (wikEdFullScreenMode == true) {
wikEdFrameHeight = 0;
wikEdFrameWidth = 0;
}
 
// turn on designmode before adding content
if ( (onloadWorkaround == false) && (wikEdReadOnly == false) ) {
wikEdFrameDocument.designMode = 'on';
try { wikEdFrameDocument.execCommand('styleWithCSS', 0, false); } catch (e) {
try { wikEdFrameDocument.execCommand('useCSS', 0, true); } catch (e) {
try { wikEdFrameDocument.execCommand('styleWithCSS', false, false); } catch (e) {
}
var nextNode = node.nextSibling;
if (node.tagName != 'INPUT') {
wikEd.captchaWrapper.appendChild(node);
}
node = nextNode;
}
}
}
 
// create editing frame wrapper
// MS-IE needs styling for full width frame
wikEd.frameOuter = document.createElement('div');
if (wikEdMSIE == true) {
wikEd.frameOuter.id = 'wikEdFrameOuter';
////// wikEdFrame.style.width = wikEdTextareaWidth + 'px';// 100%
wikEd.frameOuter.className = 'wikEdFrameOuter';
wikEd.frameWrapper.appendChild(wikEd.frameOuter);
 
wikEd.frameInner = document.createElement('div');
wikEd.frameInner.id = 'wikEdFrameInner';
wikEd.frameInner.className = 'wikEdFrameInner';
wikEd.frameOuter.appendChild(wikEd.frameInner);
 
// remove frame border if textarea has none
if (wikEd.textareaBorderHeight === 0) {
wikEd.frameInner.style.borderWidth = '0';
wikEd.frameOuter.style.borderWidth = '0';
}
 
// create editing frame and initialize after iframe loading
// fill iframe with content
wikEd.frame = document.createElement('iframe');
wikEdFrameDocument.open();
wikEd.frame.addEventListener('load', wikEd.FrameLoadHandler, false);
wikEdFrameDocument.write(html);
wikEd.frame.id = 'wikEdFrame';
wikEdFrameDocument.close();
wikEd.frame.className = 'wikEdFrame';
wikEdFrameBody = wikEdFrameDocument.body;
wikEd.frameInner.appendChild(wikEd.frame);
 
// set frame height and width, border divs shrink around
wikEd.frameBorderHeight = parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderBottomWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderBottomWidth'), 10);
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
 
wikEd.frameBorderWidth = parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderRightWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderRightWidth'), 10);
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.width = wikEd.frameWidth;
 
// generate button bars and add them to the buttons wrapper
// form wrapper has been added against summary input submit defaulting to this button
if (wikEdReadOnlywikEd.readOnly === false) {
wikEdButtonBarFormatwikEd.buttonBarFormat = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.format']);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarFormatwikEd.buttonBarFormat);
 
wikEdButtonBarTextifywikEd.buttonBarTextify = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.textify']);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarTextifywikEd.buttonBarTextify);
}
 
wikEdButtonBarControlwikEd.buttonBarControl = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.control']);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarControlwikEd.buttonBarControl);
 
if (wikEdConfig['wikEd.config.buttonBar']['.custom1'][6].length > 0) {
wikEdButtonBarCustom1wikEd.buttonBarCustom1 = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.custom1']);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarCustom1wikEd.buttonBarCustom1);
}
 
wikEdButtonBarFindwikEd.buttonBarFind = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.find']);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarFindwikEd.buttonBarFind);
 
// inactivate replace buttons for read-only pages
if (wikEdReadOnly == false) {
if (wikEd.readOnly === true) {
wikEdButtonBarFix = MakeButtonBar(wikEdConfig['buttonBar']['fix']);
document.getElementById('wikEdReplaceAll').className = 'wikEdButtonInactive';
wikEdButtonsWrapper.appendChild(wikEdButtonBarFix);
document.getElementById('wikEdReplacePrev').className = 'wikEdButtonInactive';
document.getElementById('wikEdReplaceNext').className = 'wikEdButtonInactive';
}
 
if (wikEd.readOnly === false) {
if (wikEdConfig['buttonBar']['custom2'][6].length > 0) {
wikEdButtonBarCustom2wikEd.buttonBarFix = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['custom2'].fix);
wikEdButtonsWrapperwikEd.buttonBarWrapper.appendChild(wikEdButtonBarCustom2wikEd.buttonBarFix);
}
 
if (wikEd.config.buttonBar.custom2[6].length > 0) {
wikEd.buttonBarCustom2 = wikEd.MakeButtonBar(wikEd.config.buttonBar.custom2);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarCustom2);
}
 
var br = document.createElement('br');
br.style.clear = 'both';
wikEdButtonsWrapperwikEd.buttonsWrapper.appendChild(br);
wikEd.caseSensitive = document.getElementById('wikEdCaseSensitive');
wikEd.regExp = document.getElementById('wikEdRegExp');
wikEd.findAhead = document.getElementById('wikEdFindAhead');
wikEd.findText = document.getElementById('wikEdFindText');
wikEd.replaceText = document.getElementById('wikEdReplaceText');
 
// add preview box top bar to submit wrapper
wikEdCaseSensitive = document.getElementById('wikEdCaseSensitive');
wikEd.buttonBarPreview = wikEd.MakeButtonBar(wikEd.config.buttonBar.preview);
wikEdRegExp = document.getElementById('wikEdRegExp');
if ( (wikEd.rearrange === true) && (wikEd.submitWrapper !== null) ) {
wikEdFindAhead = document.getElementById('wikEdFindAhead');
if ( (wikEd.fullScreenMode === true) && (wikEd.editArticle === true) && (wikEd.useWikEd === true) ) {
wikEdFindText = document.getElementById('wikEdFindText');
wikEd.buttonBarPreview.style.display = 'none';
wikEdReplaceText = document.getElementById('wikEdReplaceText');
}
 
wikEd.submitWrapper.appendChild(wikEd.buttonBarPreview);
// add preview box top bar to submit wrapper
wikEdButtonBarPreview = MakeButtonBar(wikEdConfig['buttonBar']['preview']);
if (wikEdRearrange == true) {
wikEdSubmitWrapper.insertBefore(wikEdButtonBarPreview, wikEdSubmitWrapper.firstChild);
}
 
// add previewpasted box and its bottombutton bar to previewframe wrapper
wikEd.buttonBarPasted = wikEd.MakeButtonBar(wikEd.config.buttonBar.pasted);
if (wikEdLocalPrevWrapper != null) {
wikEd.buttonBarPasted.style.visibility = 'hidden';
var div = document.createElement('div');
wikEd.frameInner.insertBefore(wikEd.buttonBarPasted, wikEd.frameInner.firstChild);
div.id = 'wikEdPreviewBoxOuter';
 
div.className = 'wikEdPreviewBoxOuter';
// add article and diff preview containers and their bottom bar to preview wrapper
wikEdLocalPrevWrapper.appendChild(div);
if (wikEd.localPrevWrapper !== null) {
 
// article preview
wikEd.previewArticle = document.createElement('div');
wikEd.previewArticle.id = 'wikEdPreviewArticle';
wikEd.previewArticle.className = 'wikEdPreviewArticle';
wikEd.previewArticle.display = 'none';
wikEd.localPrevWrapper.appendChild(wikEd.previewArticle);
 
// diff preview
wikEd.previewDiff = document.createElement('div');
wikEd.previewDiff.id = 'wikEdPreviewDiff';
wikEd.previewDiff.className = 'wikEdPreviewDiff';
wikEd.previewDiff.display = 'none';
wikEd.localPrevWrapper.appendChild(wikEd.previewDiff);
 
// add preview container bottom bar to preview wrapper
wikEdPreviewBox = document.createElement('div');
wikEd.buttonBarPreview2 = wikEd.MakeButtonBar(wikEd.config.buttonBar.preview2);
wikEdPreviewBox.id = 'wikEdPreviewBox';
wikEd.localPrevWrapper.appendChild(wikEd.buttonBarPreview2);
wikEdPreviewBox.className = 'wikEdPreviewBox';
div.appendChild(wikEdPreviewBox);
wikEdButtonBarPreview2 = MakeButtonBar(wikEdConfig['buttonBar']['preview2']);
wikEdLocalPrevWrapper.appendChild(wikEdButtonBarPreview2);
}
 
// add jump box to standard preview
var wikEd.wikiPreview = document.getElementById('wikiPreview');
if (wikEd.wikiPreview !== null) {
if (wikEd.wikiPreview.firstChild !== null) {
wikEdButtonBarJumpwikEd.buttonBarJump = wikEd.MakeButtonBar(wikEdConfig['wikEd.config.buttonBar']['.jump']);
wikEd.wikiPreview.insertBefore(wikEdButtonBarJumpwikEd.buttonBarJump, wikEd.wikiPreview.firstChild);
}
}
 
// add insert special chars to insert wrapper
if (wikEdInsertWrapperwikEd.insertWrapper !== null) {
var wpSpecialcharsinsert = document.getElementById('editpagemw-specialcharsedittools-charinsert');
if (wpSpecialcharsinsert !=== null) {
insert = document.getElementById('editpage-specialchars');
wikEdInsertWrapper.appendChild(wpSpecialchars);
}
if (insert !== null) {
wikEd.insertWrapper.appendChild(insert);
}
}
 
// wrappers filled
 
// add local preview button next to submit button
if (wikEd.enableLocalPreview !== false) {
wikEdLocalPreview = document.createElement('button');
var previewSpan = document.createElement('span');
wikEdLocalPreview.id = 'wikEdLocalPreview';
previewSpan.innerHTML = wikEd.MakeButtonCode(82, 'button');
wikEdLocalPreview.title = wikEdConfig['text']['wikEdLocalPreview title'];
if (wikEd.previewButton !== null) {
wikEdLocalPreview.className = 'wikEdLocalPreview';
wikEd.previewButton.parentNode.insertBefore(previewSpan, wikEd.previewButton.nextSibling);
}
else if (wikEd.saveButton !== null) {
wikEd.saveButton.parentNode.insertBefore(previewSpan, wikEd.saveButton.nextSibling);
}
else {
wikEd.submitWrapper.insertBefore(previewSpan, wikEd.submitWrapper.firstChild);
}
 
// add local diff button next to submit button
var localPreviewImg = document.createElement('img');
if ( ( (wikEd.diffPreviewButton !== null) || (wikEd.editWatchlist === true) ) && (wikEd.readOnly === false) ) {
localPreviewImg.id = 'wikEdLocalPreviewImg';
var diffSpan = document.createElement('span');
localPreviewImg.src = wikEdConfig['image']['preview'];
diffSpan.innerHTML = wikEd.MakeButtonCode(83, 'button');
localPreviewImg.alt = wikEdConfig['text']['wikEdLocalPreviewImg alt'];
if (wikEd.diffPreviewButton !== null) {
localPreviewImg.title = wikEdConfig['text']['wikEdLocalPreview title'];
wikEd.diffPreviewButton.parentNode.insertBefore(diffSpan, wikEd.diffPreviewButton.nextSibling);
wikEdLocalPreview.appendChild(localPreviewImg);
}
 
else if (wikEdPreviewButtonpreviewSpan !== null) {
wikEdPreviewButton previewSpan.parentNode.insertBefore(wikEdLocalPreviewdiffSpan, wikEdPreviewButtonpreviewSpan.nextSibling);
}
else if (wikEdSaveButtonwikEd.previewButton !== null) {
wikEdSaveButton wikEd.previewButton.parentNode.insertBefore(wikEdLocalPreviewdiffSpan, wikEdSaveButtonwikEd.previewButton.nextSibling);
}
}
}
 
// correct tab order between check boxes and submits
// add local diff button next to submit button
wikEd.frame.tabIndex = wikEd.textarea.tabIndex;
if (wikEdDiffPreviewButton != null) {
wikEdLocalDiff = document.createElement('button');
wikEdLocalDiff.id = 'wikEdLocalDiff';
wikEdLocalDiff.title = wikEdConfig['text']['wikEdLocalDiff title'];
wikEdLocalDiff.className = 'wikEdLocalDiff';
 
// initialize image buttons
var localDiffImg = document.createElement('img');
wikEd.Button(document.getElementById('wikEdRefHide'), 'wikEdRefHide', null, wikEd.refHide);
localDiffImg.id = 'wikEdLocalDiffImg';
wikEd.Button(document.getElementById('wikEdHighlightSyntax'), 'wikEdHighlightSyntax', null, wikEd.highlightSyntax);
localDiffImg.src = wikEdConfig['image']['diff'];
wikEd.Button(document.getElementById('wikEdUseWikEd'), 'wikEdUseWikEd', null, wikEd.useWikEd);
localDiffImg.alt = wikEdConfig['text']['wikEdLocalDiffImg alt'];
wikEd.Button(document.getElementById('wikEdCloseToolbar'), 'wikEdCloseToolbar', null, wikEd.closeToolbar);
localDiffImg.title = wikEdConfig['text']['wikEdLocalDiff title'];
wikEd.Button(document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, wikEd.fullScreenMode);
wikEd.Button(document.getElementById('wikEdUsing'), 'wikEdUsing', null, wikEd.using);
wikEd.Button(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, false);
wikEd.Button(document.getElementById('wikEdRegExp'), 'wikEdRegExp', null, false);
wikEd.Button(document.getElementById('wikEdFindAhead'), 'wikEdFindAhead', null, wikEd.config.findAheadSelected);
wikEd.Button(document.getElementById('wikEdClose'), 'wikEdClose', null, false, 'wikEdButton');
wikEd.Button(document.getElementById('wikEdClose2'), 'wikEdClose2', null, false, 'wikEdButton');
wikEd.Button(document.getElementById('wikEdTableMode'), 'wikEdTableMode', null, wikEd.tableMode);
 
// grey out fullscreen button
wikEdLocalDiff.appendChild(localDiffImg);
if ( (wikEd.editArticle === false) || (wikEd.useWikEd === false) ) {
wikEdDiffPreviewButton.parentNode.insertBefore(wikEdLocalDiff, wikEdDiffPreviewButton.nextSibling);
document.getElementById('wikEdFullScreen').className = 'wikEdButtonInactive';
}
 
// grey out close toolbar button
// correct tab order between check boxes and submits
if (wikEd.rearrange === false) {
wikEdFrame.tabIndex = wikEdTextarea.tabIndex;
document.getElementById('wikEdCloseToolbar').className = 'wikEdButtonInactive';
 
// initialize image buttons
WikEdButton(document.getElementById('wikEdDiff'), 'wikEdDiff', null, wikEdDiff);
WikEdButton(document.getElementById('wikEdRefHide'), 'wikEdRefHide', null, wikEdRefHide);
WikEdButton(document.getElementById('wikEdHighlightSyntax'), 'wikEdHighlightSyntax', null, wikEdHighlightSyntax);
WikEdButton(document.getElementById('wikEdUseWikEd'), 'wikEdUseWikEd', null, wikEdUseWikEd);
WikEdButton(document.getElementById('wikEdCloseToolbar'), 'wikEdCloseToolbar', null, wikEdCloseToolbar);
WikEdButton(document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, wikEdFullScreenMode);
WikEdButton(document.getElementById('wikEdUsing'), 'wikEdUsing', null, wikEdUsing);
WikEdButton(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, false);
WikEdButton(document.getElementById('wikEdRegExp'), 'wikEdRegExp', null, false);
WikEdButton(document.getElementById('wikEdFindAhead'), 'wikEdFindAhead', null, wikEdConfig['findAheadSelected']);
WikEdButton(document.getElementById('wikEdClose'), 'wikEdClose', null, false, 'wikEdButton');
WikEdButton(document.getElementById('wikEdClose2'), 'wikEdClose2', null, false, 'wikEdButton');
WikEdButton(document.getElementById('wikEdTableMode'), 'wikEdTableMode', null, wikEdTableMode);
 
// hide typo fix button until typo fix rules are loaded and parsed
var fixRegExTypo = document.getElementById('wikEdFixRegExTypo');
if (fixRegExTypo != null) {
fixRegExTypo.style.display = 'none';
}
 
// hide typo fix button until typo fix rules are loaded and parsed
// hide buttons if API is not available
wikEd.fixRegExTypo = document.getElementById('wikEdFixRegExTypo');
if ( (wikEdWikiGlobals['wgEnableAPI'] != true) && (wikEdWikiGlobals['wgEnableAPI'] != 'true') ) {
if (wikEd.fixRegExTypo !== null) {
var fixRedirect = document.getElementById('wikEdFixRedirect');
wikEd.fixRegExTypo.style.display = 'none';
if (fixRedirect != null) {
fixRedirect.style.display = 'none';
}
}
 
// add a clear summary button left to the summary input field
if (wikEdSummaryTextwikEd.summaryText !== null) {
var clearSummaryForm = document.createElement('form');
clearSummaryForm.id = 'wikEdClearSummaryForm';
clearSummaryForm.className = 'wikEdClearSummaryForm';
wikEdSummaryTextwikEd.summaryText.parentNode.insertBefore(clearSummaryForm, wikEdSummaryTextwikEd.summaryText);
 
wikEdClearSummarywikEd.clearSummary = document.createElement('button');
wikEdClearSummarywikEd.clearSummary.id = 'wikEdClearSummary';
wikEdClearSummarywikEd.clearSummary.className = 'wikEdClearSummary';
wikEdClearSummarywikEd.clearSummary.alt = wikEdConfig['wikEd.config.text']['wikEdClearSummary alt'];
wikEdClearSummarywikEd.clearSummary.title = wikEdConfig['wikEd.config.text']['wikEdClearSummary title'];
clearSummaryForm.appendChild(wikEd.clearSummary);
wikEdClearSummary.style.height = (wikEdSummaryText.clientHeight + 1) +'px';
clearSummaryForm.appendChild(wikEdClearSummary);
 
wikEdClearSummaryImgwikEd.clearSummaryImg = document.createElement('img');
wikEdClearSummaryImgwikEd.clearSummaryImg.id = 'wikEdClearSummaryImg';
wikEdClearSummaryImgwikEd.clearSummaryImg.src = wikEdConfig['wikEd.config.image']['clearSummary'];
wikEdClearSummaryImgwikEd.clearSummaryImg.alt = 'Clear summary';
wikEdClearSummarywikEd.clearSummary.appendChild(wikEdClearSummaryImgwikEd.clearSummaryImg);
 
// remember button width, might be without image
wikEdClearSummaryWidthwikEd.clearSummaryWidth = wikEdClearSummarywikEd.clearSummary.offsetWidth;
 
// make the summary a combo box
var summaryComboInput = document.createElement('span');
summaryComboInput.id = 'wikEdSummaryComboInput';
summaryComboInput.className = 'wikEdSummaryComboInput';
summaryComboInput = wikEdSummaryTextwikEd.summaryText.parentNode.insertBefore(summaryComboInput, wikEdSummaryTextwikEd.summaryText);
 
wikEdSummaryTextwikEd.summaryText = wikEdSummaryTextwikEd.summaryText.parentNode.removeChild(wikEdSummaryTextwikEd.summaryText);
wikEdSummaryTextwikEd.summaryText.className = 'wikEdSummaryText';
wikEdSummaryTextWidthwikEd.summaryTextWidth = wikEdSummaryWrapperwikEd.summaryWrapper.offsetWidth - wikEdSummaryInputWrapperwikEd.summaryInputWrapper.offsetWidth;
if (wikEdSummaryTextWidthwikEd.summaryTextWidth < 150) {
wikEdSummaryTextWidthwikEd.summaryTextWidth = 150;
}
wikEdSummaryTextwikEd.summaryText.style.width = wikEdSummaryTextWidthwikEd.summaryTextWidth + 'px';
 
wikEdSummarySelectwikEd.summarySelect = document.createElement('select');
wikEdSummarySelectwikEd.summarySelect.id = 'wikEdSummarySelect';
wikEdSummarySelectwikEd.summarySelect.className = 'wikEdSummarySelect';
 
summaryComboInput.appendChild(wikEdSummaryTextwikEd.summaryText);
summaryComboInput.appendChild(wikEdSummarySelectwikEd.summarySelect);
 
// repair summary combo css (e.g. Wikisource MediaWiki:Common.css/Tweaks.css)
wikEd.summaryText.style.setProperty('position', 'absolute', 'important');
}
 
// shorten submit button texts
if (wikEdPreviewButtonwikEd.previewButton !== null) {
wikEdPreviewButtonwikEd.previewButton.value = wikEdConfig['wikEd.config.text']['.shortenedPreview'];
}
if (wikEdDiffPreviewButtonwikEd.diffPreviewButton !== null) {
wikEdDiffPreviewButtonwikEd.diffPreviewButton.value = wikEdConfig['wikEd.config.text']['.shortenedChanges'];
}
 
// set up combo input boxes with history
wikEdFieldHistwikEd.fieldHist ['find'] = [];
wikEdSavedName['wikEd.savedName.find'] = 'wikEdFindHistory';
wikEdInputElement['wikEd.inputElement.find'] = new Object(wikEdFindTextwikEd.findText);
wikEdSelectElement['wikEd.selectElement.find'] = new Object(document.getElementById('wikEdFindSelect'));
wikEdSelectElement['wikEd.selectElement.find'].title = wikEdConfig['wikEd.config.text']['wikEdFindSelect title'];
 
wikEdFieldHistwikEd.fieldHist ['replace'] = [];
wikEdSavedName['wikEd.savedName.replace'] = 'wikEdReplaceHistory';
wikEdInputElement['wikEd.inputElement.replace'] = new Object(wikEdReplaceTextwikEd.replaceText);
wikEdSelectElement['wikEd.selectElement.replace'] = new Object(document.getElementById('wikEdReplaceSelect'));
wikEdSelectElement['wikEd.selectElement.replace'].title = wikEdConfig['wikEd.config.text']['wikEdReplaceSelect title'];
 
if (wikEdSummaryInputWrapperwikEd.summaryInputWrapper !== null) {
wikEdFieldHistwikEd.fieldHist ['summary'] = [];
wikEdSavedName['wikEd.savedName.summary'] = 'wikEdSummaryHistory';
wikEdInputElement['wikEd.inputElement.summary'] = new Object(wikEdSummaryTextwikEd.summaryText);
wikEdSelectElement['wikEd.selectElement.summary'] = new Object(document.getElementById('wikEdSummarySelect'));
wikEdSelectElement['wikEd.selectElement.summary'].title = wikEdConfig['wikEd.config.text']['wikEdSummarySelect title'];
}
 
// adjust the select field widths to that of the text input fields
WikEdResizeComboInputwikEd.ResizeComboInput('find');
WikEdResizeComboInputwikEd.ResizeComboInput('replace');
if (wikEd.summaryText !== null) {
WikEdResizeComboInput('summary');
wikEd.ResizeComboInput('summary');
}
 
// hide the button bars per saved setting
if (wikEdButtonBarFormatwikEd.buttonBarFormat !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFormat);
WikEdButtonBarInit(wikEdButtonBarFormat);
}
if (wikEdButtonBarTextifywikEd.buttonBarTextify !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarTextify);
WikEdButtonBarInit(wikEdButtonBarTextify);
}
if (wikEdButtonBarControlwikEd.buttonBarControl !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarControl);
WikEdButtonBarInit(wikEdButtonBarControl);
}
if (wikEdButtonBarCustom1wikEd.buttonBarCustom1 !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarCustom1);
WikEdButtonBarInit(wikEdButtonBarCustom1);
}
if (wikEdButtonBarFindwikEd.buttonBarFind !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFind);
WikEdButtonBarInit(wikEdButtonBarFind);
}
if (wikEdButtonBarFixwikEd.buttonBarFix !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFix);
WikEdButtonBarInit(wikEdButtonBarFix);
}
if (wikEdButtonBarCustom2wikEd.buttonBarCustom2 !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarCustom2);
WikEdButtonBarInit(wikEdButtonBarCustom2);
}
 
// copy page warnings above edit window
// display only the textarea or the iframe, dont change the frame
if ( (wikEd.config.doCloneWarnings === true) && (wikEd.editForm !== null) ) {
WikEdSetEditArea(wikEdUseWikEd, true);
if ( (wikEd.clonedWarnings === false) && (wikEd.previewPage === false) && (/(.*\n){2}/.test(wikEd.origVersion) ) === true) {
 
// add a link to the wikEd help page
if (wikEdRearrange == true) {
if ( (wikEdConfig['helpPageLink'] != '') && (wikEdConfig['helpPageLink'] != null) ) {
var editHelpParent = wikEdDiffPreviewButton;
while (editHelpParent != null) {
if (editHelpParent.tagName == 'SPAN') {
break;
}
editHelpParent = editHelpParent.nextSibling;
}
 
if (editHelpParent != null) {
var editHelp = editHelpParent.lastChild;
while (editHelp != null) {
if (editHelp.tagName == 'A') {
break;
}
editHelp = editHelp.previousSibling;
}
 
if (editHelp != null) {
var wikEdHelpSpan = document.createElement('span');
wikEdHelpSpan.id = 'wikEdHelpSpan';
wikEdHelpSpan.className = 'wikEdHelpSpan';
wikEdHelpSpan.innerHTML = wikEdConfig['helpPageLink'].replace(/\{wikEdHomeBaseUrl\}/g, wikEdConfig['homeBaseUrl']);
editHelpParent.insertBefore(wikEdHelpSpan, editHelp.nextSibling);
 
wikEdEditHelp = wikEdHelpSpan.parentNode;
wikEdEditHelp.id = 'wikEdEditHelp';
wikEdEditHelp.className = 'wikEdEditHelp';
}
}
}
}
 
// copy page warnings above edit window
if (wikEdConfig['doCloneWarnings'] == true) {
if ( (wikEdClonedWarnings == false) && (wikEdPreviewPage == false) && (/(.*\n){2}/.test(wikEdOrigVersion) ) == true) {
var divs = document.getElementsByTagName('div');
var divWarnings = [];
Line 3,197 ⟶ 3,613:
for (var i = 0; i < divs.length; i ++) {
var div = divs[i];
if (/editnotice/.test(div.id) === true) {
if (editnoticeArea === false) {
divWarnings.push(div);
editnoticeArea = true;;
}
}
else if (/mw-.*?warning/.test(div.className) === true) {
divWarnings.push(div);
}
}
 
for (var i = 0; i < divWarnings.length; i ++) {
// create clone wrapper
var clone = divWarnings[i].cloneNode(true);
if (divWarnings.length > 0) {
wikEdEditForm.insertBefore(clone, wikEdEditForm.firstChild);
var cloneWrapper = document.createElement('div');
cloneWrapper.id = 'wikEdClonedWarnings';
var cloneNote = document.createElement('div');
cloneNote.id = 'wikEdClonedWarningsNote';
cloneNote.innerHTML = wikEd.config.text['clonedWarningsNote'];
cloneWrapper.appendChild(cloneNote);
for (var i = 0; i < divWarnings.length; i ++) {
var clone = divWarnings[i].cloneNode(true);
 
// ignore redlink-only edit warnings
var html = clone.innerHTML;
html = html.replace(/<a\b[^>].*?\bclass="new"[^>]*>(.|\n)*?<\/a>/g, '');
html = html.replace(/<(.|\n)*?>/g, '');
html = html.replace(/\s*/g, '');
if (html === '') {
continue;
}
 
cloneWrapper.appendChild(clone);
wikEd.clonedWarnings = true;
}
if (wikEd.clonedWarnings === true) {
wikEd.inputWrapper.parentNode.insertBefore(cloneWrapper, wikEd.inputWrapper);
}
}
wikEdClonedWarnings = true;
}
}
 
// init and resize frame after buttons and summary are in place, wait until iframe has been loaded
// add frame stylesheet definition
if (wikEd.frameLoaded === false) {
wikEdDirection = WikEdGetStyle(document.body, 'direction');
wikEd.frame.addEventListener('load', wikEd.InitializeFrame, false);
wikEdFrameBody.style.direction = wikEdDirection;
WikEdApplyCSS(wikEdFrameDocument, wikEdConfig['frameCSS']);
WikEdHighlightNamedHideButtonsStylesheet = new WikEdStyleSheet(wikEdFrameDocument);
 
// copy textarea background
if (WikEdGetStyle(wikEdTextarea, 'display') != 'none') {
wikEdFrameInner.style.backgroundColor = WikEdGetStyle(wikEdTextarea, 'backgroundColor');
}
else {
 
wikEd.InitializeFrame();
// adjust font size (px)
wikEdTextSizeInit = parseFloat(WikEdGetStyle(wikEdTextarea, 'fontSize')) * wikEdConfig['textSizeAdjust'] / 100;
wikEdTextSize = wikEdTextSizeInit;
wikEdFrameBody.style.fontSize = wikEdTextSize + 'px';
 
// copy the textarea content to the iframe
if (wikEdUseWikEd == true) {
WikEdUpdateFrame();
}
 
// scroll to edit window and focus if not preview page or Semantic Form
// initialize IERange DOM range compatibility library
if ( (scrollToEditFocus === true) && (wikEd.previewPage === false) && (wikEd.editSemanticForm === false) ) {
if (typeof(IERange) == 'function') {
IERange(wikEdFrameWindow, wikEdFrameDocument);
}
 
// focus the input field
// scroll to edit window and focus if it is not a preview page
if ( (scrollToEditFocuswikEd.config.focusEdit === true) && (wikEdPreviewPagewikEd.useWikEd === false) ) {
wikEd.textarea.setSelectionRange(0, 0);
 
wikEd.textarea.focus();
// focus the input field
if (wikEdConfig['focusEdit'] == true) {
if (wikEdUseWikEd == true) {
wikEdFrameWindow.focus();
}
else {
if (wikEdMSIE == true) {
wikEdTextarea.selection.empty();
}
else {
wikEdTextarea.setSelectionRange(0, 0);
}
wikEdTextarea.focus();
}
}
 
// scroll
if ( (wikEdFullScreenModewikEd.fullScreenMode === false) && (wikEdConfig['wikEd.config.scrollToEdit'] === true) ) {
window.scroll(0, WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdEditFormwikEd.inputWrapper) - 2);
}
}
 
// register edit button click events
for (var buttonId in wikEdEditButtonHandlerwikEd.editButtonHandler) {
if (wikEdEditButtonHandlerObject.prototype.hasOwnProperty.call(wikEd.editButtonHandler, buttonId) === true) {
var buttonObj = document.getElementById(buttonId);
if (buttonObj !== null) {
WikEdAddEventListenerbuttonObj.addEventListener(buttonObj, 'click', WikEdEditButtonHandlerwikEd.EditButtonHandler, true);
}
}
}
 
// register summary shrinking event after loading the 'Clear summary' image handler
if (wikEd.clearSummaryImg !== null) {
WikEdAddEventListener(wikEdClearSummaryImg, 'load', WikEdShrinkSummaryHandler, true);
wikEd.clearSummaryImg.addEventListener('load', wikEd.ShrinkSummaryHandler, true);
}
 
// register summary resize event for window resizing (MS IE bug: fires once always)
WikEdAddEventListenerwindow.addEventListener(window, 'resize', WikEdResizeWindowHandlerwikEd.ResizeWindowHandler, true);
 
// register framedocument events
WikEdAddEventListenerdocument.addEventListener(wikEdFrameDocument, 'keydown', WikEdKeyFrameHandlerwikEd.KeyHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'keyup', WikEdKeyFrameHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'keypress', WikEdKeyFrameHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'mouseup', WikEdKeyFrameHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'keydown', WikEdKeyHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'mousemove', WikEdResizeGripHandler, true);
WikEdAddEventListener(wikEdFrameDocument, 'dblclick', WikEdResizeFrameResetHandler, true);
 
// registerdblclick documenton wrapper events
wikEd.debugWrapper.addEventListener('dblclick', wikEd.DebugHandler, true);
WikEdAddEventListener(document, 'keydown', WikEdKeyHandler, true);
wikEd.localPrevWrapper.addEventListener('dblclick', wikEd.PrevWrapperHandler, true);
 
// dblclickregister onfind wrapperahead events
wikEd.findText.addEventListener('keyup', wikEd.FindAhead, true);
WikEdAddEventListener(wikEdDebugWrapper, 'dblclick', WikEdDebugHandler, true);
WikEdAddEventListener(wikEdLocalPrevWrapper, 'dblclick', WikEdPrevWrapperHandler, true);
 
// register findsubmit aheadbutton events
if (wikEd.saveButton !== null) {
WikEdAddEventListener(wikEdFindText, 'keyup', WikEdFindAhead, true);
wikEd.saveButton.addEventListener('click', wikEd.SaveButtonHandler, true);
}
if (wikEd.previewButton !== null) {
wikEd.previewButton.addEventListener('click', wikEd.PreviewButtonHandler, true);
}
if (wikEd.diffPreviewButton !== null) {
wikEd.diffPreviewButton.addEventListener('click', wikEd.DiffPreviewButtonHandler, true);
}
 
// register submitset button bar grip area events
if (wikEd.buttonBarFormat !== null) {
WikEdAddEventListener(wikEdSaveButton, 'click', WikEdSaveButtonHandler, true);
wikEd.buttonBarFormat.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
WikEdAddEventListener(wikEdPreviewButton, 'click', WikEdPreviewButtonHandler, true);
}
WikEdAddEventListener(wikEdDiffPreviewButton, 'click', wikEdDiffPreviewButtonHandler, true);
if (wikEd.buttonBarTextify !== null) {
WikEdAddEventListener(wikEdLocalPreview, 'click', WikEdLocalPreviewHandler, true);
wikEd.buttonBarTextify.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
WikEdAddEventListener(wikEdLocalDiff, 'click', WikEdLocalDiffHandler, true);
}
if (wikEd.buttonBarControl !== null) {
wikEd.buttonBarControl.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarCustom1 !== null) {
if (wikEd.buttonBarCustom1.firstChild.firstChild !== null) {
wikEd.buttonBarCustom1.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
}
if (wikEd.buttonBarFind !== null) {
wikEd.buttonBarFind.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarFix !== null) {
wikEd.buttonBarFix.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarCustom2 !== null) {
if (wikEd.buttonBarCustom2.firstChild.firstChild !== null) {
wikEd.buttonBarCustom2.firstChild.firstChild.addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
}
 
// unloadregister (leavingcombo page)box events
if (wikEd.summarySelect !== null) {
WikEdAddEventListener(window, 'pagehide', WikEdUnloadHandler, false);
wikEd.summarySelect.addEventListener('change', function () { wikEd.ChangeComboInput('summary'); }, false);
wikEd.summarySelect.addEventListener('focus', function () { wikEd.SetComboOptions('summary'); }, false);
}
if (wikEd.selectElement.find !== null) {
wikEd.selectElement.find.addEventListener('change', function () { wikEd.ChangeComboInput('find'); }, false);
wikEd.selectElement.find.addEventListener('focus', function () { wikEd.SetComboOptions('find'); }, false);
}
if (wikEd.selectElement.replace !== null) {
wikEd.selectElement.replace.addEventListener('change', function () { wikEd.ChangeComboInput('replace'); }, false);
wikEd.selectElement.replace.addEventListener('focus', function () { wikEd.SetComboOptions('replace'); }, false);
}
 
// register the clear summary click handler
// set button bar grip area events
if (wikEdButtonBarFormatwikEd.clearSummary !== null) {
wikEd.clearSummary.addEventListener('click', wikEd.ClearSummaryHandler, false);
WikEdAddEventListener(wikEdButtonBarFormat.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
}
 
if (wikEdButtonBarTextify != null) {
// register double click handler on wiki preview area
WikEdAddEventListener(wikEdButtonBarTextify.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
if (wikEd.wikiPreview !== null) {
wikEd.wikiPreview.addEventListener('dblclick', wikEd.WikiPreviewHandler, false);
}
 
if (wikEdButtonBarControl != null) {
// register special char insert select handler for fullscreen resizing
WikEdAddEventListener(wikEdButtonBarControl.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
if (wikEd.insertWrapper !== null) {
var select = wikEd.insertWrapper.getElementsByTagName('select')[0];
if (select !== undefined) {
select.addEventListener('change', wikEd.InsertChangeHandler, true);
}
}
 
if (wikEdButtonBarCustom1 != null) {
// select the text on focus for find and replace fields, tab/shift-tab between find and replace fields
if (wikEdButtonBarCustom1.firstChild.firstChild != null) {
if (wikEd.findText !== null) {
WikEdAddEventListener(wikEdButtonBarCustom1.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
wikEd.findText.addEventListener('focus', wikEd.FindReplaceHandler, true);
wikEd.findText.addEventListener('keydown', wikEd.FindReplaceHandler, true);
}
if (wikEd.replaceText !== null) {
wikEd.replaceText.addEventListener('focus', wikEd.FindReplaceHandler, true);
wikEd.replaceText.addEventListener('keydown', wikEd.FindReplaceHandler, true);
}
 
// check if dynamically inserted addon tags have to be removed: Web of Trust (WOT)
if (document.getElementById('wot-logo') !== null) {
wikEd.cleanNodes = true;
}
 
// override insertTags function used by standard button toolbar and editpage special chars with wikEd replacement
 
// window.mw.toolbar.insertTags
if ( (window.mw !== undefined) && (window.mw.toolbar !== undefined) && (typeof window.mw.toolbar.insertTags === 'function') ) {
if (wikEd.InsertTagsOriginal === null) {
wikEd.InsertTagsOriginal = window.mw.toolbar.insertTags;
}
window.mw.toolbar.insertTags = wikEd.InsertTags;
}
 
if (wikEdButtonBarFind != null) {
// deprecated insertTags function in wikibits.js
WikEdAddEventListener(wikEdButtonBarFind.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
else if (typeof window.insertTags == 'function') {
if (wikEd.InsertTagsOriginal === null) {
wikEd.InsertTagsOriginal = window.insertTags;
}
window.insertTags = wikEd.InsertTags;
}
 
if (wikEdButtonBarFix != null) {
// hook wikEd into the enhanced new edit toolbar, not Greasemonkey compatible
WikEdAddEventListener(wikEdButtonBarFix.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
if (typeof jQuery == 'function') {
jQuery('#wpTextbox1').bind('encapsulateSelection', function (e, before, inside, after) {
if (wikEd.useWikEd === true) {
wikEd.InsertTags(before, after, inside);
}
});
}
 
if (wikEdButtonBarCustom2 != null) {
// update textarea before using UI LivePreview function, not Greasemonkey compatible
if (wikEdButtonBarCustom2.firstChild.firstChild != null) {
if ( (typeof jQuery == 'function') && (typeof window.mw == 'object') ) {
WikEdAddEventListener(wikEdButtonBarCustom2.firstChild.firstChild, 'click', WikEdButtonBarGripHandler, false);
jQuery(window.mw).bind('LivePreviewPrepare', function (event) {
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
}
});
}
 
// override insertAtCursor function in wikia.com MediaWiki:Functions.js, not Greasemonkey compatible
if (typeof window.insertAtCursor == 'function') {
if (wikEd.InsertAtCursorOriginal === null) {
wikEd.InsertAtCursorOriginal = window.insertAtCursor;
}
window.insertAtCursor = wikEd.InsertAtCursor;
}
 
// reset error indicator
// register combo box events
wikEd.SetLogo();
WikEdAddEventListener(wikEdSummarySelect, 'change', function() { WikEdChangeComboInput('summary'); }, false);
wikEd.turnedOn = true;
WikEdAddEventListener(wikEdSummarySelect, 'focus', function() { WikEdSetComboOptions('summary'); }, false);
 
// get frame resize grip image dimensions
WikEdAddEventListener(wikEdSelectElement['find'],'change', function() { WikEdChangeComboInput('find'); }, false);
var resizeGripImage = document.createElement('img');
WikEdAddEventListener(wikEdSelectElement['find'],'focus', function() { WikEdSetComboOptions('find'); }, false);
resizeGripImage.id = 'wikEdResizeGrip';
resizeGripImage.addEventListener('load', wikEd.ResizeGripLoadHandler, true);
resizeGripImage.src = wikEd.config.image['resizeGrip'];
 
// remove accesskeys that are defined in wikEd from page elements
WikEdAddEventListener(wikEdSelectElement['replace'],'change', function() { WikEdChangeComboInput('replace'); }, false);
wikEd.DeleteAccesskeys();
WikEdAddEventListener(wikEdSelectElement['replace'],'focus', function() { WikEdSetComboOptions('replace'); }, false);
 
// disable CodeEditor button when wikEd is active
// register the clear summary click handler
wikEd.DisableCodeEditorButton();
WikEdAddEventListener(wikEdClearSummary, 'click', WikEdClearSummaryHandler, true);
 
// run scheduled custom functions
// select the text on focus for find and replace fields
wikEd.ExecuteHook(wikEd.config.setupHook);
WikEdAddEventListener(wikEdFindText, 'focus', WikEdFindReplaceHandler, true);
 
WikEdAddEventListener(wikEdReplaceText, 'focus', WikEdFindReplaceHandler, true);
// load and parse RegExTypoFix rules if the button is enabled
wikEd.LoadTypoFixRules();
 
// done with setup and turn-on
return;
};
 
 
//
// wikEd.GetPaths: get MediaWiki file paths from wikiGlobals if possible
//
 
wikEd.GetPaths = function () {
// tab / shift-tab between find and replace fields
WikEdAddEventListener(wikEdFindText, 'keydown', WikEdFindReplaceHandler, true);
WikEdAddEventListener(wikEdReplaceText, 'keydown', WikEdFindReplaceHandler, true);
 
// init MediaWiki file paths for use in regexps
if (wikEdWikiGlobals['wikEd.wikiGlobals.wgServer'] !== nullundefined) {
wikEdServerwikEd.server = wikEdWikiGlobals['wikEd.wikiGlobals.wgServer'];
}
if (wikEdWikiGlobals['wikEd.wikiGlobals.wgArticlePath'] !== nullundefined) {
wikEdArticlePathwikEd.articlePath = wikEdWikiGlobals['wikEd.wikiGlobals.wgArticlePath'];
}
if (wikEdWikiGlobals['wikEd.wikiGlobals.wgScriptPath'] !== nullundefined) {
wikEdScriptPathwikEd.scriptPath = wikEdWikiGlobals['wikEd.wikiGlobals.wgScriptPath'];
}
if (wikEdWikiGlobals['wikEd.wikiGlobals.wgScript'] !== nullundefined) {
wikEdScriptwikEd.script = wikEdWikiGlobals['wikEd.wikiGlobals.wgScript'];
}
 
wikEdArticlePathwikEd.articlePath = wikEdArticlePathwikEd.articlePath.replace(wikEdServerwikEd.server, '');
wikEdScriptPathwikEd.scriptPath = wikEdScriptPathwikEd.scriptPath.replace(wikEdServerwikEd.server, '');
wikEdArticlePathwikEd.articlePath = wikEdArticlePathwikEd.articlePath.replace(/\$1$/, '');
wikEdScriptPathwikEd.scriptPath = wikEdScriptPathwikEd.scriptPath.replace(/\/?$/, '/');
wikEdScriptNamewikEd.scriptName = wikEdScriptwikEd.script.replace(wikEdScriptPathwikEd.scriptPath, '');
wikEd.scriptURL = wikEd.server + wikEd.scriptPath;
wikEdScriptURL = wikEdServer + wikEdScriptPath;
 
// prepare for use in regexps
wikEdServerwikEd.server = wikEdServerwikEd.server.replace(/(\W)/g, '\\$1');
wikEdArticlePathwikEd.articlePath = wikEdArticlePathwikEd.articlePath.replace(/(\W)/g, '\\$1');
wikEdScriptwikEd.script = wikEdScriptwikEd.script.replace(/(\W)/g, '\\$1');
wikEdScriptPathwikEd.scriptPath = wikEdScriptPathwikEd.scriptPath.replace(/(\W)/g, '\\$1');
wikEdScriptNamewikEd.scriptName = wikEdScriptNamewikEd.scriptName.replace(/(\W)/g, '\\$1');
 
return;
// check if dynamically inserted addon tags have to be removed: Web of Trust (WOT)
};
if (document.getElementById('wot-logo') != null) {
 
wikEdCleanNodes = true;
 
//
// wikEd.FrameLoadHandler: load handler for iframe
// Chrome fires iframe load event immediately after element creation, Firefox fires much later and then deletes already added content
 
wikEd.FrameLoadHandler = function (event) {
 
// remove event listener
wikEd.frame.removeEventListener('load', wikEd.FrameLoadHandler, false);
 
// set frame loaded flag
wikEd.frameLoaded = true;
 
return;
};
 
 
//
// wikEd.InitializeFrame: initialize editing iframe after loading
//
 
wikEd.InitializeFrame = function () {
 
// remove event listener
wikEd.frame.removeEventListener('load', wikEd.InitializeFrame, false);
 
// get object shortcuts
wikEd.frameWindow = wikEd.frame.contentWindow;
wikEd.frameDocument = wikEd.frameWindow.document;
wikEd.frameHtml = wikEd.frameDocument.documentElement;
wikEd.frameBody = wikEd.frameDocument.body;
 
// set frame body properties
if (wikEd.highlightSyntax === true) {
if (wikEd.refHide === true) {
wikEd.frameBody.className = 'wikEdFrameBodyNewbie';
}
else {
wikEd.frameBody.className = 'wikEdFrameBodySyntax';
}
}
else {
wikEd.frameBody.className = 'wikEdFrameBodyPlain';
}
wikEd.frameBody.contentEditable = 'true';
if (wikEd.noSpellcheck === true) {
wikEd.frameBody.spellcheck = 'false';
}
 
// disable table resizing controls in Firefox
// fullscreen mode
try {
if (wikEdFullScreenMode == true) {
wikEd.frameDocument.execCommand('enableObjectResizing', false, 'false');
WikEdFullScreen(wikEdFullScreenMode, true);
wikEd.frameDocument.execCommand('enableInlineTableEditing', false, 'false');
}
catch (exception) {
}
 
// display iframe, hide textarea, set fullscreen
// override the insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars
wikEd.SetEditArea(wikEd.useWikEd, true);
if (typeof(insertTags) == 'function') {
 
if (WikEdInsertTagsOriginal == null) {
// add frame stylesheets
WikEdInsertTagsOriginal = insertTags;
wikEd.frameHtml.className = 'wikEdFrameHtml';
wikEd.direction = wikEd.GetStyle(document.body, 'direction');
wikEd.frameBody.style.direction = wikEd.direction;
wikEd.ApplyCSS(wikEd.frameDocument, wikEd.config.frameCSS);
wikEd.HighlightNamedHideButtonsStylesheet = new wikEd.StyleSheet(wikEd.frameDocument);
 
// copy textarea background style
wikEd.textareaBackgroundColor = wikEd.GetStyle(wikEd.textarea, 'backgroundColor');
if (wikEd.config.frameBackgroundColor === true) {
wikEd.frameInner.style.setProperty('background-color', wikEd.textareaBackgroundColor);
}
 
// adjust font size (px)
wikEd.textSizeInit = parseFloat(wikEd.GetStyle(wikEd.textarea, 'fontSize')) * wikEd.config.textSizeAdjust / 100;
wikEd.textSize = wikEd.textSizeInit;
wikEd.frameBody.style.fontSize = wikEd.textSize + 'px';
 
// copy textarea content into iframe and focus
if (wikEd.useWikEd === true) {
wikEd.ScanPreviewRedlinks();
wikEd.UpdateFrame();
if ( (wikEd.config.focusEdit === true) && (wikEd.previewPage === false) && (wikEd.editSemanticForm === false) ) {
wikEd.frameBody.focus();
}
insertTags = window.WikEdInsertTags;
}
 
// make read only
if (wikEd.readOnly === true) {
wikEd.frameBody.contentEditable = 'false';
}
 
// register frame events
wikEd.frameDocument.addEventListener('keydown', wikEd.KeyFrameHandler, true);
wikEd.frameDocument.addEventListener('keyup', wikEd.KeyFrameHandler, true);
wikEd.frameDocument.addEventListener('keypress', wikEd.KeyFrameHandler, true);
wikEd.frameDocument.addEventListener('click', wikEd.KeyFrameHandler, true);
 
wikEd.frameDocument.addEventListener('keydown', wikEd.KeyHandler, true);
wikEd.frameDocument.addEventListener('mousemove', wikEd.ResizeGripHandler, true);
wikEd.frameDocument.addEventListener('dblclick', wikEd.ResizeFrameResetHandler, true);
 
// register paste events
wikEd.frameDocument.addEventListener('paste', wikEd.PasteFrameHandler, true);
wikEd.frameDocument.addEventListener('drop', wikEd.PasteFrameHandler, true);
wikEd.frameDocument.addEventListener('paste', wikEd.KeyFrameHandler, true);
 
// fullscreen mode
if (wikEd.fullScreenMode === true) {
wikEd.FullScreen(true, true);
}
 
// needed for upload and edit raw watchlist
else {
wikEd.ResizeWindowHandler();
window.insertTags = window.WikEdInsertTags;
}
 
// unload (leaving page) events
// hook wikEd into the enhanced new edit toolbar
window.addEventListener('pagehide', wikEd.UnloadHandler, false);
if (typeof(jQuery) == 'function') {
 
jQuery('#wpTextbox1').bind('encapsulateSelection', function(e, before, inside, after) {
return;
if (wikEdUseWikEd == true) {
};
WikEdInsertTags(before, after, inside);
 
}
 
});
//
// wikEd.CodeEditorCheck: check for active code editor and .js or .css page
//
 
wikEd.CodeEditorCheck = function () {
 
wikEd.jsPage = false;
wikEd.cssPage = false;
wikEd.useCodeEditor = false;
 
// check if .js or .css page
if ( (wikEd.wikiGlobals.wgCanonicalNamespace == 'MediaWiki') || ( (wikEd.wikiGlobals.wgCanonicalNamespace == 'User') && (wikEd.wikiGlobals.wgTitle.indexOf('/') >= 0) ) ) {
if (/\.js$/.test(wikEd.wikiGlobals.wgTitle) === true) {
wikEd.jsPage = true;
 
}
else if (/\.css$/.test(wikEd.wikiGlobals.wgTitle) === true) {
wikEd.cssPage = true;
}
}
 
// check for code editor
// override insertAtCursor function in wikia.com MediaWiki:Functions.js
if ( (wikEd.jsPage === true) || (wikEd.cssPage === true) ) {
if (typeof(insertAtCursor) == 'function') {
if (WikEdInsertAtCursorOriginalwikEd.wikiGlobals.wgPageContentModel === nullundefined) {
if (wikEd.GetCookie('wikiEditor-0-codeEditor-enabled') == 1) {
WikEdInsertAtCursorOriginal = insertAtCursor;
wikEd.useCodeEditor = true;
}
}
else if (wikEd.wikiGlobals.wgPageContentModel != 'wikitext') {
if (wikEd.GetCookie('wikiEditor-0-codeEditor-enabled') == 1) {
wikEd.useCodeEditor = true;
}
}
 
// wait for landing patch: https://gerrit.wikimedia.org/r/#/c/130068/
if ( (window.mw !== undefined) && (window.mw.user !== undefined) && (window.mw.user.options !== undefined) ) {
if (window.mw.user.options.get('usebetatoolbar') == 1) {
wikEd.useBetaToolbar = true;
if (window.mw.user.options.get('usecodeeditor') == 1) {
wikEd.useCodeEditor = true;
}
}
}
insertAtCursor = window.WikEdInsertAtCursor;
}
return;
};
 
// reset error indicator
WikEdSetLogo();
wikEdTurnedOn = true;
 
//
// get frame resize grip image dimensions
// wikEd.DisableCodeEditorButton: disable CodeEditor button when wikEd is active
var resizeGripImage = document.createElement('img');
//
resizeGripImage.id = 'wikEdResizeGrip';
WikEdAddEventListener(resizeGripImage, 'load', WikEdResizeGripLoadHandler, true);
resizeGripImage.src = wikEdConfig['image']['resizeGrip'];
 
wikEd.DisableCodeEditorButton = function () {
// run scheduled custom functions
WikEdExecuteHook(wikEdConfig['setupHook']);
 
if ( (wikEd.config.disableCodeEditorButton === true) && ( (wikEd.useBetaToolbar === true) || (wikEd.wikiEditorBar !== null) ) ) {
// load and parse RegExTypoFix rules if the button is enabled
var buttons = document.body.getElementsByClassName('tool-button');
WikEdLoadTypoFixRules();
var disabled = false;
for (var i = 0; i < buttons.length; i ++) {
var rel = buttons[i].getAttribute('rel');
var title = buttons[i].getAttribute('title');
if (rel == 'codeEditor') {
var buttonClone = buttons[i].cloneNode(true);
buttonClone.setAttribute('rel', rel + '_disabled_by_wikEd');
buttonClone.setAttribute('title', title + wikEd.config.text['wikEdCodeEditorButtonDisabled']);
buttons[i].style.display = 'none';
buttons[i].parentNode.insertBefore(buttonClone, buttons[i]);
disabled = true;
break;
}
}
 
// donepoll withbetween setup0.1 and turn-on12 s
if ( (disabled === false) && (wikEd.codeEditorButtonPollCount < 15) ) {
var delay = 100 + wikEd.codeEditorButtonPollCount * 100;
wikEd.codeEditorButtonPollCount ++;
window.setTimeout(wikEd.DisableCodeEditorButton, delay);
}
}
return;
};
 
 
//
// wikEd.DeleteAccesskeys: remove accesskeys that are defined in wikEd from page elements
//
 
wikEd.DeleteAccesskeys = function () {
 
var accesskeyTags = ['textarea', 'input', 'a'];
for (var i = 0; i < accesskeyTags.length; i ++) {
var accesskeyElements = document.getElementsByTagName(accesskeyTags[i]);
for (var j = 0; j < accesskeyElements.length; j ++) {
var attribute = accesskeyElements[j].getAttribute('accesskey');
if (attribute !== null) {
if (wikEd.buttonKeyCode[ attribute.toUpperCase().charCodeAt(0) ] !== undefined) {
accesskeyElements[j].setAttribute('accesskey', null);
}
}
}
}
return;
};
Line 3,447 ⟶ 4,127:
 
//
// WikEdAutoUpdatewikEd.AutoUpdate: check for the latest version and force-reload to update
//
 
windowwikEd.WikEdAutoUpdateAutoUpdate = function () {
 
// check only on non-interaction pages
if (/(\?|&)action=/.test(window.___location.search) === true) {
return;
}
 
// check if autoupdate is enabled
if (wikEdConfig['wikEd.config.autoUpdate'] !== true) {
return;
}
 
// install bugfix (fix script duplication after @namespace change in version 0.9.127)
// check for forced update check
if (wikEd.greasemonkey === true) {
var currentVersion = wikEd.VersionToNumber(wikEd.programVersion);
if (currentVersion < 9127000) {
var updatePopup = wikEd.config.text.wikEdGreasemonkeyAutoUpdateBugfix;
var updateURL = wikEd.config.autoUpdateScriptUrlBugfix;
var protocol = document.___location.href.replace(/\/\/.*/, '');
updateURL = updateURL.replace(/^(?=\/\/)/, protocol);
updatePopup = updatePopup.replace(/\{updateURL\}/g, updateURL);
window.alert(updatePopup);
window.___location.href = updateURL;
}
}
 
// check for forced update check
var forcedUpdate = false;
if (wikEdConfig['wikEd.config.forcedUpdate'] !== '') {
 
// get version numbers from strings
var currentVersion = WikEdVersionToNumberwikEd.VersionToNumber(wikEdProgramVersionwikEd.programVersion);
var forcedVersion = WikEdVersionToNumberwikEd.VersionToNumber(wikEdConfig['wikEd.config.forcedUpdate']);
 
// schedule forced update check
if ( (currentVersion !== null'') && (forcedVersion !== null'') ) {
if (forcedVersion > currentVersion) {
forcedUpdate = true;
Line 3,478 ⟶ 4,172:
}
 
// check for regular update
var regularUpdate = false;
var currentDate = new Date();
if (forcedUpdate === false) {
 
// get date of last update check
var lastCheckStr = WikEdGetPersistentwikEd.GetPersistent('wikEdAutoUpdate');
var lastCheckDate = new Date(lastCheckStr);
 
// fix missing or corrupt saved setting
if (isNaN(lastCheckDate.valueOf()) === true) {
WikEdSetPersistentwikEd.SetPersistent('wikEdAutoUpdate', 'January 1, 1970', 0, '/');
return;
}
 
// get the hours since last update check
var diffHours = (currentDate - lastCheckDate) / 1000 / 60 / 60;
if (wikEdGreasemonkeywikEd.greasemonkey === true) {
if (diffHours > wikEdConfig['wikEd.config.autoUpdateHoursGM']) {
regularUpdate = true;
}
}
else if (diffHours > wikEdConfig['wikEd.config.autoUpdateHours']) {
regularUpdate = true;
}
}
 
// perform AJAX request to get latest version number
if ( (forcedUpdate === true) || (regularUpdate === true) ) {
 
// save current update check date
WikEdSetPersistentwikEd.SetPersistent('wikEdAutoUpdate', currentDate.toUTCString(), 0, '/');
 
// make the ajax request
wikEd.AjaxRequest('GET', wikEd.config.autoUpdateUrl, null, 'text/plain', function (ajax) {
 
// get response
// make the ajax request
var requestMethod = 'GET';
var requestUrl = wikEdConfig['autoUpdateUrl'];
var postFields = null;
var overrideMimeType = null;
WikEdAjaxRequest(requestMethod, requestUrl, postFields, overrideMimeType, function(ajax, obj) {
 
// get response
var html = ajax.responseText;
 
// get version numbers from strings
var currentVersion = WikEdVersionToNumberwikEd.VersionToNumber(wikEdProgramVersionwikEd.programVersion);
var newVersion = WikEdVersionToNumberwikEd.VersionToNumber(html);
 
// check if downloaded version is newer and perform update
if ( (currentVersion !== null'') && (newVersion !== null'') ) {
if (newVersion > currentVersion) {
WikEdDoUpdatewikEd.DoUpdate();
}
}
Line 3,536 ⟶ 4,225:
return;
};
 
 
//
// WikEdVersionToNumberwikEd.VersionToNumber: parse version string (1.22.333a) into number 122333097
//
 
windowwikEd.WikEdVersionToNumberVersionToNumber = function (versionStr) {
 
var verregExpMatchVer = versionStr.match(/(\d+)\.(\d+)\.(\d+)(\w?)/);
if (verregExpMatchVer === null) {
return '';
}
var versionNumber = Number(verregExpMatchVer[1]) * 100000000 + Number(verregExpMatchVer[2]) * 1000000 + Number(verregExpMatchVer[3]) * 1000 + (verregExpMatchVer[4] + '0').charCodeAt(0);
return versionNumber;
 
return(versionNumber);
};
 
 
//
// WikEdDoUpdatewikEd.DoUpdate: actually perform update
//
 
windowwikEd.WikEdDoUpdateDoUpdate = function () {
 
// update Greasemonkey script by navigating to the script code page
if (wikEdGreasemonkeywikEd.greasemonkey === true) {
var updatePopup = wikEdConfig['wikEd.config.text']['.wikEdGreasemonkeyAutoUpdate'];
updatePopup = updatePopup.replace(/\{updateURL\}/g, wikEdConfig['wikEd.config.autoUpdateUrl']);
window.alert(updatePopup);
window.___location.href = wikEdConfig['wikEd.config.autoUpdateScriptUrl'];
}
 
// update wikEd by reloading the page with cache bypassing (equivalent to Shift-Reload or Shift-F5)
else {
window.___location.reload(true);
Line 3,576 ⟶ 4,265:
 
//
// WikEdLoadTypoFixRuleswikEd.LoadTypoFixRules: load and parse RegExTypoFix rules if the button is enabled
//
 
windowwikEd.WikEdLoadTypoFixRulesLoadTypoFixRules = function () {
 
// load RegExTypoFix rules per Ajax if enabled
if ( (wikEdConfig['wikEd.config.regExTypoFix'] === false) || (wikEdReadOnlywikEd.readOnly === true) || (wikEdTypoRulesFindwikEd.typoRulesFind.length > 0) ) {
return;
}
 
// make the ajax request
var requestMethodsep = 'GET&';
if (wikEd.config.regExTypoFixURL.indexOf('?') == -1) {
var requestUrl = wikEdConfig['regExTypoFixURL'];
sep = '?';
var postFields = null;
}
var overrideMimeType = null;
 
WikEdAjaxRequest(requestMethod, requestUrl, postFields, overrideMimeType, function(ajax) {
wikEd.AjaxRequest('GET', wikEd.config.regExTypoFixURL + sep + wikEd.programVersion, null, 'text/plain', function (ajax) {
 
// get response
var rulesTxt = ajax.responseText;
 
// parse regexp rules
var regExp = new RegExp('^/<(?:Typo )?\s+(?:word="(.+*?)" \s+)?find="(.+*?)" \s+replace="(.+*?)" +\s*\/?>', 'gim')/g;
var regExpMatch;
while ( (regExpMatch = regExp.exec(rulesTxt)) !== null) {
 
// check if this is a valid regexp
var regExpFind;
try {
regExpFind = new RegExp(regExpMatch[2], 'gm');
}
catch (errexception) {
var msg = 'Invalid RegExTypoFix rule:\nfind=' + regExpMatch[2] + '\nreplace=' + regExpMatch[3];
wikEd.ConsoleLog(msg);
continue;
}
 
// save regexp and replace
wikEdTypoRulesFindwikEd.typoRulesFind.push(regExpFind);
wikEdTypoRulesReplacewikEd.typoRulesReplace.push(regExpMatch[3]);
}
 
// display typo fix button
if (wikEdTypoRulesFindwikEd.typoRulesFind.length > 0) {
if (wikEd.fixRegExTypo !== null) {
document.getElementById('wikEdFixRegExTypo').style.display = 'inline';
wikEd.fixRegExTypo.style.display = 'inline';
}
}
return;
Line 3,625 ⟶ 4,320:
 
//
// WikEdEditButtonHandlerwikEd.EditButtonHandler: handler for clicks on edit buttons
//
 
windowwikEd.WikEdEditButtonHandlerEditButtonHandler = function (event) {
 
// execute the button click handler code, obj required in eval context
// event compatibility fixes
eventvar obj = WikEdEvent(event, this).currentTarget;
eval(wikEd.editButtonHandler[obj.id]);
if (event == null) {
return;
};
 
// execute the button click handler code
var obj;
if (event.currentTarget != null) {
obj = event.currentTarget;
}
 
//
// MS IE compatibility
// wikEd.ShrinkSummaryHandler: shrink the summary after loading the 'Clear summary' image
else {
//
obj = event.srcElement;
}
 
wikEd.ShrinkSummaryHandler = function (event) {
// workaround for mozilla 3.0 bug 441087
objId = obj.id;
eventShiftKey = event.shiftKey;
 
var diffWidth = wikEd.clearSummary.offsetWidth - wikEd.clearSummaryWidth;
eval(wikEdEditButtonHandler[objId]);
wikEd.inputElement.summary.style.width = (wikEd.inputElement.summary.offsetWidth - diffWidth) + 'px';
wikEd.selectElement.summary.style.width = (wikEd.selectElement.summary.offsetWidth - diffWidth) + 'px';
wikEd.clearSummaryWidth = wikEd.clearSummary.offsetWidth;
return;
};
Line 3,657 ⟶ 4,347:
 
//
// wikEd.InsertChangeHandler: resize fullscreen after changing insert special char selection
// WikEdShrinkSummaryHandler: shrink the summary after loading the 'Clear summary' image
//
 
windowwikEd.WikEdShrinkSummaryHandlerInsertChangeHandler = function (event) {
if (wikEd.fullscreen === true) {
wikEd.ResizeWindowHandler();
}
};
 
var diffWidth = wikEdClearSummary.offsetWidth - wikEdClearSummaryWidth;
 
//
// Firefox < 3.0
// wikEd.ResizeWindowHandler: adjust fullscreen frame and summary width after resizing the window
if ( typeof(wikEdInputElement['summary'].clientLeft) == 'undefined' ) {
// browser's dynamic table resizing interferes if wikEd is inserted in table (Special:Upload)
wikEdInputElement['summary'].style.width = (wikEdInputElement['summary'].clientWidth - diffWidth) + 'px';
 
wikEdSelectElement['summary'].style.width = (wikEdSelectElement['summary'].clientWidth - diffWidth) + 'px';
wikEd.ResizeWindowHandler = function (event) {
 
// fullscreen resizing
if (wikEd.fullscreen === true) {
var captchaHeight = wikEd.captchaWrapper.offsetHeight;
var debugHeight = wikEd.debugWrapper.offsetHeight;
var buttonsHeight = wikEd.buttonsWrapper.offsetHeight;
 
var consoleTopHeight = 0;
if (wikEd.consoleTopWrapper !== null) {
consoleTopHeight = wikEd.consoleTopWrapper.offsetHeight;
}
 
var consoleHeight = wikEd.consoleWrapper.offsetHeight;
 
var insertHeight = 0;
if (wikEd.insertWrapper !== null) {
insertHeight = wikEd.insertWrapper.offsetHeight;
}
 
var windowHeight = window.innerHeight;
var frameHeight = windowHeight - captchaHeight - debugHeight - buttonsHeight - consoleTopHeight - consoleHeight - insertHeight - wikEd.frameBorderHeight;
if (frameHeight < 100) {
frameHeight = 100;
}
wikEd.frame.style.height = frameHeight + 'px';
wikEd.frame.style.width = (wikEd.frameWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
}
 
// Firefoxadjust >=frame 3.0size
else {
wikEdInputElement['summary']wikEd.style.widthframeWidth = (wikEdInputElement['summary']wikEd.frameWrapper.clientWidth - diffWidthwikEd.frameBorderWidth) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
wikEdSelectElement['summary'].style.width = (wikEdSelectElement['summary'].clientWidth - diffWidth + 3) + 'px';
wikEd.frame.style.width = wikEd.frameWidth;
}
wikEd.ResizeSummary();
wikEdClearSummaryWidth = wikEdClearSummary.offsetWidth;
return;
};
Line 3,681 ⟶ 4,402:
 
//
// wikEd.WikiPreviewHandler: event handler for wiki preview: scroll to edit field on double click
// WikEdResizeWindowHandler: adjust the summary width after resizing the window
//
 
windowwikEd.WikEdResizeWindowHandlerWikiPreviewHandler = function (event) {
 
// filter out selecting double clicks on text
// adjust frame size
var sel = window.getSelection();
wikEdFrameHeight = (wikEdTextareaOffsetHeightInitial - wikEdFrameBorderHeight) + 'px';
wikEdFrameWidth = (wikEdEditorWrapper.clientWidth - wikEdFrameBorderWidth) + 'px';
wikEdFrame.style.height = wikEdFrameHeight;
wikEdFrame.style.width = wikEdFrameWidth;
 
// explicitOriginalTarget (Firefox)
WikEdResizeSummary();
var textTarget = event.explicitOriginalTarget;
if (textTarget !== undefined) {
if (textTarget.nodeName == '#text') {
return;
}
}
 
// ignore for non-blank selection
else if ( (sel !== null) && (/^\s*$/.test(sel.toString()) === false) ) {
return;
}
sel.collapseToEnd();
 
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
return;
};
Line 3,698 ⟶ 4,430:
 
//
// WikEdUnloadHandlerwikEd.UnloadHandler: save editing frame to cached textarea
//
 
windowwikEd.WikEdUnloadHandlerUnloadHandler = function (event) {
 
// update textarea if not already done in submit handlers
// event compatibility fixes
if (wikEd.useWikEd === true) {
event = WikEdEvent(event, this);
if (eventwikEd.textareaUpdated === nullfalse) {
wikEd.UpdateTextarea();
return;
}
 
// update textarea if not already done in submit handlers
if (wikEdUseWikEd == true) {
if (wikEdTextareaUpdated != true) {
WikEdUpdateTextarea();
}
}
Line 3,720 ⟶ 4,446:
 
//
// WikEdSaveButtonHandlerwikEd.SaveButtonHandler: 'Save page' onsubmit click handler for submit button
//
 
windowwikEd.WikEdSaveButtonHandlerSaveButtonHandler = function (event) {
 
wikEd.saveButton.removeEventListener('click', wikEd.SaveButtonHandler, true);
WikEdRemoveEventListener(wikEdSaveButton, 'click', WikEdSaveButtonHandler, true);
 
// update textarea
if (wikEdUseWikEdwikEd.useWikEd === true) {
wikEd.UpdateTextarea();
WikEdUpdateTextarea();
wikEdTextareaUpdatedwikEd.textareaUpdated = true;
}
 
// check for interfering scripts or gadgets: mwEmbed for file uploads
if ( (wikEdUploadEditwikEd.editUpload === true) && (typeof(window.MW_EMBED_VERSION) !== 'undefined') ) {
WikEdAddEventListenerwikEd.saveButton.addEventListener(wikEdSaveButton, 'click', WikEdSaveButtonHandlerwikEd.SaveButtonHandler, true);
return;
}
 
// add "using wikEd" to summary, not for adding a new section (+ tab)
if (wikEdSummaryTextwikEd.summaryText !== null) {
var text = wikEdSummaryTextwikEd.summaryText.value;
text = text.replace(/^[, ]+/, '');
text = text.replace(/[, ]+$/, '');
WikEdAddToHistorywikEd.AddToHistory('summary');
 
if ( (wikEdUsingwikEd.using === true) && (text !== '') ) {
if (text.lastIndexOf(wikEdConfig['wikEd.config.summaryUsing']) < 0) {
if (wikEdAddNewSectionwikEd.addNewSection !== true) {
text += ' ' + wikEdConfig['wikEd.config.summaryUsing'];
}
}
}
wikEdSummaryTextwikEd.summaryText.value = text;
}
 
// submit
wikEdSaveButtonwikEd.saveButton.click();
 
// reinstate handler in case the browser back button will be used
WikEdAddEventListenerwikEd.saveButton.addEventListener(wikEdSaveButton, 'click', WikEdSaveButtonHandlerwikEd.SaveButtonHandler, true);
 
return;
Line 3,767 ⟶ 4,493:
 
//
// WikEdPreviewButtonHandlerwikEd.PreviewButtonHandler: 'Show preview' click handler
//
 
windowwikEd.WikEdPreviewButtonHandlerPreviewButtonHandler = function (event) {
 
if (wikEdUseWikEdwikEd.useWikEd === true) {
wikEd.UpdateTextarea();
WikEdUpdateTextarea();
wikEdTextareaUpdatedwikEd.textareaUpdated = true;
}
return;
Line 3,781 ⟶ 4,507:
 
//
// wikEdDiffPreviewButtonHandlerwikEd.DiffPreviewButtonHandler: 'Show changes' click handler
//
 
windowwikEd.wikEdDiffPreviewButtonHandlerDiffPreviewButtonHandler = function (event) {
 
// interrupt fullscreen mode
if (wikEdFullScreenMode == true) {
if (wikEd.fullscreen === true) {
WikEdFullScreen(false);
wikEd.FullScreen(false);
}
 
if (wikEdUseWikEd == true) {
if (wikEd.useWikEd === true) {
WikEdUpdateTextarea();
wikEd.UpdateTextarea();
wikEdTextareaUpdated = true;
wikEd.textareaUpdated = true;
}
 
return;
};
Line 3,799 ⟶ 4,526:
 
//
// WikEdLinkifyHandlerwikEd.LinkifyHandler: open innermost highlighted link in new window/tab on ctrl/meta-click
//
 
windowwikEd.WikEdLinkifyHandlerLinkifyHandler = function (event) {
 
if ( (event.shiftKey === false) && ( (event.ctrlKey === true) || (event.metaKey === true) ) && (event.altKey === false) ) {
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
if ( (event.shiftKey == false) && ( (event.ctrlKey == true) || (event.metaKey == true) ) && (event.altKey == false) ) {
var node = event.target;
while (node !== null) {
var linkIdid = node.id;
if (linkId (id !== null) && (id.indexOf('wikEdWikiLink') === 0) ) {
if (linkIdObject.indexOfprototype.hasOwnProperty.call('wikEdLinkify'wikEd.wikiLinks, id) === 0true) {
var linkIdNolinkUrl = linkIdwikEd.replace(/\D/g, '')wikiLinks[id].url;
event.stopPropagation();
var linkUrl = wikEdLinkifyArray[linkIdNo];
if window.open(linkUrl != null) {;
eventwindow.stopPropagationfocus();
window.open(linkUrl)break;
window.focus();
break;
}
}
}
Line 3,834 ⟶ 4,552:
 
//
// wikEd.ButtonBarGripHandler: click, mouseover handler, see also wikEd.ButtonBarInit()
// WikEdLocalPreviewHandler: local 'Show preview' image button click handler
//
 
windowwikEd.WikEdLocalPreviewHandlerButtonBarGripHandler = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
WikEdButton(wikEdLocalPreview, 'wikEdLocalPreview');
return;
};
 
 
//
// WikEdLocalDiffHandler: local 'Show changes' image button click handler
//
 
window.WikEdLocalDiffHandler = function(event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
WikEdButton(wikEdLocalDiff, 'wikEdLocalDiff');
return;
};
 
 
//
// WikEdButtonBarGripHandler: click, mouseover handler, see also WikEdButtonBarInit()
//
 
window.WikEdButtonBarGripHandler = function(event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
event.stopPropagation();
Line 3,891 ⟶ 4,567:
buttonsWrapper.style.position = 'static';
 
// hide the buttons bar
if (buttonsWrapper.className != 'wikEdButtonBarButtonsWrapperHidden') {
buttonsWrapper.className = 'wikEdButtonBarButtonsWrapperHidden';
barInnerWrapper.className = 'wikEdButtonBarInnerWrapperHidden';
gripWrapper.className = 'wikEdButtonBarGripWrapperHidden';
wikEdButtonsWrapperWidthwikEd.buttonsWrapperWidth[bar.id] = buttonsWrapper.offsetWidth;
buttonsWrapper.style.display = 'none';
WikEdAddEventListenergrip.addEventListener(grip, 'mouseover', WikEdButtonBarGripHandlerwikEd.ButtonBarGripHandler, false);
WikEdSetPersistentwikEd.SetPersistent(bar.id + 'Hidden', '1', 0, '/');
}
 
// unhide the buttons bar
else {
buttonsWrapper.className = 'wikEdButtonBarButtonsWrapperVisible';
Line 3,908 ⟶ 4,584:
gripWrapper.className = 'wikEdButtonBarGripWrapperVisible';
buttonsWrapper.style.display = 'block';
WikEdRemoveEventListenergrip.removeEventListener(grip, 'mouseover', WikEdButtonBarGripHandlerwikEd.ButtonBarGripHandler, false);
WikEdSetPersistentwikEd.SetPersistent(bar.id + 'Hidden', '0', 0, '/');
}
}
 
// show the buttons bar on mouseover
else if (event.type == 'mouseover') {
if (buttonsWrapper.className == 'wikEdButtonBarButtonsWrapperHidden') {
WikEdAddEventListenerbar.addEventListener(bar, 'mouseout', WikEdButtonBarHandlerwikEd.ButtonBarHandler, false);
 
// browsers sometimes give offsetTop/offsetLeft - 1, + 0.5 seems to help
// show buttons to the right
 
if (bar.offsetParent.clientWidth > grip.offsetLeft + grip.offsetWidth + wikEdButtonsWrapperWidth[bar.id]) {
// show buttons to the right
buttonsWrapper.style.left = (grip.offsetLeft + grip.offsetWidth) + 'px';
if (bar.offsetParent.clientWidth > grip.offsetLeft + grip.offsetWidth + wikEd.buttonsWrapperWidth[bar.id] + 0.5) {
buttonsWrapper.style.left = (grip.offsetLeft + grip.offsetWidth + 0.5) + 'px';
}
 
// show buttons to the left
else {
buttonsWrapper.style.left = (gripWrapper.offsetLeft - wikEdButtonsWrapperWidthwikEd.buttonsWrapperWidth[bar.id] + 0.5) + 'px';
}
 
buttonsWrapper.style.top = (gripWrapper.offsetTop + 0.5) + 'px';
// a mozilla bug sometimes gives offsetTop - 1 when the wikEdToolbarWrapper is hidden
buttonsWrapper.style.top = gripWrapper.offsetTop + 'px';
buttonsWrapper.style.position = 'absolute';
buttonsWrapper.style.display = 'block';
Line 3,939 ⟶ 4,616:
 
//
// WikEdButtonBarHandlerwikEd.ButtonBarHandler: mouseout handler
//
 
windowwikEd.WikEdButtonBarHandlerButtonBarHandler = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
event.stopPropagation();
 
var bar = event.currentTarget;
 
var barInnerWrapper = bar.firstChild;
var gripWrapper = barInnerWrapper.firstChild;
Line 3,960 ⟶ 4,629:
var buttons = buttonsWrapper.firstChild;
 
// hide the buttons
if (event.type == 'mouseout') {
if (buttonsWrapper.className == 'wikEdButtonBarButtonsWrapperHidden') {
 
// filter the events for mouseouts actually leaving the bar
if (
(
( (event.target == grip) || (event.target == gripWrapper) ) &&
(event.safeRelatedTargetrelatedTarget != gripWrapper) && (event.safeRelatedTargetrelatedTarget != buttonsWrapper) && (event.safeRelatedTargetrelatedTarget != buttons) && (event.safeRelatedTargetrelatedTarget.parentNode != buttons)
) ||
(
( (event.target.parentNode.parentNode == buttons) || (event.target.parentNode == buttons) || (event.target == buttons) || (event.target == buttonsWrapper) ) &&
(event.safeRelatedTargetrelatedTarget.parentNode.parentNode != buttons) && (event.safeRelatedTargetrelatedTarget.parentNode != buttons) && (event.safeRelatedTargetrelatedTarget != buttons) && (event.safeRelatedTargetrelatedTarget != buttonsWrapper) && (event.safeRelatedTargetrelatedTarget != gripWrapper) && (event.safeRelatedTargetrelatedTarget != grip)
)
) {
WikEdRemoveEventListenerbar.removeEventListener(bar, 'mouseout', WikEdButtonBarHandlerwikEd.ButtonBarHandler, false);
buttonsWrapper.style.display = 'none';
buttonsWrapper.style.position = 'static';
Line 3,989 ⟶ 4,658:
//
 
windowwikEd.WikEdClearSummaryHandlerClearSummaryHandler = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
 
// clear the summary if it is only a paragraph name
if ( /^\/\* .*? \*\/ *$/.test(wikEdSummaryTextwikEd.summaryText.value) === true) {
wikEdSummaryTextwikEd.summaryText.value = '';
}
 
// clear the summary but leave paragraph names
else {
wikEdSummaryTextwikEd.summaryText.value = wikEdSummaryTextwikEd.summaryText.value.replace(/^((\/\* .*? \*\/ *)?).*()/,
function (p, p1, p2, p3) {
if (p1.length > 0) {
p1 = p1 + ' ';
}
return( p1);
}
);
}
wikEdSummaryTextwikEd.summaryText.focus();
return;
};
Line 4,021 ⟶ 4,684:
 
//
// WikEdFindReplaceHandlerwikEd.FindReplaceHandler: find and replace: tab and shift-tab between fields, select on focus
//
 
windowwikEd.WikEdFindReplaceHandlerFindReplaceHandler = function (event) {
 
// tab / shift-tab between fields
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
// tab / shift-tab between fields
if (event.type == 'keydown') {
if (event.keyCode == 9) {
if (event.target == wikEdFindTextwikEd.findText) {
event.preventDefault();
WikEdRemoveEventListenerwikEd.replaceText.removeEventListener(wikEdReplaceText, 'focus', WikEdFindReplaceHandlerwikEd.FindReplaceHandler, true);
wikEdReplaceTextwikEd.replaceText.focus();
WikEdAddEventListenerwikEd.replaceText.addEventListener(wikEdReplaceText, 'focus', WikEdFindReplaceHandlerwikEd.FindReplaceHandler, true);
}
else if (event.target == wikEdReplaceTextwikEd.replaceText) {
event.preventDefault();
WikEdRemoveEventListenerwikEd.findText.removeEventListener(wikEdFindText, 'focus', WikEdFindReplaceHandlerwikEd.FindReplaceHandler, true);
wikEdFindTextwikEd.findText.focus();
WikEdAddEventListenerwikEd.findText.addEventListener(wikEdFindText, 'focus', WikEdFindReplaceHandlerwikEd.FindReplaceHandler, true);
}
}
}
 
// select on focus
else if (event.type == 'focus') {
event.target.setSelectionRange(0, this.textLength);
if (wikEdMSIE == true) {
 
}
else {
event.target.setSelectionRange(0, this.textLength);
}
}
return;
Line 4,064 ⟶ 4,716:
 
//
// WikEdKeyFrameHandlerwikEd.KeyFrameHandler: event handler for key and mouse events in the frame
//
 
windowwikEd.WikEdKeyFrameHandlerKeyFrameHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
 
event = WikEdEvent(event, this);
// textarea no longer up to date
if (event == null) {
if ( event.type == 'paste' ) {
return;
wikEd.textareaUpdated = false;
}
}
 
// invalidate wikify/textify of recently pasted text and textarea status for printable char key presses
else if ( (event.type == 'keydown') || (event.type == 'keypress') ) {
switch (event.keyCode) {
 
// keys that do not change text
case 16: // shift
case 17: // ctrl
case 18: // alt
case 19: // pause/break
case 20: // caps lock
case 33: // page up
case 34: // page down
case 35: // end
case 36: // home
case 37: // left
case 38: // up
case 39: // right
case 40: // down
case 45: // insert
case 91: // windows left
case 91: // windows right
case 93: // select
case 112: // F1
case 113: // F2
case 114: // F3
case 115: // F4
case 116: // F5
case 117: // F6
case 118: // F7
case 119: // F8
case 120: // F9
case 121: // F10
case 122: // F11
case 123: // F12
case 144: // num lock
case 145: // scroll lock
case 182: // my computer
case 183: // my calculator
case 224: // apple
break;
 
// escape ends wikify/textify, all others change text
default:
 
// textarea no longer up to date
if (event.keyCode !== 27) { // escape
wikEd.textareaUpdated = false;
}
 
// invalidate wikify/textify
wikEd.PastedOff();
}
}
 
if (wikEdUseWikEd == true) {
switch (event.type) {
 
// keydown event
case 'keydown':
switch (event.keyCode) {
 
// tab key, switch between form elements instead of adding multiple spaces
case 9:
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
event.preventDefault();
 
// focus the next form element
if (wikEdAddNewSectionwikEd.addNewSection === true) {
document.getElementById('wpMinoredit').focus();
}
else {
wikEdSummaryTextwikEd.summaryText.focus();
}
 
// scroll to text input top
if (wikEdFullScreenModewikEd.fullscreen === false) {
window.scroll(0, WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdInputWrapperwikEd.inputWrapper));
}
}
Line 4,104 ⟶ 4,810:
break;
 
// after cursor movements set cursor position into closest highest text node so that highlighting does not bleed out
case 'keyup':
ifswitch (event.charCode == 0keyCode) {
case 17: // ctrl-v
switch (event.keyCode) {
case 1746: // ctrl-vdel
wikEd.AntiHighlightBleeding({});
case 37: // left
case 38: // upbreak;
case 3937: // rightleft
case 4038: // downup
case 33: // page up
case 34 8: // page downbackspace
wikEd.AntiHighlightBleeding({}, null, 'left');
case 46: // del
case 8: // backspacebreak;
case 39: // right
WikEdAntiHighlightBleeding(new Object());
}case 40: // down
case 34: // page down
wikEd.AntiHighlightBleeding({}, null, 'right');
break;
}
break;
case 'click':
wikEd.AntiHighlightBleeding({});
 
// invalidate wikify/textify of recently pasted text after selecting text
if ( (wikEd.paste !== null) && (wikEd.paste.polling === false) ) {
var sel = wikEd.GetSelection();
if (sel.isCollapsed === false) {
 
// check if clicking into selected pasted text
var range = sel.getRangeAt(0);
if (range != wikEd.keepSelRange) {
wikEd.PastedOff();
}
}
}
// run through, no break
 
// grey out inactive buttons
case 'mouseup':
WikEdAntiHighlightBleeding(new Object());
case 'keypress':
case 'paste':
WikEdInactiveButtons();
 
// grey out inactive buttons
wikEd.InactiveButtons();
}
}
Line 4,134 ⟶ 4,859:
 
//
// wikEd.PasteFrameHandler: event handler for paste and drop events in the edit frame
// set cursor position into closest highest text node so that highlighting does not bleed out
// does not work under Google Chrome which forces the cursor into the previous node
//
 
windowwikEd.WikEdAntiHighlightBleedingPasteFrameHandler = function(obj, editButtonInsert(event) {
 
if (wikEd.useWikEd !== true) {
// check if disabled
event.stopPropagation();
if (wikEdConfig['antiHighlightBleeding'] != true) {
wikEd.paste = null;
return;
}
 
var sel = wikEd.GetSelection();
// get selection object
var range = sel.getRangeAt(0);
if (obj.sel == null) {
 
obj.sel = WikEdGetSelection();
// ignore if still processing previous event
if ( (wikEd.paste !== null) && (wikEd.paste.polling === false) ) {
return;
}
wikEd.paste = {
eventType: event.type,
atStart: false,
polling: true,
blockStart: false,
blockEnd: false,
pasteAtEndOfLine: false,
offset: null,
prevNode: null,
prevUp: null,
parent: null,
prevNodeIndex: null,
rangeStartNode: null,
rangeStartOffset: null,
rangeStartAfter: null,
last: '',
dropHtml: null,
sel: sel,
range: range
};
 
// get position info before event is performed
var startNode = range.startContainer;
var startOffset = range.startOffset;
var endNode = range.endContainer;
var endOffset = range.endOffset;
switch (event.type) {
 
// drop
case 'drop':
if (event.dataTransfer === undefined) {
return;
}
wikEd.paste.dropHtml = event.dataTransfer.getData('text/html');
break;
 
// paste
case 'paste':
 
// find first previous node up as anchor to recover start node after insertion
wikEd.PasteFindPreviousNode();
break;
}
 
// needed to check if pasted content has been added to frame
wikEd.paste.startNode = startNode;
wikEd.paste.startOffset = startOffset;
wikEd.paste.endNode = endNode;
wikEd.paste.endOffset = endOffset;
 
wikEd.paste.startNodePreviousSibling = startNode.previousSibling;
wikEd.paste.startNodeNextSibling = startNode.nextSibling;
wikEd.paste.endNodePreviousSibling = endNode.previousSibling;
wikEd.paste.endNodeNextSibling = endNode.nextSibling;
 
// detect and process pasted content in edit frame by polling
wikEd.paste.pollCount = 1;
window.setTimeout(wikEd.PastePoll, 1);
 
return;
};
 
 
//
// wikEd.PasteFindPreviousNode: find first previous node up relative to selection as an anchor to recover start node after insertion
//
 
wikEd.PasteFindPreviousNode = function () {
 
var sel = wikEd.paste.sel;
var range = sel.getRangeAt(0);
var node = range.startContainer;
var offset = range.startOffset;
var prevNode = node.previousSibling;
 
// correct startNode into leaf node
if ( (node.nodeName != '#text') && (offset > 0) ) {
var childs = node.childNodes;
if ( (childs.length > 0) && (offset < childs.length) ) {
node = childs.item(offset);
offset = 0;
prevNode = node.previousSibling;
}
}
 
// test for paste at end of line after br
if ( (node.nodeName == '#text') && (offset == node.textContent.length) ) {
if ( (node.nextSibling !== null) && (node.nextSibling.nodeName == 'BR') ) {
wikEd.paste.pasteAtEndOfLine = true;
}
}
else if (node.nodeName == 'BR') {
 
// not in empty line
if ( (node.previousSibling === null) || (node.previousSibling.nodeName != 'BR') ) {
wikEd.paste.pasteAtEndOfLine = true;
}
}
 
// correct <br> into previous text node
if ( (node.nodeName == 'BR') && (prevNode !== null) && (prevNode.nodeName == '#text') ) {
node = prevNode;
offset = node.textContent.length;
prevNode = node.previousSibling;
}
 
// ascend to first node with a previous sibling
var prevUp = 0;
while ( (node != wikEd.frameBody) && (prevNode === null) ) {
node = node.parentNode;
prevUp ++;
prevNode = node.previousSibling;
}
 
// save paste ___location reference to drop object
if ( (node == wikEd.frameBody) && (offset === 0) ) {
wikEd.paste.atStart = true;
}
else {
wikEd.paste.offset = offset;
wikEd.paste.prevNode = prevNode;
wikEd.paste.prevUp = prevUp;
 
// find prevNode index
wikEd.paste.parent = prevNode.parentNode;
wikEd.paste.prevNodeIndex = null;
var parentNodes = wikEd.paste.parent.childNodes;
for (var i = 0; i < parentNodes.length; i ++) {
if (prevNode === parentNodes.item(i)) {
wikEd.paste.prevNodeIndex = i;
break;
}
}
}
return;
};
 
 
//
// wikEd.PastePoll: detect and process pasted content in edit frame by polling
//
 
wikEd.PastePoll = function () {
 
if (wikEd.paste === null) {
return;
}
 
if (wikEd.paste.pollCount > 100) {
wikEd.paste = null;
return;
}
 
var sel = wikEd.paste.sel;
var range = sel.getRangeAt(0);
var startNode = range.startContainer;
var startOffset = range.startOffset;
var endNode = range.endContainer;
var endOffset = range.endOffset;
 
// check if pasted content has already been added to frame
if (
(startNode === wikEd.paste.startNode) &&
(startOffset === wikEd.paste.startOffset) &&
(endNode === wikEd.paste.endNode) &&
(endOffset === wikEd.paste.endOffset) &&
 
(startNode.previousSibling === wikEd.paste.startNodePreviousSibling) &&
(startNode.nextSibling === wikEd.paste.startNodeNextSibling) &&
(endNode.previousSibling === wikEd.paste.endNodePreviousSibling) &&
(endNode.nextSibling === wikEd.paste.endNodeNextSibling)
) {
 
// schedule next poll, typically requires only one or two polls
wikEd.paste.pollCount ++;
window.setTimeout(wikEd.PastePoll, 1);
return;
}
wikEd.paste.polling = false;
 
// select dropped or pasted text; Chrome selects pasted text automatically
if (range.collapsed === true) {
switch (wikEd.paste.eventType) {
 
// drop
case 'drop':
if (wikEd.paste.dropHtml !== null) {
 
// plainTextify dropHtml
var div = document.createElement('div');
div.innerHTML = wikEd.paste.dropHtml;
var obj = {};
wikEd.GetInnerHTML(obj, div);
var plainText = obj.plain;
plainText = plainText.replace(/&lt;/g, '<');
plainText = plainText.replace(/&gt;/g, '>');
plainText = plainText.replace(/&amp;/g, '&');
 
// select using backwards built-in find
if ( (typeof wikEd.frameWindow.find == 'function') && (plainText.length > 0) ) {
 
// Chrome (but keeps selection in first place)
var found = wikEd.Find(obj, plainText, true, true, false, false);
 
// Firefox (removes \n)
if (found === false) {
var plainTextCrop = plainText.replace(/\n+/g, '');
found = wikEd.Find(obj, plainTextCrop, true, true, false, false);
if (found === true) {
 
// extend selection into removed \n
range = sel.getRangeAt(0);
 
// extend left
var regExpMatchStart = /^\n+/.exec(plainText);
if (regExpMatchStart !== null) {
var newlines = regExpMatchStart[0].length;
var node = range.startContainer;
var offset = range.startOffset;
 
if ( (node.nodeName == '#text') && (offset === 0) ) {
for (var i = 0; i < newlines; i ++) {
var nextNode = node.previousSibling;
if ( (nextNode === null) || (nextNode.nodeName != 'BR') ) {
break;
}
node = nextNode;
}
if (node.nodeName == 'BR') {
range.setStartBefore(node);
}
}
}
 
// extend right
var regExpMatchEnd = /\n+$/.exec(plainText);
if (regExpMatchEnd !== null) {
var newlines = regExpMatchEnd[0].length;
var node = range.endContainer;
var offset = range.endOffset;
if ( (node.nodeName == '#text') && (offset == node.textContent.length) ) {
for (var i = 0; i < newlines; i ++) {
var nextNode = node.nextSibling;
if ( (nextNode === null) || (nextNode.nodeName != 'BR') ) {
break;
}
node = nextNode;
}
if (node.nodeName == 'BR') {
range.setEndAfter(node);
}
}
}
}
}
}
}
break;
 
// paste
case 'paste':
wikEd.SelectPasted();
break;
}
}
range = sel.getRangeAt(0);
wikEd.paste.range = range.cloneRange();
wikEd.EditButton(null, 'wikEdPasting');
if (wikEd.paste === null) {
return;
}
 
// display floating pasted toolbar
if (range.getClientRects === undefined) {
wikEd.buttonBarPasted.style.left = '1px';
wikEd.buttonBarPasted.style.top = '1px';
}
 
// get cursor rectangle position
else {
var barWidth = wikEd.buttonBarPasted.offsetWidth;
var barHeight = wikEd.buttonBarPasted.offsetHeight;
 
// extend collapsed caret range to start, get last line coords
range.setStart(wikEd.frameBody, 0);
var rectList = range.getClientRects();
var rect = rectList[rectList.length - 1];
 
// vertical pos
if (rect.bottom + barHeight <= parseInt(wikEd.frameHeight)) {
wikEd.buttonBarPasted.style.top = rect.bottom + 'px';
}
else {
wikEd.buttonBarPasted.style.bottom = '1px';
}
 
// horizontal pos
if (rect.right + barWidth <= parseInt(wikEd.frameWidth)) {
wikEd.buttonBarPasted.style.left = rect.right + 'px';
}
else {
wikEd.buttonBarPasted.style.right = '1px';
}
}
 
// remove selection
sel.collapseToEnd();
 
wikEd.PastedSwitch();
return;
};
 
 
//
// wikEd.SelectPasted: select pasted text
// does not work good for Chromium that normalizes ranges into text nodes, see https://code.google.com/p/chromium/issues/detail?id=271445
//
 
wikEd.SelectPasted = function () {
 
var sel = wikEd.paste.sel;
var range = sel.getRangeAt(0);
 
// insert at start
if (wikEd.paste.atStart === true) {
range.setStart(wikEd.frameBody, 0);
}
 
// recover start node from saved previous node
else {
var offset = wikEd.paste.offset;
 
// reverse navigate back down to start node, start at prevNode, then descend prevUp levels
var preStartNode = null;
var prevNode = wikEd.paste.prevNode;
 
// node has been replaced
if (prevNode.parentNode === null) {
prevNode = wikEd.paste.parent.childNodes.item(wikEd.paste.prevNodeIndex);
wikEd.paste.pasteAtEndOfLine = false;
}
 
var node = prevNode;
var up = wikEd.paste.prevUp;
if (node.nextSibling !== null) {
node = node.nextSibling;
for (var i = 0; i < up; i ++) {
var child = node.firstChild;
if (child === null) {
wikEd.paste = null;
return;
}
node = child;
}
preStartNode = node;
}
 
// move up to first next node when element has been inserted at top level
else {
while ( (node.nextSibling === null) && (node.nodeName != 'BODY') ) {
node = node.parentNode;
}
if (node.nodeName != 'BODY') {
preStartNode = node.nextSibling;
}
}
 
// set range start
if (preStartNode.nodeName == '#text') {
range.setStart(preStartNode, offset);
}
 
// start after prevNode
else {
range.setStartAfter(prevNode);
}
 
// needed for Chrome
sel.removeAllRanges();
sel.addRange(range);
 
// check if range starts with a block
var node = range.startContainer;
var offset = range.startOffset;
 
// before or after text in textnode
if (node.nodeName == '#text') {
 
// get first insert parent with left sibling, from inside the insert up
if (offset === 0) {
while ( (node.previousSibling === null) && (node.nodeName != 'BODY') ) {
node = node.parentNode;
}
}
 
// find first insert sibling to right, from ouside into insert
else if (offset == node.textContent.length) {
while ( (node.nextSibling === null) && (node.nodeName != 'BODY') ) {
node = node.parentNode;
}
if (node.nodeName != 'BODY') {
node = node.nextSibling;
}
}
}
if (wikEd.paste.pasteAtEndOfLine === true) {
node = node.nextSibling;
}
 
// check if block element
if ( (node !== null) && (node.nodeName != 'BODY') && (node.nodeType == node.ELEMENT_NODE) ) {
if (wikEd.frameWindow.getComputedStyle(node).getPropertyValue('display') == 'block') {
wikEd.paste.blockStart = true;
}
}
 
// check if range ends with a block
var node = range.endContainer;
var offset = range.endOffset;
 
// before or after text in textnode
if (node.nodeName == '#text') {
 
// get first insert parent with right sibling, from inside the insert up
if (offset == node.textContent.length) {
while ( (node.nextSibling === null) && (node.nodeName != 'BODY') ) {
node = node.parentNode;
}
}
 
// find first insert sibling to left, from ouside into insert
else if (offset === 0) {
while ( (node.previousSibling === null) && (node.nodeName != 'BODY') ) {
node = node.parentNode;
}
if (node.nodeName != 'BODY') {
node = node.previousSibling;
}
}
}
 
// check if block element
if ( (node.nodeName != 'BODY') && (node.nodeType == node.ELEMENT_NODE) ) {
if (wikEd.GetStyle(node, 'display') == 'block') {
wikEd.paste.blockEnd = true;
}
}
}
 
// return if no content is selected
if (range.collapsed === true) {
wikEd.paste = null;
}
 
return;
};
 
 
//
// wikEd.PastedSwitch: set wikify/textify indicator after pasting wikified text
//
 
wikEd.PastedSwitch = function () {
 
if ( (wikEd.paste === null) || (wikEd.paste.polling === true) ) {
wikEd.PastedOff();
}
else {
if (wikEd.paste.last == 'wikify') {
document.getElementById('wikEdPastedTextify').className = 'wikEdButton';
document.getElementById('wikEdPastedWikify').className = 'wikEdButtonInactive';
}
else if (wikEd.paste.last == 'textify') {
document.getElementById('wikEdPastedTextify').className = 'wikEdButtonInactive';
document.getElementById('wikEdPastedWikify').className = 'wikEdButton';
}
document.getElementById('wikEdPastedTextify').style.cursor = '';
document.getElementById('wikEdPastedWikify').style.cursor = '';
wikEd.buttonBarPasted.style.visibility = 'visible';
 
// show text selection when mouse hovers over bar
wikEd.buttonBarPasted.addEventListener('mouseenter', wikEd.ButtonBarPastedHandler, true);
}
return;
};
 
 
//
// wikEd.PastedOff: invalidate wikify/textify of recently pasted wikified text
//
 
wikEd.PastedOff = function () {
 
wikEd.buttonBarPasted.removeEventListener('mouseenter', wikEd.ButtonBarPastedHandler, false);
wikEd.buttonBarPasted.removeEventListener('mouseleave', wikEd.ButtonBarPastedHandler, false);
wikEd.paste = null;
wikEd.buttonBarPasted.style.visibility = 'hidden';
return;
};
 
 
//
// wikEd.PastedClose: handler for pastedClose button on floating paste button bar
//
 
wikEd.PastedClose = function () {
 
var sel = wikEd.GetSelection();
sel.collapseToEnd();
wikEd.PastedOff();
wikEd.frameWindow.focus();
return;
};
 
 
//
// wikEd.ButtonBarPastedHandler: show text selection when mouse hovers over floating paste button bar
//
 
wikEd.ButtonBarPastedHandler = function (event) {
 
if (event.target == wikEd.buttonBarPasted) {
 
// add selection
if (event.type == 'mouseenter') {
wikEd.buttonBarPasted.removeEventListener('mouseenter', wikEd.ButtonBarPastedHandler, false);
if ( (wikEd.paste !== null) && (wikEd.paste.sel !== null) && (wikEd.paste.range !== null) ) {
wikEd.paste.sel.removeAllRanges();
wikEd.paste.sel.addRange(wikEd.paste.range);
}
wikEd.buttonBarPasted.addEventListener('mouseleave', wikEd.ButtonBarPastedHandler, false);
}
 
// remove selection
else if (event.type == 'mouseleave') {
wikEd.buttonBarPasted.removeEventListener('mouseleave', wikEd.ButtonBarPastedHandler, false);
if ( (wikEd.paste !== null) && (wikEd.paste.sel !== null) ) {
wikEd.paste.sel.collapseToEnd();
}
wikEd.buttonBarPasted.addEventListener('mouseenter', wikEd.ButtonBarPastedHandler, false);
}
}
return;
};
 
 
//
// wikEd.AntiHighlightBleeding: set cursor position into closest highest text node so that highlighting does not bleed out
// does not work under Google Chrome that forces the cursor into the previous node
//
 
wikEd.AntiHighlightBleeding = function (obj, editButtonInsert, direction) {
 
// check if disabled
if (wikEd.config.antiHighlightBleeding !== true) {
return;
}
 
// get selection object
if (obj.sel === undefined) {
obj.sel = wikEd.GetSelection();
}
 
// only if no text is selected
var range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
if ( (obj.sel.isCollapsed !== true) || (range.collapsed !== true) ) {
return;
}
 
// get focus node
// correct focusNode to actual (deepest) node
var focusNode = obj.sel.focusNode;
var focusOffset = obj.sel.focusOffset;
if (focusNode === null) {
return;
}
 
// setcorrect focusfocusNode into deepestleaf node
if ( (focusNode.childNodes !== null) && (focusNode.childNodes.length > 0) ) {
if ( (focusNode.childNodes.length > 0) && (focusOffset < focusNode.childNodes.length) ) {
focusNode = focusNode.childNodes.item(focusOffset);
focusOffset = 0;
}
if (focusNode.tagName != 'BR') {
 
range.setStart(focusNode, focusOffset);
// pasting behind "<br>: " (list)
range.setEnd(focusNode, focusOffset);
}else {
focusNode = focusNode.childNodes.item(focusOffset - 1);
focusOffset = focusNode.childNodes.length;
}
if (focusNode.tagName != 'BR') {
range.setStart(focusNode, focusOffset);
range.setEnd(focusNode, focusOffset);
}
}
 
// do not further correct if focus is linebreak if key but not if edit button
if ( (focusNode.tagName == 'BR') && (editButtonInsert !== true) ) {
return;
}
 
// do not leave opened hide box (refs, templates, charents, and table code)
// get next text-like node to the left if we are not in the middle of a text node
var node = focusNode;
var hidden = false;
while (node !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Show$/.test(node.className) === true) {
return;
}
 
// detect hidden node
if (
( (wikEd.refHide === true) && (/^((wikEd(Ref|Templ|CharEntity|Table))|(wikEdTableBR))$/.test(node.className) === true) ) ||
(/^(wikEdScroll(Before|After))$/.test(node.className) === true)
) {
focusNode = node;
hidden = true;
break;
}
node = node.parentNode;
}
 
// detect start of text
var startOfText = false;
if (focusOffset === 0) {
startOfText = true;
var node = focusNode;
while ( (node !== null) && (node != wikEd.frameBody) ) {
if (node.previousSibling !== null) {
startOfText = false;
break;
}
node = node.parentNode;
}
}
if (startOfText === true) {
range.setStartBefore(wikEd.frameBody);
range.setEndBefore(wikEd.frameBody);
return;
}
 
// get next text-like node to the left if we are not in the middle of a text node
var leftNode = focusNode;
var leftLevel = 0;
if ( (focusNode.nodeName != '#text') || (focusOffset === 0) || (hidden === true) ) {
var objLeft = {
var objLeft = {
'backwards': true
'backwards': true
};
};
if ( (focusNode.nodeName != '#text') || (focusOffset == 0) ) {
WikEdGetNextTextNodewikEd.GetNextTextNode(objLeft, focusNode, 0);
if (objLeft.foundNode !== undefined) {
}
if leftNode = (objLeft.foundNode != null) {;
leftNode leftLevel = objLeft.foundNodefoundLevel;
}
leftLevel = objLeft.foundLevel;
}
 
// get next text-like node to the right if we are not in the middle of a text node
var objRight = {
'backwards': false
};
var rightNode = focusNode;
var rightLevel = 0;
if ( (focusNode.nodeName != '#text') || (focusOffset == focusNode.textContent.length) || (hidden === true) ) {
WikEdGetNextTextNode(var objRight, focusNode,= 0);{
'backwards': false
}
};
if (objRight.foundNode != null) {
wikEd.GetNextTextNode(objRight, focusNode, 0);
rightNode = objRight.foundNode;
rightLevel =if (objRight.foundLevel;foundNode !== undefined) {
rightNode = objRight.foundNode;
rightLevel = objRight.foundLevel;
}
}
 
// check if we need to correct the focus node to higher level text-like node
var correctTo = '';
if (leftNode != rightNode) {
 
if ( (focusNode.tagName == 'BR') && (editButtonInsert == true) ) {
// get out of hidden element
if (hidden === true) {
 
// direction
if ( (direction == 'right') && (rightNode !== null) ) {
correctTo = 'right';
}
else if ( (direction == 'left') && (leftNode !== null) ) {
correctTo = 'left';
}
 
// right, left
else if (rightNode !== null) {
correctTo = 'right';
}
else if (leftNode !== null) {
correctTo = 'left';
}
}
 
// BR
else if ( (focusNode.tagName == 'BR') && (editButtonInsert === true) ) {
correctTo = 'left';
}
 
else if ( (leftLevel > rightLevel) && (leftNode != focusNode) ) {
// correct into heighest neighboring node
else if ( (leftNode !== null) && (leftLevel > rightLevel) && (leftNode != focusNode) ) {
correctTo = 'left';
}
else if ( (rightNode !== null) && (leftLevel < rightLevel) && (rightNode != focusNode) ) {
correctTo = 'right';
}
 
// same level, set focus outside tag markups (class names contains 'Tag'): [ [[ | || <
else if ( (leftNode !== null) && (rightNode !== null) && (leftLevel == rightLevel) ) {
 
// get class names
var leftClass = '';
if (leftNode.nodeName == '#text') {
Line 4,241 ⟶ 5,600:
}
 
// class names contains 'Tag'
if ( (/wikEd.*?Tag/.test(leftClass) != true) && (/wikEd.*?Tag/.test(rightClass) == true) && (leftNode != focusNode) ) {
if ( (/wikEd.*?Tag/.test(leftClass) !== true) && (/wikEd.*?Tag/.test(rightClass) === true) && (leftNode != focusNode) ) {
correctTo = 'left';
}
else if ( (/wikEd.*?Tag/.test(leftClass) === true) && (/wikEd.*?Tag/.test(rightClass) !== true) && (rightNode != focusNode) ) {
correctTo = 'right';
}
Line 4,250 ⟶ 5,610:
}
 
// set focus to the next left node
if (correctTo == 'left') {
var node;
 
// insert new text node after linebreak and focus
if (leftNode.tagName == 'BR') {
node = wikEdFrameDocumentwikEd.frameDocument.createTextNode('');
leftNode.parentNode.insertBefore(node, leftNode.nextSibling);
range.setStart(node, 0);
Line 4,274 ⟶ 5,634:
}
 
// set focus to the next right node
else if (correctTo == 'right') {
var node;
 
// insert new text node before linebreak
if (rightNode.tagName == 'BR') {
var node = wikEdFrameDocumentwikEd.frameDocument.createTextNode('');
rightNode.parentNode.insertBefore(node, rightNode);
range.setStart(node, 0);
Line 4,297 ⟶ 5,657:
}
}
 
return;
};
 
 
//
// WikEdResizeGripLoadHandlerwikEd.ResizeGripLoadHandler: event handler to determine grip background image size
//
 
windowwikEd.WikEdResizeGripLoadHandlerResizeGripLoadHandler = function (event) {
 
wikEd.resizeGripWidth = event.currentTarget.width;
// event compatibility fixes
wikEd.resizeGripHeight = event.currentTarget.height;
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
wikEdResizeGripWidth = event.currentTarget.width;
wikEdResizeGripHeight = event.currentTarget.height;
return;
};
Line 4,321 ⟶ 5,675:
 
//
// WikEdResizeGripHandlerwikEd.ResizeGripHandler: event handler for mouse over resize grip background image
//
 
windowwikEd.WikEdResizeGripHandlerResizeGripHandler = function (event) {
 
// Firefox bug during startup ("wikEd is not defined")
// prevent console errors about undefined functions and variables (Firefox bug)
if (typeof(WikEdEvent)wikEd === 'undefined') {
return;
}
 
if (wikEd.useWikEd === true) {
// Firefox bug during startup ("WikEdEvent is not defined")
if (typeof(WikEdEvent) != 'function' ) {
return;
}
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
if (wikEdUseWikEd == true) {
if (event.type == 'mousemove') {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
 
// move into grip
if (wikEdResizeFrameMouseOverGripwikEd.resizeFrameMouseOverGrip === false) {
if (event.clientY >= wikEdFrameBodywikEd.frameBody.clientHeight - wikEdResizeGripHeightwikEd.resizeGripHeight) {
if (event.clientX >= wikEdFrameBodywikEd.frameBody.clientWidth - wikEdResizeGripWidthwikEd.resizeGripWidth) {
if ( (event.clientY < wikEdFrameBodywikEd.frameBody.clientHeight) && (event.clientX < wikEdFrameBodywikEd.frameBody.clientWidth) ) {
wikEdResizeFrameMouseOverGripwikEd.resizeFrameMouseOverGrip = true;
if (wikEdFullScreenModewikEd.fullscreen === true) {
wikEdFrameBodywikEd.frameBody.style.cursor = 'alias';
}
else {
WikEdAddEventListenerwikEd.frameDocument.addEventListener(wikEdFrameDocument, 'mousedown', WikEdResizeStartHandlerwikEd.ResizeStartHandler, true);
wikEdFrameBodywikEd.frameBody.style.cursor = 'move';
}
}
Line 4,364 ⟶ 5,707:
}
 
// move out of grip
else if (wikEdResizeFrameActivewikEd.resizeFrameActive === false) {
if (
(event.clientY < wikEdFrameBodywikEd.frameBody.clientHeight - wikEdResizeGripHeightwikEd.resizeGripHeight) ||
(event.clientX < wikEdFrameBodywikEd.frameBody.clientWidth - wikEdResizeGripWidthwikEd.resizeGripWidth)
) {
wikEdResizeFrameMouseOverGripwikEd.resizeFrameMouseOverGrip = false;
WikEdRemoveEventListenerwikEd.frameDocument.removeEventListener(wikEdFrameDocument, 'mousedown', WikEdResizeStartHandlerwikEd.ResizeStartHandler, true);
wikEdFrameBodywikEd.frameBody.style.cursor = 'auto';
}
}
Line 4,383 ⟶ 5,726:
 
//
// WikEdResizeStartHandlerwikEd.ResizeStartHandler: event handler to start the resizing of the editing frame
//
 
windowwikEd.WikEdResizeStartHandlerResizeStartHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
if ( (event.type == WikEdEvent'mousedown') && (event,.button this=== 0); ) {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
if (event == null) {
if (event.clientY >= wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) {
return;
if (event.clientX >= wikEd.frameBody.clientWidth - wikEd.resizeGripWidth) {
}
if ( (event.clientY < wikEd.frameBody.clientHeight) && (event.clientX < wikEd.frameBody.clientWidth) ) {
 
if (wikEdUseWikEd == true) {
if ( (event.type == 'mousedown') && (event.button == 0) ) {
if ( (event.shiftKey == false) && (event.ctrlKey == false) && (event.altKey == false) && (event.metaKey == false) ) {
if (event.clientY >= wikEdFrameBody.clientHeight - wikEdResizeGripHeight) {
if (event.clientX >= wikEdFrameBody.clientWidth - wikEdResizeGripWidth) {
if ( (event.clientY < wikEdFrameBody.clientHeight) && (event.clientX < wikEdFrameBody.clientWidth) ) {
event.preventDefault();
wikEdResizeFrameActivewikEd.resizeFrameActive = true;
 
wikEdResizeFramePageYStartwikEd.resizeFramePageYStart = event.pageY;
wikEdResizeFramePageXStartwikEd.resizeFramePageXStart = event.pageX;
 
wikEdResizeFrameOffsetHeightwikEd.resizeFrameOffsetHeight = wikEdFramewikEd.frame.offsetHeight;
wikEdResizeFrameOffsetWidthwikEd.resizeFrameOffsetWidth = wikEdFramewikEd.frame.offsetWidth;
WikEdAddEventListenerwikEd.frameDocument.addEventListener(wikEdFrameDocument, 'mouseup', WikEdResizeStopHandlerwikEd.ResizeStopHandler, true);
WikEdAddEventListenerdocument.addEventListener(document, 'mouseup', WikEdResizeStopHandlerwikEd.ResizeStopHandler, true);
WikEdAddEventListenerwikEd.frameDocument.addEventListener(wikEdFrameDocument, 'mousemove', WikEdResizeDragHandlerFramewikEd.ResizeDragHandlerFrame, true);
WikEdAddEventListenerdocument.addEventListener(document, 'mousemove', WikEdResizeDragHandlerDocumentwikEd.ResizeDragHandlerDocument, true);
}
}
Line 4,423 ⟶ 5,760:
 
//
// WikEdResizeStopHandlerwikEd.ResizeStopHandler: event handler to stop the resizing of the editing frame
//
 
windowwikEd.WikEdResizeStopHandlerResizeStopHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
if ( (event === WikEdEventundefined) || (event,.type this== 'mouseup'); ) {
wikEd.frameDocument.removeEventListener('mouseup', wikEd.ResizeStopHandler, true);
if (event == null) {
document.removeEventListener('mouseup', wikEd.ResizeStopHandler, true);
return;
wikEd.frameDocument.removeEventListener('mousemove', wikEd.ResizeDragHandlerFrame, true);
}
document.removeEventListener('mousemove', wikEd.ResizeDragHandlerDocument, true);
 
if (wikEdUseWikEd == true) {
if (event.type == 'mouseup') {
WikEdRemoveEventListener(wikEdFrameDocument, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(document, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(wikEdFrameDocument, 'mousemove', WikEdResizeDragHandlerFrame, true);
WikEdRemoveEventListener(document, 'mousemove', WikEdResizeDragHandlerDocument, true);
 
if (
(event.clientY <=== wikEdFrameBody.clientHeight - wikEdResizeGripHeightundefined) ||
(event.clientXclientY < wikEdFrameBodywikEd.clientWidthframeBody.clientHeight - wikEdResizeGripWidthwikEd.resizeGripHeight) ||
(event.clientX < wikEd.frameBody.clientWidth - wikEd.resizeGripWidth)
) {
wikEdResizeFrameMouseOverGripwikEd.resizeFrameMouseOverGrip = false;
WikEdRemoveEventListenerwikEd.frameDocument.removeEventListener(wikEdFrameDocument, 'mousedown', WikEdResizeStartHandlerwikEd.ResizeStartHandler, true);
wikEdFrameBodywikEd.frameBody.style.cursor = 'auto';
}
}
wikEdResizeFrameActivewikEd.resizeFrameActive = false;
}
return;
Line 4,457 ⟶ 5,789:
 
//
// WikEdResizeDragHandlerFramewikEd.ResizeDragHandlerFrame: event handler for editing frame resizing by mouse dragging (frame event)
//
 
windowwikEd.WikEdResizeDragHandlerFrameResizeDragHandlerFrame = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
var diffY = event.pageY - wikEdResizeFramePageYStartwikEd.resizeFramePageYStart;
var diffX = event.pageX - wikEdResizeFramePageXStartwikEd.resizeFramePageXStart;
 
var frameHeightNew = wikEdResizeFrameOffsetHeightwikEd.resizeFrameOffsetHeight + diffY;
var frameWidthNew = wikEdResizeFrameOffsetWidthwikEd.resizeFrameOffsetWidth + diffX;
 
if (frameHeightNew >= 100) {
wikEdFrameHeightwikEd.frameHeight = frameHeightNew + 'px';
wikEdFramewikEd.frame.style.height = wikEdFrameHeightwikEd.frameHeight;
}
if (frameWidthNew >= 100) {
wikEdFrameWidthwikEd.frameWidth = frameWidthNew + 'px';
wikEdFramewikEd.frame.style.width = wikEdFrameWidthwikEd.frameWidth;
}
}
Line 4,489 ⟶ 5,815:
 
//
// WikEdResizeDragHandlerDocumentwikEd.ResizeDragHandlerDocument: event handler for editing frame resizing by mouse dragging (document event)
//
 
windowwikEd.WikEdResizeDragHandlerDocumentResizeDragHandlerDocument = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
var diffY = event.pageY - wikEdResizeFramePageYStartwikEd.resizeFramePageYStart - WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdFramewikEd.frame);
var diffX = event.pageX - wikEdResizeFramePageXStartwikEd.resizeFramePageXStart - WikEdGetOffsetLeftwikEd.GetOffsetLeft(wikEdFramewikEd.frame);
 
var frameHeightNew = wikEdResizeFrameOffsetHeightwikEd.resizeFrameOffsetHeight + diffY;
var frameWidthNew = wikEdResizeFrameOffsetWidthwikEd.resizeFrameOffsetWidth + diffX;
 
if (frameHeightNew >= 100) {
wikEdFrameHeightwikEd.frameHeight = frameHeightNew + 'px';
wikEdFramewikEd.frame.style.height = wikEdFrameHeightwikEd.frameHeight;
}
if (frameWidthNew >= 100) {
wikEdFrameWidthwikEd.frameWidth = frameWidthNew + 'px';
wikEdFramewikEd.frame.style.width = wikEdFrameWidthwikEd.frameWidth;
}
}
Line 4,521 ⟶ 5,841:
 
//
// WikEdResizeFrameResetHandlerwikEd.ResizeFrameResetHandler: event handler to reset the editing frame size
//
 
windowwikEd.WikEdResizeFrameResetHandlerResizeFrameResetHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
 
if (wikEdUseWikEd == true) {
if (event.type == 'dblclick') {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
if (event.clientY > wikEdFrameBodywikEd.frameBody.clientHeight - wikEdResizeGripHeightwikEd.resizeGripHeight) {
if (event.clientX > wikEdFrameBodywikEd.frameBody.clientWidth - wikEdResizeGripWidthwikEd.resizeGripWidth) {
if ( (event.clientY < wikEdFrameBodywikEd.frameBody.clientHeight) && (event.clientX < wikEdFrameBodywikEd.frameBody.clientWidth) ) {
 
// end fullscreen mode
if (wikEdFullScreenModewikEd.fullscreen === true) {
WikEdFullScreenwikEd.FullScreen(false, true);
}
 
// reset size to default
wikEdFrameHeightwikEd.frameHeight = (wikEdTextareaOffsetHeightInitialwikEd.textareaOffsetHeightInitial - wikEdFrameBorderHeightwikEd.frameBorderHeight) + 'px';
wikEdFrameWidthwikEd.frameWidth = (wikEdEditorWrapperwikEd.editorWrapper.clientWidth - wikEdFrameBorderWidthwikEd.frameBorderWidth) + 'px';
wikEdFramewikEd.frame.style.height = wikEdFrameHeightwikEd.frameHeight;
wikEdFramewikEd.frame.style.width = wikEdFrameWidthwikEd.frameWidth;
 
// end resizing
wikEd.ResizeStopHandler();
WikEdRemoveEventListener(wikEdFrameDocument, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(document, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(wikEdFrameDocument, 'mousemove', WikEdResizeDragHandlerFrame, true);
WikEdRemoveEventListener(document, 'mousemove', WikEdResizeDragHandlerDocument, true);
wikEdResizeFrameMouseOverGrip = false;
WikEdRemoveEventListener(wikEdFrameDocument, 'mousedown', WikEdResizeStartHandler, true);
wikEdFrameBody.style.cursor = 'auto';
wikEdResizeFrameActive = false;
}
}
Line 4,570 ⟶ 5,877:
 
//
// WikEdDebugHandlerwikEd.DebugHandler: event handler tofor cleardebug ortextarea: hideclear the(double debugclick) textareaor onhide (shift/ctrl/alt) -double click)
//
 
windowwikEd.WikEdDebugHandlerDebugHandler = function (event) {
 
if ( (event.shiftKey === true) || (event.ctrlKey === true) || (event.altKey === true) || (event.metaKey === true) ) {
wikEdDebugWrapperwikEd.debugWrapper.style.visibilitydisplay = 'hiddennone';
wikEd.debugOpen = false;
wikEdDebug.style.display = 'none';
 
wikEdDebugOpen = false;
// resize fullscreen frame
if (wikEd.fullScreenMode === true) {
wikEd.ResizeWindowHandler();
}
}
else {
wikEdDebugwikEd.debug.value = '';
}
return;
Line 4,588 ⟶ 5,899:
 
//
// WikEdPrevWrapperHandlerwikEd.PrevWrapperHandler: event handler for preview box: scroll to closeedit previewfield /(double diffclick) boxor onclose (shift/ctrl/alt-double click)
//
 
windowwikEd.WikEdPrevWrapperHandlerPrevWrapperHandler = function (event) {
 
// close (shift/ctrl/alt-double click)
wikEdLocalPrevWrapper.style.display = 'none';
if ( (event.shiftKey === true) || (event.ctrlKey === true) || (event.altKey === true) || (event.metaKey === true) ) {
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'none';
 
wikEd.localPrevWrapper.style.height = 'auto';
 
// reinstate interrupted fullscreen mode
if (wikEd.fullScreenMode === true) {
wikEd.FullScreen(true);
}
}
 
// scroll to edit field (double click)
else {
 
// filter out selecting double clicks on text
var sel = window.getSelection();
 
// explicitOriginalTarget (Firefox)
var textTarget = event.explicitOriginalTarget;
if (textTarget !== undefined) {
if (textTarget.nodeName == '#text') {
return;
}
}
 
// ignore for non-blank selection
else if ( (sel !== null) && (/^\s*$/.test(sel.toString()) === false) ) {
return;
}
sel.collapseToEnd();
 
// scroll to edit field
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
}
return;
};
Line 4,599 ⟶ 5,946:
 
//
// WikEdSetLogowikEd.SetLogo: set the logo on top of the page
//
 
windowwikEd.WikEdSetLogoSetLogo = function (state, parameter) {
 
var src = '';
var alt = '';
var title = '';
if (state == 'error') {
wikEdLogo.src = wikEdConfig['wikEd.config.image']['error'];
wikEdLogo.alt = wikEdConfig['wikEd.config.text']['wikEdLogo error alt'];
wikEdLogo.title = wikEdConfig['wikEd.config.text']['wikEdLogo error title'];
}
else if (state == 'browser') {
wikEdLogo.src = wikEdConfig['wikEd.config.image']['browser'];
wikEdLogo.alt = wikEdConfig['wikEd.config.text']['wikEdLogo browser alt'];
wikEdLogo.title = wikEdConfig['wikEd.config.text']['wikEdLogo browser title'];
}
else if (state == 'incompatible') {
wikEdLogo.src = wikEdConfig['wikEd.config.image']['incompatible'];
wikEdLogo.alt = wikEdConfig['wikEd.config.text']['wikEdLogo incompatible alt'];
wikEdLogo.title = wikEdConfig['wikEd.config.text']['wikEdLogo incompatible title'];
}
else {
if (wikEdDisabledwikEd.disabled === true) {
wikEdLogo.src = wikEdConfig['wikEd.config.image']['disabled'];
wikEdLogo.alt = wikEdConfig['wikEd.config.text']['wikEdLogo disabled alt'];
wikEdLogo.title = wikEdConfig['wikEd.config.text']['wikEdLogo disabled title'];
}
else if (wikEd.testVersion === true) {
src = wikEd.config.image['testVersion'];
alt = wikEd.config.text['wikEdLogo testVersion alt'];
title = wikEd.config.text['wikEdLogo testVersion title'];
}
else {
wikEdLogo.src = wikEdConfig['wikEd.config.image']['logo'];
wikEdLogo.alt = wikEdConfig['wikEd.config.text']['wikEdLogo alt'];
wikEdLogo.title = wikEdConfig['wikEd.config.text']['wikEdLogo title'];
}
}
if (parameter !== undefined) {
var version = wikEdProgramVersion;
title = title.replace(/\{wikEdParameter\}/g, parameter);
if (wikEdConfig['gadget'] == true) {
version += ' G';
}
title = title.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
else if (wikEdGreasemonkey == true) {
title = title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
version += ' GM';
wikEd.logo.src = src;
}
wikEd.logo.alt = alt;
else if (wikEdGreasemonkeyToHead == true) {
wikEd.logo.title = title;
version += ' GMH';
}
wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdParameter\}/g, parameter);
wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramVersion\}/g, version);
wikEdLogo.title = wikEdLogo.title.replace(/\{wikEdProgramDate\}/g, wikEdProgramDate);
 
return;
};
Line 4,650 ⟶ 5,999:
 
//
// wikEd.MakeButtonBar: generate button bar div element
//
 
windowwikEd.MakeButtonBar = function (bar) {
 
// id outer, class outer, id inner, class inner, alt, button numbers
var barId = bar[0];
var barClass = bar[1];
Line 4,663 ⟶ 6,012:
var gripTitle = bar[5];
var buttonNumbers = bar[6];
var barTitle = bar[7];
 
// collect the buttons
var buttons = '';
for (var i = 0; i < buttonNumbers.length; i ++) {
Line 4,687 ⟶ 6,037:
break;
default:
var currButton = wikEdConfig['wikEd.config.button'][buttonNo];
if (typeof( currButton) != 'object') {
window.alert('Loading error: The button "' + buttonNumbers[i] + '" is not defined.');
}
if ( (currButton[0] == 'wikEdSource') && (wikEdConfig['wikEd.config.showSourceButton'] !== true) && (wikEd.config.debug !== true) ) {
break;
}
else if ( (currButton[0] == 'wikEdUsing') && (wikEdConfig['wikEd.config.showUsingButton'] !== true) ) {
break;
}
else if ( (currButton[0] == 'wikEdTableMode') && (wikEdConfig['wikEd.config.showTableModeButton'] !== true) ) {
break;
}
 
// add accesskey information to button titlehtml andcode
buttons += wikEd.MakeButtonCode(buttonNo);
var accessKey = '';
if (wikEdConfig['buttonKey'][buttonNo] != null) {
accessKey = ' [' + wikEdConfig['text']['alt-shift'] + wikEdConfig['buttonKey'][buttonNo][0] + ']';
 
// initialize wikEdButtonKeyCode[keyCode] = id
wikEdButtonKeyCode[ (wikEdConfig['buttonKey'][buttonNo][1]) ] = currButton[0];
}
 
// add button html code
buttons += '<img id="' + currButton[0] + '" class="' + currButton[1] + '" title="' + currButton[2] + accessKey +'" src="' + currButton[3] + '" width="' + currButton[4] + '" height="' + currButton[5] + '" alt="' + currButton[6] + '">';
 
// collect click event info
wikEdEditButtonHandler[ currButton[0] ] = currButton[7];
}
}
 
// create the button bar div
var div = document.createElement('div');
div.id = barId;
div.className = barClass;
if ( (barTitle !== undefined) && (barTitle !== '') ) {
 
barTitle = barTitle.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
barTitle = barTitle.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
div.title = barTitle;
}
var buttonsStyle = '';
if (barHeight > 0) {
Line 4,728 ⟶ 6,070:
}
 
// make a grip bar
var html = '';
if (gripTitle !== null) {
var gripStyle = 'width: ' + wikEdConfig['wikEd.config.buttonBarGripWidth'] + 'px; ';
if (barHeight > 0) {
gripStyle += 'height: ' + barHeight + 'px; ';
Line 4,756 ⟶ 6,098:
}
 
// make a standard no-grip bar
else {
html += '<div id="' + buttonsId + '" class="' + buttonsClass + '"' + buttonsStyle + '">';
html += buttons;
html += '</div>';
}
div.innerHTML = html;
return div;
};
 
 
//
// wikEd.MakeButtonCode: create button code and register
//
 
wikEd.MakeButtonCode = function (buttonNo, type) {
 
var currButton = wikEd.config.button[buttonNo];
 
// add accesskey information to button title
var accessKey = '';
if (wikEd.config.buttonKey[buttonNo] !== undefined) {
accessKey = ' [' + wikEd.config.text['alt-shift'] + wikEd.config.buttonKey[buttonNo][0] + ']';
 
// initialize wikEd.buttonKeyCode[keyCode] = id
wikEd.buttonKeyCode[ (wikEd.config.buttonKey[buttonNo][1]) ] = currButton[0];
}
 
// add button html code
var html;
if (type == 'button') {
html = '<button type="button" id="' + currButton[0] + '" class="' + currButton[1] + '" title="' + currButton[2] + accessKey +'"><img src="' + currButton[3] + '" width="' + currButton[4] + '" height="' + currButton[5] + '" alt="' + currButton[6] + '"></button>';
}
else {
html = '<img id="' + currButton[0] + '" class="' + currButton[1] + '" title="' + currButton[2] + accessKey +'" src="' + currButton[3] + '" width="' + currButton[4] + '" height="' + currButton[5] + '" alt="' + currButton[6] + '">';
}
 
// collect click event info
wikEd.editButtonHandler[ currButton[0] ] = currButton[7];
 
return(div) html;
};
 
 
//
// WikEdButtonBarInitwikEd.ButtonBarInit: hide buttons bar, see also WikEdButtonBarGripHandlerwikEd.ButtonBarGripHandler()
//
 
windowwikEd.WikEdButtonBarInitButtonBarInit = function (bar) {
 
if (WikEdGetPersistentwikEd.GetSavedSetting(bar.id + 'Hidden') === '1'true) {
var barInnerWrapper = bar.firstChild;
var gripWrapper = barInnerWrapper.firstChild;
Line 4,783 ⟶ 6,157:
gripWrapper.className = 'wikEdButtonBarGripWrapperHidden';
buttonsWrapper.className = 'wikEdButtonBarButtonsWrapperHidden';
wikEdButtonsWrapperWidthwikEd.buttonsWrapperWidth[bar.id] = buttonsWrapper.offsetWidth;
buttonsWrapper.style.display = 'none';
WikEdAddEventListenergrip.addEventListener(grip, 'mouseover', WikEdButtonBarGripHandlerwikEd.ButtonBarGripHandler, true);
}
return;
Line 4,792 ⟶ 6,166:
 
//
// WikEdSetEditAreawikEd.SetEditArea: apply css changes to switch between classic textarea and rich text frame
//
 
windowwikEd.WikEdSetEditAreaSetEditArea = function (useFrame, notFrame) {
 
var scrollRatio = null;
 
// turn rich text frame on
if (useFrame === true) {
scrollRatio = wikEdTextareawikEd.textarea.scrollTop / wikEdTextareawikEd.textarea.scrollHeight;
 
// remember resized textarea dimensions
wikEdTextareaHeightwikEd.textareaHeight = (wikEdTextareawikEd.textarea.offsetHeight - wikEdTextareaBorderHeightwikEd.textareaBorderHeight) + 'px';
wikEdTextareaWidthwikEd.textareaWidth = '100%';
 
wikEdTextareaWrapperwikEd.textareaWrapper.style.position = 'absolute';
wikEdTextareaWrapperwikEd.textareaWrapper.style.visibility = 'hidden';
wikEdTextareawikEd.textarea.style.display = 'none';
 
if (notFrame !== true) {
wikEdFrameWrapperwikEd.frameWrapper.style.position = 'static';
wikEdFrameWrapperwikEd.frameWrapper.style.visibility = 'visible';
wikEdFrameBodywikEd.frameBody.style.display = 'block';
}
 
// set visibility of native toolbar
if (wikEdToolbar != null) {
if (wikEdCloseToolbarwikEd.closeToolbar === true) {
wikEdToolbarWrapperwikEd.toolbarWrapper.style.display = 'none';
}
else {
wikEdToolbarWrapper.style.display = 'block';
}
}
else {
if (wikEdButtonBarFormat != null) {
wikEdButtonBarFormatwikEd.toolbarWrapper.style.display = 'block';
}
 
if (wikEd.buttonBarFormat !== null) {
wikEd.buttonBarFormat.style.display = 'block';
}
if (wikEdButtonBarTextifywikEd.buttonBarTextify !== null) {
wikEdButtonBarTextifywikEd.buttonBarTextify.style.display = 'block';
}
if (wikEdButtonBarCustom1wikEd.buttonBarCustom1 !== null) {
wikEdButtonBarCustom1wikEd.buttonBarCustom1.style.display = 'block';
}
if (wikEdButtonBarFindwikEd.buttonBarFind !== null) {
wikEdButtonBarFindwikEd.buttonBarFind.style.display = 'block';
}
if (wikEdButtonBarFixwikEd.buttonBarFix !== null) {
wikEdButtonBarFixwikEd.buttonBarFix.style.display = 'block';
}
if (wikEdButtonBarCustom2wikEd.buttonBarCustom2 !== null) {
wikEdButtonBarCustom2wikEd.buttonBarCustom2.style.display = 'block';
}
if (wikEdButtonBarControlwikEd.buttonBarControl !== null) {
wikEdButtonBarControlwikEd.buttonBarControl.style.display = 'block';
}
wikEdFrameBodywikEd.frameBody.scrollTop = scrollRatio * wikEdFrameBodywikEd.frameBody.scrollHeight;
wikEd.ResizeWindowHandler();
}
 
// turn classic textarea on
else {
scrollRatio = wikEdFrameBodywikEd.frameBody.scrollTop / wikEdFrameBodywikEd.frameBody.scrollHeight;
if (notFrame !== true) {
 
// get resized frame dimensions for textarea
if (wikEdUseWikEdwikEd.useWikEd === true) {
wikEd.textareaHeight = wikEd.frameHeight;
wikEdTextareaHeight = wikEdFrameHeight;
wikEdTextareaWidthwikEd.textareaWidth = '100%';
}
wikEdFrameWrapperwikEd.frameWrapper.style.position = 'absolute';
wikEdFrameWrapperwikEd.frameWrapper.style.visibility = 'hidden';
// Mozilla or wikEd bug: <br> insertion before text a while after setting display to 'none', test with setTimeout('alert(wikEdFrameBodywikEd.frameBody.innerHTML)', 1000);
// wikEdFrameBody// wikEd.frameBody.style.display = 'none';
}
wikEdTextareaWrapperwikEd.textareaWrapper.style.position = 'static';
wikEdTextareaWrapperwikEd.textareaWrapper.style.visibility = 'visible';
 
wikEdTextareawikEd.textarea.style.height = wikEdTextareaHeightwikEd.textareaHeight;
wikEdTextareawikEd.textarea.style.width = wikEdTextareaWidthwikEd.textareaWidth;
wikEdTextareawikEd.textarea.style.display = 'block';
 
// force visibility of native toolbar
if (wikEdToolbarWrapper != null) {
if (wikEd.toolbarWrapper !== null) {
wikEdToolbarWrapper.style.display = 'block';
wikEd.toolbarWrapper.style.display = 'block';
}
if (wikEdButtonBarFormatwikEd.buttonBarFormat !== null) {
wikEdButtonBarFormatwikEd.buttonBarFormat.style.display = 'none';
}
if (wikEdButtonBarTextifywikEd.buttonBarTextify !== null) {
wikEdButtonBarTextifywikEd.buttonBarTextify.style.display = 'none';
}
if (wikEdButtonBarCustom1wikEd.buttonBarCustom1 !== null) {
wikEdButtonBarCustom1wikEd.buttonBarCustom1.style.display = 'none';
}
if (wikEdButtonBarFindwikEd.buttonBarFind !== null) {
wikEdButtonBarFindwikEd.buttonBarFind.style.display = 'none';
}
if (wikEdButtonBarFixwikEd.buttonBarFix !== null) {
wikEdButtonBarFixwikEd.buttonBarFix.style.display = 'none';
}
if (wikEdButtonBarCustom2wikEd.buttonBarCustom2 !== null) {
wikEdButtonBarCustom2wikEd.buttonBarCustom2.style.display = 'none';
}
if (wikEdButtonBarControlwikEd.buttonBarControl !== null) {
wikEdButtonBarControlwikEd.buttonBarControl.style.display = 'block';
}
wikEdTextareawikEd.textarea.scrollTop = scrollRatio * wikEdTextareawikEd.textarea.scrollHeight;
}
 
return;
};
Line 4,903 ⟶ 6,278:
 
//
// WikEdButtonwikEd.Button: toggle or set button checked state
// used for buttons that do not require nor change the text. Faster than WikEdEditButtonwikEd.EditButton()
//
 
windowwikEd.WikEdButtonButton = function (buttonObj, buttonId, toggleButton, setButton, classButton, doButton) {
if (buttonObj !== null) {
 
if (buttonObj != null) {
 
// check if the button is disabled
if (buttonObj.className == 'wikEdButtonInactive') {
return;
}
 
// set button to pressed, set cursor to hourglass
buttonObj.style.cursor = 'wait';
 
// init the button
if (setButton !=== nullfalse) {
if buttonObj.setAttribute(setButton =='checked', false) {;
if (classButton === undefined) {
buttonObj.setAttribute('checked', false);
buttonObj.className = 'wikEdButtonUnchecked';
if (classButton == null) {
buttonObj.className = 'wikEdButtonUnchecked';
}
}
else {}
else if (setButton === true) {
buttonObj.setAttribute('checked', true);
buttonObj.setAttribute('checked', true);
if (classButton == null) {
if (classButton === undefined) {
buttonObj.className = 'wikEdButtonChecked';
buttonObj.className = 'wikEdButtonChecked';
}
}
}
else if (typeof classButton !== null'string') {
buttonObj.className = classButton;
}
else {
doButton = true;
}
 
// toggle the button
if (toggleButton !=== nulltrue) {
if (toggleButtonbuttonObj.getAttribute('checked') === 'true') {
if buttonObj.setAttribute(WikEdGetAttribute(buttonObj, 'checked'), == 'true'false) {;
buttonObj.setAttribute(className = 'checkedwikEdButtonUnchecked', false);
}
buttonObj.className = 'wikEdButtonUnchecked';
}else {
buttonObj.setAttribute('checked', true);
else {
buttonObj.setAttribute(className = 'checkedwikEdButtonChecked', true);
buttonObj.className = 'wikEdButtonChecked';
}
}
}
}
 
// perform specific actions
var focusFrame = false;
if ( ( (setButtondoButton == null) && (classButton == null) ) || (doButton == true) ) {
 
// textarea no longer up to date
wikEd.textareaUpdated = false;
 
// remove active content
WikEdRemoveElementswikEd.RemoveElements(['script', 'object', 'applet', 'embed']);
 
switch (buttonId) {
 
// switch between syntax highlighting and plain text
case 'wikEdHighlightSyntax':
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') == 'true') {
wikEdHighlightSyntaxwikEd.highlightSyntax = true;
WikEdSetPersistentwikEd.SetPersistent('wikEdSyntaxOff', '0', 0, '/');
if (wikEdRefHidewikEd.refHide === true) {
wikEdFrameBodywikEd.frameBody.className = 'wikEdFrameBodyNewbie';
}
else {
wikEdFrameBodywikEd.frameBody.className = 'wikEdFrameBodySyntax';
}
}
else {
wikEdHighlightSyntaxwikEd.highlightSyntax = false;
WikEdSetPersistentwikEd.SetPersistent('wikEdSyntaxOff', '1', 0, '/');
wikEdFrameBodywikEd.frameBody.className = 'wikEdFrameBodyPlain';
}
 
// do not keep whole text selected
WikEdEditButtonwikEd.EditButton( null, 'wikEdUpdateAll', {'keepSel': false} );
break;
 
// toggle table mode // {{TABLE}}button
case 'wikEdTableMode':
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') != 'true') {
wikEdTableModewikEd.tableMode = false;
WikEdEditButtonwikEd.EditButton( null, 'wikEdUpdateAll', {'keepSel': false} );
}
else {
wikEdTableModewikEd.tableMode = true;
WikEdEditButtonwikEd.EditButton( null, 'wikEdTablifywikEdUpdateAll', {'keepSel': false} );
}
break;
 
// align textbox with display top
case 'wikEdScrollToPreview':
case 'wikEdScrollToPreview2':
case 'wikEdScrollToPreview3':
window.scroll(0, WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdSaveButtonwikEd.submitWrapper));
focusFrame = true;
break;
 
// align edit buttons with display top
case 'wikEdScrollToEdit':
case 'wikEdScrollToEdit2':
case 'wikEdScrollToEdit3':
case 'wikEdScrollToEdit4':
window.scroll(0, WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdInputWrapperwikEd.inputWrapper));
focusFrame = true;
break;
 
// cycle through different font sizes
case 'wikEdTextZoomDown':
wikEdTextSizewikEd.textSize = wikEdTextSizewikEd.textSize / 1.2;
if (wikEdTextSizewikEd.textSize < wikEdTextSizeInitwikEd.textSizeInit / 1.2 / 1.2) {
wikEdTextSizewikEd.textSize = wikEdTextSizeInitwikEd.textSizeInit * 1.2 * 1.2;
}
wikEdFrameBodywikEd.frameBody.style.fontSize = wikEdTextSizewikEd.textSize + 'px';
focusFrame = true;
break;
 
// cycle through different font sizes
case 'wikEdTextZoomUp':
wikEdTextSizewikEd.textSize = wikEdTextSizewikEd.textSize * 1.2;
if (wikEdTextSizewikEd.textSize > wikEdTextSizeInitwikEd.textSizeInit * 1.2 * 1.2) {
wikEdTextSizewikEd.textSize = wikEdTextSizeInitwikEd.textSizeInit / 1.2 / 1.2;
}
wikEdFrameBodywikEd.frameBody.style.fontSize = wikEdTextSizewikEd.textSize + 'px';
focusFrame = true;
break;
 
// display local preview box
case 'wikEdLocalPreview':
wikEd.LocalPreview();
if (wikEdFullScreenMode == true) {
WikEdFullScreen(false);
}
if (wikEdUseWikEd == true) {
WikEdUpdateTextarea();
}
 
// clear box to display loading indicator, keep wrapper height to prevent scrolling
var previewHeight = wikEdPreviewBox.offsetHeight;
if ( (wikEdPreviewBox.innerHTML != '') && (previewHeight > 0) ) {
wikEdPreviewBox.style.height = previewHeight + 'px';
}
wikEdPreviewBox.innerHTML = wikEdConfig['text']['wikEdPreviewLoading'];
wikEdLocalPrevWrapper.style.display = 'inline';
 
// prepare ajax preview
wikEdPreviewIsAjax = false;
var bodyData = wikEdTextarea.value;
 
// Opera 0.9.51
bodyData = bodyData.replace(/\r\n|\n\r|\r/g, '\n');
 
if (wikEdConfig['useAjaxPreview'] == true) {
var livePreview = true;
 
// articles on watchlist preview page
if (wikEdWatchlistEdit == true) {
bodyData = bodyData.replace(/\n{1}/g, '\n\n');
bodyData = bodyData.replace(/(.+)/g,
function (p, p1) {
if (/[\#<>\[\]\|\{\}]/.test(p1) == true) {
return(p1);
}
var article = p1;
var talk;
if (/:/.test(article) == true) {
 
// postfix (User_talk) or prefix (Discussion_Utilisateur), test for xxx_ vs. _xxx (all ASCII non-letters as separator)
// Firefox 3.6.7 + Greasemonkey 0.8.20100408.06: invalid range with \{-‰ and \x8f-™
if (/[ -\/\:-\@\[-\`\{-\x88‰‹\x8d\x8f-\x98™›\x9d\xa0-»¿×÷]/.test(wikEdConfig['text']['talk namespace suffix']) == true) {
talk = article.replace(/([^:]*)/, wikEdConfig['text']['talk namespace suffix'] + '$1');
}
else {
talk = article.replace(/([^:]*)/, '$1' + wikEdConfig['text']['talk namespace suffix']);
}
}
else {
talk = wikEdConfig['text']['talk namespace'] + ':' + article;
}
var uriArticle = article.replace(/ /g, '_');
uriArticle = encodeURI(uriArticle);
uriArticle = uriArticle.replace(/%25(\d\d)/g, '%$1');
uriArticle = uriArticle.replace(/\'/g, '%27');
var hist = wikEdWikiGlobals['wgServer'] + wikEdWikiGlobals['wgScript'] + '?title=' + uriArticle + '&action=history';
return('[[:' + p1 + ']]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;([[:' + talk + '|' + wikEdConfig['text']['talk page'] + ']], [' + hist + ' ' + wikEdConfig['text']['history page'] + '])');
}
);
}
 
// normal article edit page
else {
 
// append references section for section edits
var section = document.getElementsByName('wpSection');
if (section != null) {
if (section.length > 0) {
if (/\d+/.test(section[0].value) == true) {
if (/<ref[^>\/]*>.*?<\/ref[^>]*>/i.test(bodyData) == true) {
if (/<references\b[^>]*>/i.test(bodyData) == false) {
bodyData += '<div class="wikEdPreviewRefs"><references/></div>';
}
}
}
}
}
 
// GesHI syntax highlighting support, GeSHi css is only provided dynamically and not for &live
// so request a full preview and attach css to page, remember already loaded GeSHi languages
while ( (regExpMatch = /<(source|syntaxhighlight)\b[^>]*?lang\s*=\s*(\"|\')(\w+)\2/gi.exec(bodyData)) != null) {
var lang = regExpMatch[3];
if (wikEdGeSHiCSS['wikEd' + lang] == null) {
livePreview = false;
wikEdGeSHiCSS['wikEd' + lang] = true;
break;
}
}
}
 
// make the ajax request
WikEdAjaxPreview(bodyData, WikEdLocalPreviewAjaxHandler, livePreview);
}
 
// prepare a local preview (Pilaf's InstaView), will be overwritten by Ajax version
if ( (wikEdConfig['useLocalPreview'] == true) && (typeof(InstaView) == 'object') ) {
InstaView.conf.user.name = wikEdWikiGlobals['wgUserName'];
var text = wikEdTextarea.value;
 
// Opera 0.9.51
text = text.replace(/\r\n|\n\r|\r/g, '\n');
 
var instaView = InstaView.convert(text);
if (wikEdPreviewIsAjax != true) {
wikEdPreviewBox.innerHTML = instaView;
 
// init sortable tables (wikibits.js)
if (typeof(sortables_init) == 'function') {
sortables_init();
}
 
// init collapsible tables (common.js)
if (typeof(createCollapseButtons) == 'function') {
createCollapseButtons();
}
}
}
focusFrame = true;
break;
 
// display local diff box
case 'wikEdLocalDiff':
if (typeof(WDiffString)WikEdDiff !=== 'function'undefined) {
wikEd.previewDiff.innerHTML = '<div class="wikEdPreviewDiffError">' + wikEd.config.text.diffNotLoaded + '</div>';
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'block';
wikEd.localPrevWrapper.style.display = 'block';
break;
}
 
if (wikEdFullScreenMode == true) {
// interrupt fullscreen mode
WikEdFullScreen(false);
if (wikEd.fullscreen === true) {
wikEd.FullScreen(false);
}
if (wikEdUseWikEd == true) {
WikEdUpdateTextarea();
}
 
// add trailing newline
var currentVersion = wikEdTextarea.value;
 
// Opera 0.9.51
currentVersion = currentVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
// display diff, keep wrapper height to prevent scrolling
if (currentVersion.substr(currentVersion.length - 1, 1) != '\n') {
var previewHeight = wikEd.localPrevWrapper.offsetHeight;
currentVersion += '\n';
if ( ( (wikEd.previewArticle.innerHTML !== '') || (wikEd.previewDiff.innerHTML !== '') ) && (previewHeight > 0) ) {
wikEd.localPrevWrapper.style.height = previewHeight + 'px';
}
if (wikEdOrigVersionwikEd.substr(wikEdOrigVersionpreviewDiff.lengthinnerHTML - 1, 1) !=== '\n') {
wikEd.previewDiff.innerHTML = wikEd.config.text.wikEdPreviewLoading;
wikEdOrigVersion += '\n';
}
wikEd.localPrevWrapper.style.display = 'block';
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'block';
 
if (wikEd.useWikEd === true) {
// call external diff program
wikEd.UpdateTextarea();
var diffText = WDiffString(wikEdOrigVersion, currentVersion);
if (wikEdConfig['fullDiff'] != true) {
diffText = WDiffShortenOutput(diffText);
}
 
// add trailing newline
// display diff, keep wrapper height to prevent scrolling
var previewHeightcurrentVersion = wikEdPreviewBoxwikEd.offsetHeighttextarea.value;
if ( (wikEdPreviewBox.innerHTML != '') && (previewHeight > 0) ) {
wikEdPreviewBox.style.height = previewHeight + 'px';
}
wikEdPreviewBox.innerHTML = diffText;
wikEdLocalPrevWrapper.style.display = 'block';
 
// call external diff program
// scroll to button, textarea, or preview field
wikEd.previewDiff.innerHTML = wikEd.DiffResponse(wikEd.origVersion, currentVersion);
WikEdScrollToPreview();
 
// scroll to button, textarea, or preview field
break;
wikEd.ScrollToPreview();
 
// run scheduled custom functions
// toggle wikEdDiff
wikEd.ExecuteHook(wikEd.config.diffHook);
case 'wikEdDiff':
 
// turn wikEdDiff off
if (WikEdGetAttribute(buttonObj, 'checked') != 'true') {
wikEdDiff = false;
WikEdSetPersistent('wikEdDiff', '0', 0, '/');
if (typeof(wikEdDiffDiv) == 'object') {
if (wikEdDiffDiv != null) {
wikEdDiffDiv.style.display = 'none';
}
}
window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper));
}
 
// turn wikEdDiff on
else {
wikEdDiff = true;
WikEdSetPersistent('wikEdDiff', '1', 0, '/');
if (typeof(wikEdDiffDiv) == 'object') {
if (wikEdDiffDiv != null) {
wikEdDiffDiv.style.display = 'block';
window.scroll(0, WikEdGetOffsetTop(wikEdDiffDiv));
WikEdDiff();
}
}
}
focusFrame = true;
break;
 
// close the preview /and diff boxboxes
case 'wikEdClose':
case 'wikEdClose2':
window.scroll(0, WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdInputWrapperwikEd.inputWrapper));
 
wikEdLocalPrevWrapper.style.display = 'none';
wikEdPreviewBoxwikEd.previewArticle.style.heightdisplay = 'autonone';
wikEd.previewDiff.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'none';
 
wikEd.localPrevWrapper.style.height = 'auto';
focusFrame = true;
break;
 
// switch between textarea and frame display
// switching an iframe in design mode immediately after initialization between absolute/static may crash mozilla
case 'wikEdUseWikEd':
 
// enble wikEd
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') == 'true') {
WikEdUpdateFrame()wikEd.useWikEd = true;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.SetPersistent('wikEdUseClassic', '0', 0, '/');
 
// update frame content
wikEd.UpdateFrame();
 
// turndisplay rich text frame on
WikEdSetEditAreawikEd.SetEditArea(true);
wikEdUseWikEd = true;
WikEdSetPersistent('wikEdUseClassic', '0', 0, '/');
 
// run scheduled custom functions
WikEdExecuteHookwikEd.ExecuteHook(wikEdConfig['wikEd.config.frameHook']);
}
 
// turn classic textarea on, disable wikEd
else {
WikEdUpdateTextareawikEd.PastedOff();
WikEdSetEditArea(false);
wikEdUseWikEd = false;
WikEdSetPersistent('wikEdUseClassic', '1', 0, '/');
 
// update frame content
// run scheduled custom functions
wikEd.UpdateTextarea();
WikEdExecuteHook(wikEdConfig['textareaHook']);
 
// display on textarea
wikEd.SetEditArea(false);
 
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.SetPersistent('wikEdUseClassic', '1', 0, '/');
 
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.textareaHook);
}
 
// update fullscreen
wikEd.FullScreen(wikEd.fullScreenMode, true);
 
break;
 
// add "using wikEd" to summaries
case 'wikEdUsing':
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') == 'true') {
wikEdUsingwikEd.using = true;
WikEdSetPersistentwikEd.SetPersistent('wikEdSummaryUsing', '1', 0, '/');
}
else {
wikEdUsingwikEd.using = false;
WikEdSetPersistentwikEd.SetPersistent('wikEdSummaryUsing', '0', 0, '/');
}
break;
 
// hide ref tags
case 'wikEdRefHide':
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') == 'true') {
wikEdRefHidewikEd.refHide = true;
WikEdSetPersistentwikEd.SetPersistent('wikEdRefHide', '1', 0, '/');
}
else {
wikEdRefHidewikEd.refHide = false;
WikEdSetPersistentwikEd.SetPersistent('wikEdRefHide', '0', 0, '/');
}
 
if (wikEdUseWikEd == true) {
if ( (wikEd.config.showTableModeButton === false) && (wikEd.config.tableMode === true) ) {
if (wikEdRefHide == true) {
wikEd.tableMode = wikEd.refHide;
wikEdFrameBody.className = 'wikEdFrameBodyNewbie';
}
 
if (wikEd.useWikEd === true) {
if (wikEd.refHide === true) {
wikEd.frameBody.className = 'wikEdFrameBodyNewbie';
}
else {
wikEdFrameBodywikEd.frameBody.className = 'wikEdFrameBodySyntax';
}
WikEdEditButtonwikEd.EditButton(null, 'wikEdWikify', 'whole');
}
break;
 
// close the toolbar
case 'wikEdCloseToolbar':
if (WikEdGetAttribute(buttonObj, .getAttribute('checked') == 'true') {
wikEdCloseToolbarwikEd.closeToolbar = true;
wikEd.toolbarWrapper.style.display = 'none';
if (wikEdToolbar != null) {
wikEd.SetPersistent('wikEdCloseToolbar', '1', 0, '/');
wikEdToolbarWrapper.style.display = 'none';
}
WikEdSetPersistent('wikEdCloseToolbar', '1', 0, '/');
}
else {
wikEdCloseToolbarwikEd.closeToolbar = false;
wikEd.toolbarWrapper.style.display = 'block';
if (wikEdToolbar != null) {
wikEd.SetPersistent('wikEdCloseToolbar', '0', 0, '/');
wikEdToolbarWrapper.style.display = 'block';
}
WikEdSetPersistent('wikEdCloseToolbar', '0', 0, '/');
}
 
if (wikEdFullScreenMode == true) {
// resize fullscreen frame
WikEdFullScreen(wikEdFullScreenMode);
if (wikEd.fullscreen === true) {
wikEd.ResizeWindowHandler();
}
break;
 
// just toggle the case sensitive search button
case 'wikEdCaseSensitive':
break;
 
// just toggle the regexp search button
case 'wikEdRegExp':
break;
 
// just toggle the find-ahead-as-you-type search button
case 'wikEdFindAhead':
break;
 
// switch to fullscreen edit area
case 'wikEdFullScreen':
if (wikEdRearrangebuttonObj.getAttribute('checked') == 'true') {
wikEd.FullScreen(true, true);
if (WikEdGetAttribute(buttonObj, 'checked') == 'true') {
wikEd.SetPersistent('wikEdFullscreen', '1', 0, '/');
WikEdFullScreen(true);
}
WikEdSetPersistent('wikEdFullscreen', '1', 0, '/');
}else {
wikEd.FullScreen(false, true);
else {
wikEd.SetPersistent('wikEdFullscreen', '0', 0, '/');
WikEdFullScreen(false);
WikEdSetPersistent('wikEdFullscreen', '0', 0, '/');
}
}
break;
 
// clear the saved settings for find, replace, and summary history
case 'wikEdClearHistory':
WikEdClearHistorywikEd.ClearHistory('find');
WikEdClearHistorywikEd.ClearHistory('replace');
WikEdClearHistorywikEd.ClearHistory('summary');
focusFrame = true;
break;
 
// for testing
case 'wikEdPlaceholder':
break;
Line 5,359 ⟶ 6,610:
}
 
// reset cursor to normal
if (buttonObj !== null) {
buttonObj.style.cursor = 'pointer';
 
// Firefox 27 bug workaround to force cursor update
buttonObj.focus();
}
 
// focus the frame
if ( (wikEdUseWikEdwikEd.useWikEd === true) && (focusFrame === true) ) {
wikEdFrameWindowwikEd.frameWindow.focus();
}
 
Line 5,374 ⟶ 6,628:
 
//
// WikEdEditButtonwikEd.EditButton: editing functions
// used for buttons that require or change the text, more time consuming than WikEdButtonwikEd.Button()
//
 
windowwikEd.WikEdEditButtonEditButton = function (buttonObj, buttonId, parameters, CustomHandler) {
 
// check if iframe is enabled
if (wikEd.UseWikEd === false) {
return;
}
 
// check if button is disabled
if (buttonObj !== null) {
if (buttonObj.className == 'wikEdButtonInactive') {
return;
Line 5,387 ⟶ 6,646:
}
 
// remove active and non-text content
WikEdRemoveElementswikEd.RemoveElements(['script', 'object', 'applet', 'embed', 'textarea']);
 
// select the appropriate text change targets (whole, selection, cursor, focusWord, focusLine, selectionWord, or selectionLine)
var obj = {};
obj.changed = {};
var highlightNoTimeOut = false;
 
// set cursor position into closest highest text node so that highlighting does not bleed out
WikEdAntiHighlightBleedingwikEd.AntiHighlightBleeding(obj, true);
 
// textarea no longer up to date
// switch the button
wikEd.textareaUpdated = false;
 
// invalidate wikify/textify of recently pasted text
if ( (buttonId != 'wikEdPastedWikify') && (buttonId != 'wikEdPastedTextify') && (buttonId != 'wikEdPasting') ) {
wikEd.PastedOff();
}
 
// switch the button
switch (buttonId) {
 
// undo, redo: whole
case 'wikEdUndo':
case 'wikEdRedo':
case 'wikEdUndoAll':
case 'wikEdRedoAll':
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
break;
 
// basic wiki character formatting: selection / focusWord / cursor
case 'wikEdBold':
case 'wikEdItalic':
Line 5,420 ⟶ 6,687:
case 'wikEdWikiLink':
case 'wikEdWebLink':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,435 ⟶ 6,702:
break;
 
// reference: selection / cursor
case 'wikEdRef':
case 'wikEdRefNamed':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,447 ⟶ 6,714:
break;
 
// references and small references: selection / cursor
case 'wikEdReferences':
case 'wikEdReferencesSection':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,459 ⟶ 6,726:
break;
 
// charactersignature formatting:and selectionname /only focusWordsignature: selection / cursor
case 'wikEdSign':
case 'wikEdSignName':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
obj.changed = obj.cursor;
}
break;
 
// character formatting: selection / focusWord / cursor
case 'wikEdCase':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,476 ⟶ 6,755:
break;
 
// multiple line changes: selectionLine / focusLine / cursor
case 'wikEdDecreaseHeading':
case 'wikEdIncreaseHeading':
Line 5,486 ⟶ 6,765:
case 'wikEdDecreaseIndentList':
case 'wikEdDefinitionList':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
WikEdGetTextwikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusLine');
if (obj.focusLine.plain !== '') {
obj.changed = obj.focusLine;
}
Line 5,502 ⟶ 6,781:
break;
 
// sort: selectionLine / focusLine
case 'wikEdSort':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor, selectionLine');
if (obj.selection.plain !=== '') {
WikEdGetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
}
else if (/\n./.test(obj.selection.plain) === false) {
obj.changed = obj.selection;
}
else {
obj.changed = obj.selectionLine;
WikEdGetText(obj, 'focusPara');
if (obj.focusPara.plain != '') {
obj.changed = obj.focusPara;
}
}
break;
 
// image: selectionWord (if text is selected) / cursor
case 'wikEdImage':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
WikEdGetTextwikEd.GetText(obj, 'selectionWord');
obj.changed = obj.selectionWord;
}
Line 5,529 ⟶ 6,807:
break;
 
// table: selectionLine / cursor
case 'wikEdTable':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
WikEdGetTextwikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusLine');
obj.changed = obj.cursor;
}
break;
 
// wikify pasted: selection / wholecursor
case 'wikEdPastedWikify':
wikEd.GetText(obj, 'cursor');
obj.changed = obj.cursor;
break;
 
// textify during pasting: selection
case 'wikEdPasting':
 
// get text, do not wikify
wikEd.GetText(obj, 'selection', false);
obj.changed = obj.selection;
break;
 
// textify pasted: cursor
case 'wikEdPastedTextify':
wikEd.GetText(obj, 'cursor');
obj.changed = obj.cursor;
break;
 
// wikify: selection / whole
case 'wikEdWikify':
if (parameters == 'whole') {
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
}
else {
WikEdGetTextwikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
}
Line 5,560 ⟶ 6,858:
break;
 
// textify: selection / whole, without wikifying
case 'wikEdTextify':
WikEdGetTextwikEd.GetText(obj, 'selection', false);
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'whole', false);
obj.changed = obj.whole;
}
break;
 
// redirect: whole
case 'wikEdRedirect':
WikEdGetTextwikEd.GetText(obj, 'whole, selection, cursor');
if (obj.selection.plain === '') {
WikEdGetTextwikEd.GetText(obj, 'selectionWord');
}
obj.changed = obj.whole;
break;
 
// find and replace: selection / focusWord / cursor
case 'wikEdFindPrev':
case 'wikEdFindNext':
Line 5,589 ⟶ 6,887:
case 'wikEdReplaceNext':
case 'wikEdFindAll':
WikEdGetTextwikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,604 ⟶ 6,902:
break;
 
// replace all: selection / whole
case 'wikEdReplaceAll':
WikEdGetTextwikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
}
break;
 
// fixing buttons: selection / whole
case 'wikEdFixBasic':
case 'wikEdFixUnicode':
Line 5,624 ⟶ 6,922:
case 'wikEdFixRedirect':
case 'wikEdFixRedirectReplace':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
}
break;
 
// fixing buttons: selection / focusPara / cursor
case 'wikEdFixPunct':
case 'wikEdFixMath':
Line 5,641 ⟶ 6,939:
case 'wikEdFixCaps':
case 'wikEdFixChem':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusPara');
if (obj.focusPara.plain !== '') {
obj.changed = obj.focusPara;
}
Line 5,656 ⟶ 6,954:
break;
 
// fixing buttons: selection / focusLine / cursor
case 'wikEdFixChem':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'focusLine');
if (obj.focusPara.plain !== '') {
obj.changed = obj.focusLine;
}
Line 5,673 ⟶ 6,971:
break;
 
// source: selection / whole
case 'wikEdSource':
WikEdGetTextwikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
}
break;
 
// insert tags: selection / focusWord / cursor
case 'wikEdInsertTags':
WikEdGetTextwikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
WikEdGetText(obj,.changed 'focusWord')= obj.cursor;
if (obj.focusWord.plain != '') {
obj.changed = obj.focusWord;
}
else {
obj.changed = obj.cursor;
}
}
break;
 
// update text view using current control button settings
// convert wiki tables to html
case 'wikEdTablify':
WikEdGetText(obj, 'whole');
obj.changed = obj.whole;
break;
 
// update text view using current control button settings
case 'wikEdUpdateAll':
WikEdGetTextwikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
break;
 
// custom edit functions have to call WikEdGetTextwikEd.GetText() themselves
default:
WikEdGetTextwikEd.GetText(obj, 'cursor');
obj.changed = obj.cursor;
break;
}
 
// exit
if (obj.changed === nullundefined) {
wikEdFrameWindowwikEd.frameWindow.focus();
 
// reset button to active, reset cursor
if (buttonObj !== null) {
if (buttonObj.className != 'wikEdButtonInactive') {
buttonObj.className = 'wikEdButton';
Line 5,734 ⟶ 7,020:
}
 
// set local syntax highlighting flag
var highlightSyntax = wikEdHighlightSyntaxwikEd.highlightSyntax;
 
// apply selected action
// manipulate the text
var selectChanged = true;
var selectChangedText = '';
var emptyOrSpaces = /^ *$/.test(obj.changed.plain);
switch (buttonId) {
 
// undo
case 'wikEdUndo':
if (wikEdLastVersionwikEd.lastVersion === null) {
wikEdLastVersionwikEd.lastVersion = obj.changed.plain;
}
WikEdFrameExecCommandwikEd.frameDocument.execCommand('undo');
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEdFrameBodywikEd.frameBody, 0);
}
obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
obj.changed.plain = null;
obj.changed.keepSel = true;
break;
 
// redo
case 'wikEdRedo':
WikEdFrameExecCommandwikEd.frameDocument.execCommand('redo');
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEdFrameBodywikEd.frameBody, 0);
}
obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
obj.changed.plain = null;
obj.changed.keepSel = true;
break;
 
// bold
case 'wikEdBold':
 
if ( /\'\'\'([^\'](.|\n)*?)\'\'\'/.test(obj.changed.plain) ) {
// remove markup
obj.changed.plain = obj.changed.plain.replace(/\'\'\'([^\'](.|\n)*?)\'\'\'/g, '$1');
if (/^(\s*)'''((.|\n)*?)'''(\s*)$/.test(obj.changed.plain) ) {
obj.changed.plain = obj.changed.plain.replace(/^(\s*)'''((.|\n)*?)'''(\s*)$/g, '$1$2$4');
}
 
// add markup
else {
obj.changed.plain = '\'\'\'' + obj.changed.plain + '\'\'\'';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(\'\'\')( *)((.|\n)*?)( *)(\'\'\')/, '$2$1$3$6$5');
 
// move spaces outside markup
obj.changed.plain = obj.changed.plain.replace(/^(''')(\s*)((.|\n)*?)(\s*)(''')$/, '$2$1$3$6$5');
 
// trim to maximal number of ' (bold + italic)
obj.changed.plain = obj.changed.plain.replace(/^'{6,}((.|\n)*)'{6,}$/g, '\'\'\'\'\'$1\'\'\'\'\'');
}
}
obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\'');
obj.changed.keepSel = true;
break;
 
// italic
case 'wikEdItalic':
 
if ( /(\'{3,})\'\'([^\'](.|\n)*?)\'\'(\'{3,})/.test(obj.changed.plain) ) {
// remove markup
obj.changed.plain = obj.changed.plain.replace(/(\'{3,})\'\'([^\'](.|\n)*?)\'\'(\'{3,})/g, '$1$2$4');
if (/^(\s*)''((.|\n)*?)''(\s*)$/.test(obj.changed.plain) ) {
}
else obj.changed.plain if= obj.changed.plain.replace( /^(^|[^\']s*)\'\'([^\'](.|\n)*?)\'\'([^\']|s*)$)/.test(obj.changed.plain)g, '$1$2$4') {;
obj.changed.plain = obj.changed.plain.replace(/(^|[^\'])\'\'([^\'](.|\n)*?)\'\'([^\']|$)/g, '$1$2$4');
}
 
// add markup
else {
obj.changed.plain = '\'\'' + obj.changed.plain + '\'\'';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(\'\')( *)((.|\n)*?)( *)(\'\')/, '$2$1$3$6$5');
 
// move spaces outside markup
obj.changed.plain = obj.changed.plain.replace(/^('')(\s*)((.|\n)*?)(\s*)('')$/, '$2$1$3$6$5');
 
// trim to maximal number of ' (bold + italic)
obj.changed.plain = obj.changed.plain.replace(/^'{6,}((.|\n)*)'{6,}$/g, '\'\'\'\'\'$1\'\'\'\'\'');
}
}
obj.changed.plain = obj.changed.plain.replace(/\'{6,}/g, '\'\'\'\'\'');
obj.changed.keepSel = true;
break;
 
// underline
case 'wikEdUnderline':
 
// remove markup
if ( /&lt;u&gt;((.|\n)*?)&lt;\/u&gt;/i.test(obj.changed.plain) ) {
obj.changed.plain = obj.changed.plain.replace(/&lt;u&gt;((.|\n)*?)&lt;\/u&gt;/gi, '$1');
}
 
// add markup
else {
obj.changed.plain = '&lt;u&gt;' + obj.changed.plain + '&lt;\/u&gt;';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;u&gt;)( *)((.|\n)*?)( *)(&lt;\/u&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;u&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/u&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// strikethrough
case 'wikEdStrikethrough':
if ( /&lt;s&gt;((.|\n)*?)&lt;\/s&gt;/i.test(obj.changed.plain) ) {
Line 5,815 ⟶ 7,125:
else {
obj.changed.plain = '&lt;s&gt;' + obj.changed.plain + '&lt;\/s&gt;';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;s&gt;)( *)((.|\n)*?)( *)(&lt;\/s&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;s&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/s&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// nowiki
case 'wikEdNowiki':
if ( /&lt;nowiki&gt;((.|\n)*?)&lt;\/nowiki&gt;/i.test(obj.changed.plain) ) {
Line 5,827 ⟶ 7,139:
else {
obj.changed.plain = '&lt;nowiki&gt;' + obj.changed.plain + '&lt;\/nowiki&gt;';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;nowiki&gt;)( *)((.|\n)*?)( *)(&lt;\/nowiki&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;nowiki&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/nowiki&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// superscript
case 'wikEdSuperscript':
obj.changed.plain = obj.changed.plain.replace(/^(\s*)&lt;sub&gt;((.|\n)*?)&lt;\/sub&gt;(\s*)$/, '$1$2$4');
Line 5,840 ⟶ 7,154:
else {
obj.changed.plain = '&lt;sup&gt;' + obj.changed.plain + '&lt;/sup&gt;';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;sup&gt;)( *)((.|\n)*?)( *)(&lt;\/sup&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;sup&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/sup&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// subscript
case 'wikEdSubscript':
obj.changed.plain = obj.changed.plain.replace(/^(\s*)&lt;sup&gt;((.|\n)*?)&lt;\/sup&gt;(\s*)$/, '$1$2$4');
Line 5,853 ⟶ 7,169:
else {
obj.changed.plain = '&lt;sub&gt;' + obj.changed.plain + '&lt;/sub&gt;';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;sub&gt;)( *)((.|\n)*?)( *)(&lt;\/sub&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;sub&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/sub&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// in-text reference
case 'wikEdRef':
case 'wikEdRefNamed':
if (obj.changed.plain === '') {
if (buttonId == 'wikEdRef') {
obj.changed.plain = '&lt;ref&gt;&lt;\/ref&gt;';
}
else {
obj.changed.plain = '&lt;ref name=\"\" \/&gt;';
}
}
else if ( /&lt;ref( name=\"\")? ?\/&gt;/i.test(obj.changed.plain) ) {
obj.changed.plain = '';
}
else if ( /&lt;ref( name=\"\")?&gt;((.|\n)*?)&lt;\/ref&gt;/i.test(obj.changed.plain) ) {
obj.changed.plain = obj.changed.plain.replace(/&lt;ref( name=\"\")?&gt;((.|\n)*?)&lt;\/ref&gt;/gi, '$2');
}
else {
Line 5,880 ⟶ 7,198:
}
else {
obj.changed.plain = '&lt;ref name=\"\"&gt;' + obj.changed.plain + '&lt;/ref&gt;';
}
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;ref( name=\"\")?&gt;)( *)((.|\n)*?)( *)(&lt;\/ref&gt;)/, '$3$1$4$7$6');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;ref( name="")?&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/ref&gt;)$/, '$3$1$4$7$6');
}
}
obj.changed.keepSel = true;
break;
 
// signature ~~~~
case 'wikEdSign':
if (obj.changed.plain == '~~~~') {
obj.changed.plain = '';
}
else {
obj.changed.plain = '~~~~';
}
obj.changed.keepSel = true;
break;
 
// name only signature ~~~
case 'wikEdSignName':
if (obj.changed.plain == '~~~') {
obj.changed.plain = '';
}
else {
obj.changed.plain = '~~~';
}
obj.changed.keepSel = true;
break;
 
// references ___location
case 'wikEdReferences':
case 'wikEdReferencesSection':
var ref = wikEdConfig['wikEd.config.text']['.wikEdReferencesSection'];
ref = ref.replace(/</g, '&lt;');
ref = ref.replace(/>/g, '&gt;');
var refEscaped = ref;
refEscaped = refEscaped.replace(/([^\w\s\;\&])/g, '\\$1');
refEscaped = refEscaped.replace(/^\n|\n$/g, '\\n*');
refEscaped = refEscaped.replace(/(\n)/g, '\\n');
var regExp = new RegExp(refEscaped, 'gi');
 
// plain references tag
if (buttonId == 'wikEdReferences') {
if (obj.changed.plain === '') {
obj.changed.plain = '&lt;references/&gt;';
}
else if (regExp.test(obj.changed.plain) === true) {
obj.changed.plain = obj.changed.plain.replace(regExp, '');
}
Line 5,916 ⟶ 7,258:
}
 
// complete references code
else {
if (obj.changed.plain === '') {
obj.changed.plain = ref;
}
else if (regExp.test(obj.changed.plain) === true) {
obj.changed.plain = obj.changed.plain.replace(regExp, '');
}
Line 5,935 ⟶ 7,277:
break;
 
// toggle lowercase / uppercase
case 'wikEdCase':
if (obj.changed.plain === '') {
obj.changed.plain = null;
}
 
// lowercase all uppercased text
else {
 
// html character entities to chars
var plain = obj.changed.plain;
plain = plain.replace(/&gt;/g, '>');
Line 5,954 ⟶ 7,296:
}
 
// first-letter-uppercase all lowercased text
else if (plain.toLowerCase() == plain) {
var regExp = new RegExp('(^|[^' + wikEd.letters + '_0-9])([' + wikEd.letters + '])([' + wikEd.letters + '_0-9\']*)', 'g');
plain = plain.replace(/(^|[^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])([\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])([\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\']*)/g,
plain = plain.replace(regExp,
function (p, p1, p2, p3) {
function(p, p1, p2, p3) {
return( p1 + p2.toUpperCase() + p3.toLowerCase());
}
);
}
 
// uppercase mixed upper and lowercased text
else {
plain = plain.toUpperCase();
}
 
// chars back to html character entities
plain = plainwikEd.replaceEscapeHtml(/&/g, '&amp;'plain);
plain = plain.replace(/</g, '&lt;');
plain = plain.replace(/>/g, '&gt;');
obj.changed.plain = plain;
}
Line 5,977 ⟶ 7,318:
break;
 
// sort alphabetically by visible words, case insensitive, and numerically
case 'wikEdSort':
 
// fix unicode and character entities
WikEdFixUnicodewikEd.FixUnicode(obj.changed);
 
// sort a single line
// keep leading and trailing empty lines and table syntax
if (/\n./.test(obj.changed.plain) === false) {
 
// Normalize(): normalize strings for sorting
var Normalize = function (text) {
 
// [ [ |( ) ] ]
text = text.replace(/\[\[[^\[\]\|]*\|([^\[\]]*)\]\]/g, '$1');
 
// [ [( ) ] ]
text = text.replace(/\[\[([^\[\]\|]*)\]\]/g, '$1');
 
// start with first letter
var regExp = new RegExp('^[^' + wikEd.letters + '_0-9]+', 'g');
text = text.replace(regExp, '');
 
// sort numerically by adding preceeding 0s to numbers
text = text.replace(/0*(\d+)(\.\d*)?/g,
function(p, p1, p2) {
return '000000000000000'.substr(p1.length) + p1 + p2;
}
);
 
// case insensitive
text = text.toLowerCase();
 
return text;
};
 
// SplitSortJoin(): sort list items in one line
var SplitSortJoin = function (regExp, text) {
 
var sorted = null;
 
// split text into array of element / separator pairs
var array = [];
var regExpMatch;
var lastMatch = 0;
while ( (regExpMatch = regExp.exec(text)) !== null) {
var element = text.substring(lastMatch, regExpMatch.index);
var separator = regExpMatch[0];
array.push([element, separator, Normalize(element)]);
lastMatch = regExp.lastIndex;
}
if (array.length > 0) {
var element = text.substring(lastMatch);
if (element !== '') {
array.push([element, '', Normalize(element)]);
}
 
// sort array after normalized elements
array.sort(function(a, b) {
if (a[2] > b[2]) {
return 1;
}
if (a[2] < b[2]) {
return -1;
}
return 0;
});
 
// join, keep separator next to element if possible, otherwise use last separator
sorted = '';
for (var i = 0; i < array.length; i ++) {
if ( (array[i][1] === '') && (i < array.length - 1) ) {
array[i][1] = array[array.length - 1][1];
array[array.length - 1][1] = '';
}
sorted += array[i][0] + array[i][1];
}
}
return sorted;
};
 
// extract sortable text
var pre = '';
var sortable = obj.changed.plain;
var post = '';
 
// 123 3 4 4 2 15 56 6
var regExpMatch = /^(((\|[\w ]+\=)|\||!|(:*;)+) *)(.*?)( *\n*)$/.exec(obj.changed.plain);
if (regExpMatch !== null) {
pre = regExpMatch[1];
sortable = regExpMatch[5];
post = regExpMatch[6];
}
 
// sortable text enclosed in html
var regExpMatch = /^(<[^>]>+)(.*?)(<\/[^>]>+)$/.exec(sortable);
if (regExpMatch !== null) {
pre = pre + regExpMatch[1];
sortable = regExpMatch[2];
post = regExpMatch[3] + post;
}
 
// table cells
var sorted = SplitSortJoin(/ *((\||!){2,2}) *()/g, sortable);
if ( (sorted === null) || (/^(\|{1,1}|!{1,1})/.test(pre) === false) ) {
 
// bullets, dots, dashes, \|/:-,; in spaces
sorted = SplitSortJoin(/((&amp;nbsp;| )+((\\|\||\/|:|-|,|;)+)(&amp;nbsp;| )+|(&amp;nbsp;| )*(•|&bull;|&#x2022;|&#8226;|·|&middot;|&#0*xb7;|&#0*183;|–|&ndash;|&#x2013;|&#8211;|—|&mdash;|&#x2015;|&#8213;)(&amp;nbsp;| )*)()/gi, sortable);
if (sorted === null) {
 
// ,;:
sorted = SplitSortJoin(/(&amp;nbsp;| )*(,|;|:)(&amp;nbsp;| )+/g, sortable);
if (sorted === null) {
 
// multiple spaces with &nbsp;
sorted = SplitSortJoin(/( +&amp;nbsp;|&amp;nbsp;&amp;nbsp;|&amp;nbsp; )(&amp;nbsp;| )*()/g, sortable);
 
// simple spaces
if (sorted === null) {
sorted = SplitSortJoin(/ +/g, sortable);
}
}
}
}
 
// join pre, sorted, and post
if (sorted !== null) {
sorted = sorted.replace(/ {2,}/, ' ');
sorted = sorted.replace(/ +$/, '');
post = post.replace(/ +(\n*|$)/, '$1');
obj.changed.plain = pre + sorted + post;
}
break;
}
 
// keep leading and trailing empty lines and table syntax
var pre = '';
var main = '';
var post = '';
var regExpMatch = /^(((\{\|.*|!.*|\|\+.*|\|\-.*|)\n)*)((.|\n)*?)(((\|\}.*|\|\-.*|)\n)*)$/.exec(obj.changed.plain);
if (regExpMatch !== null) {
pre = regExpMatch[1];
main = regExpMatch[4];
Line 5,997 ⟶ 7,466:
}
 
// join cells in table rows
main = main.replace(/(^|\n)(\|[^\-\+\}](.|\n)*?(?=(\|\-|\{\||\|\}|$)|$))/g,
function(p, p1, p2, p3) {
p2 = p2.replace(/\n/g, '\x00');
return( p1 + p2);
}
);
 
// cycle through lines
var lines = main.split('\n');
var sortArray = [];
Line 6,012 ⟶ 7,481:
var sortKey = line;
 
// remove empty lines
if (line === '') {
continue;
}
sortKey = sortKey.replace(/\x00/g, '\n');
 
// remove html
sortKey = sortKey.replace(/&lt;.*&gt;/g, '');
 
// lowercase
sortKey = sortKey.toLowerCase();
 
// keep visible text of wikilinks only
sortKey = sortKey.replace(/\[\[[^\|\[\]]*\|/g, '');
sortKey = sortKey.replace(/\[\[|\]\]/g, '');
 
// keep visible text of external links only
sortKey = sortKey.replace(/\[(https?:|ftp:|irc:|gopher):)\/\/\S+/g, '');
 
// keep visible cell content only
sortKey = sortKey.replace(/((^|\n)(\||\!))(?![\+\-\}\|\!])[^\|\!]*(\||\!)(?!\4)/g, '$1');
sortKey = sortKey.replace(/(^|\n)\|-.*?(\n|$)/g, '$2');
 
// keep single ' only
sortKey = sortKey.replace(/\'{2,}/g, '');
 
// remove decimal commas
sortKey = sortKey.replace(/(\d)\,(?=\d\d\d(\D|$))/g, '$1');
 
// sort numerically by adding preceeding 0s to numbers
sortKey = sortKey.replace(/0*(\d+)(\.\d*)?/g,
function(p, p1, p2) {
return( '000000000000000'.substr(p1.length) + p1 + p2);
}
);
 
// non-breaking and other spaces
sortKey = sortKey.replace(/&nbsp;|\s/g, ' ');
 
// remove umlauts (just guessing, but probably better than not doing it)
sortKey = sortKey.replace(/[à-æ]/g, 'a');
sortKey = sortKey.replace(/[ç]/g, 'c');
Line 6,063 ⟶ 7,532:
sortKey = sortKey.replace(/[ýÿ]/g, 'y');
 
// remove non-chars
sortKey = sortKey.replace(/[^\$\@\.\,\:\;\-\w\s\'\u007f-\uffff]/g, '');
 
// join multiple spaces
sortKey = sortKey.replace(/ +/g, ' ');
 
// remove leading and trailing spaces
sortKey = sortKey.replace(/^ +| +$/g, '');
 
Line 6,075 ⟶ 7,544:
}
 
// sort lines
sortArray = sortArray.sort(
function(a, b) {
if (a[1] <=> b[1]) {
return(- 1);
}
if (a[1] < b[1]) {
return -1;
}
else {
return(1) 0;
}
}
);
 
// join lines
var joined = '';
for (var i = 0; i < sortArray.length; i ++) {
Line 6,101 ⟶ 7,573:
break;
 
// undo all
case 'wikEdUndoAll':
if (wikEdLastVersionwikEd.lastVersion === null) {
wikEdLastVersionwikEd.lastVersion = obj.changed.plain;
}
obj.changed.plain = wikEdOrigVersionwikEd.origVersion;
obj.changed.plain = wikEd.EscapeHtml(obj.changed.plain.replace(/&/g, '&amp;');
obj.changed.plain = obj.changed.plain.replace(/>/g, '&gt;');
obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
break;
 
// redo all
case 'wikEdRedoAll':
if (wikEdLastVersionwikEd.lastVersion !== null) {
obj.changed.plain = wikEdLastVersionwikEd.lastVersion;
}
break;
 
// create wikilink
case 'wikEdWikiLink':
if ( /\[\[((.|\n)*?)\]\]/.test(obj.changed.plain) ) {
Line 6,127 ⟶ 7,597:
else {
obj.changed.plain = '[[' + obj.changed.plain + ']]';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(\[\[)( *)((.|\n)*?)( *)(\]\])/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(\[\[)(\s*)((.|\n)*?)(\s*)(\]\])$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// create weblink
case 'wikEdWebLink':
if ( /\[((.|\n)*?)\]/.test(obj.changed.plain) ) {
Line 6,139 ⟶ 7,611:
else {
obj.changed.plain = '[' + obj.changed.plain + ']';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/(\[)( *)((.|\n)*?)( *)(\])/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(\[)(\s*)((.|\n)*?)(\s*)(\])$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
break;
 
// decrease heading level
case 'wikEdDecreaseHeading':
 
// decrease heading
obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(=+) *(.*?) *=+(?=\n|$)/g, '$1$2 $3 $2');
 
// remove heading
obj.changed.plain = obj.changed.plain.replace(/(^|\n)=(?!=) *(.*?) *=+(?=\n|$)/g, '$1$2');
 
// adjust closing tags
obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *(.*?) *=+(?=\n|$)/g, '$1$2 $3 $2');
obj.changed.keepSel = true;
break;
 
// increase heading level
case 'wikEdIncreaseHeading':
 
// increase heading
obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *(.*?) *=+(?=\n|$)/g, '$1=$2 $3 $2=');
 
// create new heading
if (/\n/.test(obj.changed.plain) === false) {
obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\s].*?)(?=\n|$)/g, '$1== $2 ==');
}
 
// adjust closing tags
obj.changed.plain = obj.changed.plain.replace(/(^|\n)(=+) *(.*?) *=+(?=\n|$)/g, '$1$2 $3 $2');
obj.changed.keepSel = true;
break;
 
// increase bullet list
case 'wikEdIncreaseBulletList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, '*$1 ');
return( p1);
}
);
Line 6,185 ⟶ 7,659:
break;
 
// decrease bullet list
case 'wikEdDecreaseBulletList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return( p1);
}
);
Line 6,196 ⟶ 7,670:
break;
 
// increase numbered list
case 'wikEdIncreaseNumberList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, '#$1 ');
return( p1);
}
);
Line 6,207 ⟶ 7,681:
break;
 
// decrease numbered list
case 'wikEdDecreaseNumberList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return( p1);
}
);
Line 6,218 ⟶ 7,692:
break;
 
// increase indented list
case 'wikEdIncreaseIndentList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, ':$1 ');
return( p1);
}
);
Line 6,229 ⟶ 7,703:
break;
 
// decrease indented list
case 'wikEdDecreaseIndentList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return( p1);
}
);
Line 6,240 ⟶ 7,714:
break;
 
// create definition list
case 'wikEdDefinitionList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([^\s\;]+) *()/g, '; $1 : ');
return( p1);
}
);
break;
 
// create image
case 'wikEdImage':
if (obj.changed.plain !== '') {
obj.changed.plain = '[[Image:<span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['image width'] + '</span>px|' + obj.changed.plain + ']]';
}
else {
obj.changed.plain = '[[Image:<span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['image width'] + '</span>px|<span class="wikEdInsertHere"> </span>]]';
if (obj.focusWord !== nullundefined) {
if (obj.focusWord.plain !== '') {
obj.changed.plain = ' ' + obj.changed.plain + ' ';
}
Line 6,265 ⟶ 7,739:
break;
 
// create table
case 'wikEdTable':
if (obj.changed.plain !== '') {
obj.changed.plain = obj.changed.plain.replace(/(^|\n) *()/g, '\n|-\n| ');
obj.changed.plain = obj.changed.plain.replace(/^\n\|\-\n/, '\n{| class="wikitable" border="1"\n');
obj.changed.plain = obj.changed.plain.replace(/$/g, '\n|}\n');
}
else if (wikEdTableMode == true) {
obj.changed.plain = '\n<table{| class="wikitable"\n|+ border="1"><caption><span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table caption'] + '</span></caption><tr><th>\n! <span class="wikEdinserthere">' + wikEdConfig['wikEd.config.text']['table heading'] + '</span></th><th> !! <span class="wikEdinsertherewikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table heading'] + '</span></th></tr><tr><td>\n|-\n| <span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table cell'] + '</span></td><td> || <span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table cell'] + '</span></td></tr><tr><td>\n|-\n| <span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table cell'] + '</span></td><td> || <span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['table cell'] + '</span></td></tr></table>\n|}\n';
if (obj.focusLine.plain !== '') {
obj.changed.plain = '\n' + obj.changed.plain + '\n';
}
}
else {break;
 
obj.changed.plain = '\n{| class="wikitable" border="1"\n|+ <span class="wikEdInsertHere">' + wikEdConfig['text']['table caption'] + '</span>\n! <span class="wikEdinserthere">' + wikEdConfig['text']['table heading'] + '</span> !! <span class="wikEdInsertHere">' + wikEdConfig['text']['table heading'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEdConfig['text']['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEdConfig['text']['table cell'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEdConfig['text']['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEdConfig['text']['table cell'] + '</span>\n|}\n';
// wikify pasted
if (obj.focusLine.plain != '') {
case 'wikEdPastedWikify':
obj.changed.plain = '\n' + obj.changed.plain + '\n';
 
// wikify already pasted content
if ( (wikEd.paste === null) || (wikEd.paste.polling === true) ) {
wikEd.PastedOff();
return;
}
 
// reselect pasted
obj.sel.removeAllRanges();
obj.sel.addRange(wikEd.paste.range);
 
obj = {};
wikEd.GetText(obj, 'selection', false);
obj.changed = obj.selection;
obj.changed.plain = wikEd.paste.wikified;
wikEd.paste.last = 'wikify';
wikEd.PastedSwitch();
obj.changed.keepSel = true;
break;
 
// textify during pasting
case 'wikEdPasting':
if ( (wikEd.paste === null) || (wikEd.paste.polling === true) ) {
wikEd.PastedOff();
return;
}
 
// move content before br after paste at end of line, part 1
if (wikEd.paste.pasteAtEndOfLine === true) {
if (wikEd.paste.blockStart === true) {
obj.changed.plain = obj.changed.plain.replace(/^\n/, '');
obj.changed.html = obj.changed.html.replace(/^<br\b[^>]*>/, '');
}
}
 
// textify, not changing obj.html
wikEd.Textify(obj.changed);
obj.changed.plain = obj.changed.plain.replace(/\xa0/g, ' ');
wikEd.paste.last = 'textify';
 
// wikify, not changing obj.plain
wikEd.RemoveEmbracingTags(obj.changed);
wikEd.WikifyHTML(obj.changed, false);
obj.changed.html = obj.changed.html.replace(/\s*<br\b[^>]*>\s*/g, '\n');
obj.changed.html = obj.changed.html.replace(/\xa0/g, ' ');
 
// move content before br after paste at end of line, part 2
if (wikEd.paste.pasteAtEndOfLine === true) {
if (wikEd.paste.blockEnd === true) {
obj.changed.plain += '\n';
obj.changed.html += '\n';
}
}
 
// save textified and wikified for switching
wikEd.paste.textified = obj.changed.plain;
wikEd.paste.wikified = obj.changed.html;
 
// no textify/wikify option when pasting plain text
if (wikEd.paste.textified == wikEd.paste.wikified) {
wikEd.PastedOff();
}
else {
obj.changed.keepSel = true;
}
break;
 
// textify pasted: strip html from recently pasted content
// wikify: always done above
case 'wikEdPastedTextify':
if ( (wikEd.paste === null) || (wikEd.paste.polling === true) ) {
wikEd.PastedOff();
return;
}
 
// reselect pasted
obj.sel.removeAllRanges();
obj.sel.addRange(wikEd.paste.range);
 
obj = {};
wikEd.GetText(obj, 'selection', false);
obj.changed = obj.selection;
obj.changed.plain = wikEd.paste.textified;
wikEd.paste.last = 'textify';
wikEd.PastedSwitch();
obj.changed.keepSel = true;
break;
 
// wikify
case 'wikEdWikify':
 
// wikify already done in wikEd.GetText()
break;
 
// textify: strip html from pasted content
case 'wikEdTextify':
WikEdTextifywikEd.Textify(obj.changed);
if (parameters == 'shift') {
highlightNoTimeOut = true;
Line 6,298 ⟶ 7,857:
break;
 
// redirect
case 'wikEdRedirect':
var linkTarget;
if (obj.selection.plain !== '') {
linkTarget = obj.selection.plain;
}
else if (obj.selectionWord.plain !== '') {
linkTarget = obj.selectionWord.plain;
}
else {
linkTarget = '<span class="wikEdInsertHere">' + wikEdConfig['wikEd.config.text']['redirect article link'] + '</span>';
}
 
// remove link text after |
linkTarget = linkTarget.replace(/\|(.|\n)*()/, '');
 
// remove formatting and spaces
linkTarget = linkTarget.replace(/^(=+|\'+|<[^>]*>|\s+|\[)+((.|\n)*?)(=+|\'+|<[^>]*>|\s+|\])+$/g, '$2');
linkTarget = linkTarget.replace(/&lt;/g, '<');
linkTarget = linkTarget.replace(/&gt;/g, '>');
Line 6,323 ⟶ 7,882:
obj.changed.plain = '#REDIRECT [[' + linkTarget + ']]';
 
// append to summary
if (wikEdInputElement['summary']wikEd.wikiGlobals.wgUseAutomaticEditSummaries !== nulltrue) {
if ( (objwikEd.selectioninputElement.plainsummary != '') || (obj.selectionWord.plain != '') undefined) {
if ( (obj.selection.plain !== '') || (obj.selectionWord.plain !== '') ) {
wikEdInputElement['summary'].value = wikEdInputElement['summary'].value.replace(/#REDIRECT( \[\[[^\]]*\]\])?(, *)?/g, '');
wikEdInputElement[' wikEd.inputElement.summary'].value = WikEdAppendToSummary(wikEdInputElement['wikEd.inputElement.summary'].value, '.replace(/#REDIRECT( \[\['[^\]]*\]\])?(, + linkTarget +*)?/g, ']]');
wikEd.inputElement.summary.value = wikEd.AppendToSummary(wikEd.inputElement.summary.value, '#REDIRECT [[' + linkTarget + ']]');
}
else { }
else {
wikEdInputElement['summary'].value = WikEdAppendToSummary(wikEdInputElement['summary'].value, '#REDIRECT');
wikEd.inputElement.summary.value = wikEd.AppendToSummary(wikEd.inputElement.summary.value, '#REDIRECT');
}
}
}
Line 6,336 ⟶ 7,897:
break;
 
// find and replace
case 'wikEdFindPrev':
case 'wikEdFindNext':
Line 6,346 ⟶ 7,907:
case 'wikEdReplaceAll':
 
// get the find text
var findText;
 
// unescape <, >, and &
obj.changed.plain = obj.changed.plain.replace(/&lt;/g, '<');
obj.changed.plain = obj.changed.plain.replace(/&gt;/g, '>');
obj.changed.plain = obj.changed.plain.replace(/&amp;/g, '&');
 
// copy selection/word under cursor to find field
if ( (parameters == 'shift') && ( (buttonId == 'wikEdFindNext') || (buttonId == 'wikEdReplaceNext') ) ) {
if (/\n/.test(obj.changed.plain) === false) {
if (buttonId == 'wikEdFindNext') {
wikEdInputElement['wikEd.inputElement.find'].value = obj.changed.plain;
}
else {
wikEdInputElement['wikEd.inputElement.replace'].value = obj.changed.plain;
}
obj.changed.keepSel = true;
Line 6,369 ⟶ 7,930:
}
 
// get the find text from the selection
if ( (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdJumpNext') ) {
findText = obj.changed.plain;
if (obj.selection.plain === '') {
obj.changed.keepSel = true;
obj.changed.plain = null;
Line 6,379 ⟶ 7,940:
}
 
// get the find text from the find field
else {
if (wikEdInputElement['wikEd.inputElement.find'].value !== '') {
findText = wikEdInputElement['wikEd.inputElement.find'].value.replace(/\xa0/g, ' ');
}
else {
Line 6,390 ⟶ 7,951:
}
 
// get button status
var regExpChecked = WikEdGetAttributewikEd.regExp.getAttribute(wikEdRegExp, 'checked');
var caseSensitiveChecked = WikEdGetAttributewikEd.caseSensitive.getAttribute(wikEdCaseSensitive, 'checked');
 
// get thecase replacesensitive textsetting
var caseSensitive = false;
var replaceText = wikEdInputElement['replace'].value;
if (caseSensitiveChecked == 'true') {
caseSensitive = true;
}
 
// get the replace text
var replaceText = wikEd.inputElement.replace.value.replace(/\xa0/g, ' ');
 
// format the find and replace texts for a plain text search
var useRegExp = true;
if ( (regExpChecked == 'false') || (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdJumpNext') ) {
Line 6,403 ⟶ 7,970:
}
 
// format the replace text for a regular expression search
if ( (buttonId == 'wikEdReplacePrev') || (buttonId == 'wikEdReplaceNext') || (buttonId == 'wikEdReplaceAll') ) {
if (useRegExp === true) {
 
// substitute \\ \n \r \t \' \" \127 \x1f \u12ef
replaceText = replaceText.replace(/\\\\/g, '\x00');
replaceText = replaceText.replace(/\\n/g, '\n');
replaceText = replaceText.replace(/\\r/g, '\r');
replaceText = replaceText.replace(/\\t/g, '\t');
replaceText = replaceText.replace(/\\\'/g, '\'');
replaceText = replaceText.replace(/\\\"/g, '\"');
 
replaceText = replaceText.replace(/\\([0-7]{3})/g,
function(p, p1) {
return( String.fromCharCode(parseInt(p1, 8)));
}
);
replaceText = replaceText.replace(/\\x([0-9a-fA-F]{2})/g,
function(p, p1) {
return( String.fromCharCode(parseInt(p1, 16)));
}
);
replaceText = replaceText.replace(/\\u([0-9a-fA-F]{4})/g,
function(p, p1) {
return( String.fromCharCode(parseInt(p1, 16)));
}
);
Line 6,434 ⟶ 8,001:
}
 
// check the regexp
var replacedFlag = false;
var regExpFind;
Line 6,442 ⟶ 8,009:
) {
var regExpFindText = findText;
if (useRegExp !== true){
regExpFindText = regExpFindText.replace(/([\\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1');
}
var regExpFlags = 'gm';
if (caseSensitive !== true) {
regExpFlags += 'i';
}
Line 6,452 ⟶ 8,019:
regExpFind = new RegExp(regExpFindText, regExpFlags);
}
catch (errexception) {
return;
}
}
 
// replace all
if (buttonId == 'wikEdReplaceAll') {
if (regExpFind.test(obj.changed.plain)) {
Line 6,468 ⟶ 8,035:
}
 
// replace an existing selection
else if ( (buttonId == 'wikEdReplacePrev') || (buttonId == 'wikEdReplaceNext') ) {
if (regExpFind.test(obj.selection.plain)) {
 
var replaced = obj.selection.plain.replace(regExpFind, replaceText);
if (obj.changed.plain != replaced) {
Line 6,498 ⟶ 8,066:
(buttonId == 'wikEdFindAll')
) {
if (replacedFlag === false) {
 
// get direction
var backwards = false;
if ( (buttonId == 'wikEdFindPrev') || (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdReplacePrev') ) {
Line 6,506 ⟶ 8,074:
}
 
// find all
// get case sensitive
var caseSensitive = false;
if (caseSensitiveChecked == 'true') {
caseSensitive = true;
}
 
// find all
if (buttonId == 'wikEdFindAll') {
var found;
var foundRanges = [];
 
// start at top of text
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
var range = wikEdFrameDocumentwikEd.frameDocument.createRange();
if (wikEdFrameBodywikEd.frameBody.firstChild !== null) {
range.setStartBefore(wikEdFrameBodywikEd.frameBody.firstChild);
}
range.collapse(true);
range = obj.sel.addRange(range);
 
// cycle through matches
var scrollTop = wikEdFrameBodywikEd.frameBody.scrollTop;
do {
 
// WikEdFindwikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
found = WikEdFindwikEd.Find(obj, findText, caseSensitive, false, false, useRegExp);
if (found === true) {
foundRanges.push(obj.changed.range.cloneRange());
}
} while (found === true);
 
// scroll back
if (regExpChecked == 'false') {
wikEdFrameBodywikEd.frameBody.scrollTop = scrollTop;
}
 
// add the found ranges, Webkit does not support multiple selections
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
for (var i = 0; i < foundRanges.length; i ++) {
obj.sel.addRange(foundRanges[i]);
Line 6,551 ⟶ 8,113:
}
 
// normal find
else {
obj.selectChanged = selectChanged;
WikEdFindwikEd.Find(obj, findText, caseSensitive, backwards, true, useRegExp);
selectChanged = obj.selectChanged;
}
Line 6,560 ⟶ 8,122:
}
 
// escape <, >, and &
if (obj.changed.plain !== null) {
obj.changed.plain = wikEd.EscapeHtml(obj.changed.plain.replace(/&/g, '&amp;');
obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
obj.changed.plain = obj.changed.plain.replace(/>/g, '&gt;');
}
 
// save search history to settings
if ( (buttonId == 'wikEdFindPrev') || (buttonId == 'wikEdFindNext') || (buttonId == 'wikEdFindAll') ) {
WikEdAddToHistorywikEd.AddToHistory('find');
}
if ( (buttonId == 'wikEdReplacePrev') || (buttonId == 'wikEdReplaceNext') || (buttonId == 'wikEdReplaceAll') ) {
WikEdAddToHistorywikEd.AddToHistory('find');
WikEdAddToHistorywikEd.AddToHistory('replace');
}
obj.changed.keepSel = true;
break;
 
// fixbasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions
// to do: only certain changes in multiline tags: comments, tables, subst
case 'wikEdFixBasic':
WikEdFixBasicwikEd.FixBasic(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixPunct':
WikEdFixPunctwikEd.FixPunct(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixMath':
WikEdFixMathwikEd.FixMath(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixChem':
WikEdFixChemwikEd.FixChem(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixUnicode':
WikEdFixUnicodewikEd.FixUnicode(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixRedirect':
WikEdFixRedirectCallwikEd.LinkInfoCall(obj.changed, function (ajax); {
wikEd.LinkInfoHandler(ajax);
wikEd.EditButton(null, 'wikEdFixRedirectReplace');
});
return;
case 'wikEdFixRedirectReplace':
WikEdFixRedirectReplacewikEd.FixRedirectReplace(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixUnits':
WikEdFixUnitswikEd.FixUnits(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixDashes':
WikEdFixDasheswikEd.FixDashes(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixHtml':
WikEdFixHTMLwikEd.FixHTML(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixRegExTypo':
if ( (wikEdConfig['wikEd.config.regExTypoFix'] === true) && (wikEdTypoRulesFindwikEd.typoRulesFind.length > 0) ) {
WikEdFixTyposwikEd.FixTypos(obj.changed);
}
else {
Line 6,629 ⟶ 8,192:
break;
case 'wikEdFixCaps':
WikEdFixCapswikEd.FixCaps(obj.changed);
obj.changed.keepSel = true;
break;
case 'wikEdFixAll':
WikEdFixAllwikEd.FixAll(obj.changed);
obj.changed.keepSel = true;
break;
 
// source on
case 'wikEdSource':
obj.changed.plain = obj.changed.code;
obj.changed.plain = obj.changed.plain.replace(/(<(br|p)\b.[^>]*?>)/g, '$1\n\n');
obj.changed.plain = wikEd.EscapeHtml(obj.changed.plain.replace(/&/g, '&amp;');
obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
obj.changed.plain = obj.changed.plain.replace(/>/g, '&gt;');
highlightSyntax = false;
break;
 
// insert tags
case 'wikEdInsertTags':
var tagOpen = parameters[0] || '';
var tagClose = parameters[1] || '';
var sampleText = parameters[2] || '';
tagOpen = tagOpenwikEd.replaceEscapeHtml(/&/g, '&amp;'tagOpen);
tagOpentagClose = tagOpenwikEd.replaceEscapeHtml(/</g, '&lt;'tagClose);
tagOpensampleText = tagOpenwikEd.replaceEscapeHtml(/>/g, '&gt;'sampleText);
tagClose = tagClose.replace(/&/g, '&amp;');
tagClose = tagClose.replace(/</g, '&lt;');
tagClose = tagClose.replace(/>/g, '&gt;');
tagsampleText = sampleText.replace(/&/g, '&amp;');
tagsampleText = sampleText.replace(/</g, '&lt;');
tagsampleText = sampleText.replace(/>/g, '&gt;');
 
// single string to insert
if ( (tagOpen.length > 0) && (tagClose.length === 0) && (sampleText.length === 0) ) {
obj.changed = obj.cursor;
obj.changed.plain = tagOpen;
}
else if ( (tagOpen.length === 0) && (tagClose.length === 0) && (sampleText.length > 0) ) {
obj.changed.plain = sampleText;
}
 
// opening and closing strings
else if ( (obj.changed.plain === '') && (sampleText.length > 0) ) {
obj.changed.plain = tagOpen + sampleText + tagClose;
 
// select sample text
selectChangedText = sampleText;
obj.changed.keepSel = true;
Line 6,681 ⟶ 8,238:
break;
 
// update text view using current control button settings
// convert wiki tables to html // {{TABLE}}
case 'wikEdTablify':
obj.changed.keepSel = true;
if (wikEdTableMode == true) {
WikEdWikiTableToHtml(obj.changed);
}
break;
 
// update text view using current control button settings // {{TABLE}}
case 'wikEdUpdateAll':
obj.changed.keepSel = true;
if ( (parameters !== undefined) && (parameters.keepSel === false) null) {
if (parametersobj.changed.keepSel == false) {;
obj.changed.keepSel = false;
}
}
break;
 
// custom edit functions
default:
if (CustomHandler !== nullundefined) {
CustomHandler(obj);
}
else {
window.alert('Unknown edit function \'' + buttonId + '\'');
}
break;
}
 
// pause frame spellchecking
var pauseFrameSpellchecking = false;
var frameSpellchecking = wikEdFrameBodywikEd.frameBody.spellcheck;
if (frameSpellchecking === true) {
var wholeLength = 0;
var changedLength = 0;
if (obj.whole !== nullundefined) {
if (obj.whole.plain !== null) {
wholeLength = obj.whole.plain.length;
}
}
if (obj.changed.plain !== null) {
changedLength = obj.changed.plain.length;
}
if ( (changedLength > 10000) || (wholeLength > 10000) ) {
pauseFrameSpellchecking = true;
wikEdFrameBodywikEd.frameBody.spellcheck = false;
}
}
 
// get the scroll position
var frameScrollTop = wikEdFrameBodywikEd.frameBody.scrollTop;
var frameScrollLeft = wikEdFrameBody.scrollLeft;
 
// update the selection ranges, do not add any text changes
if (obj.changed.plain === null) {
if (buttonId != 'wikEdFindAll') {
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// scroll the selected text into the viewport
if (selectChanged !== false) {
WikEdScrollToSelectionwikEd.ScrollToSelection();
}
}
}
 
// apply text changes
else {
 
// a text change erases the last version for redo all
if ( (buttonId != 'wikEdUndo') && (buttonId != 'wikEdRedo') && (buttonId != 'wikEdUndoAll') ) {
wikEdLastVersionwikEd.lastVersion = null;
}
 
// highlight the syntax
obj.html = obj.changed.plain;
if (highlightSyntax === true) {
if (obj.changed.from == 'whole') {
obj.whole = true;
}
 
WikEdHighlightSyntax(obj, highlightNoTimeOut);
wikEd.HighlightSyntax(obj, highlightNoTimeOut);
}
 
// at least highlight tab characters
else {
obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->');
}
 
// display multiple blanks as blank-&nbsp;
obj.html = obj.html.replace(/(^|\n) /g, '$1&nbsp;');
obj.html = obj.html.replace(/ (\n|$)/g, '&nbsp;$1');
Line 6,775 ⟶ 8,322:
obj.html = obj.html.replace(/ {2}/g, '&nbsp; ');
 
// newlines to <br>
obj.html = obj.html.replace(/\n/g, '<br>');
 
// make changed range text the current selection
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
var range = obj.changed.range;
 
obj.sel.addRange(range);
 
// replace the selection with changed text
if ( (obj.changed.keepSel === false) && (obj.html === '') && (obj.sel.isCollapsed === false) ) {
// Opera 9.50beta bug: inserthtml removes blanks and generates consecutive text nodes
wikEd.frameDocument.execCommand('delete');
if (obj.html != '') {
}
var reselectBefore = '';
else if ( (obj.changed.keepSel === false) || (obj.changed.from == 'whole') ) {
var reselectAfter = '';
 
if (obj.changed.from != 'whole') {
// read only toggle highlight button
wikEdInsertCounter ++;
if (wikEd.readOnly === true) {
reselectBefore = '<span class="wikEdScrollBefore" id="wikEdScrollBefore' + wikEdInsertCounter + '"></span>';
wikEd.frameBody.innerHTML = obj.html;
reselectAfter = '<span class="wikEdScrollAfter" id="wikEdScrollAfter' + wikEdInsertCounter + '"></span>';
}
else if (obj.html !== '') {
wikEd.frameDocument.execCommand('inserthtml', false, obj.html);
}
 
// firefox workaround https://bugzilla.mozilla.org/show_bug.cgi?id=309731
else {
wikEd.frameDocument.execCommand('delete', false);
}
WikEdFrameExecCommand('inserthtml', reselectBefore + obj.html + reselectAfter);
}
else {
else if (obj.sel.isCollapsed == false) {
wikEd.insertCounter ++;
WikEdFrameExecCommand('delete');
var reselectBefore = '<span class="wikEdScrollBefore" id="wikEdScrollBefore' + wikEd.insertCounter + '"></span>';
var reselectAfter = '<span class="wikEdScrollAfter" id="wikEdScrollAfter' + wikEd.insertCounter + '"></span>';
wikEd.frameDocument.execCommand('inserthtml', false, reselectBefore + obj.html + reselectAfter);
}
 
// select the whole text after replacing the whole text and scroll to same height
var range = null;
if (obj.changed.from == 'whole') {
if ( (obj.changed.from == 'whole') && (wikEd.frameBody.firstChild !== null) ) {
WikEdRemoveAllRanges(obj.sel);
obj.sel.removeAllRanges();
wikEdFrameBody.scrollTop = frameScrollTop;
var range = wikEdFrameDocumentwikEd.frameDocument.createRange();
range.setStartBefore(wikEdFrameBodywikEd.frameBody.firstChild);
range.setEndAfter(wikEdFrameBodywikEd.frameBody.lastChild);
obj.sel.addRange(range);
selectChanged = false;
 
// scheduling needed for Firefox but not Chrome
window.setTimeout( function () { wikEd.frameBody.scrollTop = frameScrollTop; }, 0);
}
 
// select the changed text and scroll it into the viewport
else if (selectChanged !== false) {
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
var range = wikEdFrameDocumentwikEd.frameDocument.createRange();
var startNodeReselect = wikEdFrameDocumentwikEd.frameDocument.getElementById('wikEdScrollBefore' + wikEdInsertCounterwikEd.insertCounter);
var endNodeReselect = wikEdFrameDocumentwikEd.frameDocument.getElementById('wikEdScrollAfter' + wikEdInsertCounterwikEd.insertCounter);
range.setStartAfterif ( (startNodeReselect !== null) && (endNodeReselect !== null) ); {
range.setStartBefore(startNodeReselect);
// should be range.setEndAfter, but that causes caret at start of next line due to https://bugzilla.mozilla.org/show_bug.cgi?id=587461
range.setEndBeforesetEndAfter(endNodeReselect);
obj.sel.addRange(range);
WikEdScrollToNodes wikEd.ScrollToNodes(startNodeReselect, endNodeReselect);
}
}
 
// save paste range for reselection to switch between textified and wikified text
if ( (wikEd.paste !== null) && (range !== null) ) {
wikEd.paste.range = range.cloneRange();
}
}
 
// remove selection, keep whole text auto-selection as warning
if (
( (obj.changed.keepSel !== true) && (obj.changed.from != 'whole') ) ||
(obj.changed.keepSel === false) ||
(buttonId == 'wikEdRedirect') ||
( (buttonId == 'wikEdWikify') && (parameters == 'whole') )
) {
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEdFrameBodywikEd.frameBody, 0);
}
else {
Line 6,838 ⟶ 8,405:
}
 
// focus edit area to continue editing as there is no selection that would be overwritten
wikEdFrameWindowwikEd.frameWindow.focus();
wikEd.keepSelRange = null;
}
 
// save curently selected range
// reset button to active, reset cursor
else if (buttonObjobj.sel.rangeCount !=> null0) {
wikEd.keepSelRange = obj.sel.getRangeAt(0);
}
else {
wikEd.keepSelRange = null;
}
 
// reset button to active, reset cursor
if (buttonObj !== null) {
if (buttonObj.className != 'wikEdButtonInactive') {
buttonObj.className = 'wikEdButton';
}
buttonObj.style.cursor = 'auto';
}
 
// grey out inactive buttons
wikEd.InactiveButtons();
WikEdInactiveButtons();
 
// add event handlers to unhide refs and templates
if ( (highlightSyntax === true) && (obj.changed.plain !== null) ) {
 
// add eventref handlersand totemplate unhidenames refsto andhide templatesbuttons
wikEd.HighlightNamedHideButtons();
if ( (highlightSyntax == true) && (obj.changed.plain != null) ) {
 
// add refevent andhandlers templateto namesunhide torefs hideand buttonstemplates
wikEd.HideAddHandlers();
WikEdHighlightNamedHideButtons();
 
// add event handlers to unhidemake refshighlighted andframe templateslinks ctrl-clickable
wikEd.LinkifyLinks();
WikEdHideAddHandlers();
 
// get link infos from server (redirects, redlinks)
// add event handlers to make highlighted frame links ctrl-clickable
wikEd.LinkInfoCall();
WikEdLinkifyAddHandlers();
}
 
// resume frame spellchecking
if (pauseFrameSpellchecking === true) {
wikEdFrameBodywikEd.frameBody.spellcheck = true;
}
return;
};
 
 
//
// wikEd.LocalPreview: display local preview box using AJAX call
//
 
wikEd.LocalPreview = function ( fetchRefs ) {
 
// interrupt fullscreen mode
if ( wikEd.fullscreen === true ) {
wikEd.FullScreen( false );
}
 
// update textarea
if ( wikEd.useWikEd === true && wikEd.textareaUpdated === false ) {
wikEd.UpdateTextarea();
wikEd.textareaUpdated = true;
}
 
// clear box to display loading indicator, keep wrapper height to prevent scrolling
var previewHeight = wikEd.localPrevWrapper.offsetHeight;
if ( ( wikEd.previewArticle.innerHTML !== '' || wikEd.previewDiff.innerHTML !== '' ) && previewHeight > 0 ) {
wikEd.localPrevWrapper.style.height = previewHeight + 'px';
}
if ( wikEd.previewArticle.innerHTML === '' ) {
wikEd.previewArticle.innerHTML = wikEd.config.text.wikEdPreviewLoading;
}
wikEd.previewArticle.style.display = 'block';
wikEd.previewDiff.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'block';
 
// prepare ajax preview
var bodyData = wikEd.textarea.value;
if ( wikEd.config.useAjaxPreview === true ) {
 
// use Live preview if possible, see https://www.mediawiki.org/wiki/Manual:Live_preview
var livePreview = true;
 
// articles on watchlist preview page
if ( wikEd.editWatchlist === true ) {
bodyData = bodyData.replace( /\n{1}/g, '\n\n' );
bodyData = bodyData.replace( /(.+)/g,
function( p, p1 ) {
if ( /[#<>\[\]|{}]/.test(p1) === true ) {
return p1;
}
var article = p1;
 
// get article talk page
var talk;
if ( /:/.test(article) === true ) {
 
// $1_ns:name
if ( wikEd.config.text['talk namespace suffix'].indexOf('$1') >= 0 ) {
talk = article.replace( /^([^:]*)/, wikEd.config.text['talk namespace suffix'] );
}
 
// talk_ns:name (Discussion_Utilisateur) (all ASCII non-letters as separator)
else if ( /[ -\/:-@\[-`{-\x88‰‹\x8d\x8f-\x98™›\x9d\xa0-»¿×÷]$/.test( wikEd.config.text['talk namespace suffix'] ) === true ) {
talk = article.replace( /^([^:]*)/, wikEd.config.text['talk namespace suffix'] + '$1' );
}
 
// ns_talk:name (User_talk)
else {
talk = article.replace( /^([^:]*)/, '$1' + wikEd.config.text['talk namespace suffix'] );
}
}
else {
talk = wikEd.config.text['talk namespace'] + ':' + article;
}
var uriArticle = wikEd.EncodeTitle( article );
var hist = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgScript + '?title=' + uriArticle + '&action=history';
return '[[:' + p1 + ']]&nbsp;•&nbsp;([[:' + talk + '|' + wikEd.config.text['talk page'] + ']], [' + hist + ' ' + wikEd.config.text['history page'] + '])';
}
);
}
 
// normal article edit page
else {
 
// check for section edits with <ref> tags
if (
wikEd.editSection !== null &&
/<ref\b[^>\/]*(\/>|>(.|\n)*?<\/ref>)/i.test( bodyData ) === true
) {
 
// check for named references defined outside edited section
if (
true
) {
 
// collect named references in section text
var namedRefs = wikEd.ParseNamedRefs( bodyData );
 
// check for undefined named refs
var undefinedRefs = false;
for ( var name in namedRefs ) {
if (
Object.prototype.hasOwnProperty.call( namedRefs, name ) === true &&
namedRefs[name] === null
) {
 
// reference definition not yet fetched
if ( wikEd.namedRefs[name] === undefined ) {
undefinedRefs = true;
if ( fetchRefs !== false ) {
break;
}
}
 
// replace first ref tag with fetched reference definition
else {
var regExpRef = new RegExp( '<ref\\b[^>]*?\\bname\\s*=\\s*' + name + '[^>/]*(/>|></ref>)', 'i' );
bodyData = bodyData.replace( regExpRef, wikEd.namedRefs[name] );
}
}
}
 
// fetch reference definitions from whole article text for outside refs, do not repeat fetch cycle
if ( undefinedRefs === true && fetchRefs !== false ) {
wikEd.GetArticleText( wikEd.GetArticleTextAjaxHandler );
return;
}
}
 
// append references section
if (
/<references\b[^>]*>/i.test(bodyData) === false &&
/\{\{reflist\b(.|\n)*?\}\}/i.test(bodyData) === false
) {
bodyData += '<div class="wikEdPreviewRefs"><references/></div>';
}
}
}
 
// GeSHi syntax highlighting support for legacy installations and Greasemonkey
// CSS is only provided dynamically and not for Live preview
// request a full preview and attach CSS to page, remember already loaded languages
if ( wikEd.loader === false ) {
var regExp = /<(syntaxhighlight|source)\b[^>]*?lang\s*=\s*("|')(\w+)\2/gi;
var regExpMatch;
while ( (regExpMatch = regExp.exec(bodyData)) !== null) {
var lang = regExpMatch[3];
if (wikEd.syntaxHighlightTagCSS['wikEd' + lang] === undefined) {
livePreview = false;
wikEd.syntaxHighlightTagCSS['wikEd' + lang] = true;
break;
}
}
}
 
// make the AJAX request
wikEd.AjaxPreview( bodyData, wikEd.LocalPreviewAjaxHandler, livePreview );
}
return;
};
 
 
 
//
// wikEd.AjaxPreview: get rendered page text using an Ajax non-API POST call
// WikEdLocalPreviewAjaxHandler: process the returned article preview
//
 
wikEd.AjaxPreview = function (textValue, ResponseHandler, livePreview, format ) {
window.WikEdLocalPreviewAjaxHandler = function(ajax) {
 
// get format, json preferred for module updates and summary parsing
wikEdPreviewIsAjax = true;
if ( format === undefined ) {
format = 'json';
}
if ( format === 'json' && typeof JSON !== 'object' ) {
format = 'xml';
}
 
// getAPI responserequest
if ( livePreview === true ) {
var html = ajax.responseText;
 
// get summary
// livepreview
var summary = '';
if (html.indexOf("<livepreview>") != -1) {
if (wikEd.summaryText !== null) {
html = html.replace(/\s*<\/livepreview>\s*()/, '');
summary = wikEd.summaryText.value;
html = html.replace(/\s*<\/preview>\s*()/, '');
}
html = html.replace(/&lt;/g, '<');
 
html = html.replace(/&gt;/g, '>');
// set request parameters
html = html.replace(/&quot;/g, '"');
var postFields = {
html = html.replace(/&apos;/g, '\'');
'format': format,
html = html.replace(/&amp;/g, '&');
'action': 'parse',
html = html.replace(/(.|\n)*<div class=\'previewnote\'>(.|\n)*?<\/div>/, '');
'prop': 'text|modules',
'disablepp': '1',
'pst': '1',
'title': wikEd.pageName,
'text': textValue,
'summary': summary
};
var requestUrl = wikEd.scriptURL + 'api.php';
 
// AJAX API request
wikEd.AjaxRequest( 'POST', requestUrl, postFields, 'text/plain', ResponseHandler );
}
 
// legacy support: non-API request, use Live preview if possible
// full preview page
else {
 
// prepare the url
// attach <style> stylesheet declarations to document (GeSHi)
var requestUrl;
if ( wikEd.editForm !== null && wikEd.editUpload !== true && wikEd.editWatchlist !== true && wikEd.viewDeleted !== true ) {
requestUrl = wikEd.editForm.action.replace( /\?.*()/, '' );
if ( /:\/\/()/.test(requestUrl) === false ) {
requestUrl = window.___location.protocol + '//' + window.___location.host + requestUrl;
}
}
else if ( wikEd.wikiGlobals.wgScriptPath !== undefined ) {
requestUrl = wikEd.wikiGlobals.wgScriptPath + '/index.php';
}
else {
requestUrl = window.___location.href;
requestUrl = requestUrl.replace( /\?.*()/, '' );
requestUrl = requestUrl.replace( /\/[\w\.]*$/, '/index.php' );
}
 
// prepare the form fields
var postFields = {};
if ( wikEd.pageName !== null && wikEd.wikiGlobals.wgCanonicalNamespace != 'Special' ) {
postFields['title'] = wikEd.pageName;
}
else {
postFields['title'] = 'wikEd_preview';
}
postFields['action'] = 'submit';
postFields['wpTextbox1'] = textValue;
if ( wikEd.starttime !== null ) {
postFields['wpStarttime'] = wikEd.starttime;
}
if ( wikEd.edittime !== null ) {
postFields['wpEdittime'] = wikEd.edittime;
}
if ( wikEd.editToken !== null ) {
postFields['wpEditToken'] = wikEd.editToken;
}
if ( wikEd.autoSummary !== null ) {
postFields['wpAutoSummary'] = wikEd.autoSummary;
}
postFields['wpPreview'] = 'true';
if (livePreview !== false) {
postFields['live'] = 'true';
}
 
// AJAX non-API request
wikEd.AjaxRequest( 'POST', requestUrl, postFields, 'text/plain', ResponseHandler );
}
return;
};
 
 
//
// wikEd.LocalPreviewAjaxHandler: process the returned article preview
//
 
wikEd.LocalPreviewAjaxHandler = function ( ajax ) {
 
// get preview html
var html = '';
 
// json API reponse
if ( ajax.responseText.indexOf( '{' ) === 0 ) {
var responseObj = JSON.parse( ajax.responseText );
if ( responseObj.parse !== undefined ) {
var parse = responseObj.parse;
html = parse.text['*'];
 
// load module js and css
if ( wikEd.loader === true && parse.modules !== undefined ) {
var modules = parse.modules.concat(
parse.modulescripts, parse.modulestyles, parse.modulemessages
);
window.mw.loader.load( modules );
}
 
// add heading to new section
if ( parse.parsedsummary !== undefined && wikEd.editSection === 'new') {
html = '<h2>' + parse.parsedsummary['*'] + '</h2>' + html;
}
}
}
 
// xml API reponse
else if ( ajax.responseText.indexOf( '<api>' ) !== -1 ) {
html = wikEd.StringGetInnerHTML( ajax.responseText, 'text', '' )
.replace( /&lt;/g, '<' )
.replace( /&gt;/g, '>' )
.replace( /&quot;/g, '"' )
.replace( /&amp;/g, '&' );
}
 
// non-API livepreview (https://www.mediawiki.org/wiki/Manual:Live_preview)
else if ( ajax.responseText.indexOf( '<livepreview>' ) != -1 ) {
html = wikEd.StringGetInnerHTML( ajax.responseText, 'preview', '' )
.replace( /&lt;/g, '<' )
.replace( /&gt;/g, '>' )
.replace( /&quot;/g, '"' )
.replace( /&apos;/g, '\'' )
.replace( /&amp;/g, '&' );
html = wikEd.RemoveTag( html, 'div', /\bclass=("|')previewnote("|')/, '\x00', '\x01' );
html = html.replace( /\x00(.|\n)*?\x01/g, '' );
}
 
// full preview page
else {
html = ajax.responseText;
 
// attach <style> stylesheet declarations to document (<source>, <syntaxhighlight>)
var regExpMatch;
whilevar ( (regExpMatchregExp = /<()style\b[^>]*?type=\"text\/css\">((.|\n)*?)<\/style>/gi.exec(html)) != null) {;
while ( ( regExpMatch = regExp.exec( html ) ) !== null ) {
var css = regExpMatch[2];
var stylesheet = new WikEdStyleSheetwikEd.StyleSheet( document );
stylesheet.WikEdAddRulesAddCSSRules( css );
}
 
// get preview html
html = wikEd.StringGetInnerHTML( html, 'div', 'id', 'wikiPreview', true );
html = wikEd.StringGetInnerHTML( html, 'div', 'class', 'previewnote', true, false, true );
html = html.replace( /<!--(.|\n)*?-->/g, '' );
html = html.replace( /\s+$/g, '' );
}
 
// clean form elements as these could interfere with the submit buttons
html = html.replace( /<\/?form\b[^>]*>/ggi, '' );
html = html.replace( /(<\/?input\b[^>]*?)\bnamebtype\s*=\s*["search']?hidden["(']?[^>]*>)/ggi, '$1$2' );
html = html.replace( /<input\b([^>]*)>/gi,
function( p, p1 ) {
p1 = p1.replace( /\bname\s*=\s*([^"'`=]+|\'[^'=]*\'|\"[^"=]*\")/gi, '' );
return p1;
}
);
 
// remove cite errors for automatic section preview refs
html = html.replace( /(<div\b[^>]*?\bclass=\"wikEdPreviewRefs\"[^>]*>(.|\sn)*$)/gi,
function ( p, p1, p2 ) {
p1 = p1.replace( /<strong\b[^>]*?\bclass=\"error\"[^>]*>(.|\sn)*?<\/strong>/g, '' );
return( p1);
}
);
wikEdPreviewBoxwikEd.previewArticle.innerHTML = html;
 
// apply dynamic changes to preview
// init sortable tables (wikibits.js)
if (typeof(sortables_init) == 'function') {
// init sortable tables (wikibits.js)
sortables_init();
if ( typeof window.sortables_init === 'function' ) {
window.sortables_init();
}
 
// init collapsible tables (common.js)
if ( typeof( window.createCollapseButtons) === 'function' ) {
window.createCollapseButtons();
}
 
// collapsible divs (common.js on ru)
// scroll to button, textarea, or preview field
if (typeof window.collapsibleDivs === 'function' ) {
WikEdScrollToPreview();
window.collapsibleDivs();
}
// collapsible tables (common.js on ru)
if (typeof window.collapsibleTables === 'function' ) {
window.collapsibleTables();
}
 
// load MathJax modules and render math elements
if ( wikEd.loader === true ) {
if ( $( '.tex' ).length > 0 && window.mw.user.options.get( 'math' ) === '6' ) {
window.mw.loader.using( 'ext.math.mathjax.enabler', function () {
$( '#wikiPreview' ).renderTex();
} );
}
}
/*
// load media player modules and activate media elements
if ( wikEd.loader === true ) {
window.mw.loader.using( ['mw.MwEmbedSupport', 'mw.EmbedPlayer'], function() {
 
// activate media elements, from mw.PopUpMediaTransform.js, see https://bugzilla.wikimedia.org/show_bug.cgi?id=72675
$('.PopUpMediaTransform a').each( function() {
var parent = $( this ).parent();
if ( parent.attr( 'videopayload' ) ) {
$( this ).click( function( event ) {
var thisref = this;
 
window.mw.loader.using( 'mw.MwEmbedSupport', function () {
var $videoContainer = $( $( thisref ).parent().attr( 'videopayload' ) );
window.mw.addDialog( {
'width' : 'auto',
'height' : 'auto',
'title' : window.mw.html.escape( $videoContainer.find('video,audio').attr('data-mwtitle') ),
'content' : $videoContainer,
'close' : function() {
// On close pause the video on close (so that playback does not continue)
var domEl = $( this ).find( 'video,audio' ).get(0);
if( domEl && domEl.pause ) {
domEl.pause();
}
return true;
}
} )
.css('overflow', 'hidden')
.find('video,audio').embedPlayer();
} );
// don't follow file link
return false;
} );
}
else if ( parent.attr( 'data-videopayload' ) ) {
var link = $( this ).attr( 'href' ), title = window.mw.Title.newFromImg( { src: link } );
if ( title && title.getPrefixedDb() !== window.mw.config.get( 'wgPageName' ) ) {
$( this ).attr( 'href', title.getUrl() );
}
}
} );
} );
}
*/
// fire mediawiki hook to apply changes to preview content: <categorytree>, <math>
if ( window.mw !== undefined && window.mw.hook !== undefined && window.mw.hook( 'wikipage.content' ).fire !== undefined ) {
window.mw.hook( 'wikipage.content' ).fire( $( '#wikEdPreviewArticle' ) );
}
 
// scroll to button, textarea, or preview field
wikEd.ScrollToPreview();
 
// run scheduled custom functions
wikEd.ExecuteHook( wikEd.config.previewHook );
 
return;
};
Line 6,946 ⟶ 8,888:
 
//
// wikEd.GetArticleText: get full article text
// WikEdFilePreviewAjaxHandler: process the returned image addresses
// for section edits with refs defined outside section
 
wikEd.GetArticleText = function ( ResponseHandler ) {
 
var postFields = {
'format': 'xml',
'action': 'query',
'titles': wikEd.wikiGlobals.wgTitle,
'prop': 'revisions',
'rvprop': 'content'
};
if ( wikEd.starttime !== null ) {
postFields['wpStarttime'] = wikEd.starttime;
}
if ( wikEd.edittime !== null ) {
postFields['wpEdittime'] = wikEd.edittime;
}
if ( wikEd.editToken !== null ) {
postFields['wpEditToken'] = wikEd.editToken;
}
if ( wikEd.autoSummary !== null ) {
postFields['wpAutoSummary'] = wikEd.autoSummary;
}
var requestUrl = wikEd.scriptURL + 'api.php';
 
// make an ajax API request
wikEd.AjaxRequest( 'POST', requestUrl, postFields, 'text/plain', ResponseHandler );
 
return;
};
 
 
//
// wikEd.GetArticleTextAjaxHandler: process the returned full article text
// for section edits with refs defined outside section
 
wikEd.GetArticleTextAjaxHandler = function ( ajax ) {
 
// get response
var html = ajax.responseText;
 
// get text
html = wikEd.StringGetInnerHTML( html, 'rev', '' )
.replace( /&lt;/g, '<' )
.replace( /&gt;/g, '>' )
.replace( /&quot;/g, '"' )
.replace( /&apos;/g, '\'' )
.replace( /&amp;/g, '&' );
 
// collect named references in section text
var namedRefs = wikEd.ParseNamedRefs( html );
 
// save undefined named refs
for ( var name in namedRefs ) {
if ( Object.prototype.hasOwnProperty.call( namedRefs, name ) === true ) {
if ( namedRefs[name] !== null ) {
wikEd.namedRefs[name] = namedRefs[name];
}
}
}
 
// do a local preview, do not repeat fetch cycle for reference definitions
wikEd.LocalPreview( false );
 
return;
};
 
 
//
// wikEd.ParseNamedRefs: parse named references from article text
//
 
wikEd.ParseNamedRefs = function ( text ) {
 
var namedRefs = {};
var regExpRef = /<ref\b[^>]*?\bname\s*=\s*("[^<"]+"|[\w!$%&()*,\-.:;<@\[\]^`\{|\}~]+)[^>]*?(\/>|>((.|\n)*?)<\/ref>)/gi;
var regExpMatch;
while ( ( regExpMatch = regExpRef.exec( text ) ) !== null ) {
var ref = regExpMatch[0];
var name = regExpMatch[1];
var def = regExpMatch[3] || '';
if ( Object.prototype.hasOwnProperty.call( namedRefs, name ) === false ) {
namedRefs[name] = null;
}
if ( def !== '' ) {
namedRefs[name] = ref;
}
}
 
return namedRefs;
};
 
 
//
// wikEd.FilePreviewAjaxHandler: process the returned image addresses
//
 
windowwikEd.WikEdFilePreviewAjaxHandlerFilePreviewAjaxHandler = function (ajax) {
 
// get response
var html = ajax.responseText;
 
// html-ize
html = html.replace( /\s*<\/preview>\s*()/, '' );
html = html .replace( /\s*<\/livepreview>\s*()/, '' );
html = html .replace( /&lt;/g, '<' );
html = html .replace( /&gt;/g, '>' );
html = html .replace( /&amp;/g, '&' );
html = html .replace( /&quot;/g, '"' );
html = html .replace( /&apos;/g, '\'' );
html = html .replace( /<\/?(br|p)\b.[^>]*?>/g, '\n' );
 
// parse response into file url cache
var regExpFile = new RegExp('\\n((Image|File|Media|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfigwikEd.config.text['textwikicode File'] + '|' + wikEd.config.text['wikicode FileMedia'] + '):[^ ]+) +(\\d+) +(.*)', 'ig');
var regExpMatch;
while ( (regExpMatch = regExpFile.exec(html)) !== null) {
var file = regExpMatch[1];
var filePreviewSize = regExpMatch[3];
Line 6,973 ⟶ 9,010:
var fileObj = {};
var regExpMatch;
if ( (regExpMatch = /\bsrc=\"(.+?)\"/.exec(links)) !== null) {
fileObj.url = regExpMatch[1];
if ( (regExpMatch = /\bwidth=\"(\d+)\"/.exec(links)) !== null) {
fileObj.width = parseInt(regExpMatch[1]);
}
if ( (regExpMatch = /\bheight=\"(\d+)\"/.exec(links)) !== null) {
fileObj.height = parseInt(regExpMatch[1]);
}
}
else {
fileObj.url = wikEdConfig['wikEd.config.image']['noFile'];
fileObj.width = 16;
fileObj.height = 16;
}
wikEdFilePreviewCachewikEd.filePreviewCache['wikEd' + file + filePreviewSize] = fileObj;
}
 
// cycle through file preview spans and add missing images as background
for (var i = 0; i < wikEdFilePreviewNowikEd.filePreviewNo; i ++) {
if (wikEdFilePreviewIdswikEd.filePreviewIds[i] !== '') {
var span = wikEdFrameDocumentwikEd.frameDocument.getElementById('wikEdFilePreview' + i);
if (span !== null) {
var fileNameSize = wikEdFilePreviewIds[i];
var fileNameSize = wikEd.filePreviewIds[i];
var fileObj = wikEdFilePreviewCache['wikEd' + fileNameSize];
if var (fileObj != null)wikEd.filePreviewCache['wikEd' {+ fileNameSize];
if (fileObj !== undefined) {
span.style.backgroundImage = 'url(' + fileObj.url + ')';
if (fileObj.height !== null) {
span.style.height = fileObj.height + 'px';
}
if (fileObj.width !== null) {
span.style.width = fileObj.width + 'px';
}
span.style.display = 'block';
}
spanwikEd.style.displayfilePreviewIds[i] = 'block';
}
wikEdFilePreviewIds[i] = '';
}
}
Line 7,015 ⟶ 9,054:
 
//
// wikEd.DiffResponse: calculate and linkify the diff between two versions (code copied to wikEdDiff.js)
// StringGetInnerHTML: get innerHTML of element from html in a string; can also get text before or after node
//
 
wikEd.DiffResponse = function (oldVersion, newVersion) {
window.StringGetInnerHTML = function(html, tag, attrib, value, defaultToWholeHTML, getBeforeHTML, getAfterHTML) {
 
// add trailing newline
if (oldVersion.substr(oldVersion.length - 1, 1) != '\n') {
oldVersion += '\n';
}
if (newVersion.substr(newVersion.length - 1, 1) != '\n') {
newVersion += '\n';
}
 
// call external diff program
var wikEdDiff = new WikEdDiff();
var diffText = wikEdDiff.diff(oldVersion, newVersion);
 
// linkify blockwise with breaks at delete and block move tags
var diffTextLinkified = '';
var regExp = /<span\b[^>]+?\bclass="wikEdDiff(Delete|Block)"[^>]*>/g;
var regExpMatch;
var pos = 0;
while ( (regExpMatch = regExp.exec(diffText)) !== null) {
diffTextLinkified += wikEd.DiffLinkify(diffText.substring(pos, regExpMatch.index)) + regExpMatch[0];
pos = regExp.lastIndex;
}
diffTextLinkified += wikEd.DiffLinkify(diffText.substr(pos));
return diffTextLinkified;
};
 
 
//
// wikEd.DiffLinkify: linkify external links and wikilinks in diffed text as <a> anchor elements (code copied to wikEdDiff.js)
//
 
wikEd.DiffLinkify = function (html) {
 
// &lt; &gt; to \x00 \x01
html = html.replace(/&lt;/g, '\x00');
html = html.replace(/&gt;/g, '\x01');
 
// split into valid html tags and plain text fragments
var linkified = '';
var regExp = /(<[^<>]*>)|([^<>]+|<|>)/g;
var regExpMatch;
while ( (regExpMatch = regExp.exec(html)) !== null) {
var tag = regExpMatch[1] || '';
var plain = regExpMatch[2] || '';
 
// process tags
if (tag !== '') {
linkified += tag;
}
 
// process plain tags
else {
 
// escape bogus < or >
plain = plain.replace(/>/g, '&gt;');
plain = plain.replace(/</g, '&lt;');
 
// external links 123 3 2 14 4 5 6 65
plain = plain.replace(/(((\bhttps?:|\bftp:|\birc:|\bgopher:|)\/\/)|\bnews:|\bmailto:)([^\x00-\x20\s"\[\]\x7f\|\{\}<>]|<[^>]*>)+?(?=([!"().,:;‘-•]*\s|[\x00-\x20\s"\[\]\x7f|{}]|$))/gi,
function(p) {
var whole = p;
 
// remove tags and comments
var url = whole;
url = url.replace(/\x00!--.*?--\x01/g, '');
url = url.replace(/.*--\x01|\x00!--.*()/g, '');
url = url.replace(/<.*?>/g, '');
url = url.replace(/^.*>|<.*$/g, '');
url = url.replace(/^\s+|\s+$/g, '');
 
// make title as readable as possible
var title = url;
title = title.replace(/\+/g, ' ');
 
// decodeURI breaks for invalid UTF-8 escapes
title = title.replace(/(%[0-9a-f]{2})+/gi,
function(p, p1) {
try {
return decodeURI(p);
}
catch (exception) {
return p;
}
}
);
title = title.replace(/\t/g, ' ');
title = wikEd.EscapeHtml(title);
title = title.replace(/"/g, '&quot;');
 
// linkify all url text fragments between highlighting <span>s seperately
var anchorOpen = '<a href = "' + url + '" style="text-decoration: none; color: inherit; color: expression(parentElement.currentStyle.color);" title="' + title + '">';
var anchorClose = '</a>';
whole = whole.replace(/(<[^>]*>)/g, anchorClose + '$1' + anchorOpen);
return anchorOpen + whole + anchorClose;
}
);
 
// linkify links and templates
if ( (wikEd.wikiGlobals.wgServer !== undefined) && (wikEd.wikiGlobals.wgArticlePath !== undefined) ) {
 
// 1 [[ 2title 23 | text 3 ]]1 4 {{ 5title 56 6 4
plain = plain.replace(/(\[\[([^|\[\]{}\n]+)(\|[^\[\]{}<>]*)?\]\])|(\{\{([^|\[\]{}\n]*)([^\[\]{}<>]*\}\})?)/g,
function(p, p1, p2, p3, p4, p5, p6) {
var articleName = p2 || '';
var templateName = p5 || '';
var whole = p;
 
// extract title
var title = articleName;
if (title === '') {
title = templateName;
}
title = title.replace(/\x00!--.*?--\x01/g, '');
title = title.replace(/.*--\x01|\x00!--.*()/g, '');
title = title.replace(/<.*?>/g, '');
title = title.replace(/^.*>|<.*$/g, '');
title = title.replace(/^\s+|\s+$/g, '');
 
// [[/subpage]] refers to a subpage of the current page, [[#section]] to a section of the current page
if ( (title.indexOf('/')=== 0) || (title.indexOf('#')=== 0) ) {
title = wikEd.pageName + title;
}
 
// create url
var url = wikEd.EncodeTitle(title);
var articleTitle = title.replace(/"/g, '&quot;');
if (templateName !== '') {
if (/:/.test(title) === false) {
url = 'Template:' + url;
articleTitle = 'Template:' + articleTitle;
}
}
url = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, url);
 
// linkify all text fragments between highlighting <span>s seperately
var anchorOpen = '<a href = "' + url + '" style = "text-decoration: none; color: inherit; color: expression(parentElement.currentStyle.color)" title="' + articleTitle + '">';
var anchorClose = '</a>';
whole = whole.replace(/(<[^>]*>)/g, anchorClose + '$1' + anchorOpen);
return anchorOpen + whole + anchorClose;
}
);
}
linkified += plain;
}
}
 
// \x00 and \x01 back to &lt; and &gt;
linkified = linkified.replace(/\x00/g, '&lt;');
linkified = linkified.replace(/\x01/g, '&gt;');
 
return linkified;
};
 
 
//
// wikEd.StringGetInnerHTML: get innerHTML of element from html in a string; can also get text before or after node
//
 
wikEd.StringGetInnerHTML = function (html, tag, attrib, value, defaultToWholeHTML, getBeforeHTML, getAfterHTML) {
 
var startPos;
Line 7,025 ⟶ 9,223:
var endLength;
var level = 0;
var string = '';
var regExpMatch;
 
var attribValue = '';
if (attrib !== '') {
attribValue = '[^>]*?' + attrib + '\\s*=\\s*(\\"|\\\')?' + value + '\\1';
}
var regExpStart = new RegExp('<' + tag + '\\b' + attribValue + '[^>]*?>', 'gi');
var regExpMatch;
if ( (regExpMatch = regExpStart.exec(html)) !== null) {
startPos = regExpMatch.index;
startLength = regExpMatch[0].length;
var regExpParse = new RegExp('<(\\/?)' + tag + '\\b.[^>]*?>', 'g');
regExpParse.lastIndex = startPos;
while ( (regExpMatch = regExpParse.exec(html)) !== null) {
ifvar p1 = (regExpMatch[1] ==|| '') {;
if (p1 === '') {
level ++;
}
else {
level --;
if (level === 0) {
endPos = regExpMatch.index;
endLength = regExpMatch[0].length;
Line 7,053 ⟶ 9,252:
}
 
// return whole html if node does not exist
if (endPos === nullundefined) {
if (defaultToWholeHTML === true) {
string = html;
}
}
 
// return text before node
else if (getBeforeHTML === true) {
string = html.substr(0, startPos);
}
 
// return text after node
else if (getAfterHTML === true) {
string = html.substr(endPos + endLength);
}
 
// return innerHTML of node
else {
string = html.substring(startPos + startLength, endPos);
}
 
return( string);
};
 
 
//
// WikEdScrollToPreviewwikEd.ScrollToPreview: scroll to edit buttons, textarea, or preview field depending on current position
//
 
windowwikEd.WikEdScrollToPreviewScrollToPreview = function () {
 
// reset fixed height to auto
wikEdPreviewBoxwikEd.localPrevWrapper.style.height = 'auto';
 
var scrollOffset = window.pageYOffset || document.body.scrollTop;
var inputOffset = WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdInputWrapperwikEd.inputWrapper);
var editOffset = WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdEditWrapperwikEd.editWrapper);
var submitOffset = 0;
if (wikEdSaveButtonwikEd.saveButton !== null) {
submitOffset = WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdSaveButtonwikEd.submitWrapper);
}
else if (wikEdPreviewButtonwikEd.previewButton !== null) {
submitOffset = WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdPreviewButtonwikEd.previewButton);
}
else if (wikEdDiffPreviewButtonwikEd.diffPreviewButton !== null) {
submitOffset = WikEdGetOffsetTopwikEd.GetOffsetTop(wikEdDiffPreviewButtonwikEd.diffPreviewButton);
}
else if (wikEd.submitWrapper !== null) {
var editHeight = wikEdEditWrapper.clientHeight;
submitOffset = wikEd.GetOffsetTop(wikEd.submitWrapper);
}
else {
return;
}
var editHeight = wikEd.editWrapper.clientHeight;
 
if (scrollOffset > submitOffset) {
Line 7,120 ⟶ 9,325:
 
//
// WikEdLinkifyAddHandlerswikEd.LinkifyLinks: register click handlers to make highlighted frame links ctrl-clickable (linkify), add redirect info, and highlight redlinks
//
 
windowwikEd.WikEdLinkifyAddHandlersLinkifyLinks = function () {
 
// detect external files and images
// reset frame timeout
var regExpFile = new RegExp('^(Image|File|Media|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + '):', 'i');
// window.clearTimeout(wikEdLinkifyTimeoutId);
// wikEdLinkifyTimeoutId = null;
if (wikEdConfig['linkify'] != true) {
return;
}
 
// cycle through spans
// much faster than individual getElementById in SeaMonkey 1.1.18
var spans = wikEdFrameDocumentwikEd.frameDocument.getElementsByTagName('span');
for (var i = 0; i < spans.length; i ++) {
var spanIdspan = spans[i].id;
ifvar (spanIdid != null) {span.id;
if (spanId (id !== null) && (id.indexOf('wikEdLinkifywikEdWikiLink') === 0) ) {
if (Object.prototype.hasOwnProperty.call(wikEd.wikiLinks, id) === true) {
WikEdAddEventListener(spans[i], 'click', WikEdLinkifyHandler, true);
 
// linkify
if (wikEd.config.linkify === true) {
span.addEventListener('click', wikEd.LinkifyHandler, true);
}
 
// add redirect and redlink info to popup
var info = '';
var link = wikEd.wikiLinks[id].link;
var externalLink = link.replace(regExpFile, 'File:');
 
// redirects
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, link) === true) && (wikEd.linkInfo[link].updated === true) && (wikEd.linkInfo[link].redirect === true) ) {
var target = wikEd.linkInfo[link].target;
if (target !== undefined) {
info += wikEd.config.text.redirect + ' ' + target;
}
}
else if ( (Object.prototype.hasOwnProperty.call(wikEd.externalLinkInfo, link) === true) && (wikEd.externalLinkInfo[link].updated === true) && (wikEd.externalLinkInfo[link].redirect === true) ) {
var target = wikEd.linkInfo[link].target;
if (target !== undefined) {
info += wikEd.config.text.redirect + ' ' + target;
}
}
 
// normalize redlinks from preview scanning
var linkNorm = link.charAt(0).toUpperCase() + link.substr(1);
var linkNormFull = link.replace(/(^|:)(.)/g, function (p, p1, p2) {
return p.toUpperCase();
});
 
// check for redlinks (missing links)
var missingLink = false;
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, link) === true) && (wikEd.linkInfo[link].updated === true) && (wikEd.linkInfo[link].missing === true) ) {
missingLink = true;
}
 
var missingExternalLink = false;
if (Object.prototype.hasOwnProperty.call(wikEd.externalLinkInfo, externalLink) === true) {
if ( (wikEd.externalLinkInfo[externalLink].updated === true) && (wikEd.externalLinkInfo[externalLink].missing === true) ) {
missingExternalLink = true;
}
}
else {
missingExternalLink = true;
}
 
var missingLinkNorm = false;
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, linkNorm) === true) && (wikEd.linkInfo[linkNorm].type == 'preview') && (wikEd.linkInfo[linkNorm].missing === true) ) {
missingLinkNorm = true;
}
var missingLinkNormFull = false;
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, linkNormFull) === true) && (wikEd.linkInfo[linkNormFull].type == 'preview') && (wikEd.linkInfo[linkNormFull].missing === true) ) {
missingLinkNormFull = true;
}
 
if ( ( (missingLink === true) && (missingExternalLink === true) ) || (missingLinkNorm === true) || (missingLinkNormFull === true) ) {
span.classList.add('wikEdRedlink');
info += wikEd.config.text.redlink;
}
else {
span.classList.remove('wikEdRedlink');
}
 
// set title popup
span.title = wikEd.wikiLinks[id].linkify + info;
 
// save current link infos
wikEd.wikiLinks[id].info = info;
}
}
Line 7,147 ⟶ 9,417:
 
//
// WikEdHighlightNamedHideButtonswikEd.HighlightNamedHideButtons: register :before text for named hiding buttons
//
 
windowwikEd.WikEdHighlightNamedHideButtonsHighlightNamedHideButtons = function () {
 
if (wikEdRefHidewikEd.refHide !== true) {
return;
}
Line 7,158 ⟶ 9,428:
var rules = '';
 
// references
for (var i = 0; i < wikEdReferenceArraywikEd.referenceArray.length; i ++) {
if (wikEdReferenceArraywikEd.referenceArray[i].added === true) {
continue;
}
rules += '.wikEdRefButton' + i + ' { border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; }\n';
 
rules += '.wikEdRefButtonShow' + i + ' { border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; }\n';
rules += '.wikEdRefButton' + i + ':before, .wikEdRefButtonShow' + i + ':before { content: "' + wikEd.config.text.hideRef + ' ' + wikEd.referenceArray[i].text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
 
wikEd.referenceArray[i].added = true;
rules += '.wikEdRefButton' + i + ':before, .wikEdRefButtonShow' + i + ':before { content: "' + wikEdConfig['text']['hideRef'] + ' ' + wikEdReferenceArray[i].text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
 
wikEdReferenceArray[i].added = true;
}
 
// templates
for (var i = 0; i < wikEdTemplateArraywikEd.templateArray.length; i ++) {
if (wikEdTemplateArraywikEd.templateArray[i].added === true) {
continue;
}
rules += '.wikEdTemplButton' + i + ' { border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; }\n';
 
rules += '.wikEdTemplButtonShow' + i + ' { border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; }\n';
rules += '.wikEdTemplButton' + i + ':before, .wikEdTemplButtonShow' + i + ':before { content: "' + wikEd.config.text.hideTempl + ' ' + wikEd.templateArray[i].text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
 
wikEd.templateArray[i].added = true;
rules += '.wikEdTemplButton' + i + ':before, .wikEdTemplButtonShow' + i + ':before { content: "' + wikEdConfig['text']['hideTempl'] + ' ' + wikEdTemplateArray[i].text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
 
wikEdTemplateArray[i].added = true;
}
 
// character entities
for (var i = 0; i < wikEdCharEntityArraywikEd.charEntityArray.length; i ++) {
if (wikEdCharEntityArraywikEd.charEntityArray[i].added === true) {
continue;
}
var character = wikEdCharEntityArraywikEd.charEntityArray[i].text;
if (character == '"') {
character = '\\' + character;
}
rules += '.wikEdCharEntityButton' + i + ' { border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; border-color: rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5) rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75); background: rgba(192, 192, 192, 0.3); }\n';
 
rules += '.wikEdCharEntityButtonShow' + i + ' { border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; border-color: rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75) rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5); background: rgba(192, 192, 192, 0.3); }\n';
 
rules += '.wikEdCharEntityButton' + i + ':before, .wikEdCharEntityButtonShow' + i + ':before { content: "' + character + '"; }\n';
wikEd.charEntityArray[i].added = true;
}
 
// tables
wikEdCharEntityArray[i].added = true;
for (var i = 0; i < wikEd.tableArray.length; i ++) {
if (wikEd.tableArray[i].added === true) {
continue;
}
var text = wikEd.config.text.hideTable;
if (text !== '') {
text += ' ';
}
text += wikEd.tableArray[i].text;
rules += '.wikEdTableButton' + i + ' { border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; }\n';
rules += '.wikEdTableButtonShow' + i + ' { border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; }\n';
rules += '.wikEdTableButton' + i + ':before, .wikEdTableButtonShow' + i + ':before { content: "' + text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
wikEd.tableArray[i].added = true;
}
 
// add or replace existing css rules
if (rules !== '') {
wikEd.HighlightNamedHideButtonsStylesheet.AddCSSRules(rules);
WikEdHighlightNamedHideButtonsStylesheet.WikEdAddRules(rules);
}
return;
Line 7,213 ⟶ 9,490:
 
//
// WikEdHideAddHandlerswikEd.HideAddHandlers: register mouseover handlers for tabs to unhide refs, templates, and character entities
//
 
windowwikEd.WikEdHideAddHandlersHideAddHandlers = function () {
 
if ( (wikEdConfig['wikEd.config.hideContent'] !== true) || (wikEdRefHidewikEd.refHide !== true) ) {
return;
}
var hideButton = wikEdFrameDocumentwikEd.frameDocument.getElementsByTagName('button');
for (var i = 0; i < hideButton.length; i ++) {
var tabClass = hideButton[i].className;
if (
(tabClass.indexOf('wikEdRefButton') === 0) ||
(tabClass.indexOf('wikEdTemplButton') === 0) ||
(tabClass.indexOf('wikEdCharEntityButton') === 0) ||
(tabClass.indexOf('wikEdTableButton')=== 0)
) {
WikEdAddEventListener(hideButton[i], .addEventListener('click', WikEdHideShowHandlerwikEd.HideShowHandler, true);
if (
(tabClass.indexOf('wikEdRefButtonShow') == -1) &&
(tabClass.indexOf('wikEdTemplButtonShow') == -1) &&
(tabClass.indexOf('wikEdCharEntityButtonShow') == -1) &&
(tabClass.indexOf('wikEdTableButtonShow') == -1)
) {
WikEdAddEventListener(hideButton[i], .addEventListener('mouseover', WikEdHideShowHandlerwikEd.HideShowHandler, true);
}
}
Line 7,244 ⟶ 9,523:
 
//
// WikEdHideShowHandlerwikEd.HideShowHandler: display hidden ref or template on mouse over hide tab
//
 
windowwikEd.WikEdHideShowHandlerHideShowHandler = function (event) {
 
// event compatibility fixes
event = WikEdEvent(event, this);
if (event == null) {
return;
}
event.preventDefault();
 
// find hidden content node
var hideTarget = event.currentTargetnull;
var hideInto = event.safeRelatedTargetnull;
var hideButtonhideButtonClass = null;
var hideContainerhideClass = null;
var hidehideButton = null;
var hideContainer = null;
var hideCell = null;
var hide = null;
 
if ( (event.type == 'mouseover') || (event.type == 'mouseout') || (event.type == 'click') ) {
// <container><button></button></container><hide> text </hide>
hideTarget = event.currentTarget;
hideInto = event.relatedTarget;
 
// <container><button></button></container><hide> text </hide>
// target == button
if (/^wikEd(Ref|Templ|CharEntity)Button(Show)?\d*$/.test(hideTarget.className) == true) {
hideButton = hideTarget;
hideContainer = hideButton.parentNode;
if (hideContainer != null) {
if (/^wikEd(Ref|Templ|CharEntity)Container$/.test(hideContainer.className) == false) {
hideContainer = null;
}
else {
 
// target = table cell
// get hide text
if ( (hideTarget.tagName == 'TD') && (/^wikEdTable\w+?$/.test(hideTarget.className) === true) ) {
hide = WikEdGetNextSiblingNode(hideContainer);
hideCell = hideTarget;
if (hide != null) {
hideButton = hideCell.getElementsByTagName('button')[0] || null;
if (/^wikEd(Ref|Templ|TemplNs|CharEntity)(Show)?$/.test(hide.className) == false) {
}
hide = null;
 
// target = button
else if (/^wikEd(Ref|Templ|CharEntity|Table)Button(Show)?\d*$/.test(hideTarget.className) === true) {
hideButton = hideTarget;
}
if (hideButton !== null) {
hideContainer = hideButton.parentNode;
if (hideContainer !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Container$/.test(hideContainer.className) === false) {
hideContainer = null;
}
else {
 
// get hide text
hide = wikEd.GetNextSiblingNode(hideContainer);
if (hide !== null) {
if (/^wikEd(Ref|Templ|TemplNs|CharEntity|Table)(Show)?$/.test(hide.className) === false) {
hide = null;
}
}
}
}
}
}
 
// target == hide text
else if (/^wikEd(Ref|Templ|TemplNs|CharEntity|Table)(Show)?$/.test(hideTarget.className) === true) {
hide = hideTarget;
hideContainer = wikEd.GetPreviousSiblingNode(hideTarget);
if (hideContainer !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Container$/.test(hideContainer.className) === false) {
hideContainer = null;
}
else {
 
// get button
hide = hideTarget;
hideButton = wikEd.GetFirstChildNode(hideContainer);
hideContainer = WikEdGetPreviousSiblingNode(hideTarget);
if (hideContainerhideButton !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Button(Show)Container?\d*$/.test(hideContainerhideButton.className) === false) {
hideContainer hideButton = null;
}
else {
 
// get button
hideButton = WikEdGetFirstChildNode(hideContainer);
if (hideButton != null) {
if (/^wikEd(Ref|Templ|CharEntity)Button(Show)?\d*$/.test(hideButton.className) == false) {
hideButton = null;
}
}
}
}
}
 
// exit if missing elements
if ( (hideContainer == null) || (hideButton == null) || (hide == null) ) {
if ( (hideContainer === null) || (hideButton === null) || (hide === null) ) {
return;
return;
}
 
// get classes
hideButtonClass = hideButton.className;
hideClass = hide.className;
}
 
// schedule unhide on later shift or ctrl key push
// get classes
var hideButtonClass = hideButton.className;
var hideClass = hide.className;
 
// open on hover
if (event.type == 'mouseover') {
if (hideButtonClasswikEd.indexOf('wikEdRefButton')config.unhideShift === 0true) {
if ( (event.type == 'mouseover') && (wikEd.config.unhideShift === true) && (event.shiftKey === false) && (event.ctrlKey === false) ) {
hide.style.display = 'block';
wikEd.scheduledUnhide = [hide, hideButton];
wikEd.frameDocument.addEventListener('keydown', wikEd.HideShowHandler, true);
hideButton.addEventListener('mouseout', wikEd.HideShowHandler, true);
return;
}
}
}
else if (hideButtonClass.indexOf('wikEdTemplButton') == 0) {
 
hide.style.display = 'block';
// scheduled unhide on shift or ctrl keydown
if (event.type == 'keydown') {
if ( (wikEd.scheduledUnhide !== null) && ( (event.shiftKey === true) || (event.ctrlKey === true) ) ) {
hide = wikEd.scheduledUnhide[0];
hideButton = wikEd.scheduledUnhide[1];
hideButtonClass = hideButton.className;
hideClass = hide.className;
}
}
else if (hideButtonClass.indexOf('wikEdCharEntity') == 0) {
 
hide.style.display = 'inline';
// open on hover
if ( (event.type == 'mouseover') || ( (event.type == 'keydown') && (wikEd.scheduledUnhide !== null) ) ) {
event.stopPropagation();
hideButton.removeEventListener('mouseover', wikEd.HideShowHandler, true);
 
hideClass = hideClass.replace(/Show/, '') + 'Show';
hide.className = hideClass;
 
// table cell
if (hideClass == 'wikEdTableShow') {
var node = hide;
while (node !== null) {
if ( (node.tagName == 'TD') && (/^wikEdTable\w+$/.test(node.className) === true) ) {
break;
}
node = node.parentNode;
}
if (node !== null) {
 
// wait for class change
window.setTimeout( function () {
node.addEventListener('mouseout', wikEd.HideShowHandler, true);
}, 100);
}
}
 
// button and hide
else {
 
// wait for class change
window.setTimeout( function () {
hide.addEventListener('mouseout', wikEd.HideShowHandler, true);
hideButton.addEventListener('mouseout', wikEd.HideShowHandler, true);
}, 100);
}
WikEdRemoveEventListener(hideButton, 'mouseover', WikEdHideShowHandler, true);
WikEdAddEventListener(hide, 'mouseout', WikEdHideShowHandler, true);
WikEdAddEventListener(hideButton, 'mouseout', WikEdHideShowHandler, true);
}
 
// close after hover
else if (event.type == 'mouseout') {
if ( (hideInto != hideContainer) && (hideInto != hideButton) && (hideInto != hide) && (hideInto != hideCell) ) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Button\d*$/.test(hideButton.className) === true) {
var hideOut = false;
var node = hideInto;
while (node !== null) {
if (node == wikEdFrameBodywikEd.frameBody) {
hideOut = true;
break;
}
if ( (node == hideContainer) || (node == hide) || (node == hideCell) ) {
break;
}
node = node.parentNode;
}
if (hideOut === true) {
hideevent.style.display = 'none'stopPropagation();
WikEdRemoveEventListener(hide, 'mouseout', WikEdHideShowHandler, true);
WikEdRemoveEventListener(hideButton, 'mouseout', WikEdHideShowHandler, true);
WikEdAddEventListener(hideButton, 'mouseover', WikEdHideShowHandler, true);
 
if (hideCell !== null) {
// move cursor out of hidden text
hideCell.removeEventListener('mouseout', wikEd.HideShowHandler, true);
WikEdUnhideCursor(hideContainer, hide);
}
else {
hide.removeEventListener('mouseout', wikEd.HideShowHandler, true);
hideButton.removeEventListener('mouseout', wikEd.HideShowHandler, true);
}
 
hideClass = hideClass.replace(/Show/, '');
hide.className = hideClass;
 
// wait for class change
window.setTimeout( function () {
hideButton.addEventListener('mouseover', wikEd.HideShowHandler, true);
}, 100);
 
// move cursor out of hidden text
wikEd.UnhideCursor(hideContainer, hide);
}
}
Line 7,361 ⟶ 9,707:
}
 
// hide on click
else if (event.type == 'click') {
if (/^wikEd(Ref|Templ|CharEntity|Table)ButtonShow\d*$/.test(hideButtonClass) === true) {
event.stopPropagation();
hide.style.display = 'none';
 
hideButtonClass = hideButtonClass.replace(/Show/, '');
hideClass = hideClass.replace(/Show/, '');
hide.className = hideClass;
 
hideButtonClass = hideButtonClass.replace(/Show/, '');
hideButton.className = hideButtonClass;
hideButton.title = wikEdConfig['wikEd.config.text'][hideButtonClass.replace(/\d+$/g, '') + 'Tooltip'];
 
WikEdAddEventListenerhideButton.addEventListener(hideButton, 'mouseover', WikEdHideShowHandlerwikEd.HideShowHandler, true);
 
// move cursor out of hidden text
WikEdUnhideCursorwikEd.UnhideCursor(hideContainer, hide);
}
 
// open on click
else if (/^wikEd(Ref|Templ|CharEntity|Table)Button\d*$/.test(hideButtonClass) === true) {
event.stopPropagation();
if (hideButtonClass.indexOf('wikEdCharEntityButton') == 0) {
hideButton.removeEventListener('mouseover', wikEd.HideShowHandler, true);
hide.style.display = 'inline';
hide.removeEventListener('mouseout', wikEd.HideShowHandler, true);
}
 
else {
hide.style.display = 'block';
}
hideButtonClass = hideButtonClass.replace(/Button(Show)?/, 'ButtonShow');
hideClass += 'Show';
hideClass = hideClass.replace(/Show/, '') + 'Show';
hide.className = hideClass;
 
hideButtonClass = hideButtonClass.replace(/Button(Show)?/, 'ButtonShow');
hideButton.className = hideButtonClass;
hideButton.title = wikEdConfig['wikEd.config.text'][hideButtonClass.replace(/\d+$/g, '') + 'Tooltip'];
 
hideButton.removeEventListener('mouseout', wikEd.HideShowHandler, true);
WikEdRemoveEventListener(hideButton, 'mouseover', WikEdHideShowHandler, true);
WikEdRemoveEventListener(hide, 'mouseout', WikEdHideShowHandler, true);
WikEdRemoveEventListener(hideButton, 'mouseout', WikEdHideShowHandler, true);
}
}
 
// clear scheduled unhide
if (wikEd.scheduledUnhide !== null) {
wikEd.frameDocument.removeEventListener('keydown', wikEd.HideShowHandler, true);
wikEd.scheduledUnhide = null;
}
 
return;
};
Line 7,403 ⟶ 9,753:
 
//
// WikEdUnhideCursorwikEd.UnhideCursor: move cursor out of hidden element for WikEdHideShowHandlerwikEd.HideShowHandler
//
 
windowwikEd.WikEdUnhideCursorUnhideCursor = function (firstHiddenParent, lastHiddenParent) {
 
// get selection and clone range
var sel = WikEdGetSelectionwikEd.GetSelection();
var range = sel.getRangeAt(sel.rangeCount - 10);
if (range !== null) {
 
// check if selected text is hidden
var startHidden = false;
var node = range.startContainer;
while (node !== null) {
if (node == wikEdFrameBodywikEd.frameBody) {
break;
}
Line 7,428 ⟶ 9,778:
var endHidden = false;
var node = range.endContainer;
while (node !== null) {
if (node == wikEdFrameBodywikEd.frameBody) {
break;
}
Line 7,439 ⟶ 9,789:
}
 
// unselect hidden text
if ( (startHidden === false) && (endHidden === true) ) {
range.setEndBefore(firstHiddenParent);
}
else if ( (startHidden === true) && (endHidden === false) ) {
range.setStartAfter(lastHiddenParent);
}
else if ( (startHidden === true) && (endHidden === true) ) {
range.setEndAfter(lastHiddenParent);
range.collapse(false);
Line 7,456 ⟶ 9,806:
 
//
// WikEdGetTextwikEd.GetText: get the text fragments to manipulate
//
 
windowwikEd.WikEdGetTextGetText = function (obj, whichFragment, wikify) {
 
// remove dynamically inserted nodes by other scripts
wikEd.CleanNodes(wikEd.frameDocument);
WikEdCleanNodes(wikEdFrameDocument);
 
// get selection object
if (obj.sel === nullundefined) {
obj.sel = WikEdGetSelectionwikEd.GetSelection();
}
 
// cursor for the cursor position (always done)
if (obj.cursor === nullundefined) {
obj.cursor = {
'from': 'cursor',
'keepSel': null,
'plain': ''
};
 
// set cursor range
obj.cursor.range = wikEdFrameDocumentwikEd.frameDocument.createRange();
WikEdSetRangeStartwikEd.SetRangeStart(obj.cursor.range, obj.sel.focusNode, obj.sel.focusOffset);
obj.cursor.range.collapse(true);
}
 
// whole for the whole text
if (obj.whole === nullundefined) {
if (/whole|selectionWord|selectionLine|selectionPara|focusWord|focusLine|focusPara/.test(whichFragment) === true) {
obj.whole = {
'plainArray': [],
'plainNode': [],
'plainStart': [],
'from': 'whole',
'keepSel': null
};
 
// set whole range
obj.whole.range = wikEdFrameDocumentwikEd.frameDocument.createRange();
obj.whole.range.setStart(wikEdFrameBodywikEd.frameBody, 0);
obj.whole.range.setEnd(wikEdFrameBodywikEd.frameBody, wikEdFrameBodywikEd.frameBody.childNodes.length);
 
// get whole plain text
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.whole, wikEdFrameBodywikEd.frameBody);
obj.whole.code = obj.whole.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.whole, wikify);
objwikEd.whole.plain = HtmlToPlain(obj.whole.html);
obj.whole.plain = obj.whole.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.whole.plain = obj.whole.plain.replace(/\xa0/g, ' ');
}
}
 
// selection for the selected text
if (obj.selection === nullundefined) {
if (/selection\b|selectionWord|selectionLine|selectionPara/.test(whichFragment) === true) {
obj.selection = {
'from': 'selection',
'keepSel': null
};
 
// copy range to document fragment
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEdFrameBodywikEd.frameBody, 0);
}
obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
var documentFragment = obj.selection.range.cloneContents();
 
// get selected text
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.selection, documentFragment);
obj.selection.code = obj.selection.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.selection, wikify);
objwikEd.selection.plain = HtmlToPlain(obj.selection.html);
obj.selection.plain = obj.selection.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.selection.plain = obj.selection.plain.replace(/\xa0/g, ' ');
}
}
 
// focusWord, focusLine, and focusPara for the word, line, and paragraph under the cursor
if (obj.focusWord === nullundefined) {
if (/focusWord|focusLine|focusPara/.test(whichFragment) === true) {
obj.focusWord = {
'from': 'focusWord',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusLine object for the line under the cursor
obj.focusLine = {
'from': 'focusLine',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusPara object for the paragraph under the cursor
obj.focusPara = {
'from': 'focusPara',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// find the word and line boundaries
WikEdFindBoundarieswikEd.FindBoundaries(obj.focusWord, obj.focusLine, obj.focusPara, obj.whole, obj.cursor);
 
// get the wikified plain text for the word under the cursor
var documentFragment = obj.focusWord.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.focusWord, documentFragment);
obj.focusWord.code = obj.focusWord.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.focusWord, wikify);
objwikEd.focusWord.plain = HtmlToPlain(obj.focusWord.html);
obj.focusWord.plain = obj.focusWord.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.focusWord.plain = obj.focusWord.plain.replace(/\xa0/g, ' ');
 
// get the wikified plain text for the line under the cursor
var documentFragment = obj.focusLine.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.focusLine, documentFragment);
obj.focusLine.code = obj.focusLine.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.focusLine, wikify);
objwikEd.focusLine.plain = HtmlToPlain(obj.focusLine.html);
obj.focusLine.plain = obj.focusLine.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.focusLine.plain = obj.focusLine.plain.replace(/\xa0/g, ' ');
 
// get the wikified plain text for the paragraph under the cursor
var documentFragment = obj.focusPara.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.focusPara, documentFragment);
obj.focusPara.code = obj.focusPara.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.focusPara, wikify);
objwikEd.focusPara.plain = HtmlToPlain(obj.focusPara.html);
obj.focusPara.plain = obj.focusPara.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.focusPara.plain = obj.focusPara.plain.replace(/\xa0/g, ' ');
}
}
 
// selectionWord and selectionLine for the complete words and lines under the selection
if (obj.selectionWord === nullundefined) {
if (/selectionWord|selectionLine|selectionPara/.test(whichFragment) === true) {
 
// setup selectionWord object for the words under the selection
obj.selectionWord = {
'from': 'selectionWord',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup selectionLine object for the lines under the selection
obj.selectionLine = {
'from': 'selectionLine',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusPara object for the paragraph under the selection
obj.selectionPara = {
'from': 'selectionPara',
'keepSel': false,
'range': wikEdFrameDocument wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// find the word and line boundaries
WikEdFindBoundarieswikEd.FindBoundaries(obj.selectionWord, obj.selectionLine, obj.selectionPara, obj.whole, obj.selection);
 
// get the wikified plain text for the words under the selection
var documentFragment = obj.selectionWord.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.selectionWord, documentFragment);
obj.selectionWord.code = obj.selectionWord.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.selectionWord, wikify);
objwikEd.selectionWord.plain = HtmlToPlain(obj.selectionWord.html);
obj.selectionWord.plain = obj.selectionWord.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.selectionWord.plain = obj.selectionWord.plain.replace(/\xa0/g, ' ');
 
// get the wikified plain text for the lines under the selection
var documentFragment = obj.selectionLine.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.selectionLine, documentFragment);
obj.selectionLine.code = obj.selectionLine.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.selectionLine, wikify);
objwikEd.selectionLine.plain = HtmlToPlain(obj.selectionLine.html);
obj.selectionLine.plain = obj.selectionLine.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.selectionLine.plain = obj.selectionLine.plain.replace(/\xa0/g, ' ');
 
// get the wikified plain text for the paragraph under the selection
var documentFragment = obj.selectionPara.range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj.selectionPara, documentFragment);
obj.selectionPara.code = obj.selectionPara.html;
WikEdRemoveHighlightingWikifywikEd.RemoveHighlightingWikify(obj.selectionPara, wikify);
objwikEd.selectionPara.plain = HtmlToPlain(obj.selectionPara.html);
obj.selectionPara.plain = obj.selectionPara.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
obj.selectionPara.plain = obj.selectionPara.plain.replace(/\xa0/g, ' ');
}
}
Line 7,656 ⟶ 9,984:
 
//
// WikEdFindwikEd.Find: custom find function with regexp properties, sets obj.changed.range, uses obj ranges
//
 
windowwikEd.WikEdFindFind = function (obj, findText, caseSensitive, backwards, wrap, useRegExp) {
 
var found = false;
 
// get selection
if (obj.sel === nullundefined) {
obj.sel = WikEdGetSelectionwikEd.GetSelection();
}
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEdFrameBodywikEd.frameBody, 0);
}
var range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
 
if (obj.changed === nullundefined) {
obj.changed = {};
}
obj.selectChanged = false;
 
// empty the range to avoid error messages for reverse direction ranges
obj.changed.range = wikEdFrameDocumentwikEd.frameDocument.createRange();
 
// regexp instead of plain text search for browser lacking .find (Opera), built in .find() ignores newlines
if (useRegExp !== true) {
if (typeof(wikEdFrameWindow wikEd.frameWindow.find) != 'function') {
useRegExp = true;
findText = findText.replace(/([\\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1');
}
}
 
// create the regexp
var regExpFind;
if (useRegExp === true) {
var regExpFlags = 'gm';
if (caseSensitive !== true) {
regExpFlags += 'i';
}
Line 7,698 ⟶ 10,026:
regExpFind = new RegExp(findText, regExpFlags);
}
catch (errexception) {
return( false);
}
}
 
// use the fast built-in find function for non-regexp searches; Opera does not have .find
if (useRegExp !== true) {
 
// parameters: window.find(string, caseSensitive, backwards, wrapAround, wholeWord, searchInFrames, showDialog)
found = wikEdFrameWindowwikEd.frameWindow.find(findText, caseSensitive, backwards, wrap, false, true, false);
if (found === true) {
range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
}
obj.changed.range = range;
}
 
// slow javascript regexp find and replace
else {
 
// perform find
if (obj.plainArray === undefined) {
WikEdParseDOMwikEd.ParseDOM(obj, wikEdFrameBodywikEd.frameBody);
}
var regExpMatch = [];
 
// find next, search to the right
if (backwards === false) {
 
// set start position for search to right
regExpFind.lastIndex = obj.plainFocus;
 
// execute the regexp search to the right
regExpMatch = regExpFind.exec(obj.plain);
 
// remember position for repeated searches
obj.plainFocus = regExpFind.lastIndex;
 
// wrap around, start at beginning
if ( (wrap === true) && (regExpMatch === null) ) {
regExpFind.lastIndex = 0;
regExpMatch = regExpFind.exec(obj.plain);
Line 7,742 ⟶ 10,070:
}
 
// find previous, search to the left
else {
 
// cycle through the matches to the left
var regExpMatchNext;
do {
regExpMatch = regExpMatchNext;
regExpMatchNext = regExpFind.exec(obj.plain);
if (regExpMatchNext === null) {
break;
}
} while (regExpMatchNext.index < obj.plainAnchor);
 
// wrap around, find last occurrence
if ( (wrap === true) && (regExpMatch === null) ) {
do {
regExpMatch = regExpMatchNext;
regExpMatchNext = regExpFind.exec(obj.plain);
} while (regExpMatchNext !== null);
}
}
 
// select the find
if (regExpMatch !== null) {
found = true;
 
// start
var i = 0;
while ( (obj.plainStart[i + 1] <= regExpMatch.index) && (obj.plainStart[i + 1] !== null) ) {
i ++;
}
 
// end
var j = i;
while ( (obj.plainStart[j + 1] <= regExpMatch.index + regExpMatch[0].length) && (obj.plainStart[j + 1] !== null) ) {
j ++;
}
Line 7,782 ⟶ 10,112:
var endNode = obj.plainNode[j];
var endOffset = regExpMatch.index + regExpMatch[0].length - obj.plainStart[j];
WikEdSetRangewikEd.SetRange(obj.changed.range, startNode, startOffset, endNode, endOffset);
obj.selectChanged = true;
}
}
return( found);
};
 
 
//
// WikEdScrollToSelectionwikEd.ScrollToSelection: scroll iframe range into viewport
// removing helper nodes gives Error: Node was not found = NS_ERROR_DOM_NOT_FOUND_ERR for certain undo actions
// for MSIE see http://www.webmasterworld.com/javascript/3820483.htm
// removig helper nodes gives Error: Node was not found = NS_ERROR_DOM_NOT_FOUND_ERR for certain undo actions
// adding nodes breaks the undo history in Chrome and Opera
 
wikEd.ScrollToSelection = function () {
window.WikEdScrollToSelection = function(frameScrollTop, frameScrollLeft, removeHelperNodes) {
 
// get selection and clone range
var obj = {};
obj.sel = WikEdGetSelectionwikEd.GetSelection();
if (obj.sel.rangeCount === 0) {
return;
}
 
// get selection plain text
var range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
var documentFragment = range.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj, documentFragment);
var plainText = obj.plain;
plainText = plainText.replace(/&lt;/g, '<');
Line 7,814 ⟶ 10,143:
plainText = plainText.replace(/&amp;/g, '&');
 
// select using backwards built-in find
if ( (typeof(wikEdFrameWindow wikEd.frameWindow.find) == 'function') && (plainText.length > 0) ) {
obj.sel.collapseToEnd();
 
// Chrome; parameters: WikEdFindwikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
var found = WikEdFindwikEd.Find(obj, plainText, true, true, false, false);
 
// Firefox (removes \n removed, \xa0 as blank)
if ( (found === false) && (/\n/.test(plainText) == true) ) {
plainText =wikEd.Find(obj, range.toString(), true, true, false, false);
}
WikEdFind(obj, plainText, true, true, false, false);
 
// reinstate original range if it starts or ends with \n or spaces
if (/^(\n| )|(\n| )$/.test(plainText) === true) {
obj.sel.removeAllRanges();
obj.sel.addRange(range);
}
}
 
// select empty range using backwards built-in find for previous character
else if ( (typeof(wikEdFrameWindow wikEd.frameWindow.find) == 'function') && (plainText.length === 0) ) {
var backwards = true;
 
// get plain text from start to selection
var rangeClone = range.cloneRange();
rangeClone.setStartBefore(wikEdFrameBodywikEd.frameBody.firstChild);
var documentFragment = rangeClone.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj, documentFragment);
var plainText = obj.plain;
plainText = plainText.replace(/&lt;/g, '<');
Line 7,843 ⟶ 10,177:
plainText = plainText.replace(/^([\s\S]*?)([^\n]\n*)$/, '$2');
 
// get plain text from selection to end for potentially less newlines
if (plainText.length > 1) {
var plainTextBack = plainText;
Line 7,849 ⟶ 10,183:
 
var rangeClone = range.cloneRange();
rangeClone.setEndAfter(wikEdFrameBodywikEd.frameBody.lastChild);
var documentFragment = rangeClone.cloneContents();
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj, documentFragment);
var plainText = obj.plain;
plainText = plainText.replace(/&lt;/g, '<');
Line 7,858 ⟶ 10,192:
plainText = plainText.replace(/^(\n*[^\n])([\s\S]*?)$/, '$1');
 
// backward or forward find
if (plainTextBack.length > plainText.length) {
backwards = false;
Line 7,867 ⟶ 10,201:
}
 
// Chrome; parameters: WikEdFindwikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
var found = WikEdFindwikEd.Find(obj, plainText, true, backwards, false, false);
 
// Firefox
if ( (found === false) && (/\n/.test(plainText) === true) ) {
plainText = plainText.replace(/\n/g, '');
plainText = plainText.replace(/\xa0/g, ' ');
WikEdFindwikEd.Find(obj, plainText, true, backwards, false, false);
}
if (backwards === true) {
obj.sel.collapseToEnd();
}
Line 7,884 ⟶ 10,218:
}
 
// use inserted spans as scroll marker, breaks undo history in Chrome and Opera
else {
var rangeStart = range.cloneRange();
var rangeEnd = range.cloneRange();
 
// spans to be temporarily inserted before and after selection range to get range position
wikEdInsertCounterwikEd.insertCounter ++;
var scrollStartNode = wikEdFrameDocumentwikEd.frameDocument.createElement('span');
scrollStartNode.className = 'wikEdScrollBefore';
scrollStartNode.id = 'wikEdScrollBefore' + wikEdInsertCounterwikEd.insertCounter;
var scrollEndNode = wikEdFrameDocumentwikEd.frameDocument.createElement('span');
scrollEndNode.className = 'wikEdScrollAfter';
scrollEndNode.id = 'wikEdScrollAfter' + wikEdInsertCounterwikEd.insertCounter;
 
// get the range border nodes and offsets
var startNode = range.startContainer;
var startOffset = range.startOffset;
Line 7,913 ⟶ 10,247:
}
 
// insert end node
if (endNode.nodeName == '#text') {
if (endOffset === 0) {
endNode.parentNode.insertBefore(scrollEndNode, endNode);
}
Line 7,931 ⟶ 10,265:
}
 
// insert start node
if (startNode.nodeName == '#text') {
if (startOffset === 0) {
startNode.parentNode.insertBefore(scrollStartNode, startNode);
}
Line 7,941 ⟶ 10,275:
else {
 
// collapse as a Firefox bug work around; httphttps://stackoverflow.com/questions/665676
rangeStart.collapse(true);
rangeStart.insertNode(scrollStartNode);
Line 7,951 ⟶ 10,285:
}
 
WikEdScrollToNodeswikEd.ScrollToNodes(scrollStartNode, scrollEndNode);
 
// set selection
range.setStartBefore(scrollStartNode);
range.setEndAfter(scrollEndNode);
obj.sel.removeAllRanges();
WikEdRemoveAllRanges(sel);
obj.sel.addRange(range);
}
 
Line 7,965 ⟶ 10,299:
 
//
// WikEdScrollToNodeswikEd.ScrollToNodes: scroll iframe range into viewport
//
 
windowwikEd.WikEdScrollToNodesScrollToNodes = function (scrollStartNode, scrollEndNode) {
 
// absolute span for line height detection (Opera and Chrome do not vertically align empty span at bottom)
var lineHeightNode = wikEdFrameDocumentwikEd.frameDocument.createElement('span');
lineHeightNode.innerHTML = '&nbsp;';
lineHeightNode.className = 'wikEdScrollLineHeight';
scrollEndNode.appendChild(lineHeightNode);
var lineHeight = lineHeightNode.clientHeight;
lineHeightNode.innerHTML = '';
scrollEndNode.removeChild(lineHeightNode);
 
// scroll to node coordinates
scrollStartNode.style.verticalAlign = 'top';
scrollEndNode.style.verticalAlign = 'top';
var startOffsetLeft = WikEdGetOffsetLeftwikEd.GetOffsetLeft(scrollStartNode);
var startOffsetTop = WikEdGetOffsetTopwikEd.GetOffsetTop(scrollStartNode);
var endOffsetRight = WikEdGetOffsetLeftwikEd.GetOffsetLeft(scrollEndNode);
var endOffsetBottom = WikEdGetOffsetTopwikEd.GetOffsetTop(scrollEndNode);
scrollStartNode.style.verticalAlign = 'baseline';
scrollEndNode.style.verticalAlign = 'baseline';
var frameScrollTop = wikEdFrameBodywikEd.frameBody.scrollTop;
var frameScrollLeft = wikEdFrameBodywikEd.frameBody.scrollLeft;
var x = frameScrollLeft;
var y = frameScrollTop;
 
// current scroll position
 
// selection above viewport
if (endOffsetBottom < frameScrollTop) {
y = startOffsetTop;
}
 
// selection below viewport
else if (startOffsetTop > frameScrollTop + wikEdFrameBodywikEd.frameBody.clientHeight) {
y = endOffsetBottom - wikEdFrameBodywikEd.frameBody.clientHeight + lineHeight;
}
 
// selection left of viewport
if (endOffsetRight < frameScrollLeft) {
if (endOffsetRight <= wikEdFrameBodywikEd.frameBody.clientWidth) {
x = 0;
}
Line 8,015 ⟶ 10,349:
}
 
// selection right of viewport
else if (startOffsetLeft > frameScrollLeft + wikEdFrameBodywikEd.frameBody.clientWidth) {
x = endOffsetRight - wikEdFrameBodywikEd.frameBody.clientWidth;
}
 
// do scroll
wikEdFrameWindowwikEd.frameWindow.scrollTo(x, y);
 
return;
Line 8,028 ⟶ 10,362:
 
//
// wikEd.RemoveTableModeHighlighting: strip table html, add linebreaks back
// WikEdWikiTableToHtml: convert wiki tables to html // {{TABLE}}
// expects <br> instead of \n
//
 
windowwikEd.WikEdWikiTableToHtmlRemoveTableModeHighlighting = function (objhtml) {
 
// add linebreaks back (class="wikEdTable...BR")
////
html = html.replace(/(<(br)\b[^>]*?\bclass="wikEdTable(BR)"[^>]*?>)/g, '<br>');
return;
html = html.replace(/(<(span)\b[^>]*?\bclass="wikEdTable(Tag|Caption|Row|Header|Cell)BR"[^>]*?>)/g, '<br>$1');
 
// mark tbody
html = html.replace(/(<table\b[^>]*?\bclass="wikEdTable\w+"[^>]*?><tbody\b)([^>]*>)/g, '$1 class="wikEdTableMode"$2');
 
// remove table mode tags
html = wikEd.RemoveTag(html, 'table', /\bclass="wikEdTable\w+"/, '', '<br>');
html = wikEd.RemoveTag(html, 'div|tbody|caption|tr|th|td|span', /\bclass="wikEdTable\w+"/);
 
return html;
};
 
 
//
// WikEdTextifywikEd.Textify: strip html off of text
//
 
windowwikEd.WikEdTextifyTextify = function (obj) {
 
// convert html to plain
obj.plain = obj.html;
 
// conserve spaces and linebreaks in <pre> tags
obj.plain = obj.plain.replace(/(<pre\b[^>]*>)((.|\n)*?)(<\/pre>)/g,
function(p, p1, p2, p3, p4) {
p2 = p2.replace(/ /g, '\x03');
p2 = p2.replace(/\n/g, '\x04');
return p1 + p2 + p4;
}
);
 
// remove linebreaks
obj.plain = obj.plain.replace(/ \n|\n /g, ' ');
obj.plain = obj.plain.replace(/\n/g, ' ');
 
// delete content tags
obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>.*?<\/\1>/g, '');
 
// delete MS-Office tags
// newlines
obj.plain = obj.plain.replace(/[\n ]*<br((w:|m:)(\bw+))[^>]*>[.*?<\n ]*()/\1>/g, '\n');
 
// remove tablemode highlighting code
// <div>...</div> to <br> for Safari, Chrome, WebKit
obj.plain = wikEd.RemoveTableModeHighlighting(obj.plain);
if ( (wikEdSafari == true) || (wikEdChrome == true) || (wikEdWebKit == true) ) {
 
var isRemove = [];
// convert <div>...</div> to <br> for Safari, Chrome, and WebKit
obj.plain = obj.plain.replace(/(<(\/?)div\b([^>]*)>)/g,
if ( (wikEd.safari === true) || (wikEd.chrome === true) || (wikEd.webkit === true) ) {
function (p, p1, p2, p3) {
obj.plain = wikEd.DivToBr(obj.plain);
if (p2 == '') {
if (p3 == '') {
isRemove.push(true);
return('\x00');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('\x01');
}
return(p1);
}
);
obj.plain = obj.plain.replace(/\x00\n\x01/g, '\x01');
obj.plain = obj.plain.replace(/\x01\n/g, '\x01');
obj.plain = obj.plain.replace(/\n\x00/g, '\x00');
obj.plain = obj.plain.replace(/\x01\x00/g, '\x01');
obj.plain = obj.plain.replace(/^\x00|\x01$/g, '');
obj.plain = obj.plain.replace(/[\x00\x01]/g, '\n');
}
 
// newlines
// remove empty lines from block tags
obj.plain = obj.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
 
// remove empty lines from block tags
obj.plain = obj.plain.replace(/(<(blockquote|center|div|p|pre|gallery)\b[^>]*>)[\s\x00]+/gi, '$1');
obj.plain = obj.plain.replace(/[\s\x00]+(<\/(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)>)/gi, '$1');
 
// remove highlighting pre tags
obj.plain = wikEd.RemoveTag(obj.plain, 'pre', /\bclass="wikEd[\w\/]+"/);
var isRemove = [];
obj.plain = obj.plain.replace(/(<(\/?)pre\b([^>]*)>)/g,
function (p, p1, p2, p3) {
if (p2 == '') {
if (/\bclass=\"wikEd[\w\/]+\"/.test(p3) == true) {
isRemove.push(true);
return('');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('');
}
return(p1);
}
);
 
// blocks
obj.plain = obj.plain.replace(/<\/?(address|blockquote|center|div|hr|isindex|p|pre)\b.[^>]*?>/g, '\x00\x00');
 
// keep headings only if starting with a newline
obj.plain = obj.plain.replace(/[\s|\x00]*(^|\n|\x00)[\s|\x00]*<h[1-6]\b[^>]*>((.|\n)*?)<\/h[1-6]>[\s|\x00]*()/g, '\x00\x00$2\x00\x00');
 
// lists
obj.plain = obj.plain.replace(/<\/?(dir|dl|menu|ol|ul)\b.[^>]*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(dd|dt|li)>/g, '\x00');
 
// forms
obj.plain = obj.plain.replace(/<\/?(select|textarea)\b.[^>]*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(option|legend|optgroup)>/g, '\x00');
 
// tables
obj.plain = obj.plain.replace(/<\/?(table|caption)\b[^>]*>/g, '\x00');
if (wikEdTableMode == true) {
obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\x00');
 
// override pasted table class // {{TABLE}}
obj.plain = obj.plain.replace(/(<table\b)([^>]*)(>)/gi,
function (p, p1, p2, p3) {
if (p2.match(/\bclass=/) != null) {
p2 = p2.replace(/\bclass\s*=\s*([\'\"]?)[^<>\'\"\n]*?\1/g, 'class="wikEdTableEdit"');
}
else {
p2 = ' class="wikEdTableEdit"';
}
return(p1 + p2 + p3);
}
);
 
// keep table html markup // {{TABLE}}
obj.plain = obj.plain.replace(/[\s\x00]*(<table\b.*?>)/g, '\x00\x00$1');
obj.plain = obj.plain.replace(/(<\/table>)[\s\x00]*()/g, '$1\x00');
 
obj.plain = obj.plain.replace(/<(\/?(table|caption|tr|th|td)\b[^>]*)>/g, '\x01$1\x02');
}
 
// textify table
else if (wikEdTableMode == false) {
obj.plain = obj.plain.replace(/<\/?(table|caption)\b.*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\x00');
}
 
// finish html to plain conversion
obj.plain = obj.plain.replace(/<.[^>]*?>/g, '');
 
// recover table html
obj.plain = obj.plain.replace(/\x01/g, '<');
obj.plain = obj.plain.replace(/\x02/g, '>');
 
// remove spaces
obj.plain = obj.plain.replace(/[ \t\xa0]+(\x00)/g, '$1');
obj.plain = obj.plain.replace(/(\x00)[ \t\xa0]+/g, '$1');
 
// trim down \x00 and \n
obj.plain = obj.plain.replace(/\x00+\n/g, '\n');
obj.plain = obj.plain.replace(/\n\x00+/g, '\n');
 
// pasting external content as inline
obj.plain = obj.plain.replace(/^\x00+|\x00+$/g, '');
 
obj.plain = obj.plain.replace(/\n*\x00(\x00|\n)+/g, '\n\n');
obj.plain = obj.plain.replace(/\x00/g, '\n');
obj.plain = obj.plain.replace(/(<\/table>\n)\n+/g, '$1');
 
// removerecover empty linesspaces and spaceslinebreaks from article start and<pre> endtags
obj.plain = obj.plain.replace(/\x03/g, ' ');
obj.plain = obj.plain.replace(/\x04/g, '\n');
 
// remove empty lines and spaces from article start and end
if (obj.from == 'whole') {
obj.plain = obj.plain.replace(/^\s+|\s+$/g, '');
Line 8,176 ⟶ 10,482:
 
//
// WikEdInactiveButtonswikEd.InactiveButtons: grey out inactive buttons, called after every change and click
//
 
windowwikEd.WikEdInactiveButtonsInactiveButtons = function () {
 
// undoread only
if (wikEdFrameDocumentwikEd.queryCommandEnabled('undo')readOnly === true ) {
return;
}
 
// undo
if (wikEd.frameDocument.queryCommandEnabled('undo') === true ) {
document.getElementById('wikEdUndo').className = 'wikEdButton';
document.getElementById('wikEdUndoAll').className = 'wikEdButton';
Line 8,191 ⟶ 10,502:
}
 
// redo
if (wikEdFrameDocumentwikEd.frameDocument.queryCommandEnabled('redo') === true ) {
document.getElementById('wikEdRedo').className = 'wikEdButton';
}
Line 8,199 ⟶ 10,510:
}
 
// redo all
if (wikEdLastVersionwikEd.lastVersion !== null) {
document.getElementById('wikEdRedoAll').className = 'wikEdButton';
}
Line 8,211 ⟶ 10,522:
 
//
// WikEdFixBasicwikEd.FixBasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions
//
 
wikEd.FixBasic = function (obj) {
//// change: double spaces ok after dot
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
window.WikEdFixBasic = function(obj) {
obj.plain = obj.plain.replace(/(&lt;(syntaxhighlight|source|pre|nowiki)\b[^\/]*?&gt;)((.|\n)*?)(&lt;\/\2&gt;)/gi,
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/([\[\]{}=*#:;|&])/g, '\x00$1\x00');
if (/^(syntaxhighlight|source|pre)$/i.test(p2) === true) {
p3 = p3.replace(/ /g, '\x01');
p3 = p3.replace(/\n/g, '\x02');
}
return p1 + p3 + p5;
}
);
 
// non-breaking space character to normal space
obj.plain = obj.plain.replace(/\xa0/g, ' ');
 
// tab to space
obj.plain = obj.plain.replace(/ *\t[ \t]*()/g, ' ');
 
// remove trailing spaces
obj.plain = obj.plain.replace(/([^\n])(\t| |&nbsp;)+(?=(\n|$))/g, '\n$1');
 
// remove spaces in empty lines
obj.plain = obj.plain.replace(/\n( |&nbsp;|\t)+\n/g, '\n\n');
 
// empty line before and after headings, spaces around word (lookahead), remove bold, italics, and extra =
obj.plain = obj.plain.replace(/(^|\n)+(=+) *(.*?) *(=+)(?=(\n|$))/g,
function(p, p1, p2, p3, p4) {
p3 = p3.replace(/\'{2,}/g, '');
return( '\n\n' + p2 + ' ' + p3 + ' ' + p2 + '\n\n');
}
);
 
// uppercase well known headings
var regExp = new RegExp('\\n=+ ' + wikEdConfig['wikEd.config.text']['External links'] + '? =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdConfig['wikEd.config.text']['External links'] + ' ==\n');
regExp = new RegExp('\\n=+ ' + wikEdConfig['wikEd.config.text']['See also'] + ' =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdConfig['wikEd.config.text']['See also'] + ' ==\n');
regExp = new RegExp('\\n=+ ' + wikEdConfig['wikEd.config.text']['.References'] + '? =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEdConfig['wikEd.config.text']['.References'] + ' ==\n');
 
// add space after * # : ; (list) andspare after #{| |- |+ | (table), spareand #REDIRECT
obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;]+|\{\||\|\-|\|\+|\|(?!REDIRECT)\})) *()b/ggi, '$1\x03$2 ');
obj.plain = obj.plain.replace(/(^|\n)# REDIRECT:+\b{\|/gig, '$1#REDIRECT');
function(p, p1) {
obj.plain = obj.plain.replace(/ +(?=\n)/g, '');
p = p.replace(/:/g, '\x04');
return p;
}
);
obj.plain = obj.plain.replace(/(^|\n)([*#:;]+)(?![ \n*#:;\x00])/g, '$1$2 ');
obj.plain = obj.plain.replace(/\x03/g, '#');
obj.plain = obj.plain.replace(/\x04/g, ':');
 
// add space after table markup {| |- |+ |
// empty line before and after tables
obj.plain = obj.plain.replace(/(^|\n)([*#:;]*)(\{\||\|-|\|\+|\|(?!(\}|-|\+)))(?!( |\n|\x00|$))/g, '$1$2$3 ');
 
// empty line before and after tables
obj.plain = obj.plain.replace(/\n+(\{\|)/g, '\n\n$1');
obj.plain = obj.plain.replace(/(\n\|\}([^\}]|$)) *(.*)[\n|$]+/g, '$1\n\n$3\n\n');
 
// empty line before and after lists
obj.plain = obj.plain.replace(/(^|\n)([^\*\#\:\;\n].*)(?=\n[\*\#\:\;])/g, '$1$2\n\n');
obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;].*?)(?=\n[^\*\#\:\;\n])/g, '$1$2\n\n');
 
// split into lines and change single lines, used to handle tables
var lines = obj.plain.split('\n');
obj.plain = '';
var tableflagtableFlag = false;
var preFlag = false;
 
for (var i = 0; i < lines.length; i ++) {
var line = lines[i];
 
// doline not change lines starting with a blank
if (/^ /.test(line) === false) {
preFlag = false;
 
// detect table
if (line.match(/^(\{\||\!|\|[^}])/.test(line) !=== nulltrue) {
tableflagtableFlag = true;
}
else if (line.match(/^\|\}/.test(line) !=== nulltrue) {
tableflagtableFlag = false;
}
 
// changes only to be done in tables
if (tableflagtableFlag === true) {
 
// add spaces around ||
line = line.replace(/ *\|\| *()/g, ' || ');
}
 
// changes not to be done in tables
if (! tableflag)else {
 
// empty line before and after images, Media links stay inline
var regExp = new RegExp('^(\\[\\[(Image|File|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfig['wikEd.config.text']['wikicode File'] + '):.*?\\]\\])', 'ig');
line = line.replace(regExp, '\n$1');
 
regExp = new RegExp('(\\[\\[(Image|File|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfig['wikEd.config.text']['wikicode File'] + '):.*?(\\[\\[.*?\\]\\].*?)*\\]\\])$', 'ig');
line = line.replace(regExp, '$1\n');
 
// empty line before and after includes
line = line.replace(/^(\{\{.*?\}\})$/g, '\n$1\n');
line = line.replace(/(\{\{.*?\}\})$/g, '$1\n');
}
 
}
 
// line starting with blank
// concatenate the lines
else {
 
// detect preformatted blocks
if (/^ +\S/.test(line) === true) {
preFlag = true;
}
 
// add <br> to preformatted empty line
if (preFlag === true) {
line = line.replace(/^( +)$/g, '$1&lt;br&gt;');
}
}
 
// concatenate the lines
obj.plain += line;
if (i < lines.length - 1) {
Line 8,308 ⟶ 10,651:
}
 
// remove underscoresspaces in wikilinksempty lines
obj.plain = obj.plain.replace(/(^|\n)( |&nbsp;|\t)+(?=(\n|$))/g, '$1');
 
// remove underscores in wikilinks
obj.plain = obj.plain.replace(/\[\[(.*?)((\|.*?)|)\]\]/g,
function (p, p1, p2, p3) {
p1 = p1.replace(/_/g, ' ');
return( '[[' + p1 + p2 + ']]');
}
);
 
// remove spaces in wikilinks, protect [[xxx| ]]
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*?) *\| +\]\]/g, '[[$1|\x00x03]]');
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*?) *\| *([^\[\][]*?) *\]\]/g, '[[$1|$2]]');
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*) *\]\]/g, '[[$1]]');
obj.plain = obj.plain.replace(/\x00x03/g, ' ');
 
// remove spaces in external links
obj.plain = obj.plain.replace(/\[ *(.*?) *\](?!\])/g, '[$1]');
 
// no space around pipes before curly brackets
obj.plain = obj.plain.replace(/ +\| +\}\}/g, '|}}');
 
// no empty line between headings and includes
obj.plain = obj.plain.replace(/\n(=+ .*? =+\n)\n+(\{\{.*?\}\})/g, '\n$1$2');
 
// spaces in comments
obj.plain = obj.plain.replace(/(&lt;!--) *((.|\n)*?) *(--&gt;)/g, '$1 $2 $34');
 
// empty line before and after categories
var regExp = new RegExp('( |\\n)*(\\[\\[(Category|' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ')\\s*:[^\\n]*?\\]\\])( |\\n)*', 'gi');
obj.plain = obj.plain.replace(regExp, '\n\n$2\n\n');
 
// categories not separated by empty lines (lookahead)
regExp = new RegExp('(\\[\\[(Category|' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ')\\s*:[^\\n]*?\\]\\])\\n*(?=\\[\\[(Category|' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ')\\s*:[^\\n]*?\\]\\])', 'gi');
obj.plain = obj.plain.replace(regExp, '$1\n');
 
// single empty lines only
obj.plain = obj.plain.replace(/\n{3,}/g, '\n\n');
 
// remove leading and trailing newlines
obj.plain = obj.plain.replace(/^\n+/, '');
obj.plain = obj.plain.replace(/\n{2,}$/, '\n');
 
// preserved markup and spaces
obj.plain = obj.plain.replace(/\x00/g, '');
obj.plain = obj.plain.replace(/\x01/g, ' ');
obj.plain = obj.plain.replace(/\x02/g, '\n');
 
return;
Line 8,354 ⟶ 10,705:
 
//
// WikEdFixPunctwikEd.FixPunct: remove (or add) space before .,:;
//
 
windowwikEd.WikEdFixPunctFixPunct = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// protect punctuation in charents
obj.plain = obj.plain.replace(/(&([a-zA-Z0-9]{2,10}|#[0-9]{2,7}))(;)/g, '$1\x00$3');
 
// protect punctuation in URLs
var regExp = new RegExp('((\\bhttps?://|\\bftp://|\\birc://|\\bgopher://|\\bnews:|\\bmailto:|\\bfile://|//)[!#%&()+,\\-./:;=?@~' + wikEd.letters + '_0-9]*)', 'g');
obj.plain = obj.plain.replace(/(\b(http:\/\/|https:\/\/|ftp:\/\/|irc:\/\/|gopher:\/\/|news:|mailto:|file:\/\/)[\!\#\%\&\(\)\+-\/\:\;\=\?\@\w\~ŠŒŽœžŸŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]*)/g,
obj.plain = obj.plain.replace(regExp,
function(p, p1, p2) {
p = p.replace(/([\.\,\:\;\?\!](?!$))/g, '\x00$1');
return( p);
}
);
 
// protect punctuation in filenames
obj.plainregExp = obj.plain.replacenew RegExp(/'([a' + wikEd.letters + '_0-zA-Z_ŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f89\u04f9\-])([\.\,\:\;\?\!])(?=([a-zA-Z]{32,4})([\\s\:\;\?\!\.\,\(\)\\[\\]\{\}\|]|$))/g', '$1\x00$2g');
obj.plain = obj.plain.replace(regExp, '$1\x00$2');
 
// protect punctuation in article names
obj.plain = obj.plain.replace(/(\[\[|\{\{)([^\]\}\|\n]*)/g,
function(p, p1, p2) {
p = p.replace(/([\.\,\:\;\?\!])/g, '\x00$1');
return( p);
}
);
 
// protect punctuation in single letter abbreviations (e.g. U.S.) (language specific behaviour)
if (wikEdConfig['fixPunctFrench'] == true) {
regExp = new RegExp('(^|[\\s\'"”\\[{(])([' + wikEd.letters + '][.,:;]){2,}', 'g');
obj.plain = obj.plain.replace(regExp,
function(p) {
p = p.replace(/([.,:;])/g, '\x00$1');
return p;
}
);
 
// preserve double spaces after dot
obj.plain = obj.plain.replace(/([.!?]) {2}(?=\S)/g, '$1\x01\x01');
 
// remove spaces before punctuation
if (wikEd.config.fixPunctFrench === true) {
obj.plain = obj.plain.replace(/(«) *()/g, '$1 ');
obj.plain = obj.plain.replace(/ *(»)/g, ' $1');
 
obj.plain = obj.plain.replace(/([a-zA-Z_ŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\]\}\)]) *([\.\,])(?=([a-zA-ZŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\[\{\(\s]|$))/g, '$1$2 ');
regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]})]) *([.,])(?=(['+ wikEd.letters + '_0-9\'"”\\[{(\\s\\x01]|$))', 'g');
obj.plain = obj.plain.replace(/([a-zA-Z_ŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\]\}\)]) *([\:\;\?\!])/g, '$1 $2 ');
obj.plain = obj.plain.replace(regExp, '$1$2 ');
 
regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]})]) *([:;?!])', 'g');
obj.plain = obj.plain.replace(regExp, '$1 $2 ');
}
else {
regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]})]) *([.,:;])(?=([' + wikEd.letters + '_0-9\'"”\\[{(\\s\\x01]|$))', 'g');
obj.plain = obj.plain.replace(/([a-zA-Z_ŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\]\}\)]) *([\.\,\:\;])(?=([a-zA-ZŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\'\"”\[\{\(\s]|$))/g, '$1$2 ');
obj.plain = obj.plain.replace(regExp, '$1$2 ');
}
 
obj.plain = obj.plain.replace(/\x00/g, '');
obj.plain = obj.plain.replace(/ +$/g, '');
obj.plain = obj.plain.replace(/ +\n/g, '\n');
 
// multiple spaces
obj.plain = obj.plain.replace(/ {2,}/g, ' ');
obj.plain = obj.plain.replace(/ (?=\x01)/g, '');
obj.plain = obj.plain.replace(/\x01/g, ' ');
 
return;
Line 8,402 ⟶ 10,778:
 
//
// WikEdFixUnicodewikEd.FixUnicode: fix unicode character representations
//
 
windowwikEd.WikEdFixUnicodeFixUnicode = function (obj) {
 
obj.plain = obj.plain.replace(/&amp;#0*160;|&amp;#x0*a0;/gi, '&amp;nbsp;');
obj.plain = obj.plain.replace(/&amp;#0*32;|&amp;#x0*20;/gi, ' ');
 
// replace supported chars: change decimal, hex, and character entities into actual char
for (var i = 0; i < wikEdSupportedCharswikEd.supportedChars.length; i ++) {
var replaceChar = String.fromCharCode(parseInt(wikEdSupportedCharswikEd.supportedChars[i][0], 16));
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEdSupportedCharswikEd.supportedChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEdSupportedCharswikEd.supportedChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// character entity representation
regExpStr = '&amp;' + wikEdSupportedCharswikEd.supportedChars[i][1] + ';';
 
// case sensitive replace
var regExp = new RegExp(regExpStr, 'g');
obj.plain = obj.plain.replace(regExp, replaceChar);
}
 
// replace unsupported chars in IE6: change decimal, hex, and chars into character entities
for (var i = 0; i < wikEdProblemCharswikEd.problemChars.length; i ++) {
var replaceChar = '&amp;' + wikEdProblemCharswikEd.problemChars[i][1] + ';';
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEdProblemCharswikEd.problemChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEdProblemCharswikEd.problemChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// actual character representation
regExpStr = '\\u' + wikEdProblemCharswikEd.problemChars[i][0];
 
// case sensitive replace
var regExp = new RegExp(regExpStr, 'g');
obj.plain = obj.plain.replace(regExp, replaceChar);
}
 
// replace special chars (spaces and invisible characters): change decimal, hex, and chars into character entities
for (var i = 0; i < wikEdSpecialCharswikEd.specialChars.length; i ++) {
var replaceChar = '&amp;' + wikEdSpecialCharswikEd.specialChars[i][1] + ';';
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEdSpecialCharswikEd.specialChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEdSpecialCharswikEd.specialChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// actual character representation
regExpStr = '\\u' + wikEdSpecialCharswikEd.specialChars[i][0];
 
// case sensitive replace
var regExp = new RegExp(regExpStr, 'g');
obj.plain = obj.plain.replace(regExp, replaceChar);
}
 
// unicode line separator and paragraph separator
obj.plain = obj.plain.replace(/\u2028/g, '\n');
obj.plain = obj.plain.replace(/\u2029/g, '\n\n');
Line 8,482 ⟶ 10,861:
 
//
// WikEdFixRedirectCallwikEd.LinkInfoCall: parseget link targetsinfos into(redirects, wikEdRedirectsCache objectredlinks) using AJAX API call
//
 
windowwikEd.WikEdFixRedirectCallLinkInfoCall = function (obj, handler) {
 
// check if api is enabled
if ( (wikEd.scriptURL === '') ) {
if ( ( (wikEdWikiGlobals['wgEnableAPI'] != true) && (wikEdWikiGlobals['wgEnableAPI'] != 'true') ) || (wikEdScriptURL == '') ) {
return;
}
 
// set default handlers
// reset redirects object
var externalHandler = null;
wikEdRedirectsCache = {};
if (handler === undefined) {
handler = wikEd.LinkInfoHandler;
externalHandler = wikEd.ExternalLinkInfoHandler;
}
 
// get wikilinks and external file links
var links = '';
var externalLinks = '';
 
// detect external files
// 1 [[ 2 2 3 34# 4 5 6 6 5 ]] 1
var regExpFile = new RegExp('^(Image|File|Media|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + '):', 'i');
var regExpLink = /(\[\[\s*(:?)\s*([^\n#<>\[\]\{\}\|]+)(\s*#[^\n\[\]\|]*?)?(\s*\|(.|\s)*?)?\]\]\s*)/g;
 
while ( (regExpMatch = regExpLink.exec(obj.plain)) != null) {
// parse links from provided text
links += regExpMatch[3] + '|';
if (obj !== undefined) {
 
// 1 [[ 2 2 3 34 # 4 5 6 6 5 ]] 1 7 {{ 8 8 9 910 # 1011 12 12 11 }} 7
var regExpLink = /(\[\[\s*(:?)\s*([^\n#<>\[\]{}|]+)(\s*#[^\n\[\]|]*?)?(\s*\|(.|\n)*?)?\]\])|(\{\{\s*(:?)\s*([^\n#<>\[\]{}|]+)(\s*#[^\n\[\]|]*?)?(\s*\|(.|\n)*?)?\}\})/g;
var regExpMatch ;
while ( (regExpMatch = regExpLink.exec(obj.plain)) !== null) {
var link = wikEd.CleanLink(regExpMatch[3] || regExpMatch[9]);
if (links !== '') {
links += '|';
}
links += link;
 
// collect external file links
if (regExpFile.test(link) === true) {
if (externalLinks !== '') {
externalLinks += '|';
}
externalLinks += link.replace(regExpFile, 'File:');
}
}
}
 
if (links == '') {
// get links from link info data structure
return;
else {
for (var link in wikEd.linkInfo) {
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, link) === true) && (wikEd.linkInfo[link].update === true) ) {
if (links !== '') {
links += '|';
}
links += link;
 
// collect external file links
if (regExpFile.test(link) === true) {
if (externalLinks !== '') {
externalLinks += '|';
}
externalLinks += link.replace(regExpFile, 'File:');
}
}
}
}
 
// prepare theAjax request
var postFields = {};
postFields['titles'] = links;
postFields['redirects'] = 'true';
postFields['format'] = 'xml';
postFields['action'] = 'query';
if (wikEdEdittimewikEd.starttime !== null) {
postFields['wikEdEdittimewpStarttime'] = wikEdEdittimewikEd.starttime;
}
if (wikEdEditTokenwikEd.edittime !== null) {
postFields['wpEditTokenwpEdittime'] = wikEdEditTokenwikEd.edittime;
}
if (wikEd.editToken !== null) {
postFields['wpEditToken'] = wikEd.editToken;
}
if (wikEd.autoSummary !== null) {
postFields['wpAutoSummary'] = wikEd.autoSummary;
}
var requestUrl = wikEdScriptURL + 'api.php';
var requestMethod = 'POST';
var overrideMimeType = undefined;//'text/html';
 
// makeprepare the ajaxlink request
if (links !== '') {
WikEdAjaxRequest(requestMethod, requestUrl, postFields, overrideMimeType, function(ajax, obj) {
postFields['titles'] = links;
var requestUrl = wikEd.scriptURL + 'api.php';
 
// make the ajax request
// get response
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', handler);
var txt = ajax.responseText;
}
if ( (regExpMatch = txt.match(/<redirects>((.|\s)*?)<\/redirects>/)) != null) {
var redirects = regExpMatch[1];
 
// prepare external file request to Commons
if ( (regExpMatch = txt.match(/<normalized>((.|\s)*?)<\/normalized>/)) != null) {
if ( (externalHandler !== null) && (externalLinks !== '') && (wikEd.useExternalApi === true) && (wikEd.config.externalApiUrl !== '') ) {
redirects = regExpMatch[1] + redirects;
postFields['titles'] = externalLinks;
}
var requestUrl = wikEd.config.externalApiUrl;
 
// make the ajax request
// parse redirects
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', externalHandler, true);
var i = 0;
}
wikEdRedirectsCache.from = [];
wikEdRedirectsCache.to = [];
wikEdRedirectsCache.allFrom = '';
 
return;
var regExpRedir = /<(r|n) .*?\bfrom=\"([^\">]*)\".*?\bto=\"([^\"]*)\".*?>/g;
};
while ( (regExpMatch = regExpRedir.exec(txt)) != null) {
wikEdRedirectsCache.from[i] = regExpMatch[2];
wikEdRedirectsCache.allFrom += i + '="' + regExpMatch[2] + '"';
wikEdRedirectsCache.to[i] = regExpMatch[3];
i ++;
}
 
// recurse through chained normalizations and redirects
wikEdRedirectsCache.toIndex = [];
for (var i = 0; i < wikEdRedirectsCache.to.length; i ++) {
wikEdRedirectsCache.toIndex[i] = WikEdResolveRedirects(i);
}
 
//
}
// wikEd.ExternalLinkInfoHandler: parse external file link infos from AJAX call for redirect fixing and redlinking
//
 
wikEd.ExternalLinkInfoHandler = function (ajax) {
// replace links
WikEdEditButton(null, 'wikEdFixRedirectReplace');
 
wikEd.LinkInfoHandler(ajax, true);
return;
};
 
 
//
// wikEd.LinkInfoHandler: parse link infos from AJAX call for redirect fixing and redlinking
// see https://en.mediawikia.org/w/api.php
//
 
wikEd.LinkInfoHandler = function (ajax, external) {
 
// WED('ajax.responseText', ajax.responseText.replace(/></g, '>\n<'));
 
// get response <query>
var regExpMatchQuery = ajax.responseText.match(/<api>(.|\n)*?<query>\s*((.|\n)*?)\s*<\/query>(.|\n)*?<\/api>/);
if (regExpMatchQuery === null) {
return;
});
var query = regExpMatchQuery[2];
// end Ajax handler
 
// <normalized>
var normalized = '';
var regExpMatchNormalized = query.match(/<normalized>\s*((.|\n)*?)\s*<\/normalized>/);
if (regExpMatchNormalized !== null) {
normalized = regExpMatchNormalized[1];
}
 
// <interwiki>
var interwiki = '';
var regExpMatchInterwiki = query.match(/<interwiki>\s*((.|\n)*?)\s*<\/interwiki>/);
if (regExpMatchInterwiki !== null) {
interwiki = regExpMatchInterwiki[1];
}
 
// <redirects>
var redirects = '';
var regExpMatchRedirects = query.match(/<redirects>\s*((.|\n)*?)\s*<\/redirects>/);
if (regExpMatchRedirects !== null) {
redirects = regExpMatchRedirects[1];
}
 
// <pages>
var pages = '';
var regExpMatchPages = query.match(/<pages>\s*((.|\n)*?)\s*<\/pages>/);
if (regExpMatchPages !== null) {
pages = regExpMatchPages[1];
}
 
// standard links or external file links
var linkInfo;
if (external === true) {
linkInfo = wikEd.externalLinkInfo;
}
else {
linkInfo = wikEd.linkInfo;
}
 
// parse redirects and normalized, type: n or r
var regExpRedirNorm = /<(r|n)\b[^>]*?\bfrom="([^">]*)"[^>]*?\bto="([^"]*)"[^>]*?>/g;
var regExpMatchRedirNorm ;
while ( (regExpMatchRedirNorm = regExpRedirNorm.exec(redirects + normalized) ) !== null) {
var link = regExpMatchRedirNorm[2];
link = link.replace(/&quot;/g, '"');
link = link.replace(/&#039;/g, '\'');
link = link.replace(/&amp;/g, '&');
var to = regExpMatchRedirNorm[3];
to = to.replace(/&quot;/g, '"');
to = to.replace(/&#039;/g, '\'');
to = to.replace(/&amp;/g, '&');
linkInfo[link] = {
update: false,
updated: true,
type: regExpMatchRedirNorm[1],
missing: false,
redirect: (regExpMatchRedirNorm[1] == 'r'),
to: to
};
}
 
// parse pages and interwiki, type: page, i
var regExpPageInter = /<(page|i)\b([^>]*?\btitle="([^">]*)"[^>]*)>/g;
var regExpMatchPageInter;
while ( (regExpMatchPageInter = regExpPageInter.exec(pages + interwiki) ) !== null) {
var link = regExpMatchPageInter[3];
link = link.replace(/&quot;/g, '"');
link = link.replace(/&#039;/g, '\'');
link = link.replace(/&amp;/g, '&');
linkInfo[link] = {
update: false,
updated: true,
type: regExpMatchPageInter[1],
redirect: false,
 
// also: special, invalid
missing: /\bmissing="([^"]*)"/.test(regExpMatchPageInter[2])
};
}
 
// find target by recursing through chained normalizations and redirects
for (var link in linkInfo) {
if ( (Object.prototype.hasOwnProperty.call(linkInfo, link) === true) && (linkInfo[link].updated === true) ) {
var target = wikEd.ResolveRedirects(linkInfo, link);
linkInfo[link].target = target;
linkInfo[link].missing = linkInfo[target].missing;
 
// normalizations are also redirects when pointing to a redirect
if ( (linkInfo[link].type == 'n') && (linkInfo.hasOwnProperty(linkInfo[link].to) === true) && (linkInfo[ linkInfo[link].to ].type == 'r') ) {
linkInfo[link].redirect = true;
}
}
}
 
// add redirect info and redlink highlighting to existing links
wikEd.LinkifyLinks();
 
return;
Line 8,569 ⟶ 11,095:
 
//
// WikEdResolveRedirectswikEd.ResolveRedirects: recursively follow redirects, calledwhen fromparsing WikEdFixRedirectCallAPI Ajaxresponse in wikEd.LinkInfoCall handler
//
// uses wikEdRedirectsCache.allFrom as a regExp hash
 
windowwikEd.WikEdResolveRedirectsResolveRedirects = function (ilinkInfo, link) {
 
var toRegExp = wikEdRedirectsCache.to[i].replace(/(\W)/g, '\\$1');
if ( (Object.prototype.hasOwnProperty.call(linkInfo, link) === true) && (linkInfo[link].updated === true) ) {
var regExp = new RegExp('(\\d+)=\\"' + toRegExp + '\\"');
if (linkInfo[link].hasOwnProperty('to') === true) {
if ( (regExpMatch = wikEdRedirectsCache.allFrom.match(regExp)) != null) {
link = wikEd.ResolveRedirects(linkInfo, linkInfo[link].to);
i = WikEdResolveRedirects( parseInt(regExpMatch[1], 10) );
}
}
return(i) link;
};
 
 
//
// wikEd.ScanPreviewRedlinks: scan article preview section for redlinks
// WikEdFixRedirectReplace: replace redirects using wikEdRedirectsCache object prepared in WikEdFixRedirectCall()
//
 
windowwikEd.WikEdFixRedirectReplaceScanPreviewRedlinks = function (obj) {
 
// check all link tags in preview and cat links section
if (wikEdRedirectsCache.from == null) {
var linkTags = [];
return;
var i = 0;
if (wikEd.wikiPreview !== null) {
linkTags.push(wikEd.wikiPreview.getElementsByTagName('a'));
}
if (wikEd.catLinks !== null) {
linkTags.push(wikEd.catLinks.getElementsByTagName('a'));
}
 
// cycle through parsed redirectslinks
var regExpQuery = new RegExp(wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgScriptPath + '/index.php\\?(.*?)(#|$)');
if (wikEdRedirectsCache.from != null) {
for (var i = 0; i < wikEdRedirectsCache.fromlinkTags.length; i ++) {
for (var j = 0; j < linkTags[i].length; j ++) {
var tag = linkTags[i][j];
var href = tag.href;
if (href !== null) {
 
// get query string
// 1 1 2 23 # 3 4 |56 6 54
var regExpMatchQuery = regExpQuery.exec(href);
var regExp = new RegExp('\\[\\[\\s*(:?)\\s*(' + wikEdRedirectsCache.from[i] + ')(\\s*#[^\\n\\[\\]\\|]*?)?(\\s*\\|((.|\\s)*?))?\\s*\\]\\]', 'g');
if (regExpMatchQuery !== null) {
obj.plain = obj.plain.replace(regExp,
var query = regExpMatchQuery[1];
function(p, p1, p2, p3, p4, p5) {
var prefix = p1;
var article = p2;
var redirect = wikEdRedirectsCache.to[ wikEdRedirectsCache.toIndex[i] ];
var fragmentId = p3 || '';
var linkText = p5 || '';
 
// get title
// use normalized target
var regExpMatchTitle = query.match(/(^|&)title=(.+?)(&|$)/);
var linkTarget = redirect;
if (regExpMatchTitle !== null) {
var title = regExpMatchTitle[2];
var link = '';
 
// files
// lowercase link target if link text starts with lowercase (main space only)
if ( (title == 'Special:Upload') && (/\bnew\b/.test(tag.className) === true) ) {
if (wikEdConfig['articlesCaseSensitive'] == false) {
link = tag.innerHTML;
if (/:/.test(linkTarget) != true) {
}
if (article.charAt(0).toLowerCase() == article.charAt(0)) {
 
linkTarget = linkTarget.charAt(0).toLowerCase() + linkTarget.substr(1);
// links, templates, categories
}
else if (/(^|&)redlink=(.*?)(&|$)/.test(query) === true) {
link = title;
link = link.replace(/_/g, ' ');
link = decodeURIComponent(link);
}
 
// save redlink status in link info; get API info later anyway
if (link !== '') {
wikEd.linkInfo[link] = {
update: true,
updated: true,
type: 'preview',
redirect: false,
missing: true
};
}
}
}
}
}
}
return;
};
 
 
// remove text if identical to new target
//
if (linkText != '') {
// wikEd.FixRedirectReplace: replace redirects using linkInfo data
if ( linkText.replace(/_/g, ' ') == linkTarget ) {
//
 
wikEd.FixRedirectReplace = function (obj) {
 
// 1 2[[ 2 3 3 4 45 # 5 6 |78 8 76 9 ]] 91,01{{ 1 2 2 3 34 # 4 5 |67 7 65 8 }} 80
var regExpLink = /((\[\[)\s*(:?)\s*([^\n#<>\[\]{}|]+)(\s*#[^\n\[\]|]*?)?(\s*\|((.|\n)*?))?(\]\]))|((\{\{)\s*(:?)\s*([^\n#<>\[\]{}|]+)(\s*#[^\n\[\]|]*?)?(\s*\|((.|\n)*?))?(\}\}))/g;
 
obj.plain = obj.plain.replace(regExpLink,
function(p, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15, p16, p17, p18) {
var tag = p1 || p10;
var openTag = p2 || p11;
var prefix = p3 || p12;
var article = p4 || p13;
var fragmentId = p5 || p14;
var linkText = p7 || p16;
var closeTag = p9 || p18;
 
var link = wikEd.CleanLink(article);
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, link) === true) && (wikEd.linkInfo[link].redirect === true) ) {
var target = wikEd.linkInfo[link].target;
 
// lowercase link target if link text starts with lowercase (main space only)
if (wikEd.config.articlesCaseSensitive === false) {
if (/:/.test(target) !== true) {
if (article.charAt(0).toLowerCase() == article.charAt(0)) {
target = target.charAt(0).toLowerCase() + target.substr(1);
}
}
}
 
// remove link text if identical to new target
if (openTag == '[[') {
if (linkText !== '') {
if (linkText.replace(/_/g, ' ') == target) {
linkText = '';
}
}
 
// keep replaced link as link text
else if (linkText === '') {
if (linkTargettarget != article) {
linkText = article;
}
}
}
 
// return fixed link
var wikiLink = openTag + prefix + target + fragmentId;
if (linkText !== '') {
wikiLink += '[[|' + prefix + linkTarget + fragmentId + ']]'linkText;
}
else {
wikiLink = '[[' + prefix + linkTarget + fragmentId + '|' + linkText + ']]';
}
return(wikiLink);
}
wikiLink += closeTag;
);
return wikiLink;
}
return tag;
}
});
return;
};
Line 8,650 ⟶ 11,239:
 
//
// WikEdFixMathwikEd.FixMath: math character fixer, originally from User:Omegatron
//
 
windowwikEd.WikEdFixMathFixMath = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// change only outside <math> </math> wikicode
obj.plain = obj.plain.replace(/(.*?)((&lt;math(\b.*?)&gt;.*?&lt;\/math&gt;)|$)/gi,
function (p, p1, p2) {
 
// convert html entities into actual dash characters
p1 = p1.replace(/&plus;/g, '+');
p1 = p1.replace(/&minus;/g, '\u2212');
p1 = p1.replace(/&middot;/g, '·');
 
// convert dash next to a number into a minus sign character
var regExp = new RegExp('([^' + wikEd.letters + '_0-9,{])-(\\d)', 'g');
p1 = p1.replace(/([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\,\{])-(\d)/g, '$1\u2212$2');
p1 = p1.replace(regExp, '$1\u2212$2');
 
// changes 2x3 to 2×3
p1 = p1.replace(/(\d *)x( *\d)/g, '$1\xd7$2');
 
// changes 10^3 to 10<sup>3</sup>
p1 = p1.replace(/(\d*\.?\d+)\^(\u2212?\d+\.?\d*)/g, '$1&lt;sup&gt;$2&lt;/sup&gt;');
 
// change x^3 to x<sup>3</sup>
var regExp = new RegExp('([' + wikEd.letters + '_0-9])\\^(\\u2212?\\d+\\.?\\d*) ', 'g');
p1 = p1.replace(/([\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9])\^(\u2212?\d+\.?\d*) /g, '$1&lt;sup&gt;$2&lt;/sup&gt;');
p1 = p1.replace(regExp, '$1&lt;sup&gt;$2&lt;/sup&gt;');
 
// change +/- to ±
p1 = p1.replace(/( |\d)\+\/(-|\u2212)( |\d)/g, '$1\xb1$3');
 
// htmlize single char superscripts
p1 = p1.replace(/(\xb9|&sup1;)/g, '&lt;sup&gt;1&lt;/sup&gt;');
p1 = p1.replace(/(\xb2|&sup2;)/g, '&lt;sup&gt;2&lt;/sup&gt;');
p1 = p1.replace(/(\xb3|&sup3;)/g, '&lt;sup&gt;3&lt;/sup&gt;');
 
return( p1 + p2);
}
);
Line 8,694 ⟶ 11,285:
 
//
// WikEdFixChemwikEd.FixChem: fix chemical formulas
//
 
windowwikEd.WikEdFixChemFixChem = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
var realElements = 'H|He|Li|Be|B|C|N|O|F|Ne|Na|Mg|Al|Si|P|S|Cl|Ar|K|Ca|Sc|Ti|V|Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr|Rb|Sr|Y|Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I|Xe|Cs|Ba|Hf|Ta|W|Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn|Fr|Ra|Rf|Db|Sg|Bh|Hs|Mt|Ds|Rg|La|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu|Ac|Th|Pa|U|Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr';
var pseudoElements = '|Me|Et|Pr|Bu|e';
 
// fix common typos
obj.plain = obj.plain.replace(/\bh2o\b/g, 'H2O');
obj.plain = obj.plain.replace(/\bh3o+/g, 'H3O+');
obj.plain = obj.plain.replace(/\boh-/g, 'OH-');
 
// uppercase lowercased elements
var regExp = new RegExp('(^|[^a-zA-Z])(' + realElements.toLowerCase() + pseudoElements.toLowerCase() + ')([^a-zA-Z]|$)', 'g');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
if (p2 != 'e') {
p2 = p2.charAt(0).toUpperCase() + p2.substr(1).toLowerCase();
}
return( p1 + p2 + p3);
}
);
 
// fix superscripts
obj.plain = obj.plain.replace(/&plus;/g, '+');
obj.plain = obj.plain.replace(/&minus;/g, '\u2212');
Line 8,726 ⟶ 11,317:
regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d*(\\+|-|\\u2212))', 'g');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
p2 = p2.replace(/-/g, '\u2212');
return( p1 + '&lt;sup&gt;' + p2 + '&lt;/sup&gt;');
}
);
 
// fix indices
regExp = new RegExp('(' + realElements + pseudoElements + '|\\))(\\d+)', 'g');
obj.plain = obj.plain.replace(regExp, '$1&lt;sub&gt;$2&lt;/sub&gt;');
 
// fix prefixes
regExp = new RegExp('(\\d+) *(\\(|' + realElements + pseudoElements + ')', 'g');
obj.plain = obj.plain.replace(regExp, '$1$2');
 
// fix arrows
obj.plain = obj.plain.replace(/ *-+&gt; *()/g, ' \u2192 ');
obj.plain = obj.plain.replace(/ *&lt;-+ *()/g, ' \u2190 ');
 
// &hdarr; and "leftwards harpoon over rightwards harpoon" not supported in IE6
// obj.plain = obj.plain.replace(/ *(&lt;=+&gt;|&hdarr;|&harr;|\u2190 *\u2192) *()/g, ' \u21cc ');
obj.plain = obj.plain.replace(/ *(&lt;==+&gt;|&hdarr;|&harr;|\u21cc|\u2190 *\u2192) *()/g, ' <=> ');
 
// fix -
var regExp = new RegExp('([' + wikEd.letters + '_0-9]|\\)|&gt;) +(-|\\u2212) +([' + wikEd.letters + '_0-9]|\\()', 'g');
obj.plain = obj.plain.replace(/([\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\)|&gt;) +(-|\u2212) +([\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\()/g, '$1 \u2212 $3');
obj.plain = obj.plain.replace(regExp, '$1 \u2212 $3');
 
return;
Line 8,756 ⟶ 11,348:
 
//
// WikEdFixUnitswikEd.FixUnits: unit formatter
//
 
windowwikEd.WikEdFixUnitsFixUnits = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// convert into actual characters
obj.plain = obj.plain.replace(/&amp;deg;|&amp;#00b0;/g, '°');
obj.plain = obj.plain.replace(/&amp;#00b5;|&amp;mu;|&amp;micro;/g, 'µ');
obj.plain = obj.plain.replace(/&amp;Omega;|&amp;#8486;/g, '\u03a9');
 
// add space before units, remove space around /, and use abreviations
obj.plainvar regExp = obj.plain.replacenew RegExp(/'( *\/ *|\\d *)(Y|yotta|Z|zetta|E|exa|P|peta|T|tera|G|giga|M|mega|k|kilo|K|h|hecto|da|deca|d|deci|c|centi|m|mill?i|micro|u|µ|n|nano|p|pico|f|femto|a|atto|z|zepto|y|yocto|mibi|mebi|)(gramm?s?|g|metres?|meters?|m|amperes?|Amperes?|amps?|Amps?|A|Angstroms?|Angströms?|Å|Kelvins?|kelvins?|K|moles?|Moles?|mol|candelas?|cd|rad|Ci|sr|Hert?z|hert?z|Hz|newtons?|Newtons?|N|Joules?|joules?|J|watts?|Watts?|W|pascals?|Pascals?|Pa|lm|lx|C|volts?|Volts?|V|O|Farads?|F|Wb|T|H|S|bequerels?|Bequerels?|Bq|Gy|Sv|kat|centigrades?|°C|decibels?|db|dB|M|ohms?|Ohms?|\\u03a9|sec|seconds?|s|minutes?|min|hour?|h|bits?|Bits?|bit|bytes?|Bytes?|B|bps|Bps)(?=[^\wŠŒŽšœžŸÀ' + wikEd.letters + '_0-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f99]|$)/', 'g,');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
function(p, p1, p2, p3) {
 
p1 = p1.replace(/ *\/ *()/g, '/');
Line 8,823 ⟶ 11,416:
p3 = p3.replace(/Bps/g, 'B/s');
 
return( p1 + p2 + p3);
}
);
 
// fix prefix casing
var regExp = new RegExp(' K(bit/s|B/s)([^' + wikEd.letters + '_0-9]|$)', 'g');
obj.plain = obj.plain.replace(/ K(bit\/s|B\/s)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' k$1$2');
obj.plain = obj.plain.replace(/ m(bit\/s|B\/s)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/gregExp, ' Mk$1$2');
 
obj.plain = obj.plain.replace(/ g(bit\/s|B\/s)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' G$1$2');
var regExp = new RegExp(' m(bit/s|B/s)([^' + wikEd.letters + '_0-9]|$)', 'g');
obj.plain = obj.plain.replace(/ t(bit\/s|B\/s)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/g, ' T$1$2');
obj.plain = obj.plain.replace(/ e(bit\/s|B\/s)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|$)/gregExp, ' EM$1$2');
 
var regExp = new RegExp(' g(bit/s|B/s)([^' + wikEd.letters + '_0-9]|$)', 'g');
obj.plain = obj.plain.replace(regExp, ' G$1$2');
 
var regExp = new RegExp(' t(bit/s|B/s)([^' + wikEd.letters + '_0-9]|$)', 'g');
obj.plain = obj.plain.replace(regExp, ' T$1$2');
 
var regExp = new RegExp(' e(bit/s|B/s)([^' + wikEd.letters + '_0-9]|$)', 'g');
obj.plain = obj.plain.replace(regExp, ' E$1$2');
 
return;
Line 8,839 ⟶ 11,441:
 
//
// WikEdFixDasheswikEd.FixDashes: fixes dashes and minus signs
//
 
windowwikEd.WikEdFixDashesFixDashes = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// convert html character entities into actual dash characters
obj.plain = obj.plain.replace(/&amp;mdash;/g, '—');
obj.plain = obj.plain.replace(/&amp;ndash;/g, '–');
obj.plain = obj.plain.replace(/&amp;minus;/g, '\u2212');
 
// remove spaces around em dashes
obj.plainvar regExp = obj.plain.replacenew RegExp(/'([a' + wikEd.letters + '_0-zA-Z9\'\"”\\]\}\)])( |&amp;nbsp;)*—( |&amp;nbsp;)*([a-zA' + wikEd.letters + '_0-Z9\'\"“\\[\{\(])/g', '$1—$4g');
obj.plain = obj.plain.replace(regExp, '$1—$4');
 
// convert -- to em dashes
obj.plainvar regExp = obj.plain.replacenew RegExp(/'([a' + wikEd.letters + '_0-zA-Z9\'\"”\\]\}\)])( |&amp;nbsp;)*--( |&amp;nbsp;)*([a-zA' + wikEd.letters + '_0-Z9\'\"“\\[\{\(])/g', '$1—$4g');
obj.plain = obj.plain.replace(regExp, '$1—$4');
 
// convert hyphen next to lone number into a minus sign character
obj.plainvar regExp = obj.plain.replacenew RegExp(/'([a' + wikEd.letters + '_0-zA-Z9\'\"”\\]>] ) *(\\u2212|–)(\\d)/g', '$1\u2212$3g');
obj.plain = obj.plain.replace(regExp, '$1\u2212$3');
 
// convert minus or en dashes to dashes with spaces
obj.plainvar regExp = obj.plain.replacenew RegExp(/'([a-zA' + wikEd.letters + '_0-Z9\'\"”\]\]}])( |&amp;nbsp;)*(\\u2212|–)( |&amp;nbsp;)*([a-zA' + wikEd.letters + '_0-Z9\'\"“\\[\{])/g', '$1 – $5g');
obj.plain = obj.plain.replace(regExp, '$1 – $5');
 
// convert dashes to en dashes in dates
obj.plain = obj.plain.replace(/(^|[ \(\|])(\d\d(\d\d)?)(\u2212|-|–)(\d\d)(\u2212|-|–)(\d\d(\d\d)?)([ \)\}\|,.;—]|$)/gm, '$1$2–$5–$7$9');
 
Line 8,871 ⟶ 11,477:
 
//
// WikEdFixHTMLwikEd.FixHTML: fix html to wikicode
//
 
windowwikEd.WikEdFixHTMLFixHTML = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// get html from plain, keep leading spaces, \n to <br>
// remove syntax highlighting
obj.html = obj.plain;
obj.html = obj.html.replace(/(^|\n) +/g,
function(p, p1) {
p = p.replace(/ /g, '\xa0');
return p;
}
);
obj.html = obj.html.replace(/\n/g, '<br>');
WikEdRemoveHighlighting(obj);
 
// preserve double spaces after dot
// keep <br> in blockquote
obj.html = obj.html.replace(/([.!?]) {2}(?=\S)/g, '$1\xa0\xa0');
 
// remove syntax highlighting
wikEd.RemoveHighlighting(obj);
 
// keep <br> in preformatted lines
obj.html = obj.html.replace(/(^|<br>)( |\xa0).*?(?=<br>)/g,
function(p, p1, p2) {
p = p.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01');
return p;
}
);
 
// keep <br> in blockquote
obj.html = obj.html.replace(/(&lt;blockquote\b.*?&gt;)([\S\s]*?)(&lt;\/blockquote&gt;)/gi,
function (p, p1, p2, p3) {
p2 = p2.replace(/&lt;(br\b.*?)&gt;<br\b.[^>]*?>/g, '\x00$1\x01\n');
return( p1 + p2 + p3);
}
);
 
// keep <br> in tables (and certain templates!?)
obj.html = obj.html.replace(/(<br\b[^>]*>\|)([^\}][\S\s]*?)(?=<br\b[^>]*>\|)/gi,
function (p, p1, p2) {
p2 = p2.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01');
return( p1 + p2);
}
);
 
// detect outermost template tags
var depth = 0;
obj.html = obj.html.replace(/((\{\{)|\}\})/g,
function (p, p1, p2) {
if (p2 != p2 || '') {;
if (p2 !== '') {
depth ++;
if (depth == 1) {
return( '<!--wikEdOuterTemplateStart-->' + p1);
}
return( p1);
}
depth --;
if (depth === 0) {
return( p1 + '<!--wikEdOuterTemplateEnd-->');
}
return( p1);
}
);
 
// keep <br> in templates
obj.html = obj.html.replace(/<!--wikEdOuterTemplateStart-->([\S\s]*?)<!--wikEdOuterTemplateEnd-->/g,
function (p, p1) {
return( p1.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01'));
}
);
 
// detect outermost table tags
var depth = 0;
obj.html = obj.html.replace(/(((^|<br\b[^>]*>)\{\|)|<br\b[^>]*>\|\})/g,
function (p, p1, p2, p3) {
if (p2 !== '') {
depth ++;
if (depth == 1) {
return( '<!--wikEdOuterTableStart-->' + p1);
}
return( p1);
}
depth --;
if (depth === 0) {
return( p1 + '<!--wikEdOuterTableEnd-->');
}
return( p1);
}
);
 
// keep <br> in tables
obj.html = obj.html.replace(/<!--wikEdOuterTableStart-->([\S\s]*?)<!--wikEdOuterTableEnd-->/g,
function (p, p1) {
return( p1.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01'));
}
);
 
// turn visible html code into real html, exclude comments
obj.html = obj.html.replace(/&lt;(\/?\w.*?)&gt;/g, '<$1>');
 
// restore valid <br>s
obj.html = obj.html.replace(/\x00(.*?)\x01/g, '&lt;$1&gt;');
 
// wikify, keep user added attribute
WikEdWikifyHTMLwikEd.WikifyHTML(obj, true);
 
// turn real html into visible html code
obj.html = obj.html.replace(/<br\b[^>]*>[\n ]s*()?\n/g, '\n');
obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
obj.html = obj.html.replace(/</g, '&lt;');
obj.html = obj.html.replace(/>/g, '&gt;');
obj.plain = obj.html;
 
obj.plain = obj.html;
return;
};
Line 8,971 ⟶ 11,598:
 
//
// WikEdFixCapswikEd.FixCaps: fix capitalizing of lists, linklists, images, headings
//
 
windowwikEd.WikEdFixCapsFixCaps = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// uppercase lists, also uppercases cat parameter names
// start (( listcode ) (wcode|char-ent|tag |category.. |digit| non-word,non-ret ) )( word,non-digit..) end rest)
obj.plainvar regExp = obj.plain.replacenew RegExp(/'^((\\||[\*\#\:\;]+)[ \\s\'\"]*(\'+|\&amp;\\w+\;|&lt;.*?&gt;|\\{\\{.*?\\}\\}.*|\\d|[^\wŠŒŽšœžŸÀ' + wikEd.letters + '_0-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\n9])*)([^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\d\n' + wikEd.letters + '].*?)?$/', 'gm,');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3, p4) {
function(p, p1, p2, p3, p4) {
if (p4.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda|$)/) == null) {
p4 = p4 || '';
if (/^(https?|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda|$)/.test(p4) === false) {
 
// spaces cannot be added to p1 in above regExp !?
p4 = p4.replace(/^(\s*)(.*?)$/,
function (p, p1, p2) {
p2 = p2.charAt(0).toUpperCase() + p2.substr(1);
return( p1 + p2);
}
);
}
return( p1 + p4);
}
);
 
// uppercase link lists (link)
// 12table 12 table list 2 list2 13 34 4
obj.plain = obj.plain.replace(/^((\||[\*\#\:\;]+)[ \'\"]*\[\[)(.*?)(\]\])/gm,
function (p, p1, p2, p3, p4) {
 
// uppercase link
var regExp = new RegExp('^((&amp;\\w+;|&lt;.*?&gt;|\\s)*)([' + wikEd.letters + '].*)$', '');
p3 = p3.replace(/^((\&\w+\;|[^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9]|\d)*)([a-zA-ZŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_].*)$/,
p3 = p3.replace(regExp,
function (p, p1, p2, p3) {
function(p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) == null) {
if (/^(https?|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) === false) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
return( p1 + p3);
}
);
 
// uppercase commentlink text
var regExp = new RegExp('(\\|(&amp;\\w+;|&lt;.*?&gt;|\\s)*)([' + wikEd.letters + '].*)$', '');
p3 = p3.replace(/(\| *(\&\w+\;|&lt;.*?&gt;|[^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\|]|\d)*)([a-zA-ZŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_][^\|]*)$/,
p3 = p3.replace(regExp,
function (p, p1, p2, p3) {
function(p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) == null) {
if (/^(https?|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) === false) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
return( p1 + p3);
}
);
return( p1 + p3 + p4);
}
);
 
// uppercase headings
var regExp = new RegExp('^(=+ (&amp;\\w+;|&lt;.*?&gt;|\\d|[^' + wikEd.letters + '_0-9])*)([' + wikEd.letters + '].*? =+)$', 'gm');
obj.plain = obj.plain.replace(/^(=+ (\&\w+\;|&lt;.*?&gt;|\d|[^\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\n])*)([a-zA-ZŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9_].*? =+)$/gm,
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
function(p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/) == null) {
if (/^(https?|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) === false) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
return( p1 + p3);
}
);
 
// uppercase images
var regExp = new RegExp('(\\[\\[)(Image|File|Media|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfigwikEd.config.text['textwikicode File'] + '|' + wikEd.config.text['wikicode FileMedia'] + '):([\\wŠŒŽšœžŸÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9' + wikEd.letters + '])([^\\n].*?\\]\\])', 'igm');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3, p4) {
p2 = p2.charAt(0).toUpperCase() + p2.substr(1).toLowerCase();
p3 = p3.toUpperCase();
return( p1 + p2 + ':' + p3 + p4);
}
);
Line 9,049 ⟶ 11,681:
 
//
// WikEdFixTyposwikEd.FixTypos: fix typos using the AutoWikiBrowser/RegExTypoFix list (.test() is not faster)
//
 
windowwikEd.WikEdFixTyposFixTypos = function (obj) {
 
WikEdFixBasicwikEd.FixBasic(obj);
 
// split into alternating plain text and {{lang}} template fragments (does not support nested templates)
var fragment = [];
var nextPos = 0;
var regExp = new RegExp('/{{\\s*lang\\s*\\|(.|\\n)*?}}', '/gi');
var regExpMatch;
while ( (regExpMatch = regExp.exec(obj.plain)) !== null) {
fragment.push(obj.plain.substring(nextPos, regExpMatch.index));
fragment.push(regExpMatch[0]);
Line 9,067 ⟶ 11,700:
fragment.push(obj.plain.substring(nextPos));
 
// cycle through the RegExTypoFix rules
for (var i = 0; i < wikEdTypoRulesFindwikEd.typoRulesFind.length; i ++) {
 
// cycle through the fragments, jump over {{lang}} templates
for (var j = 0; j < fragment.length; j = j + 2) {
fragment[j] = fragment[j].replace(wikEdTypoRulesFindwikEd.typoRulesFind[i], wikEdTypoRulesReplacewikEd.typoRulesReplace[i]);
}
}
 
// re-assemble text
obj.plain = fragment.join('');
 
Line 9,084 ⟶ 11,717:
 
//
// WikEdFixAllwikEd.FixAll:
//
 
windowwikEd.WikEdFixAllFixAll = function (obj) {
WikEdFixBasicwikEd.FixBasic(obj);
WikEdFixUnicodewikEd.FixUnicode(obj);
WikEdFixHTMLwikEd.FixHTML(obj);
WikEdFixCapswikEd.FixCaps(obj);
return;
};
Line 9,097 ⟶ 11,730:
 
//
// WikEdRemoveElementswikEd.RemoveElements: remove elements by tag name
//
 
windowwikEd.WikEdRemoveElementsRemoveElements = function (tagNameArray) {
 
// cycle through the element names
for (var i = 0; i < tagNameArray.length; i ++) {
var elementArray = wikEdFrameDocumentwikEd.frameBody.getElementsByTagName(tagNameArray[i]);
for (var j = 0; j < elementArray.length; j ++) {
elementArray[j].parentNode.removeChild(elementArray[j]);
Line 9,114 ⟶ 11,747:
 
//
// WikEdFindBoundarieswikEd.FindBoundaries: find word boundaries and line boundaries starting from selection.range
//
 
windowwikEd.WikEdFindBoundariesFindBoundaries = function (word, line, para, whole, selection) {
 
if (whole.plain === '') {
return;
}
 
// get the start node and offset
var startNode = selection.range.startContainer;
var startOffset = selection.range.startOffset;
 
// get the end node and offset
var endNode = selection.range.endContainer;
var endOffset = selection.range.endOffset;
 
if (startNode.childNodes !== null) {
if (startNode.childNodes.length > 0) {
startNode = startNode.childNodes.item(startOffset);
Line 9,133 ⟶ 11,770:
}
}
if (endNode.childNodes !== null) {
if (endNode.childNodes.length > 0) {
endNode = endNode.childNodes.item(endOffset);
Line 9,140 ⟶ 11,777:
}
 
// find the start and end nodes in the whole plain text arrays
var startNodeIndex;
var endNodeIndex;
Line 9,153 ⟶ 11,790:
}
 
// find last previous word and line boundary
var foundWord = false;
var foundLine = false;
var foundPara = false;
var regExp = new RegExp('.*[^\\w\\' + wikEd.letters + '_0-ŠŒŽšœžŸÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f99]', 'g');
var plainPrev = '';
 
// check text nodes left-wise for a boundary
var plain = '';
for (var i = startNodeIndex; i >= 0; i --) {
Line 9,169 ⟶ 11,806:
plain = plain.replace(/&amp;/g, '&');
 
// boundary is a new paragraph
if ( (plainPrev == '\n') && (plain == '\n') ) {
para.range.setStartAfter(whole.plainNode[i + 1]);
Line 9,176 ⟶ 11,813:
}
 
// boundary is a newline
else if (plain == '\n') {
if (foundWord === false) {
word.range.setStartAfter(whole.plainNode[i]);
foundWord = true;
}
if (foundLine === false) {
line.range.setStartAfter(whole.plainNode[i]);
foundLine = true;
Line 9,188 ⟶ 11,825:
}
 
// check text node for a word boundary
else if (foundWord === false) {
if (i == startNodeIndex) {
plain = plain.substr(0, startOffset);
}
regExp.lastIndex = 0;
if (regExp.exec(plain) !== null) {
WikEdSetRangeStartwikEd.SetRangeStart(word.range, whole.plainNode[i], regExp.lastIndex);
foundWord = true;
}
Line 9,201 ⟶ 11,838:
}
 
// boundary is start of text
if (foundPara === false) {
para.range.setStartBefore(whole.plainNode[0]);
}
if (foundLine === false) {
line.range.setStartBefore(whole.plainNode[0]);
}
if (foundWord === false) {
word.range.setStartBefore(whole.plainNode[0]);
}
 
// find next word and line boundary
regExp = new RegExp('[^' + wikEd.letters + '_0-9]', 'g');
regExp = new RegExp('[^\\w\\-ŠŒŽšœžŸÀ-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f9]', 'g');
foundWord = false;
foundLine = false;
foundPara = false;
 
// check text nodes right-wise for a boundary
plain = '';
for (var i = endNodeIndex; i < whole.plainArray.length; i ++) {
Line 9,227 ⟶ 11,864:
plain = plain.replace(/&amp;/g, '&');
 
// boundary is a double newline
if ( (plainPrev == '\n') && (plain == '\n') ) {
para.range.setEndBefore(whole.plainNode[i]);
Line 9,234 ⟶ 11,871:
}
 
// boundary is a newline
else if (plain == '\n') {
if (foundWord === false) {
word.range.setEndBefore(whole.plainNode[i]);
foundWord = true;
}
if (foundLine === false) {
line.range.setEndBefore(whole.plainNode[i]); //// crashes for empty selection
foundLine = true;
Line 9,246 ⟶ 11,883:
}
 
// check text node for a word boundary
else if (foundWord === false) {
if (i == endNodeIndex) {
regExp.lastIndex = endOffset;
Line 9,255 ⟶ 11,892:
}
var regExpArray = regExp.exec(plain);
if (regExpArray !== null) {
WikEdSetRangeEndwikEd.SetRangeEnd(word.range, whole.plainNode[i], regExp.lastIndex - 1);
foundWord = true;
}
Line 9,262 ⟶ 11,899:
}
 
// boundary is end of text
if (foundPara === false) {
para.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
}
if (foundLine === false) {
line.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
}
if (foundWord === false) {
word.range.setEndAfter(whole.plainNode[whole.plainArray.length - 1]);
}
Line 9,278 ⟶ 11,915:
 
//
// wikEd.DivToBr: convert <div>...</div> to <br> for Safari, Chrome, and WebKit
// remove syntax highlighting and wikify
//
 
windowwikEd.WikEdRemoveHighlightingWikifyDivToBr = function(obj, wikify(html) {
 
// remove inline tags around <br>
if ( (obj.html != '') || (wikify == true) ) {
var tagRegExp = /<(i|dfn|cite|em|var|b|strong|abbr|big|code|del|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby)\b[^>]*>((<br\b[^>]*>)+)<\/\1>/gi;
while (tagRegExp.test(html) === true) {
html = html.replace(tagRegExp, '$2');
tagRegExp.lastIndex = 0;
}
 
// convert <div>...</div> to <br>\x00...\x00 forto Safari,mark Chrome,block WebKitborders
html = wikEd.RemoveTag(html, 'div', null, '\x00', '\x00');
if ( (wikEdSafari == true) || (wikEdChrome == true) || (wikEdWebKit == true) ) {
 
var isRemove = [];
// remove div block borders after <br>
obj.html = obj.html.replace(/(<(\/?)div\b([^>]*)>)/g,
html = html.replace(/<br>\x00+/g, '<br>');
function (p, p1, p2, p3) {
 
if (p2 == '') {
// remove leading and trailing div block borders
if (p3 == '') {
html = html.replace(/^\x00+|\x00+$/g, '');
isRemove.push(true);
 
return('\x00');
// combine div block borders into single <br>
}
html = html.replace(/\x00+/g, '<br>');
isRemove.push(false);
 
return(p1);
return html;
}
};
if (isRemove.pop() == true) {
 
return('\x01');
 
}
//
return(p1);
// wikEd.RemoveHighlightingWikify: remove syntax highlighting and wikify
}
//
);
 
obj.html = obj.html.replace(/\x00\s*<br>\s*\x01/g, '\x01');
wikEd.RemoveHighlightingWikify = function (obj, wikify) {
obj.html = obj.html.replace(/\x01\s*<br>/g, '\x01');
 
obj.html = obj.html.replace(/<br>\s*\x00/g, '\x00');
if ( (obj.html !== '') || (wikify === true) ) {
obj.html = obj.html.replace(/\x01\s*\x00/g, '\x01');
 
obj.html = obj.html.replace(/^\x00|\x01$/g, '');
// convert <div>...</div> to <br> for Safari, Chrome, and WebKit
obj.html = obj.html.replace(/[\x00\x01]/g, '<br>');
if ( (wikEd.safari === true) || (wikEd.chrome === true) || (wikEd.webkit === true) ) {
obj.html = wikEd.DivToBr(obj.html);
}
 
// remove syntax highlighting
WikEdRemoveHighlightingwikEd.RemoveHighlighting(obj);
 
// wikify, don't allow many attributes
if ( (obj.htmlCode === true) && (wikify !== false) ) {
WikEdWikifyHTMLwikEd.WikifyHTML(obj, false);
}
}
Line 9,325 ⟶ 11,969:
 
//
// wikEd.WikifyHTML:
// WikEdWikifyHTML:
// obj.html contains the text to be wikified
// expects < > &lt; &gt; &amp; spaces instead of &nbsp; <br> (not \n)
// returns <br> (not \n)
// wikiCode === true: allow extended set of attributes for existing wikicode, keep leading spaces
 
//
// allowed and converted tags:
// br|p
Line 9,342 ⟶ 11,987:
// bdo|q|kbd|samp|abbr|acronym|label
// other allowed tags:
// abbr|big|blockquote|colgroup|center|code|del|div|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby
// mediawiki tags (inline/block):
// nowiki|math|score|noinclude|includeonly|onlyinclude|ref|charinsert|fundraising|fundraisinglogo
// gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references
 
windowwikEd.WikEdWikifyHTMLWikifyHTML = function (obj, relaxedwikiCode) {
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
var regExpStr;
obj.html = obj.html.replace(/(<(syntaxhighlight|source|pre|nowiki)\b[^\/>]*>)((.|\n)*?)(<\/\2>)/gi,
var regExp;
function(p, p1, p2, p3, p4, p5) {
var regExpMatch;
p3 = p3.replace(/</g, '\x01');
p3 = p3.replace(/>/g, '\x02');
if (/^(syntaxhighlight|source|pre)$/i.test(p2) === true) {
p3 = p3.replace(/ |\xa0/g, '\x03');
}
return p1 + p3 + p5;
}
);
 
// delete tags: <style>
obj.html = obj.html.replace(/<(style)\b[^>]*>(.|\n)*?<\/\1>/gi, '');
 
// remove MediaWiki section edit spans
obj.html = obj.html.replace(/<span[^>]*class=\"editsection\"[^>]*>(.|\n)*?<\/span>\s*()/gi, '');
 
// remove MediaWiki heading spans
obj.html = obj.html.replace(/<span\b[^>]*\bclass=\"mw-headline\"[^>]*>((.|\n)*?)<\/span>\s*()/g, '$1');
 
// remove MediaWiki divs from article top
obj.html = obj.html.replace(/<h3\b[^>]*\bid=\"siteSub\"[^>]*>(.|\n)*?<\/h3>\s*()/g, '');
obj.html = obj.html.replace(/<div\b[^>]*\bid=\"contentSub\"[^>]*>(.|\n)*?<\/div>\s*()/g, '');
obj.html = obj.html.replace(/<div\b[^>]*\bid=\"jump-to-nav\"[^>]*>(.|\n)*?<\/div>\s*()/g, '');
 
// remove MediaWiki table of contents
obj.html = obj.html.replace(/<table\b[^>]*?\bid=\"toc\"[^>]*>(.|\n)*?<\/table>\s*()/g, '');
 
// remove MediaWiki print footer
obj.html = obj.html.replace(/<div\b[^>]*?\bclass=\"printfooter\"[^>]*>[^<>\"]+\"<a\b[^>]*>[^<]+<\/a>\"<\/div>\s*()/g, '');
 
// remove MediaWiki category list tags
while(var regExp = /<div\b[^>]*\bid=\"catlinks\"[^>]*>((.|\n)*?)<\/div>\s*()/g;
while(regExp.test(obj.html) === true) {
obj.html = obj.html.replace(regExp, '$1');
regExp.lastIndex = 0;
}
while(var regExp = /<p\b[^>]*?\bclass=\"catlinks\"[^>]*>((.|\n)*?)<a\b[^>]*>[^<>]+<\/a>: ((.|\n)*?)<\/p>/g;
while(regExp.test(obj.html) === true) {
obj.html = obj.html.replace(regExp, '$1$23');
regExp.lastIndex = 0;
}
 
// convert MS-Word non-standard lists: *
obj.html = obj.html.replace(/\s*<p \b[^>]*>\s*<!--\[if !supportLists\]-->(.|\n)*?<!--\[endif\]-->\s*((.|\n)*?)\s*<\/p>\s*()/g, '* $12\n');
 
// collect MS-Word footnote texts
var footnotes = {};
obj.html = obj.html.replace(/<div\b[^>]* id\bid="ftn(\d+)"[^>]*>\s*<p class="MsoFootnoteText">\s*<a(.|\n)*?<\/a>((.|\n)*?)<\/p>\s*<\/div>/g,
function(p, p1, p2, p3) {
footnotes[p1] = p3.replace(/^(\s|<br\b[^>]*>)|(\s|<br\b[^>]*>)$/g, '');
return( '');
}
);
 
// add footnotes as <ref> tags
obj.html = obj.html.replace(/<a\b[^>]* name\bname="_ftnref(\d+)"[^>]*>(.|\n)*?<!--\[endif\]-->\s*<\/span>\s*<\/span>\s*<\/a>/g,
function(p, p1) {
var ref = '&lt;ref name="footnote_' + p1 + '"&gt;' + footnotes[p1] + '&lt;/ref&gt;';
return( ref);
}
);
 
// remove MS-Word footnote separator
obj.html = obj.html.replace(/<!--\[if !supportFootnotes\]-->(\s|<br\b[^>]*>)*<hr\b[^>]*>\s*<!--\[endif\]-->(\s|<br\b[^>]*>)*()/g, '');
 
// correct name for MS-Word images
// 1 2 2 3 3 4 4 1 5 5
obj.html = obj.html.replace(/(<v:imagedata\b[^>]*? src\bsrc="[^">]*?[\\\/]clip_image\d+(\.\w+)"[^>]*? o:title="([^">]*)"[^>]*>(.|\sn)*?<img\b[^>]*? src="[^">]*?[\\\/])clip_image\d+\.\w+("[^>]*>)/g, '$1$3$2$5');
 
// convert <div class="poem">...</div> to <poem>...</poem>
obj.html = wikEd.RemoveTag(obj.html, 'div', /\bclass="poem"/, '<poem>', '</poem>');
var isPoem = [];
obj.html = obj.html.replace(/(<(\/?)div\b([^>]*)>)/gi,
function (p, p1, p2, p3) {
if (p2 == '') {
if (/\bclass=\"poem\"/.test(p3) == true) {
isPoem.push(true);
return('<poem>');
}
isPoem.push(false);
return(p1);
}
if (isPoem.pop() == true) {
return('<poem>');
}
return(p1);
}
);
 
// sanitize <span>br <div>style="clear: <pboth;"/>
obj.html = obj.html.replace(/<(span|div|pbr)\b *s+(.[^>]*?) \s*(\/?)>/gi,
function (p, p1, p2, p3) {
return( '<' + p1 + WikEdSanitizeAttributeswikEd.SanitizeAttributes(p1, p2, relaxedwikiCode) + p3 + '>');
}
);
 
// removesanitize <span> ...<div> </spanp> pairs withhout attributes<font>
obj.html = obj.html.replace(/<(span|div|p|font)\s+([^>]*?)\s*(\/?)>/gi,
var isRemove = [];
function(p, p1, p2, p3) {
obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/gi,
return '<' + p1 + wikEd.SanitizeAttributes(p1, p2, wikiCode) + p3 + '>';
function (p, p1, p2, p3) {
if (p2 == '') {
if (p3 == '') {
isRemove.push(true);
return('');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('');
}
return(p1);
}
);
 
// remove <pspan> ...and </pfont> pairs withhout attributes
obj.html = wikEd.RemoveTag(obj.html, 'span|font');
var isRemove = [];
 
obj.html = obj.html.replace(/(<(\/?)p\b([^>]*)>)/gi,
// remove <p> ... </p> pairs withhout attributes
function (p, p1, p2, p3) {
obj.html = wikEd.RemoveTag(obj.html, 'p', null, '\x00\x00', '\x00\x00');
if (p2 == '') {
if (p3 == '') {
isRemove.push(true);
return('\x00\x00');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('\x00\x00');
}
return(p1);
}
);
 
// escape character entities
obj.html = obj.html.replace(/&(?!(amp;|lt;|gt;))/g, '&amp;');
 
// remove comments
obj.html = obj.html.replace(/<!--(.|\n)*?-->/g, '');
 
// <hr> horizontal rule
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<hr\b[^>]*>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00----\x00\x00');
 
// <i> <em> <dfn> <var> <cite> italic
obj.html = obj.html.replace(/<(i|em|dfn|var|cite)\b.[^>]*?>/gi, '\'\'');
obj.html = obj.html.replace(/<\/(i|em|dfn|var|cite)\b.[^>]*?>/gi, '\'\'');
 
// <b> <strong> bold
obj.html = obj.html.replace(/<(b|strong)\b.[^>]*?>/gi, '\'\'\'');
obj.html = obj.html.replace(/<\/(b|strong)\b.[^>]*?>/gi, '\'\'\'');
 
// <h1> .. <h6> headings
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h1\b[^>]*>((.|\n)*?)<\/h1>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00= $4 =\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h2\b[^>]*>((.|\n)*?)<\/h2>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00== $4 ==\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h3\b[^>]*>((.|\n)*?)<\/h3>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00=== $4 ===\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h4\b[^>]*>((.|\n)*?)<\/h4>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00==== $4 ====\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h5\b[^>]*>((.|\n)*?)<\/h5>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00===== $4 =====\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h6\b[^>]*>((.|\n)*?)<\/h6>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00====== $4 ======\x00\x00');
 
obj.html = obj.html.replace(/<(h[0-6])\b[^>]*>((.|\n)*?)<\/\1>/gi, '$2');
 
// {{TABLE}}
// convert html tables to wikicode
if (wikEdTableMode == false) {
 
// remove <thead> <tbody> <tfoot>
obj.html = obj.html.replace(/(\s|\x00|<br\b[^>]*>)<\/?(thead|tbody|tfoot)\b[^>]*>(\s|\x00|<br\b[^>]*>)*()/gi, '$1');
 
// remove <col></col> and <colgroup></colgroup>\s
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(col)\b[^>]*>(.|\n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(colgroup)\b[^>]*>(.|\n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
 
// line breaks to <br /> in table cells, but not in html markup
obj.html = obj.html.replace(/(<(td|th|caption)\b[^>]*>)((.|\n)*?)(<\/\2>)/gi,
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/^(\s|<br\b[^>]*>|\x00>)+/gi, '');
p3 = p3.replace(/(\s|<br\b[^>]*>|\x00>)+$/gi, '');
p3 = p3.replace(/<br\b[^>]*> *()/gi, '&lt;br /&gt;');
return(p1 + p3 + p4);
}
);
 
// removepreserve table<br> closingin tags
obj.html p3 = obj.htmlp3.replace(/(\s|<br(\bw+)[^>]*>)((.|\x00n)*?)(<\/(tr|thead|tbody|tfoot)>(\s|<br\b[^2+>]*>|\x00)*()/gi, '');
function(p, p1, p2, p3, p4, p5) {
 
p3 = p3.replace(/<br\b[^>]*>\s*()/gi, '\x04');
// <td> table cells
return p1 + p3 + p5;
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<td>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(td) +([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = WikEdSanitizeAttributes(p2, p3, relaxed);
if (p3 == '') {
return('\x00| ');
}
else {);
p3 = p3.replace(/<br\b[^>]*>\s*()/gi, '&lt;br /&gt;');
return('\x00|' + p3 + ' | ');
p3 = p3.replace(/\x04/g, '<br>');
}
return p1 + p3 + p5;
}
);}
);
 
// <th>remove table cellsclosing tags
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<th\/(tr|thead|tbody|tfoot)>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
 
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(th) +([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
// <td> table cells
function (p, p1, p2, p3, p4) {
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<td>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
p3 = WikEdSanitizeAttributes(p2, p3, relaxed);
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(td)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
if (p3 == '') {
function(p, p1, p2, p3, p4) {
return('\x00| ');
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
}
elseif (p3 === '') {
return( '\x00|' + p3 + ' | ');
}
}
); else {
return '\x00|' + p3 + ' | ';
}
}
);
 
// <trth> table rowscells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<trth>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|-\x00! ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(trth) \s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
return('\x00|-'p3 += WikEdSanitizeAttributeswikEd.SanitizeAttributes(p2, p3, relaxed) + '\x00'wikiCode);
if (p3 === '') {
return '\x00! ';
}
); else {
return '\x00!' + p3 + ' | ';
 
// <caption> table caption
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<caption>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|+ ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(caption) +([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = WikEdSanitizeAttributes(p2, p3, relaxed);
if (p3 == '') {
return('\x00|+ ');
}
else {
return('\x00|+' + p3 + ' | ');
}
}
);}
);
 
// remove<tr> closingtable tagsrows
obj.html = obj.html.replace(/(\s*|<br\/(tdb[^>]*>|th|caption\x00)*<tr>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|-\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(tr)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function(p, p1, p2, p3, p4) {
return '\x00|-' + wikEd.SanitizeAttributes(p2, p3, wikiCode) + '\x00';
}
);
 
// line breaks, also in<caption> table cells (continued)caption
obj.html = obj.html.replace(/(\s|<br\b[^>]*>[|\n x00)*<caption>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|+ ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(caption)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
 
function(p, p1, p2, p3, p4) {
// <table>
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
obj.html = obj.html.replace(/[\s\x00]*<table>[\s\x00]*(\|-(?=[\n\x00]))?/gi, '\x00\x00{|\x00');
if (p3 === '') {
obj.html = obj.html.replace(/[\s\x00]*<(table) +([^>]*)>[\s\x00]*(\|-(?=[\n\x00]))?/gi,
return '\x00|+ ';
function (p, p1, p2) {
var table = '\x00\x00{|';
if (wikEdConfig['wikifyTableParameters'] != '') {
table += ' ' + wikEdConfig['wikifyTableParameters'];
}
else {
table += WikEdSanitizeAttributes(p1, p2);
}
return(table);
}
); else {
return '\x00|+' + p3 + ' | ';
obj.html = obj.html.replace(/[\s\x00]*<\/table>[\s\x00]*()/gi, '\x00|}\x00\x00');
}
}
);
 
// remove closing tags
}
obj.html = obj.html.replace(/\s*<\/(td|th|caption)>\s*()/gi, '');
 
// forline tablebreaks, modealso override pastedin table class //cells {{TABLE}}(continued)
obj.html = obj.html.replace(/<br\s*\/?>[\n ]*()/gi, '\x00');
else if (wikEdTableMode == true) {
 
obj.html = obj.html.replace(/(<table\b)([^>]*)(>)/gi,
// <table>
function (p, p1, p2, p3) {
obj.html = obj.html.replace(/[\s\x00]*<table>[\s\x00]*(\|-(?=[\n\x00]))?/gi, '\x00\x00{|\x00');
if (p2.match(/\bclass=/)) {
p2 obj.html = p2obj.html.replace(/\bclass[\s\x00]*=<(table)\s*+([\'\"^>]?*)[^<>[\'s\"\nx00]*(\|-(?=[\1n\x00]))?/ggi, 'class="wikEdTableEdit"');
function(p, p1, p2, p3) {
}
var table = '\x00\x00{|';
else {
if (wikEd.config.wikifyTableParameters !== '') {
p2 = ' class="wikEdTableEdit"';
table += ' ' + wikEd.config.wikifyTableParameters;
}
return(p1 + p2 + p3);
}
); else {
table += wikEd.SanitizeAttributes(p1, p2, wikiCode);
}
return table + '\x00';
}
);
obj.html = obj.html.replace(/[\s\x00]*<\/table>[\s\x00]*()/gi, '\x00|}\x00\x00');
 
// convert links
// table block element needs only one newline
obj.html = obj.html.replace(/<a(\s|<br\b[^>]*)>((.|\x00n)*(?)<table\b.*?/a>)/gi, '\x00\x00$2');
function(p, p1, p2) {
obj.html = obj.html.replace(/(<\/table>)(\s|<br\b[^>]*>|\x00)*()/gi, '$1\x00');
var linkParam = p1;
}
var linkText = p2;
 
// line breaks (continued)
if (wikEdTableMode == true) {
obj.html = obj.html.replace(/<br\b[^>]*>[\n ]*()/gi, '\x00');
}
 
// convert links
var regExpMatch = [];
var regExpStr = '(<a(\\b[^>]*)>(.*?)</a>)';
var regExp = new RegExp(regExpStr, 'gi');
obj.html = obj.html.replace(regExp,
function (p, p1, p2, p3) {
var linkParam = p2;
var linkText = p3;
var hrefUrlParam = null;
var hrefUrlArticle = null;
Line 9,640 ⟶ 12,235:
var linkTitle = '';
 
// get href value
var hrefValue;
regExpMatchvar regExpMatchLink = linkParam.match(/ href\bhref=\"([^\">]*)\"/);
if (regExpMatchregExpMatchLink !== null) {
hrefValue = regExpMatchregExpMatchLink[1];
 
// get absolute path from ./index.php and ../../index.php
hrefValue = WikEdRelativeToAbsolutePathwikEd.RelativeToAbsolutePath(hrefValue);
 
// check for wiki article link and get parameters
// 1 2 article 2 3article 3143articl314 anchor 4 6 7 8 urlpar 87539 anchor 9
regExpStrvar regExpArticle = wikEdServernew RegExp(wikEd.server + '(' + wikEdArticlePathwikEd.articlePath + '([^\\"\\?#]+)|' + wikEdScriptwikEd.script + '\\?([^\\"#]*))(#[^\\"]*)?');
var regExpMatchArticle = regExpArticle.exec(hrefValue);
regExp = new RegExp(regExpStr);
if (regExpMatchArticle !== null) {
regExpMatch = regExp.exec(hrefValue);
if (regExpMatch != null) {
 
// article name from url path <a href="../wiki/ hrefUrlArticle ">
hrefUrlArticle = regExpMatchArticle[2];
if (regExpMatch[2] != null) {
hrefUrlArticle = regExpMatch[2];
}
 
// article name from url parameters <a href="url? hrefUrlParam ">
hrefUrlParam = regExpMatchArticle[3];
else if (regExpMatch[3] != null) {
hrefUrlParam = regExpMatch[3];
}
 
// link anchor <a href="link #anchor">
linkArticleAnchor = regExpMatchArticle[4] || '';
if (regExpMatch[4] != null) {
if (linkArticleAnchor !== '') regExpMatch[4];{
linkArticleAnchor = linkArticleAnchor.replace(/\.([0-9A-F]{2})/g, '%$1');
linkArticleAnchor = decodeURIComponent(linkArticleAnchor);
Line 9,674 ⟶ 12,264:
}
 
// parse hrefUrlParam and check for special parameters
if (hrefUrlParam !== null) {
var regExpMatchHref;
regExp = new RegExp('(^|&amp;)(\\w+)=([^\\"\\&]+)', 'g');
whilevar ( (regExpMatchregExpHref = regExp.exec/(hrefUrlParam^|&amp;)(\w+) != null([^"\&]+) {/g;
while ( (regExpMatchHref = regExpHref.exec(hrefUrlParam)) !== null) {
var param = regExpMatch[2];
var valueparam = regExpMatchregExpMatchHref[32];
var value = regExpMatchHref[3];
switch (param) {
case 'title':
Line 9,695 ⟶ 12,286:
hrefParamSpecial = true;
}
if (hrefParamAction !== null) {
break;
}
Line 9,701 ⟶ 12,292:
}
 
// ISBN links
if (hrefParamAction === null) {
if ( (hrefParamISBN !== null) && (hrefParamSpecial !== true) ) {
var isbn = hrefParamISBN;
regExpMatchvar regExpMatchISBN = /((\d\-?){13}|(\d\-?){10})/.exec(linkText);
if (regExpMatchregExpMatchISBN !== null) {
isbn = regExpMatchregExpMatchISBN[1];
}
return( 'ISBN ' + isbn);
}
 
// get article from href parameters
else if ( (hrefParamTitle !== null) && (hrefParamSpecial !== true) ) {
linkArticle = hrefParamTitle;
linkArticle = linkArticle.replace(/_/g, ' ');
Line 9,719 ⟶ 12,310:
}
 
// get article name from url path
else if (hrefUrlArticle !== null) {
linkArticle = hrefUrlArticle;
linkArticle = linkArticle.replace(/_/g, ' ');
Line 9,726 ⟶ 12,317:
}
 
// get article name from <a title="">
else {
regExpMatchvar regExpMatchTitle = / title\btitle=\"([^\">]+)\"/.exec(linkParam);
if (regExpMatchregExpMatchTitle !== null) {
linkArticle = regExpMatchregExpMatchTitle[1];
}
}
Line 9,736 ⟶ 12,327:
}
 
// format wiki link
if (linkArticle !== '') {
 
// check for wiki image
regExpStrvar regExpMatchImage = '/^<img\\b[^>]*?\\bwidth=\\"(\\d+)\\"[^>]*?>$'/.exec(linkText);
if (regExpMatchImage !== null) {
regExp = new RegExp(regExpStr);
regExpMatch imgWidth = regExp.exec(linkText)regExpMatchImage[1];
if (regExpMatch != null) {
imgWidth = regExpMatch[1];
imgWidth = '|' + imgWidth + 'px';
if ( (linkTitle !== '') && (linkTitle != 'Enlarge') ) {
linkTitle = '|' + linkTitle;
return( '[[' + linkArticle + imgWidth + linkTitle + ']]');
}
else {
return( '[[' + linkArticle + imgWidth + ']]');
}
}
 
// category link
var regExpregExpCat = new RegExp('^(Category|' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ')\\s*:(.*)', 'i');
regExpMatchvar regExpMatchCat = regExpregExpCat.exec(linkArticle);
if (regExpMatchregExpMatchCat !== null) {
return( '[[' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ':' + regExpMatchregExpMatchCat[1].charAt(0).toUpperCase() + linkText.substr(1) + ']]');
}
 
// wiki link
if (linkArticle == linkText.charAt(0).toUpperCase() + linkText.substr(1)) {
return( '[[' + linkText + linkArticleAnchor + ']]');
}
 
// date link (English only)
regExpMatchvar regExpMatchDate = /^(January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2})$/.exec(linkArticle);
if (regExpMatchregExpMatchDate !== null) {
var month = regExpMatchregExpMatchDate[1];
var day = regExpMatchregExpMatchDate[2];
if (linkText == (day + ' ' + month) ) {
return( '[[' + linkArticle + linkArticleAnchor + ']]');
}
}
 
// lowercase the article name if the first char of the link text can exist in lower/uppercase and is lowercase
if ( linkText.charAt(0).toLowerCase() != linkText.charAt(0).toUpperCase() ) {
if ( linkText.charAt(0) == linkText.charAt(0).toLowerCase() ) {
Line 9,784 ⟶ 12,373:
}
 
// suffix links
regExpStrvar regExpStrSuffix = new RegExp('^' + linkArticle.replace(/(\W)/g, '\\$1') + '([\\wŠŒŽšœžŸÀ' + wikEd.letters + '_0-ÖØ-öø-\\u0220\\u0222-\\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\\u0400-\\u0481\\u048a-\\u04ce\\u04d0-\\u04f5\\u04f8\\u04f99]+)$');
var regExpMatchSuffix = regExpStrSuffix.exec(linkText);
regExp = new RegExp(regExpStr);
if (regExpMatchSuffix !== null) {
regExpMatch = regExp.exec(linkText);
return '[[' + linkArticle + linkArticleAnchor + ']]' + regExpMatchSuffix[1];
if (regExpMatch != null) {
return('[[' + linkArticle + linkArticleAnchor + ']]' + regExpMatch[1]);
}
return( '[[' + linkArticle + linkArticleAnchor + '|' + linkText + ']]');
}
 
// external link
if (hrefValue !== '') {
 
// PubMed link
regExpMatchvar regExpMatchPubMed = /^http(https?:)?\/\/www\.ncbi\.nlm\.nih\.gov\/entrez\/query\.fcgi\?cmd=Retrieve&amp;db=pubmed&amp;.*?&amp;list_uids=(\d+)/.exec(hrefValue);
if (regExpMatchregExpMatchPubMed !== null) {
return( 'PMID ' + regExpMatchregExpMatchPubMed[12]);
}
 
// DOI link
var regExpMatchDOI;
regExpMatch = /^http:\/\/dx\.doi\.org\/(.*)/.exec(hrefValue);
regExpMatchDOI = /^(https?:)?\/\/dx\.doi\.org\/(.*)/.exec(hrefValue);
if (regExpMatch != null) {
if (regExpMatchDOI !== null) {
return('{{doi|' + regExpMatch[1] + '}}');
return '{{doi|' + regExpMatchDOI[2] + '}}';
}
 
// other external link
return( '[' + hrefValue + ' ' + linkText + ']');
}
}
 
// return unchanged text
return( p1);
}
);
 
// clean up MediaWiki category list
var regExp = new RegExp('<span\\b[^>]*>(\\[\\[(Category|' + wikEdConfig['wikEd.config.text']['wikicode Category'] + ')\\s*:[^\\]]+\\]\\])<\\/span>[\\s\\x00\\|]*', 'gi');
obj.html = obj.html.replace(regExp, '$1\x00');
 
// clean up DOI
obj.html = obj.html.replace(/\[\[Digital object identifier\|DOI\]\]:(\{\{doi\|[^\}\s]+\}\})/gi, '$1');
 
// convert images
obj.html = obj.html.replace(/<img\b([^>]*)>/gi,
function (p, p1) {
 
// get and format parameters
var address = '';
var regExpMatch = /\bsrc\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1);
if (regExpMatch !== null) {
address = regExpMatch[2].replace(/^ \s+| \s+$/g, '');
}
 
var imgAlt = '';
regExpMatch = /\balt\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1);
if (regExpMatch !== null) {
imgAlt = regExpMatch[2].replace(/^ \s+| \s+$/g, '');
imgAlt = imgAlt.replace(/&amp;nbsp;|[\n\x00]/g, ' ');
imgAlt = imgAlt.replace(/ \s{2,}/g, ' ');
imgAlt = imgAlt.replace(/^ \s| \s$/g, '');
if (imgAlt !== '') {
imgAlt = '|' + imgAlt;
}
Line 9,850 ⟶ 12,439:
 
var imgWidth = '';
regExpMatch = /\bwidth\s*=\s*(\'|\")([^\'\"]*)(\'|\")/i.exec(p1);
if (regExpMatch !== null) {
imgWidth = '|' + regExpMatch[2].replace(/^ \s+| \s+$/g, '') + 'px';
}
 
var imgLink = '';
regExpMatch = /([^\/]+)$/.exec(address);
if (regExpMatch !== null) {
imgLink = regExpMatch[1];
if (imgLink !== '') {
return( '[[' + wikEdConfig['wikEd.config.text']['wikicode ImageFile'] + ':' + imgLink + imgWidth + imgAlt + ']]');
}
}
return( '');
}
);
 
// convert lists: * # : ;
var listObj = {};
listObj.prefix = '';
obj.html = obj.html.replace(/[\s\x00]*<(\/?(ol|ul|li|dl|dd|dt))\b[^>]*>[\s\x00]*()/gi,
function (p, p1, p2, p3, p4) {
switch (p1.toLowerCase()) {
case 'ol':
listObj.prefix += '#';
return( '\x00');
case 'ul':
listObj.prefix += '*';
return( '\x00');
case 'dl':
listObj.prefix += ':';
return( '\x00');
case '/ol':
case '/ul':
case '/dl':
listObj.prefix = listObj.prefix.substr(0, listObj.prefix.length - 1);
return( '\x00\x00');
case 'li':
case 'dd':
return( '\x00' + listObj.prefix + ' ');
case 'dt':
return( '\x00' + listObj.prefix.replace(/:$/, ';') + ' ');
case '/li':
case '/dt':
case '/dd':
return( '');
}
return( '');
}
);
obj.html = obj.html.replace(/[\n|\x00]+[#\*:\;]+ \s(?=[\n|\x00])/g, '');
 
// <> remove not allowed tags
obj.html = obj.html.replace(/(<\/?)(\/?)(\w+)(.[^>]*?>)/g,
function (p, p1, p2, p3, p4) {
 
if (wikEdTableMode == true) {
// keep html elements with name, id, or class starting with wikEdKeep
if ( /^(table|tr|td|th|thead|tbody|tfoot|col|colgroup|caption)$/i.test(p3) == true) {
if (wikEd.keepFormatting === true) {
var tag = p1 + p2 + p3 + p4;
if ( /^(div|span|ins|del)$/i.test(p3) === true) {
tag = tag.replace(/</g, '\x01');
if ( /\b(name|id|class)="wikEdKeep/.test(p4) === true) {
tag = tag.replace(/>/g, '\x02');
return p = p.replace(tag/</g, '\x01');
p = p.replace(/>/g, '\x02');
}
else return {p;
return('');}
}
}
 
else if ( /^(big|blockquote|colgroup|center|code|del|div|font|ins|p|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|noinclude|includeonly|ref|charinsert|fundraising|fundraisinglogo|gallery|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)$/i.test(p3) == true) {
// keep allowed tags
return(p1 + p2 + p3 + p4);
if ( /^(abbr|big|blockquote|colgroup|center|code|del|div|br|font|ins|p|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|score|noinclude|includeonly|onlyinclude|ref|charinsert|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references|syntaxhighlight|wbr)$/i.test(p3) === true) {
}
else return {p;
return('');
}
 
return '';
}
);
 
// sanitize attributes in opening html tags
obj.html = obj.html.replace(/<(\w+) \s+(.[^>]*?) \s*(\/?)>/ggi,
function (p, p1, p2, p3) {
if (p3 !== '') {
p3 = ' ' + p3;
}
return( '<' + p1 + WikEdSanitizeAttributeswikEd.SanitizeAttributes(p1, p2, relaxedwikiCode) + p3 + '>');
}
);
 
// unformat underlined, italic or bold blanks
// corrupts existing text
// obj.html = obj.html.replace(/<u>(\'\'\'|\'\'|\s|\x00)*([\s\x00]+)(\'\'\'|\'\'|\s|\x00)*<\/u>/g, '$2');
// obj.html = obj.html.replace(/\'\'\'(\'\'|\s|\x00)*([\s\x00]+)(\'\'|\s|\x00)*\'\'\'/g, '$2');
// obj.html = obj.html.replace(/\'\'([\s\x00]+)\'\'/g, '$1');
 
// fix MS Word non-style heading formatting
obj.html = obj.html.replace(/(\x00(={1,6}) \s*)(<u>|\'\'\'|\'\')+((.|\n)*?)(<\/u>|\'\'\'|\'\')+( *\2\x00)/gi, '$1$4$67');
 
// remove empty headings
obj.html = obj.html.replace(/\x00(={1,6})\s+\1\x00/g, '\x00');
 
// remove space-only lines
if (wikiCode !== true) {
obj.html = obj.html.replace(/([\s\x00]*\x00[\s\x00]*)/g,
obj.html = obj.html.replace(/([\s\x00]*\x00[\s\x00]*)/g,
function (p, p1) {
function(p, p1) {
return(p1.replace(/\n/g, '\x00'));
return p1.replace(/\n/g, '\x00');
}
}
);
);
}
 
// remove trailing linebreaks from table cells
obj.html = obj.html.replace(/\x00{2,}(\||!)/g, '\x00$1');
 
// remove leading and trailing spaces
if (wikiCode === true) {
obj.html = obj.html.replace(/\x00[ \n]+</g, '\x00<');
}
else {
obj.html = obj.html.replace(/\x00\s+</g, '\x00<');
}
obj.html = obj.html.replace(/>\s+\x00/g, '>\x00');
obj.html = obj.html.replace(/\x00\s+</g, '\x00<');
 
// remove empty inline and block tag pairs
obj.html = wikEd.RemoveEmptyTags(obj.html.replace(, /( *)<(abbr|big|colgroup|code|del|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|score|noinclude|includeonly|onlyinclude|ref|charinsert|fundraising|fundraisinglogo)\b[^>]*><\/\1> *()/gi, '$1');
obj.html = wikEd.RemoveEmptyTags(obj.html.replace(, /[\s\x00]*<(blockquote|center|div|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)\b[^>]*><\/\1>[\s\x00]*()/gi, '\x00\x00');
 
// remove empty lines from block tags
obj.html = obj.html.replace(/(<(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)\b[^>]*>[\s\x00])[\s\x00]+/gi, '$1');
obj.html = obj.html.replace(/[\s\x00]+([\s\x00]<\/(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)>)/gi, '$1');
 
// blockquote
obj.html = obj.html.replace(/(<blockquote\b[^>]*>[\s\x00]+)([\S\s]*?)([\s\x00]+<\/blockquote>)/gi,
function (p, p1, p2, p3) {
p2 = p2.replace(/\x00/g, '<br>\n');
return( p1 + p2 + p3);
}
);
 
// escape < >
obj.html = obj.html.replace(/</g, '&lt;');
obj.html = obj.html.replace(/>/g, '&gt;');
 
// preservednewlines tableto tags<br>
obj.html = obj.html.replace(/\x01/g, '<');
obj.html = obj.html.replace(/\x02/g, '>');
 
// newlines to <br>
obj.html = obj.html.replace(/\x00+\n/g, '\n');
obj.html = obj.html.replace(/\n\x00+/g, '\n');
Line 9,992 ⟶ 12,585:
obj.html = obj.html.replace(/\n/g, '<br>');
 
// preserved table and pre tags and spaces
// table block element needs only one newline
obj.html = obj.html.replace(/\x01/g, '<');
obj.html = obj.html.replace(/\x02/g, '>');
obj.html = obj.html.replace(/\x03/g, '\xa0');
 
// table block element needs only one newline
obj.html = obj.html.replace(/(<\/table><br\b[^>]*>)(<br\b[^>]*>)+/g, '$1');
 
// remove empty lines from article start and end
if (obj.from == 'whole') {
obj.html = obj.html.replace(/^(<br\b[^>]*>)+/gi, '');
obj.html = obj.html.replace(/(<br\b[^>]*>)+$/gi, '');
}
return;
};
 
 
//
// wikEd.RemoveEmptyTag: remove empty html tag pairs
//
 
wikEd.RemoveEmptyTags = function (html, tag, replace) {
 
var tagRegExp;
if (typeof tag == 'string') {
tagRegExp = new RegExp('<(' + tag + ')\\b[^>]*><\/\\1>', 'gi');
}
else {
tagRegExp = tag;
}
if (replace === undefined) {
replace = '';
}
 
while (tagRegExp.test(html) === true) {
html = html.replace(tagRegExp, replace);
tagRegExp.lastIndex = 0;
}
return html;
};
 
 
//
// wikEd.RemoveTag: recursively remove html tag pairs
//
 
wikEd.RemoveTag = function (html, tag, attribRegExp, replaceOpen, replaceClose) {
 
attribRegExp = attribRegExp || null;
replaceOpen = replaceOpen || '';
replaceClose = replaceClose || '';
 
var tagRegExp;
if (typeof tag == 'string') {
 
// 1 2 23 3 4 4 1
tagRegExp = new RegExp('(<(\\/?)(' + tag + ')\\b([^>]*)>)', 'g');
}
else {
tagRegExp = tag;
}
 
var isRemove = [];
html = html.replace(tagRegExp,
function(p, p1, p2, p3, p4) {
p2 = p2 || '';
p4 = p4 || '';
if (p2 === '') {
if (
( (attribRegExp === null) && (p4 === '') ) ||
( (attribRegExp !== null) && (attribRegExp.test(p4) === true) )
) {
isRemove.push(true);
return replaceOpen;
}
isRemove.push(false);
return p1;
}
if (isRemove.pop() === true) {
return replaceClose;
}
return p1;
}
);
return html;
};
 
 
//
// wikEd.RemoveEmbracingTags: recursively remove embracing html tag pairs
//
 
wikEd.RemoveEmbracingTags = function (obj) {
 
// quick test for no embracing tags
if (/^[^<]|[^>]$/.test(obj.html)) {
return;
}
 
// dump fragments to code list
// use stack to identify tag pairs
// use pointer list to link pairs
var stack = [];
var code = [];
var pointer = [];
 
// 1 12 3 34 4 25 5
var regExp = /([^<]*)(<(\/?)(\w+)\b[^>]*>)([^<]*)/g;
var regExpMatch;
while ( (regExpMatch = regExp.exec(obj.html)) !== null) {
var pre = regExpMatch[1];
var tag = regExpMatch[2];
var close = regExpMatch[3];
var name = regExpMatch[4];
var post = regExpMatch[5];
 
// pre
if (pre !== '') {
code.push(pre);
}
 
// ignore <tag />
if (/\/>$/.test(tag) === false) {
 
// opening tag
if (close != '/') {
stack.push([code.length, name]);
}
 
// closing tag
else {
var pop = stack.pop();
var openName = '';
 
// skip empty (void) opening elements on stack
while (pop !== undefined) {
openName = pop[1];
if (name == openName) {
break;
}
else if (/^(area|br|col|embed|hr|img|input|p|param|source|wbr)$/i.test(openName) === true) {
pop = stack.pop();
}
}
if (name == openName) {
var pos = pop[0];
pointer[code.length] = pos;
pointer[pos] = code.length;
}
}
}
code.push(tag);
 
// post
if (post !== '') {
code.push(post);
}
}
 
// check for embracing pairs and remove them
var j = code.length;
for (var i = 0; i < j; i ++) {
j --;
if (pointer[i] === undefined) {
break;
}
if (pointer[i] != j) {
break;
}
code[i] = '';
code[j] = '';
}
 
// join fragments
obj.html = code.join('');
 
return;
Line 10,006 ⟶ 12,766:
 
//
// wikEd.RelativeToAbsolutePath
// WikEdRelativeToAbsolutePath
//
// broken for editing article names containing "/", https://bugzilla.mozilla.org/show_bug.cgi?id=430910
 
windowwikEd.WikEdRelativeToAbsolutePathRelativeToAbsolutePath = function (relativePath, fullPath) {
 
var absolutePath = '';
 
// get current url
if (fullPath === nullundefined) {
fullPath = window.___location.href;
fullPath = fullPath.replace(/#.*()/, '');
Line 10,020 ⟶ 12,780:
}
 
// ./index.php
if (/^\.\/()/.test(relativePath) === true) {
relativePath = relativePath.replace(/^\.\/()/, '');
fullPath = fullPath.replace(/\/[^\/]*$/, '');
Line 10,027 ⟶ 12,787:
}
 
// ../../index.php
else if (/^\.\.\/()/.test(relativePath) === true) {
whilevar regExp = (/^\.\.\/()/.test(relativePath) == true) {;
while (regExp.test(relativePath) === true) {
relativePath = relativePath.replace(/^\.\.\/()/, '');
fullPath = fullPath.replace(/\/[^\/]*$/, '');
Line 10,036 ⟶ 12,797:
}
 
// full path
else {
absolutePath = relativePath;
}
return( absolutePath);
};
 
 
//
// WikEdSanitizeAttributeswikEd.SanitizeAttributes: see Sanitizer.php
// wikiCode === true: allow extended set of attributes for existing wikicode
//
 
wikEd.SanitizeAttributes = function (tag, attributes, wikiCode, errors) {
 
window.WikEdSanitizeAttributes attributes = function(tag, attributes, relaxed)|| {'';
var common;
var tablealign;
var tablecell;
var table;
if (relaxedwikiCode === true) {
common = '|dir|style|class'; // not needed: |lang|id|title|';
tablealign = '|align|char|charoff|valign|';
table = '|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor|';
tablecell = '|abbr|axis|headers|scope|rowspan|colspan|nowrap|width|height|bgcolor|';
}
else {
common = '|dir|';
table = '|border|cellspacing|cellpadding|align|bgcolor|';
tablealign = '|align|valign|';
tablecell = '|rowspan|colspan|nowrap|bgcolor|';
}
tag = tag.toLowerCase();
var sanitized = '';
var regExpMatch;
 
while ( (regExpMatch = /(\w+)\s*=\s*((\'|\")(.*?)\3|(\w+))/g.exec(attributes)) != null) {
// 1 12 34 45 5 6 632
var attrib = regExpMatch[1];
var regExp = /\s*(\w+)(\s*=\s*(('|")(.*?)\4|(\w+)))?\s*/g;
var attribValue = regExpMatch[4] || regExpMatch[5];
var junk = attributes.replace(regExp, '\x00');
if (attribValue == '') {
junk = junk.replace(/^\x00+|\x00\x00+|\x00+$/g, '');
continue;
junk = junk.replace(/\x00/g, '/');
var error = '';
if (junk !== '') {
error += 'Not supported text in attribute. (' + junk + ')';
}
 
// error handling
if (error !== '') {
if (errors !== undefined) {
var attribClean = attributes;
attribClean = attribClean.replace(/ +/g, ' ');
attribClean = attribClean.replace(/^ | $/g, '');
if (attribClean !== '') {
attribClean = ' ' + attribClean;
}
errors.push(error + '(<' + tag + attribClean + '>)');
}
}
 
while ( (regExpMatch = regExp.exec(attributes)) !== null) {
var error = '';
var attrib = regExpMatch[1].toLowerCase();
var attribValue = regExpMatch[5] || regExpMatch[6] || '';
var valid = false;
var tagCheck = '|' + tag + '|';
var attribCheck = '|' + attrib + '|';
 
// empty or missing attributes as parameters for wiki markup
var flag = false;
 
// include non-html wiki markup and extended set of attributes for existing wikicode
// relaxed, for existing text tags
if (relaxedwikiCode === true) {
if ('|center|em|strong|cite|code|var|sub|supdlsup|dl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby|wbr|'.indexOf(tagtagCheck) >= 0) {
if ((common).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|div|span|h1|h2|h3|h4|h5|h6|p|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|align|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|blockquote|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|cite|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|br|'.indexOf(tagtagCheck) >= 0) {
if ('|style|clear|'.indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|pre|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|width|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|ins|del|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|cite|datetime|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('ul'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|ol|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|start|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|li|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|value|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|table|'.indexOf(tagtagCheck) >= 0) {
if ((common + table).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|caption|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|align|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|thead|tfoot|tbody|'.indexOf(tagtagCheck) >= 0) {
if ((common + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|colgroup|col|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|span|width|' + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|tr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|bgcolor|' + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|td|th|'.indexOf(tagtagCheck) >= 0) {
if ((common + tablecell + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|font|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|size|color|face|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('hr|abbr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|noshade|size|width').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('rt|hr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|rbspannoshade|size|width|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('ref|rt|'.indexOf(tagtagCheck) >= 0) {
if ((common + 'name|rbspan|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('references|dfn|'.indexOf(tagtagCheck) >= 0) {
if (('|name|id|').indexOf(attribCheck) >= 0) { valid = true; }
}
 
else if ('source'.indexOf(tag) >= 0) {
// wiki markup
if (('lang').indexOf(attrib) >= 0) { valid = true; }
else if ('|ref|'.indexOf(tagCheck) >= 0) {
if (('|name|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('poem|references|'.indexOf(tagtagCheck) >= 0) {
if (common.indexOf(attrib) >= 0) { valid = true; }
}
else if ('categorytree|syntaxhighlight|source|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|modelang|depthenclose|onlyroothighlight|hiderootline|hideprefixstart|showcount|namespaces').indexOf(attribattribCheck) >= 0) { valid = true; }
valid = true;
if ( ('|line|'.indexOf(attribCheck) >= 0) && (attribValue === '') ) {
flag = true;
}
}
}
else if ('charinsert|poem|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|compact|').indexOf(attribCheck) >= 0) {
}
valid = true;
else if ('fundraising'.indexOf(tag) >= 0) {
if ( ('|compact|'.indexOf(attribCheck) >= 0) && (attribValue === '') ) {
}
flag = true;
else if ('fundraisinglogo'.indexOf(tag) >= 0) {
}
}
}
else if ('hiero|categorytree|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('imagemap|gallery|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|perrow|widths|heights|caption|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('|nowiki|noinclude|includeonly|onlyinclude|inputbox|timeline|imagemap|hiero|charinsert|'.indexOf(tagtagCheck) >= 0) {
}
else if ('timeline|math|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|alt|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('gallery|score|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|perrowlang|widthsmidi|override_midi|override_ogg|raw vorbis|heights').indexOf(attribattribCheck) >= 0) { valid = true; }
}
}
 
// strict, for html code to be wikified from external sources (websites, Word)
else {
if ('|center|em|strong|cite|code|var|sub|supdlsup|dl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby|blockquote|pre|ins|del|wbr|'.indexOf(tagtagCheck) >= 0) {
if ((common).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|div|span|h1|h2|h3|h4|h5|h6|p|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|align|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|br|'.indexOf(tagtagCheck) >= 0) {
if ('|clear|'.indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|ul|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|ol|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|start|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|li|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|type|value|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|table|'.indexOf(tagtagCheck) >= 0) {
if ((common + table).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|caption|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|align|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|thead|tfoot|tbody|'.indexOf(tagtagCheck) >= 0) {
if ((common + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|colgroup|col|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|span|' + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|tr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|bgcolor' + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|td|th|'.indexOf(tagtagCheck) >= 0) {
if ((common + tablecell + tablealign).indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|font|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|color|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('hr|abbr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|noshadetitle|size').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('rt|hr|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|rbspannoshade|size|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('ref|rt|'.indexOf(tagtagCheck) >= 0) {
if ((common + 'name|rbspan|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('references|dfn|'.indexOf(tagtagCheck) >= 0) {
if (('|name|id|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('source'.indexOf(tag) >= 0) {
if (('lang').indexOf(attrib) >= 0) { valid = true; }
}
else if ('poem'.indexOf(tag) >= 0) {
if (common.indexOf(attrib) >= 0) { valid = true; }
}
else if ('categorytree'.indexOf(tag) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces').indexOf(attrib) >= 0) { valid = true; }
}
else if ('charinsert'.indexOf(tag) >= 0) {
}
else if ('fundraising'.indexOf(tag) >= 0) {
}
else if ('fundraisinglogo'.indexOf(tag) >= 0) {
}
else if ('hiero'.indexOf(tag) >= 0) {
}
else if ('imagemap'.indexOf(tag) >= 0) {
}
else if ('inputbox'.indexOf(tag) >= 0) {
}
else if ('timeline'.indexOf(tag) >= 0) {
}
else if ('gallery'.indexOf(tag) >= 0) {
}
}
 
// ignore empty attributes
// clean up
if (valid (flag !== true) && (attribValue === '') ) {
error += 'Empty attribute. ';
}
 
// ignore not supported attributes
// clean up defaults for align
if (attribvalid === 'align'false) {
error += 'Not supported attribute ' + attrib + '. ';
if ('tr|td|th'.indexOf(tag) >= 0) {
}
if (attribValue == 'left') {
 
attribValue = '';
// error handling
}
if (error !== '') {
if (errors !== undefined) {
var attribClean = attributes;
attribClean = attribClean.replace(/ +/g, ' ');
attribClean = attribClean.replace(/^ | $/g, '');
if (attribClean !== '') {
attribClean = ' ' + attribClean;
}
errors.push(error + '(<' + tag + attribClean + '>)');
}
continue;
}
 
// clean up defaults for valignalign
else if (attrib == 'valignalign') {
if ('|tr|td|th|'.indexOf(tagtagCheck) >= 0) {
if (attribValue == 'topleft') {
attribValue = '';
}
}
}
}
 
// clean up styledefaults for valign
else if (attrib == 'stylevalign') {
if ('|tr|td|th|'.indexOf(tagCheck) >= 0) {
if (attribValue == 'top') {
attribValue = '';
}
}
}
 
// clean up style
// remove non-standard Mozilla styles
else if (attrib == 'style') {
attribValue = attribValue.replace(/(^| )(-moz-[\w\-]+): [\w\-]+; *()/g, '$1');
attribValue = attribValue.replace(/(^| )([\w\-]+): [^;]*(-moz-[\w\-]+|windowtext)[^;]*; *()/g, '$1');
 
// remove dimensionsnon-standard fromMozilla null valuesstyles
attribValue = attribValue.replace(/\b0(%^|in|cm|mm|em|ex|pt|pc|px\s)(-moz-[\bw\-]+):\s[\w\-]+;\s*()/g, '0$1');
attribValue = attribValue.replace(/(^|\s)([\w\-]+):\s[^;]*(-moz-[\w\-]+|windowtext)[^;]*;\s*()/g, '$1');
 
// remove emptydimensions definitionsfrom andnull spacesvalues
attribValue = attribValue.replace(/[\w\-]+ *\: *\; *b0(%|in|cm|mm|em|ex|pt|pc|px)\b/g, '0');
attribValue = attribValue.replace(/ *(;|:) *()/g, '$1 ');
attribValue = attribValue.replace(/( |;)+$/g, ';');
}
 
// remove empty definitions and spaces
// clean up class
attribValue = attribValue.replace(/[\w\-]+\s*\:\s*; *()/g, '');
else if (attrib == 'class') {
attribValue = attribValue.replace(/\s*(;|:)\s*()/g, '$1 ');
attribValue = attribValue.replace(/(\s|;)+$/g, ';');
}
 
// clean up class
// remove MS Word classes
else if (attrib == 'class') {
attribValue = attribValue.replace(/^Ms.*$/g, '');
}
 
if// (attribValueremove !=MS '')Word {classes
sanitizedattribValue += ' ' + attrib + '="' + attribValue +.replace(/^Ms.*$/g, '"');
}
 
// add attribute
if (flag === true) {
sanitized += ' ' + attrib;
}
else if (attribValue !== '') {
sanitized += ' ' + attrib + '="' + attribValue + '"';
}
}
return( sanitized);
};
 
 
//
// WikEdRemoveHighlightingwikEd.RemoveHighlighting: remove syntax highlighting in obj.html; sets obj.htmlCode if text contains html code
// expects <br> instead of \n
 
windowwikEd.WikEdRemoveHighlightingRemoveHighlighting = function (obj) {
 
// preserve tags, spaces and newlines in pre tag markup
// remove highlighting error messages
obj.html = obj.html.replace(/(&lt;(syntaxhighlight|source|pre)\b[^\/]*?&gt;)((.|\n)*?)(&lt;\/\2&gt;)/gi,
if (wikEdConfig['highlightError'] == true) {
function(p, p1, p2, p3, p4, p5) {
obj.html = obj.html.replace(/<span\b[^>]*?\bclass=\"wikEdConfig['highlightError']\"[^>]*>.*?<\/span><!--wikEdConfig['highlightError']-->/g, '');
p3 = p3.replace(/ /g, '\xa0');
}
p3 = p3.replace(/\n/g, '\x00');
 
return p1 + p3 + p5;
// remove highlighting and atttribute-free span tags
var isRemove = [];
obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g,
function (p, p1, p2, p3) {
if (p2 == '') {
if (/\bclass=\"wikEd[\w\/]+\"/.test(p3) == true) {
isRemove.push(true);
return('');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('');
}
return(p1);
}
);
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
// remove highlighting div tags
obj.plain = obj.plain.replace(/(&lt;(syntaxhighlight|source|pre|nowiki)\b[^\/]*?&gt;)((.|\n)*?)(&lt;\/\2&gt;)/gi,
var isRemove = [];
function(p, p1, p2, p3, p4, p5) {
obj.html = obj.html.replace(/(<(\/?)div\b([^>]*)>)/g,
p3 = p3.replace(/([\[\]{}=*#:;|&])/g, '\x00$1\x00');
function (p, p1, p2, p3) {
if (/^(syntaxhighlight|source|pre)$/i.test(p2) === ''true) {
p3 = p3.replace(/ /g, '\x01');
if (/\bclass=\"wikEd[\w\/]+\"/.test(p3) == true) {
isRemovep3 = p3.pushreplace(true/\n/g, '\x02');
return('');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('');
}
return( p1) + p3 + p5;
}
);
 
// remove highlighting error messages
// remove span tags from WebKit https://bugs.webkit.org/show_bug.cgi?id=13490
if (wikEd.config.highlightError === true) {
// filtering these tags does not help, they accumulate anyway
obj.html = obj.html.replace(/<span\b[^>]*?\bclass="wikEdHighlightError"[^>]*>(.|\n)*?<\/span><!--wikEdHighlightError-->/g, '');
var isRemove = [];
}
obj.html = obj.html.replace(/(<(\/?)span\b([^>]*)>)/g,
function (p, p1, p2, p3) {
if (p2 == '') {
if (/\bclass=\"(Apple-style-span|Apple-.*?)\"/.test(p3) == true) {
isRemove.push(true);
return('\x00');
}
isRemove.push(false);
return(p1);
}
if (isRemove.pop() == true) {
return('\x01');
}
return(p1);
}
);
 
// remove tablemode highlighting font tags from WebKitcode
obj.html = wikEd.RemoveTableModeHighlighting(obj.html);
var isRemove = [];
 
obj.html = obj.html.replace(/(<(\/?)font\b([^>]*)>)/g,
// remove highlighting and atttribute-free span tags
function (p, p1, p2, p3) {
obj.html = wikEd.RemoveTag(obj.html, 'span', /\bclass="wikEd[\w\/]+"/);
if (p2 == '') {
 
if (/\bclass=\"(Apple-style-span|Apple-.*?)\"/.test(p3) == true) {
// remove highlighting div tags
isRemove.push(true);
obj.html = wikEd.RemoveTag(obj.html, 'div', /\bclass="wikEd[\w\/]+"/, '\x00', '\x00');
return('\x00');
 
}
// comments
isRemove.push(false);
obj.html = obj.html.replace(/<!--wikEd[\w\/]+-->/g, '');
return(p1);
 
}
// remove span and font tags from WebKit https://bugs.webkit.org/show_bug.cgi?id=13490
if (isRemove.pop() == true) {
// filtering these tags does not help, they accumulate anyway
return('\x01');
obj.html = wikEd.RemoveTag(obj.html, 'span|font', /\bclass="(Apple-style-span|Apple-.*?)"/, '\x00', '\x00');
}
return(p1);
}
);
 
// remove highlighting div tags from WebKit
var isRemove = [];
 
// 12 2 3 3 4 4 5 515 1
obj.html = obj.html.replace(/(([\x00\x01]\s*)?<(\/?)div\b([^>]*)>(\s*[\x00\x01])?)/g,
function (p, p1, p2, p3, p4, p5) {
if (p3 === '') {
if ( (p2 !== '') || (p5 !== '') ) {
if (/\bstyle=\"/.test(p4) === true) {
if (/\bclass=\"/.test(p4) === false) {
isRemove.push(true);
return( '');
}
}
}
isRemove.push(false);
return( p1);
}
if (isRemove.pop() === true) {
return( '');
}
return( p1);
}
);
obj.html = obj.html.replace(/[\x00\x01]/g, '');
 
// preserve spaces and newlines in pre tag
// comments
obj.html = obj.html.replace(/(<!--wikEdpre\b[^>]*>)((.|\wn)*?)(<\/]+--pre>)/g, '');
function(p, p1, p2, p3, p4) {
p2 = p2.replace(/ /g, '\xa0');
p2 = p2.replace(/\n/g, '\x00');
 
return p1 + p2 + p4;
// newlines
}
);
 
// newlines
obj.html = obj.html.replace(/[\n ]+/g, ' ');
obj.html = obj.html.replace(/\x00/g, '\n');
 
// non-breaking spaces
obj.html = obj.html.replace(/&nbsp;/g, '\xa0');
 
// check for pasted html content
if (obj.html.match(/<(?!br\b)/.test(obj.html) !=== nulltrue) {
obj.htmlCode = true;
}
Line 10,427 ⟶ 13,197:
obj.htmlCode = false;
}
 
return;
};
Line 10,433 ⟶ 13,202:
 
//
// WikEdHighlightSyntaxInitwikEd.HighlightSyntaxInit: initialize regExp for syntax highlighting and regExp-to-number array, called during start up
//
 
windowwikEd.WikEdHighlightSyntaxInitHighlightSyntaxInit = function () {
 
wikEdParseObjwikEd.parseObj.matchToTag = [''];
wikEdParseObjwikEd.parseObj.regExpTags = null;
 
// main regular expression search definitions
// [regular expression fragment, tag, tagClass, tagStart (regexp starts with newline)]
var tagArray = [
['\\b(((https\\bhttps?:|ftp\\bftp:|irc\\birc:|gopher)\\bgopher:|)\\/\\/)|news\\bnews:|mailto\\bmailto:)[^\\x00-\\x20\\s\\\"\\[\\]\\x7f]+', 'inlineURL', 'block'], // inline link
 
// not beneficial in current browsers
// ['[^\\{\\}\\[\\]\x00\x01_\\|\\!\\=\\*\\#\\:\\;\\\"\\\'\\n\\\\~\\-]+', 'text', 'ignore'], // chew-up fragment to ignore plain text, triples regExp speed, check later if chewed into start of inlineLink; start-with-text tags (PMID,...) have to be tested for separately to benefit from his
// ['[^{}\\[\\]\x00\x01_|!=*#:;"\'\\n\\~\\-]+', 'text', 'ignore'], // chew-up fragment to ignore plain text, triples regExp speed in ancient browsers only, check later if chewed into start of inlineLink; start-with-text tags (PMID,...) have to be tested for separately to benefit from his
 
['\x00(nowiki)\\b[^\x00\x01]*\x01(.|\\n)*?\x00\\/nowiki\\s*\x01', 'nowiki', 'block'], // <nowiki>...</nowiki>
['\x00(pre)\\b[^\x00\x01]*\x01(.|\\n)*?\x00\\/pre\\s*\x01', 'pre', 'block'], // <pre>...</pre>
['\x00(math)\\b[^\x00\x01]*\x01(.|\\n)*?\x00\\/math\\s*\x01', 'math', 'block'], // <math>...</math>
['\x00(score)\\b[^\x00\x01]*\x01(.|\\n)*?\x00/score\\s*\x01', 'score', 'block'], // <score>...</score>
 
['(^|\\n)([ \xa0]+)(\\S[^\\n]*)', 'preform', 'block'], // "preformatted" text line (leading space)
['(^|\\n)([\\*\\#\\:\\;]+)([^\\n]*)', 'list', 'list', 'block'], // list line
 
['\x00(br|wbr)\\b)[^\x00\x01]*\x01', 'brvoid', 'block'], // <br>, <wbr>
['\x00(\\w+)[^\x00\x01]*?\\/\x01', 'htmlEmpty', 'block'], // <html />
 
Line 10,465 ⟶ 13,236:
['(^|\\n)(\\|\\})', 'table', 'close'], // table end
 
['(^|\\n)(\\|\\+)', 'captiontableCaption', 'blockopen'], // table caption
['(^|\\n)(\\|\\-)', 'row', 'blockopen'], // table row
 
['(^|\\n)(\\|)', 'newlinePipe', 'block'], // table cell, wikilink separator, file parameter separator, empty template parameter
['\\|\\|', 'doublePipe', 'block'], // table cell separator, empty file parameter separator, empty template parameters
['\\|', 'pipe', 'block'], // table cell parameterattribute separator, table caption parameter separator, wikilink separator, file parameter separator, redirect separator, template parameter parameter
 
['(^|\\n)(!+)', 'header', 'blockopen'], // table header cell
['!!', 'headerSep', 'blockopen'], // table header cell separator
['!', 'headerParam', 'block'], // table header cell parameter separator
 
['\\{{2,}', 'paramTempl', 'open'], // template or parameter start
Line 10,481 ⟶ 13,251:
['(^\\s*)#REDIRECT(?=\\s*\\[\\[)', 'redirect', 'block'], // redirect
 
['\\[\\[(?=(Image|File|Media|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfigwikEd.config.text['textwikicode File'] + '|' + wikEd.config.text['wikicode FileMedia'] + ')\\s*:\\s*)', 'file', 'open'], // file link start /// add translation
['\\[\\[', 'link', 'open'], // wikilink, category start with interlink detection
['\\]\\]', 'doubleCloseBracket', 'close'], // wikilink, category, file link, redirect end
 
['\\[((((https?:|ftp:|irc:|gopher):|)\\/\\/)|news:|mailto:)[^\\x00-\\x20\\s\\\"\\[\\]\\x7f]+)(\\s*)', 'external', 'open'], // external link start; up?? [[url]] detected as ext link!
['\\]', 'external', 'close'], // external link end
 
Line 10,493 ⟶ 13,263:
['\\\'{2,}', 'boldItalic', 'multi'], // bold, italic
 
['__(' + wikEdMagicWordswikEd.magicWords + ')__', 'magic', 'block'], // magic words
['~{3,5}', 'signature', 'block'], // signature
['(^|\\n)\\-{4,}', 'hr', 'block'], // hr
Line 10,500 ⟶ 13,270:
];
 
// parse tag array into regular expression string and parenthesized substring match-to-tag info array
var regExpStrings = [];
for (var i = 0; i < tagArray.length; i ++) {
Line 10,507 ⟶ 13,277:
var tagClass = tagArray[i][2];
 
// add parenthesized sub regExp to regexp array
regExpStrings.push('(' + regExpSub + ')');
 
// detect if a fragment starts with (^|\\n) to handle the leading newlines
var tagStart = false;
if (/^\(\^\|\\n\)/.test(regExpSub) === true) {
tagStart = true;
}
 
// save tag information for matched parenthesis
wikEdParseObjwikEd.parseObj.matchToTag.push( [tag, tagClass, tagStart] );
 
// add empty entry for all sub parentheses, ignore (? and \(
var pos = 0;
while ( (pos = regExpSub.indexOf('(', pos) + 1) > 0) {
if (regExpSub.charAt(pos) != '?') {
if (regExpSub.charAt(pos - 2) != '\\') {
wikEdParseObjwikEd.parseObj.matchToTag.push( [] );
}
}
Line 10,530 ⟶ 13,300:
}
 
// create regExp from or-joined parenthesized sub regExps
wikEdParseObjwikEd.parseObj.regExpTags = new RegExp(regExpStrings.join('|'), 'gi');
 
return;
Line 10,538 ⟶ 13,308:
 
//
// WikEdHighlightSyntaxwikEd.HighlightSyntax: highlight syntax in obj.html;
// existing highlighting must have been removed using WikEdRemoveHighlightingwikEd.RemoveHighlighting
// expects < > &lt; &gt; &amp; \xa0 instead of &nbsp; \n instead of <br>
// Knownknown bugs:
// - templates inside elements
// - fragment highlighting misses surrounding html
//
 
// this is a real wikicode parser that works as follows:
// cycle through the text with a complex regexp search for wikicode and highlighting fragments
// build an array -based tree structure of text elements
// tag info: text pos, text length, tag type (open, close, block, error)
// connectivity info: parent, firstChild, nextSibling, paired opening/closing (all array indexes)
Line 10,553 ⟶ 13,323:
//
/* TO DO:
<table> closes <td>, <tr>
<tr> closes <td>
heading closes links
valid table markup: \n :{|
preformatted lines: space-only lines inside and as last allowed
*/
 
wikEd.HighlightSyntax = function (obj, noTimeOut, keepComments, noBlocks) {
 
// start timer to cancel after wikEd.config.maxHighlightTime ms
window.WikEdHighlightSyntax = function(obj, noTimeOut) {
 
// start timer to cancel after wikEdConfig['maxHighlightTime'] ms
var highlightStartDate = new Date();
 
// linkify raw watchlist
// &lt; &gt; &amp; to \x00 \x01
if (wikEd.editWatchlist === true) {
obj.html = obj.html.replace(/(.*)/gm,
function(p, p1) {
var ns = '';
var article = p1;
var regExp = /^(.*?:)(.*)$/;
var regExpMatch = regExp.exec(article);
if (regExpMatch !== null) {
ns = regExpMatch[1];
article = regExpMatch[2];
}
var html = '<span class="wikEdWatchlistLink" ' + wikEd.HighlightLinkify(ns, article) + '>' + p + '</span>';
return html;
}
);
return;
}
 
// &lt; &gt; &amp; to \x00 \x01 &
obj.html = obj.html.replace(/&lt;/g, '\x00');
obj.html = obj.html.replace(/&gt;/g, '\x01');
obj.html = obj.html.replace(/&amp;/g, '&');
 
// trailing, leading, and multi spaces to nbsp
obj.html = obj.html.replace(/^ | $/gm, '\xa0');
obj.html = obj.html.replace(/(\n|\xa0 | ) /g, '$1\xa0');
 
// define parse object
var parseObj = {
 
// tree object that holds nodes to be sorted and joined for final text:
// { 'tag': , 'parent': , 'firstChild': , 'nextSibling': , 'start': , 'tagLength': , 'type': , 'pairedTagPospaired': , 'pairedPos': , 'left': , 'right': , 'index': , 'attrib': , 'noHidenewline': }
'tree': [],
 
// main regular expression for syntactic elements
'regExp': null,
 
// last match
'regExpMatch': null,
 
// highlight whole text or fragment
'whole': false,
 
// ignore leading closing tags for fragment highlighting
'addedOpenTag': false,
 
// quick references
'lastOpenTag': null,
'lastOpenNode': 0,
 
// filtered ignore p tags
'lastOpenNodeFiltered': null,
'lastOpenTagFiltered': null,
 
'secondlastOpenNodeFiltered': null,
'secondLastOpenTagFilteredsecondlastOpenTagFiltered': null,
 
'tableMode': wikEdTableMode
};
 
// add root node
parseObj.tree[0] = { 'type': 'root' };
 
// clear array of link addresses and preview image ids
if (obj.whole === true) {
parseObj.whole = true;
wikEdLinkifyArraywikEd.wikiLinks = [];
wikEdReferenceArraywikEd.referenceArray = [];
wikEdTemplateArraywikEd.templateArray = [];
wikEdCharEntityArraywikEd.charEntityArray = [];
wikEd.HighlightNamedHideButtonsStylesheet = new wikEd.StyleSheet(wikEd.frameDocument);
WikEdHighlightNamedHideButtonsStylesheet = new WikEdStyleSheet(wikEdFrameDocument);
wikEdFilePreviewNowikEd.filePreviewNo = 0;
wikEdFilePreviewIdswikEd.filePreviewIds = [];
}
 
// removetake out comments and html formatting to be kept
var content = '';
var from = 0;
var commentsLength = 0;
var regExpMatch;
var regExpComments = /(\x00!--)(.|\n)*?(--\x01)|(<[^>]*>)/g;
while ( (regExpMatch = regExpComments.exec(obj.html)) !== null) {
var tag;
parseObj.tree.push( { 'tag': 'comment', 'start': regExpMatch.index - commentsLength, 'tagLength': 0, 'type': 'comment', 'left': regExpMatch[0] } );
var p1 = regExpMatch[1] || '';
var p2 = regExpMatch[2] || '';
if (p1 !== '') {
tag = 'comment';
}
else if (p2 !== '') {
tag = 'keep';
}
parseObj.tree.push( { 'tag': tag, 'start': regExpMatch.index - commentsLength, 'tagLength': 0, 'type': tag, 'left': regExpMatch[0] } );
content += obj.html.substring(from, regExpMatch.index);
commentsLength += regExpMatch[0].length;
Line 10,637 ⟶ 13,432:
obj.html = content;
}
//// opening block tags and templates break link?
 
//// opening block tags and templates break link?
// show main parsing regExp:
// WED('regExp', wikEdParseObj.regExpTags.toString().replace(/\x00/g, '<').replace(/\x01/g, '>').replace(/\n/g, '\\n'));
 
// show main parsing regExp:
// cycle through text and find tags with a regexp search
// WED('regExp', wikEd.parseObj.regExpTags.toString().replace(/\x00/g, '<').replace(/\x01/g, '>').replace(/\n/g, '\\n'));
wikEdParseObj.regExpTags.lastIndex = 0;
while ( (parseObj.regExpMatch = wikEdParseObj.regExpTags.exec(obj.html)) != null) {
 
// cycle through text and find tags with a regexp search
// cancel highlighting after wikEdConfig['maxHighlightTime'] ms
wikEd.parseObj.regExpTags.lastIndex = 0;
if (noTimeOut != true) {
while ( (parseObj.regExpMatch = wikEd.parseObj.regExpTags.exec(obj.html)) !== null) {
 
// cancel highlighting after wikEd.config.maxHighlightTime ms
if (noTimeOut !== true) {
var currentDate = new Date();
if ( (currentDate - highlightStartDate) > wikEdConfig['wikEd.config.maxHighlightTime']) {
break;
}
}
 
var tagMatch = parseObj.regExpMatch[0];
var tagFrom = parseObj.regExpMatch.index;
var tagLength = tagMatch.length;
var tagTo = tagFrom + tagLength;
var tagProperties = [];
 
var tagMatchParenth = 0;
 
// get regexp index number from first defined parenthesized submatch
var tag = '';
var tagClass = '';
var tagStart = '';
for (var i = 1; i < wikEdParseObjwikEd.parseObj.matchToTag.length; i ++) {
if (typeof( parseObj.regExpMatch[i]) != 'undefined') {
 
// get tag information
tag = wikEdParseObjwikEd.parseObj.matchToTag[i][0];
tagClass = wikEdParseObjwikEd.parseObj.matchToTag[i][1];
tagStart = wikEdParseObjwikEd.parseObj.matchToTag[i][2];
tagMatchParenth = i;
break;
Line 10,677 ⟶ 13,473:
}
 
// handle chew-up regExp matches that massively speed up regexp search
if (tagClass == 'ignore') {
 
// move regExp pointer back if chew-up regExp fragment has eaten into the start of an inline link
if (obj.html.charAt(wikEdParseObjwikEd.parseObj.regExpTags.lastIndex) == ':') {
var regExpMatch = /(https?|ftp|irc|gopher)$/.exec(tagMatch);
if (regExpMatch !== null) {
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = wikEdParseObjwikEd.parseObj.regExpTags.lastIndex - regExpMatch[0].length;
}
}
Line 10,690 ⟶ 13,486:
}
 
// detect and remove newline from leading (^|\n) in sub-regexp: table, pipeTemplateEnd, tableCaption, row, newlinePipe, header
var leadingNewline = false;
if (tagStart === true) {
if (parseObj.regExpMatch[tagMatchParenth + 1] == '\n') {
tagFrom ++;
tagLength --;
leadingNewline = true;
tagProperties.push(['newline', true]);
}
}
 
// newlines close or end certain tags
if (leadingNewline === true) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('newline', 'close', tagFrom, 0, parseObj);
}
var openNode = parseObj.tree[parseObj.lastOpenNodeFiltered];
 
// get attrib text
// no wikicode in link target or template or parameter name, only after pipe in linkPiped, or parameterPiped
if ( (tagClass == 'open') && ( (tag == 'table') || (tag == 'row') ) ) {
var attribEnd = obj.html.indexOf('\n', tagTo);
if (attribEnd == -1) {
attribEnd = null;
}
var attribText = obj.html.substring(tagTo, attribEnd);
if (attribText !== '') {
attribText = attribText.replace(/^ +| +$/g, '');
tagProperties.push(['attrib', attribText]);
}
}
 
// no wikicode in link target, template, or parameter name
if ( (parseObj.lastOpenTag == 'link') || (parseObj.lastOpenTag == 'template') || (parseObj.lastOpenTag == 'parameter') ) {
 
if ( (openNode !== undefined) && (openNode.firstChild === null) ) {
var openNode = parseObj.tree[parseObj.lastOpenNodeFiltered];
if ( (openNode != null) && (openNode.firstChild == null) ) {
 
// allow templates and template parameters, template and link separators, and newline
if (
( (tagClass == 'open') && (tag != 'templateparamTempl') ) ||
( (tagClass == 'block') && (tag != 'newlinePipe') && (tag != 'doublePipe') && (tag != 'pipe') && (tag != 'headerSep') && (tag != 'headerParam') && (tag != 'newline') && (tag != 'preform') ) //// preform ok?
) {
 
// convert opening tag to error and continue
var errorText;
if (parseObj.lastOpenTag == 'link') {
errorText = wikEdConfig['wikEd.config.text']['.wikEdErrorCodeInLinkName'];
}
else if (parseObj.lastOpenTag == 'template') {
errorText = wikEdConfig['wikEd.config.text']['.wikEdErrorCodeInTemplName'];
}
else if (parseObj.lastOpenTag == 'parameter') {
errorText = wikEdConfig['wikEd.config.text']['.wikEdErrorCodeInParamName'];
}
WikEdHighlightMarkLastOpenNodewikEd.HighlightMarkLastOpenNode(errorText, parseObj);
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
}
}
}
 
// handle current tag by dispatching infos to stack manager that builds a hierarchical tree
switch (tag) {
 
// non-ambiguous tags
case 'nowiki':
case 'pre':
case 'math':
case 'brscore':
case 'tablevoid':
case 'file':
case 'heading':
Line 10,748 ⟶ 13,559:
case 'signature':
case 'hr':
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
break;
 
// bold and italic
case 'boldItalic':
switch (tagLength) {
Line 10,757 ⟶ 13,568:
switch(parseObj.lastOpenTagFiltered) {
case 'italic':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom, tagLength, parseObj);
break;
case 'boldItalic':
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.lastOpenNodeFiltered, 'italic', 3, 2, parseObj);
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.secondlastOpenNodeFiltered, 'bold', 0, 3, parseObj);
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom, tagLength, parseObj);
break;
default:
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'open', tagFrom, tagLength, parseObj);
}
break;
Line 10,772 ⟶ 13,583:
switch(parseObj.lastOpenTagFiltered) {
case 'bold':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom, tagLength, parseObj);
break;
case 'boldItalic':
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.lastOpenNodeFiltered, 'bold', 2, 3, parseObj);
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.secondlastOpenNodeFiltered, 'italic', 0, 2, parseObj);
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom, tagLength, parseObj);
break;
default:
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'open', tagFrom, tagLength, parseObj);
}
break;
Line 10,787 ⟶ 13,598:
switch(parseObj.lastOpenTagFiltered) {
case 'bold':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'italic') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom, 3, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom + 3, 2, parseObj);
}
else {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom, 3, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'open', tagFrom + 3, 2, parseObj);
}
break;
case 'italic':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'bold') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom + 2, 3, parseObj);
}
else {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'open', tagFrom + 2, 3, parseObj);
}
break;
case 'boldItalic':
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.secondlastOpenNodeFiltered, 'bold', 0, 3, parseObj);
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.lastOpenNodeFiltered, 'italic', 3, 2, parseObj);
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
parseObj.lastOpenTag == 'italic';
WikEdHighlightBuildTreewikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('bold', 'close', tagFrom + 2, 3, parseObj);
break;
default:
WikEdHighlightBuildTreewikEd.HighlightBuildTree('boldItalic', 'open', tagFrom, tagLength, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('boldItalic', 'open', tagFrom, tagLength, parseObj);
}
break;
default:
parseObj.tree.push( { 'start': tagFrom, 'tagLength': tagLength, 'type': 'error', 'left': wikEdConfig['wikEd.config.text']['.wikEdErrorBoldItalic'] } );
break;
}
break;
 
// templParam: template or template parameter
case 'paramTempl':
 
// template or parameter
var paramTemplTag = tag;
if (tagLength == 2) {
Line 10,837 ⟶ 13,648:
}
 
// open paramTempl
if (tagClass == 'open') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
 
// add spare elements for later disambiguation
if (paramTemplTag == 'paramTempl') {
for (var pos = 2; pos < tagLength - 1; pos = pos + 2) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
}
}
}
 
// close paramTempl
else {
 
// no opening tag, delegate error handling
if ( (parseObj.lastOpenNode === 0) || (parseObj.lastOpenNode === null) ) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
break;
}
varif (openNode === undefined) parseObj.tree[parseObj.lastOpenNodeFiltered];{
wikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
if (openNode == null) {
WikEdHighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
break;
}
 
// close template or parameter, open and close defined
if (
( (paramTemplTag == 'template') && (parseObj.lastOpenTagFiltered == 'template') ) ||
Line 10,869 ⟶ 13,679:
( (paramTemplTag == 'parameter') && (parseObj.lastOpenTagFiltered == 'parameterPiped') )
) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
}
 
// closing defines ambiguous opening
else if (
( (paramTemplTag == 'template') || (paramTemplTag == 'parameter') ) &&
Line 10,879 ⟶ 13,689:
) {
 
// redefine ambiguous opening
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(parseObj.lastOpenNodeFiltered, paramTemplTag, openNode.tagLength - tagLength, tagLength, parseObj);
 
// adjust all ambiguous parents
var redefinedTag;
var redefinedLength;
var nodeNo = openNode.parent;
while ( (nodeNo !== 0) && (nodeNo !== null) && (nodeNo !== undefined) ) {
var node = parseObj.tree[nodeNo];
if (node.tag != 'paramTempl') {
Line 10,897 ⟶ 13,707:
}
 
// ignore spare paramTempl opening tags like p tags
if (redefinedLength === 0) {
redefinedTag = 'spare';
}
 
// mark remaining single { as error
else if (redefinedLength == 1) {
parseObj.tree.push( {
Line 10,908 ⟶ 13,718:
'tagLength': node.tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplParam']
} );
redefinedTag = 'spare';
}
 
// this is a template
else if (redefinedLength == 2) {
node.tag = 'template';
}
 
// this is a parameter
else if (redefinedLength == 3) {
node.tag = 'parameter';
}
 
// redefine parent
WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine(nodeNo, redefinedTag, null, redefinedLength, parseObj);
 
// all further opening paramTempl tags are spare
if (redefinedLength <= 3) {
redefinedTag = 'spare';
redefinedLength = 0;
}
 
// up one level
nodeNo = node.parent;
}
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
 
// and close innermost tag
WikEdHighlightBuildTreewikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
}
 
// opening defines ambiguous closing
else if ( (
(openNode.tag == 'template') ||
Line 10,947 ⟶ 13,757:
(openNode.tag == 'parameterPiped') ) && (tagLength >= openNode.tagLength)
) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(openNode.tag, tagClass, tagFrom, openNode.tagLength, parseObj);
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = wikEdParseObjwikEd.parseObj.regExpTags.lastIndex - tagLength + openNode.tagLength;
}
 
// both ambiguous
else if (
(paramTemplTag == 'paramTempl') &&
(openNode.tag == 'paramTempl') &&
( (openNode.tagLength > 3) && (tagLength > 3) )
) {
parseObj.tree.push( {
'start': openNode.start,
'tagLength': openNode.tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplParamAmbig']
} );
parseObj.tree.push( {
Line 10,967 ⟶ 13,777:
'tagLength': tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplParamAmbig']
} );
}
 
// opening and closing do not match
else {
parseObj.tree.push( {
Line 10,977 ⟶ 13,787:
'tagLength': openNode.tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplParam']
} );
parseObj.tree.push( {
Line 10,983 ⟶ 13,793:
'tagLength': tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplParam']
} );
}
Line 10,989 ⟶ 13,799:
break;
 
// wikilink
// table single elements
case 'header':
case 'headerSep':
case 'headerParam':
case 'row':
case 'caption':
if (parseObj.lastOpenTagFiltered == 'table') {
WikEdHighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
}
break;
 
// wikilink
case 'link':
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, 2, parseObj);
break;
 
// inline link block and external link
case 'inlineURL':
case 'external':
 
// trailing punctuation not part of inline links
if (tag == 'inlineURL') {
var regExpMatch;
if (/\(/.test(tagMatch) === true) {
regExpMatch = /^(.*?)([\.\,\:\;\\\!\?\)]+)$/.exec(tagMatch);
}
else {
regExpMatch = /^(.*?)([\.\,\:\;\\\!\?]+)$/.exec(tagMatch);
}
if (regExpMatch !== null) {
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = tagFrom + regExpMatch[1].length;
tagMatch = regExpMatch[1];
tagLength = tagMatch.length;
Line 11,026 ⟶ 13,825:
}
 
// urls in templates or tables are interrupted by tag strings
if (tag == 'inlineURL') {
var node = parseObj.tree[parseObj.lastOpenNode];
while ( (node !== undefined) && (node !== null) ) {
 
// urls in templates are interrupted by }} and |
if ( (node.tag == 'template') || (node.tag == 'paramTempl') || (node.tag == 'parameter') || (node.tag == 'parameterPiped') ) {
var regExpMatch;
if ( (regExpMatch = /^(.*?)(\}\}|\|)(.*?)$/.exec(tagMatch)) !== null) {
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = tagFrom + tagMatchregExpMatch[1].length;
tagMatch = regExpMatch[1];
tagLength = tagMatch.length;
Line 11,043 ⟶ 13,842:
}
 
// urls in tables are interrupted by ||
else if (node.tag == 'table') {
var regExpMatch;
if ( (regExpMatch = /^(.*?)(\}\}|\|)(.*?)$/.exec(tagMatch)) !== null) {
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = tagFrom + tagMatchregExpMatch[1].length;
tagMatch = regExpMatch[1];
tagLength = tagMatch.length;
Line 11,058 ⟶ 13,857:
}
 
// dissect external [url text
if (tag == 'external') {
if (tagClass == 'open') {
var url = parseObj.regExpMatch[tagMatchParenth + 1];
var spaces = parseObj.regExpMatch[tagMatchParenth + 5];
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, 1, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('externalURL', 'block', tagFrom + 1, url.length, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('externalText', tagClass, tagFrom + 1 + url.length + spaces.length, 0, parseObj);
}
 
// close ], ignore false positive non-tags that have no opening [
else {
var node = parseObj.tree[parseObj.lastOpenNode];
while ( (node !== null) && (node !== undefined) ) {
if (node.tag == tag) {
break;
Line 11,077 ⟶ 13,876:
node = parseObj.tree[node.parent];
}
if ( (node !== null) && (node !== undefined) ) {
if (node.parent !== null) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('externalText', tagClass, tagFrom, 0, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
}
}
Line 11,087 ⟶ 13,886:
}
 
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
break;
 
// <html>
case 'html':
var htmlTag = parseObj.regExpMatch[tagMatchParenth + 1].toLowerCase();
if (/^(ref|references|sub|sup|u|s|p|wbr)$/i.test(htmlTag) === true) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
else if (/^(table|tr|td|th|col|thead|tfoot|tbody|colgroup|caption|abbr|big|blockquote|center|code|del|div|font|ins|small|span|strike|tt|rb|rp|rt|ruby|nowiki|math|score|noinclude|includeonly|onlyinclude|gallery|categorytree|charinsert|hiero|imagemap|inputbox|poem|source|syntaxhighlight|source|timeline)$/.test(htmlTag) === true) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
else {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('htmlUnknown', 'block', tagFrom, tagLength, parseObj);
}
break;
 
// <html />
case 'htmlEmpty':
var htmlTag = parseObj.regExpMatch[tagMatchParenth + 1].toLowerCase();
if (/^(references|ref|br|p|wbr)$/i.test(htmlTag) === true) {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
else {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
}
break;
 
// |}}: table end or empty template parameter + template end
case 'pipeTemplateEnd':
ifswitch (parseObj.lastOpenTagFiltered == 'table') {
case 'table':
WikEdHighlightBuildTree('table', 'close', tagFrom, 2, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'tableAttrib':
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', openNode.start + openNode.tagLength, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'row':
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom, 2, parseObj);
break;
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('table', 'close', tagFrom, 2, parseObj, tagProperties);
break;
case 'template':
wikEd.HighlightBuildTree('templateParam', 'block', tagFrom, 1, parseObj);
wikEd.HighlightBuildTree('template', 'close', tagFrom + 1, 2, parseObj);
break;
}
break;
 
// {|, |}: table
case 'table':
if (tagClass == 'open') {
switch (parseObj.lastOpenTagFiltered) {
case 'tableAttrib':
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', openNode.start + openNode.tagLength, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'row':
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'header':
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cell':
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
}
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj, tagProperties);
wikEd.HighlightBuildTree('tableAttrib', 'open', tagTo, 0, parseObj);
}
 
// close close
else {
switch (parseObj.lastOpenTagFiltered) {
WikEdHighlightBuildTree('templateParam', 'block', tagFrom, 1, parseObj);
case 'tableAttrib':
WikEdHighlightBuildTree('template', 'close', tagFrom + 1, 2, parseObj);
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', openNode.start + openNode.tagLength, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'row':
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
}
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj, tagProperties);
}
break;
 
// ]]: wikilink, file link, redirect
case 'doubleCloseBracket':
if (parseObj.lastOpenTagFiltered == 'file') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree(parseObj.lastOpenTagFiltered, tagClass, tagFrom, tagLength, parseObj);
}
else {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('link', tagClass, tagFrom, tagLength, parseObj);
}
break;
 
// \n|: table cell, wikilink separator, file parameter separator, redirect separator, empty template parameter
case 'newlinePipe':
switch (parseObj.lastOpenTagFiltered) {
case 'table':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('cellrow', tagClass'open', tagFrom, tagLength0, parseObj);
break;
case 'tableAttrib':
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'row':
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
break;
case 'link':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('linkParam', tagClass, tagFrom, tagLength, parseObj);
break;
case 'file':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('fileParam', tagClass, tagFrom, tagLength, parseObj);
break;
case 'template':
case 'paramTempl':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParam', tagClass, tagFrom, tagLength, parseObj);
break;
}
switch (parseObj.lastOpenTagFiltered) {
case 'table':
case 'tableAttrib':
case 'tableCaption':
case 'captionAttrib':
case 'row':
case 'rowAttrib':
case 'header':
case 'headerAttrib':
case 'cell':
case 'cellAttrib':
wikEd.HighlightBuildTree('cell', 'open', tagFrom, tagLength, parseObj, tagProperties);
wikEd.HighlightBuildTree('cellAttrib', 'open', tagTo, 0, parseObj);
}
break;
 
// \n!: header
// ||: table cell separator, empty file parameter separator, empty template parameters
case 'doublePipeheader':
switch (parseObj.lastOpenTagFiltered) {
case 'table':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('cellSeprow', tagClass'open', tagFrom, tagLength0, parseObj);
break;
case 'tableAttrib':
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', openNode.start + openNode.tagLength, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, parseObj);
break;
case 'row':
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
break;
}
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj, tagProperties);
wikEd.HighlightBuildTree('headerAttrib', 'open', tagTo, 0, parseObj);
break;
 
// ||: table cell separator, empty file parameter separator, empty template parameters
case 'doublePipe':
switch (parseObj.lastOpenTagFiltered) {
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('headerAttrib', 'open', tagTo, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('headerAttrib', 'open', tagTo, 0, parseObj);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('cellAttrib', 'open', tagTo, 0, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('cellAttrib', 'open', tagTo, 0, parseObj);
break;
case 'link':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('linkParam', tagClass, tagFrom, 1, parseObj);
break;
case 'file':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('fileParam', tagClass, tagFrom, 1, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('fileParam', tagClass, tagFrom + 1, 1, parseObj);
break;
case 'template':
case 'paramTempl':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParam', tagClass, tagFrom, 1, parseObj);
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParam', tagClass, tagFrom + 1, 1, parseObj);
break;
}
break;
 
// !!: table header separator
// pipe |: table cell parameter separator, table caption parameter separator, wikilink separator, file parameter separator, template parameter, parameter default
case 'pipeheaderSep':
switch (parseObj.lastOpenTagFiltered) {
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('headerAttrib', 'open', tagTo, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom, 0, parseObj);
wikEd.HighlightBuildTree('header', 'open', tagFrom, tagLength, parseObj);
wikEd.HighlightBuildTree('headerAttrib', 'open', tagTo, 0, parseObj);
break;
}
break;
 
// |-, |+: table caption, table row
case 'tableCaption':
case 'row':
switch (parseObj.lastOpenTagFiltered) {
case 'table':
break;
WikEdHighlightBuildTree('cellParam', tagClass, tagFrom, tagLength, parseObj);
case 'tableAttrib':
wikEd.HighlightBuildTree('tableAttrib', 'close', tagFrom - 1, 0, parseObj);
break;
case 'tableCaption':
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', openNode.start + openNode.tagLength, 0, parseObj);
wikEd.HighlightBuildTree('tableCaption', 'close', tagFrom - 1, 0, parseObj);
break;
case 'row':
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'rowAttrib':
wikEd.HighlightBuildTree('rowAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'header':
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('header', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cell':
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('cell', 'close', tagFrom - 1, 0, parseObj);
wikEd.HighlightBuildTree('row', 'close', tagFrom - 1, 0, parseObj);
break;
}
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj, tagProperties);
if (tag == 'row') {
wikEd.HighlightBuildTree('rowAttrib', 'open', tagTo, 0, parseObj);
}
else if (tag == 'tableCaption') {
wikEd.HighlightBuildTree('captionAttrib', 'open', tagTo, 0, parseObj);
}
break;
 
// pipe |: table tableCaption, cell, or header attribute separator, wikilink separator, file parameter separator, template parameter, parameter default
case 'pipe':
switch (parseObj.lastOpenTagFiltered) {
case 'captionAttrib':
case 'headerAttrib':
case 'cellAttrib':
 
// save attrib text to open tag: tableCaption, header, cell
if (openNode !== undefined) {
var attribText = obj.html.substring(openNode.start + openNode.tagLength, tagFrom);
var attribEnd = attribText.indexOf('\n');
if (attribEnd == -1) {
attribEnd = tagFrom;
}
else {
attribText = attribText.substr(0, attribEnd);
attribEnd = openNode.start + openNode.tagLength + attribEnd - 1;
}
if (attribText !== '') {
attribText = attribText.replace(/^ +| +$/g, '');
}
parseObj.tree[openNode.parent].attrib = attribText;
switch (parseObj.lastOpenTagFiltered) {
case 'captionAttrib':
wikEd.HighlightBuildTree('captionAttrib', 'close', attribEnd, tagLength, parseObj);
break;
case 'headerAttrib':
wikEd.HighlightBuildTree('headerAttrib', 'close', attribEnd, tagLength, parseObj);
break;
case 'cellAttrib':
wikEd.HighlightBuildTree('cellAttrib', 'close', attribEnd, tagLength, parseObj);
break;
}
}
break;
case 'link':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('linkParam', tagClass, tagFrom, tagLength, parseObj);
break;
case 'file':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('fileParam', tagClass, tagFrom, tagLength, parseObj);
break;
case 'template':
case 'paramTempl':/ //// check later for parameterPiped
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParam', tagClass, tagFrom, tagLength, parseObj);
break;
case 'parameter':
WikEdHighlightBuildTreewikEd.HighlightBuildTree('parameterDefault', tagClass, tagFrom, tagLength, parseObj);
break;
}
break;
 
// list and preformatted (leading space) lines
case 'preform':
 
// ignore template parameters preceeded with newline-spaces
if (parseObj.lastOpenTagFiltered == 'template') {
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = tagFrom + tagLengthtagTo - parseObj.regExpMatch[tagMatchParenth + 3].length;
break;
}
// run through, no break
 
case 'list':
 
// highlight line
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
 
// highlight tag
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag + 'Tag', tagClass, tagFrom, parseObj.regExpMatch[tagMatchParenth + 2].length, parseObj);
 
// move text pointer after tag
wikEdParseObjwikEd.parseObj.regExpTags.lastIndex = tagFrom + tagLengthtagTo - parseObj.regExpMatch[tagMatchParenth + 3].length;
break;
 
// newline, old
case 'newline':
WikEdHighlightBuildTreewikEd.HighlightBuildTree(tag, 'close', tagFrom, 0, parseObj);
break;
 
// unrecognized tag
default:
parseObj.tree.push( { 'start': tagFrom, 'tagLength': tagLength, 'type': 'error', 'left': wikEdConfig['wikEd.config.text']['.wikEdErrorNoHandler'] } );
}
 
// quit after reaching $ 'newline'
if (tagMatch === '') {
break;
}
}
 
// do not tolerate trailing opening tags for whole text highlighting
if (parseObj.whole === true) {
 
// mark remaining unmatched opening tags
while ( (parseObj.lastOpenNode !== 0) && (parseObj.lastOpenNode !== null) ) {
WikEdHighlightMarkLastOpenNodewikEd.HighlightMarkLastOpenNode(wikEdConfig['wikEd.config.text']['.wikEdErrorNoClose'], parseObj);
}
}
 
// show parsing tree before additional block highlighting:
// WED('parseObj.tree', parseObj.tree);
 
// additional block highlighting (autolinking, colors, spaces, dashed, control chars, charents)
// wiki autolinking (case sensitive, newlines are actually allowed!)
if (noBlocks !== true) {
var regExpMatch;
var regExpAutoLink = /((PMID)[ \xa0\t]+(\d+))|((RFC)[ \xa0\t]+(\d+))|((RFC)[ \xa0\t]+(\d+))|((ISBN)[ \xa0\t]+((97(8|9)( |-)?)?(\d( |-)?){9}(\d|x)))/g;
while ( (regExpMatch = regExpAutoLink.exec(obj.html) ) != null) {
WikEdHighlightBuildTree(regExpMatch[2] || regExpMatch[5] || regExpMatch[8] || regExpMatch[11], 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
 
// wiki autolinking (case sensitive, newlines are actually allowed!)
// named html colors in quotation marks
var regExpMatch;
var regExpColorLight = /(\'|\")(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|blanchedalmond|burlywood|chartreuse|coral|cornsilk|cyan|darkgray|darkgrey|darkkhaki|darkorange|darksalmon|darkseagreen|floralwhite|fuchsia|gainsboro|ghostwhite|gold|goldenrod|greenyellow|honeydew|hotpink|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightskyblue|lightsteelblue|lightyellow|lime|linen|magenta|mediumaquamarine|mediumspringgreen|mediumturquoise|mintcream|mistyrose|moccasin|navajowhite|oldlace|orange|palegoldenrod|palegreen|paleturquoise|papayawhip|peachpuff|peru|pink|plum|powderblue|salmon|sandybrown|seashell|silver|skyblue|snow|springgreen|tan|thistle|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)(\1)/gi;
var regExpAutoLink = /((PMID)[ \xa0\t]+(\d+))|((RFC)[ \xa0\t]+(\d+))|((RFC)[ \xa0\t]+(\d+))|((ISBN)[ \xa0\t]+((97(8|9)( |-)?)?(\d( |-)?){9}(\d|x)))/g;
while ( (regExpMatch = regExpColorLight.exec(obj.html) ) != null) {
while ( (regExpMatch = regExpAutoLink.exec(obj.html) ) !== null) {
WikEdHighlightBuildTree('colorLight', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
wikEd.HighlightBuildTree(regExpMatch[2] || regExpMatch[5] || regExpMatch[8] || regExpMatch[11], 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
}
var regExpColorDark = /(\'|\")(black|blue|blueviolet|brown|cadetblue|chocolate|cornflowerblue|crimson|darkblue|darkcyan|darkgoldenrod|darkgreen|darkmagenta|darkolivegreen|darkorchid|darkred|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|forestgreen|gray|green|grey|indianred|indigo|lightseagreen|lightslategray|lightslategrey|limegreen|maroon|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumvioletred|midnightblue|navy|olive|olivedrab|orangered|orchid|palevioletred|purple|red|rosybrown|royalblue|saddlebrown|seagreen|sienna|slateblue|slategray|slategrey|steelblue|teal|tomato)(\1)/g;
while ( (regExpMatch = regExpColorDark.exec(obj.html) ) != null) {
WikEdHighlightBuildTree('colorDark', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
 
// named html colors in quotation marks
// RGB hex colors #ddc, exclude links and character entities starting with &
var regExpColorLight = /('|")(aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|blanchedalmond|burlywood|chartreuse|coral|cornsilk|cyan|darkgray|darkgrey|darkkhaki|darkorange|darksalmon|darkseagreen|floralwhite|fuchsia|gainsboro|ghostwhite|gold|goldenrod|greenyellow|honeydew|hotpink|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightskyblue|lightsteelblue|lightyellow|lime|linen|magenta|mediumaquamarine|mediumspringgreen|mediumturquoise|mintcream|mistyrose|moccasin|navajowhite|oldlace|orange|palegoldenrod|palegreen|paleturquoise|papayawhip|peachpuff|peru|pink|plum|powderblue|salmon|sandybrown|seashell|silver|skyblue|snow|springgreen|tan|thistle|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen)(\1)/gi;
var regExpColor3 = /(^|[^\/\w&])(#[0-9a-f]{3})(?=([^\d\w]|$))/gi;
while ( (regExpMatch = regExpColor3regExpColorLight.exec(obj.html) ) !== null) {
WikEdHighlightBuildTree wikEd.HighlightBuildTree('colorHex3colorLight', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
var regExpColorDark = /('|")(black|blue|blueviolet|brown|cadetblue|chocolate|cornflowerblue|crimson|darkblue|darkcyan|darkgoldenrod|darkgreen|darkmagenta|darkolivegreen|darkorchid|darkred|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|forestgreen|gray|green|grey|indianred|indigo|lightseagreen|lightslategray|lightslategrey|limegreen|maroon|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumvioletred|midnightblue|navy|olive|olivedrab|orangered|orchid|palevioletred|purple|red|rosybrown|royalblue|saddlebrown|seagreen|sienna|slateblue|slategray|slategrey|steelblue|teal|tomato)(\1)/g;
while ( (regExpMatch = regExpColorDark.exec(obj.html) ) !== null) {
wikEd.HighlightBuildTree('colorDark', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
 
// RGB hex colors #d4d0ccddc, exclude links and character entities starting with &
var regExpColor6regExpColor3 = /(^|[^\/\w&])(#[0-9a-f]{63})(?=([^\d\w]|$))/gi;
while ( (regExpMatch = regExpColor6regExpColor3.exec(obj.html) ) !== null) {
WikEdHighlightBuildTree wikEd.HighlightBuildTree('colorHex6colorHex3', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
 
// RGB hex colors #d4d0cc, exclude links and character entities starting with &
// RGB decimal colors rgb(128,64,265)
var regExpColorDecregExpColor6 = /(^|[^\brgb/\w&])(\s*\d#[0-9a-f]{1,36}\s*,\s*)(?=([^\d{1,3}\s*,\s*\d{1,3}\s*\w]|$))/gi;
while ( (regExpMatch = regExpColorDecregExpColor6.exec(obj.html) ) !== null) {
WikEdHighlightBuildTree wikEd.HighlightBuildTree('colorDeccolorHex6', 'block', regExpMatch.index + regExpMatch[1].length, regExpMatch[02].length, parseObj);
}
 
// RGB decimal colors rgb(128,64,265)
// single character highlighting: spaces, dashes
var regExpColorDec = /\brgb\(\s*\d{1,3}\s*,\s*\d{1,3}\s*,\s*\d{1,3}\s*\)/gi;
var regExpCharSpaceDash = new RegExp('[' + wikEdCharHighlightingStr + ']', 'g');
while ( (regExpMatch = regExpCharSpaceDashregExpColorDec.exec(obj.html) ) !== null) {
WikEdHighlightBuildTree wikEd.HighlightBuildTree('charcolorDec', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
 
// controlsingle character highlighting: spaces, dashes
var regExpCharCtrlregExpCharSpaceDash = new RegExp('[' + wikEdControlCharHighlightingStrwikEd.charHighlightingStr + ']', 'g');
while ( (regExpMatch = regExpCharCtrlregExpCharSpaceDash.exec(obj.html) ) !== null) {
wikEd.HighlightBuildTree('char', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
if (regExpMatch[0].charCodeAt(0) > 2) {
WikEdHighlightBuildTree('ctrl', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
}
 
// control character entitieshighlighting
var regExpCharCtrl = new RegExp('[' + wikEd.controlCharHighlightingStr + ']', 'g');
var regExpCharEntities = /&(\w+);/g;
while ( (regExpMatch = regExpCharEntitiesregExpCharCtrl.exec(obj.html) ) !== null) {
if (wikEdCharEntitiesByName[ regExpMatch[1] 0].charCodeAt(0) !=> null2) {
WikEdHighlightBuildTree wikEd.HighlightBuildTree('charEntityctrl', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
}
}
 
// character entities
// merge wiki syntax in
var regExpCharEntities = /&(\w+);/g;
WikEdHighlightAddHtml(parseObj, obj);
while ( (regExpMatch = regExpCharEntities.exec(obj.html) ) !== null) {
if (wikEd.charEntitiesByName[ regExpMatch[1] ] !== null) {
wikEd.HighlightBuildTree('charEntity', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
}
}
// merge wiki syntax in
wikEd.HighlightAddHtml(parseObj, obj);
 
// get file previews
if ( (wikEdConfig['wikEd.config.filePreview'] === true) && (wikEdFilePreviewRequestwikEd.filePreviewRequest !== '') ) {
wikEd.AjaxPreview(wikEd.filePreviewRequest, wikEd.FilePreviewAjaxHandler);
WikEdAjaxPreview(wikEdFilePreviewRequest, WikEdFilePreviewAjaxHandler);
wikEdFilePreviewRequestwikEd.filePreviewRequest = '';
}
 
// merge html and plain text
WikEdHighlightMergeHtmlwikEd.HighlightMergeHtml(parseObj, obj);
 
// free up array
parseObj.tree = [];
 
// \x00 and \x01 back to &lt; and &gt;
obj.html = obj.html.replace(/&/g, '&amp;');
obj.html = obj.html.replace(/\x00/g, '&lt;');
obj.html = obj.html.replace(/\x01/g, '&gt;');
 
// remove commentslinebreaks in tablemode tables
if (wikEdConfig['removeHighlightComments']wikEd.tableMode === true) {
obj.html = obj.html.replace(/\n(<!--wikEd(caption|tr|th|td|br)\b[^>]*?\wbclass="wikEdTable\/]w+--"[^>]*?>)/g, '$1');
obj.html = obj.html.replace(/(<\/table>(<!--wikEdTable\w+-->)?)\n/g, '$1');
}
 
// WED('obj.html', obj.html);
// WED('wikEd.TabifyHTML(obj.html)', wikEd.TabifyHTML(obj.html));
 
// remove comments
if ( (wikEd.config.removeHighlightComments === true) && (keepComments !== true) ) {
obj.html = obj.html.replace(/<!--wikEd[\w\/]+-->/g, '');
}
return;
};
Line 11,333 ⟶ 14,462:
 
//
// WikEdHighlightTreeRedefinewikEd.HighlightTreeRedefine: redefine opening tag, for bold / italic and template / parameter
//
 
windowwikEd.WikEdHighlightTreeRedefineHighlightTreeRedefine = function (openNodeIndex, tag, tagFromDiff, tagLength, parseObj) {
 
if (typeof tag !== null'string') {
parseObj.tree[openNodeIndex].tag = tag;
}
if (typeof tagFromDiff !== null'string') {
parseObj.tree[openNodeIndex].start += tagFromDiff;
}
if (typeof tagLength !== null'string') {
parseObj.tree[openNodeIndex].tagLength = tagLength;
}
 
return;
};
Line 11,353 ⟶ 14,481:
 
//
// WikEdHighlightBuildTreewikEd.HighlightBuildTree: build an array based tree structure of text elements
// tag info: text pos, text length, tag type (root, open, close, block, error)
// connectivity info: parent, firstChild, nextSibling, paired opening/closing (all array indexes)
 
windowwikEd.WikEdHighlightBuildTreeHighlightBuildTree = function (tag, tagClass, tagFrom, tagLength, parseObj, tagProperties) {
 
// show parameters:
// WED('tag, tagClass, tagFrom, tagLength', tag + ' ,' + tagClass + ', ' + tagFrom + ', ' + tagLength);
 
// single-element tags (block)
var pushNode;
if (tagClass == 'block') {
var previousSibling = null;
if ( (parseObj.lastOpenNode !== 0) && (parseObj.lastOpenNode !== null) ) {
var redefinedParentTag;
 
// change parent link to linkPiped, only one valid separator per link
if ( (tag == 'linkParam') && (parseObj.lastOpenTag == 'link') ) {
redefinedParentTag = 'linkPiped';
}
 
// change parent link to parameterPiped, only one valid separator per link
else if ( (tag == 'parameterDefault') && (parseObj.lastOpenTag == 'parameter') ) {
redefinedParentTag = 'parameterPiped';
}
 
// redefine parent tag
if (redefinedParentTag !== nullundefined) {
parseObj.tree[parseObj.lastOpenNode].tag = redefinedParentTag;
parseObj.lastOpenTagFiltered = redefinedParentTag;
}
 
// chain blocks
var newNode = parseObj.tree.length;
var previousSibling = null;
 
// first node
if (parseObj.tree[parseObj.lastOpenNode].firstChild === null) {
parseObj.tree[parseObj.lastOpenNode].firstChild = newNode;
}
 
// chain to previous blocks
else {
previousSibling = parseObj.tree[parseObj.lastOpenNode].lastChild;
var previousSiblingNode = parseObj.tree[previousSibling];
if (previousSiblingNode !== nullundefined) {
previousSiblingNode.nextSibling = newNode;
}
Line 11,403 ⟶ 14,532:
}
 
// add new block to tree
pushNode = {
parseObj.tree.push( {
'tag': tag,
'start': tagFrom,
Line 11,411 ⟶ 14,540:
'parent': parseObj.lastOpenNode,
'previousSibling': previousSibling
} );
parseObj.tree.push(pushNode);
}
 
// opening tags
else if (tagClass == 'open') {
 
// push new open element onto tree
var openNodepushNode = {
'tag': tag,
'start': tagFrom,
Line 11,425 ⟶ 14,555:
'parent': parseObj.lastOpenNode
};
parseObj.lastOpenNode = parseObj.tree.push(openNodepushNode) - 1;
 
// get new top and second-to-top nodes, ignoring unpaired p tags
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
}
 
// closing tags
else if (tagClass == 'close') {
 
// try until we find the correct opening tag after fixing the tree
while (true) {
 
// no opening tag on stack
if (parseObj.lastOpenNode === 0) {
 
// ignore unmatched =
if (tag == 'heading') {
break;
}
 
// ignore breaking newlines
if (tag != 'newline') {
 
// tolerate leading closing tags for fragment highlighting
if ( (parseObj.whole === false) && (parseObj.addedOpenTag === false) ) {
 
// add new closing element to tree
parseObj.tree.push(pushNode = {
'tag': tag,
'start': tagFrom,
'tagLength': tagLength,
'type': 'close',
'pairedTagPospairedPos': parseObj.tree[parseObj.lastOpenNode].start + parseObj.tree[parseObj.lastOpenNode].tagLength,
} );
parseObj.tree.push(pushNode);
break;
}
 
// add no open tag error to tree
else {
parseObj.tree.push(pushNode = {
'start': tagFrom,
'tagLength': tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorNoOpen']
} );
parseObj.tree.push(pushNode);
break;
}
break;
}
}
 
// ignore unpaired <p> and spare nodes and try again with parent
if ( (tag != 'p') && ( (parseObj.lastOpenTag == 'p') || (parseObj.lastOpenTag == 'spare') ) ) {
if (parseObj.lastOpenNode !== null) {
parseObj.lastOpenNode = parseObj.tree[parseObj.lastOpenNode].parent;
parseObj.lastOpenTag = parseObj.lastOpenNode.tag;
Line 11,483 ⟶ 14,616:
}
 
// newline brakesbreaks heading or external link, remove corresponding opening tag from stack
if (tag == 'newline') {
 
// mark broken opening tags
var nodeNo = parseObj.lastOpenNode;
var node = null;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
node = parseObj.tree[nodeNo];
if (
Line 11,500 ⟶ 14,633:
(node.tag == 'boldItalic')
) {
WikEdHighlightMarkLastOpenNodewikEd.HighlightMarkLastOpenNode(wikEdConfig['wikEd.config.text']['.wikEdErrorNewline'], parseObj);
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
}
nodeNo = node.parent;
Line 11,508 ⟶ 14,641:
}
 
// correct piped link
switch (tag) {
case 'link':
Line 11,516 ⟶ 14,649:
break;
 
// correct piped parameter
case 'parameter':
if (parseObj.lastOpenTag == 'parameterPiped') {
Line 11,524 ⟶ 14,657:
}
 
// wrong closing element
if (tag != parseObj.lastOpenTag) {
 
// ignore common unmatched false positive non-tags: = and ]
if ( (tag == 'heading') ) {
break;
}
 
// check if there is an open tag for this close tag
var nodeNo = parseObj.lastOpenNode;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
if (parseObj.tree[nodeNo].tag == tag) {
break;
Line 11,540 ⟶ 14,673:
nodeNo = parseObj.tree[nodeNo].parent;
}
if ( (nodeNo != 0) && (nodeNo != null) ) {
 
// treat open tags as wrong, close tag as correct
if ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) && (parseObj.tree[nodeNo].tag == tag) ) {
 
// mark remaining unmatched opening tags
var nodeNo = parseObj.lastOpenNode;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
var node = parseObj.tree[nodeNo];
if (node.tag == tag) {
parseObj.lastOpenNode = nodeNo;
break;
}
nodeNo = node.parent;
node.type = 'error';
node.left = wikEdConfig['text']['wikEdErrorNoClose'];
node.parent = null;
}
nodeNo = node.parent;
WikEdHighlightGetLevel(parseObj);
node.type = 'error';
node.left = wikEd.config.text.wikEdErrorNoClose;
node.parent = null;
}
wikEd.HighlightGetLevel(parseObj);
}
 
// treat open tags as correct, treat close tag as wrong
else {
 
// add wrong close tag error to tree
parseObj.tree.push(pushNode = {
'start': tagFrom,
'tagLength': tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorNoOpen']
} );
parseObj.tree.push(pushNode);
break;
}break;
}
}
 
// headings in templates are ignored but we do not want to hide that template
if (tag == 'heading') {
 
// check for heading in template or ref
var ignoreHeading = false;
var nodeNo = parseObj.tree[parseObj.lastOpenNode].parent;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
var node = parseObj.tree[nodeNo];
if (node.tag == 'template') {
Line 11,595 ⟶ 14,727:
}
 
// clean out opening heading
if (ignoreHeading === true) {
 
// add headings in template errors to tree
 
// add headings in template errors to tree
// convert opening tag to error
WikEdHighlightMarkLastOpenNode(wikEdConfig['text']['wikEdErrorTemplHeading'], parseObj);
 
// convert opening tag to error
parseObj.tree.push( {
wikEd.HighlightMarkLastOpenNode(wikEd.config.text.wikEdErrorTemplHeading, parseObj);
pushNode = {
'start': tagFrom,
'tagLength': tagLength,
'type': 'error',
'left': wikEdConfig['wikEd.config.text']['.wikEdErrorTemplHeading']
} );
parseObj.tree.push(pushNode);
break;
}
}
 
// it is the correct closing element
 
// save element last text position to opening tag entry
var pairedTagPospairedPos;
var openNode = parseObj.tree[parseObj.lastOpenNode].pairedTagPos = tagFrom;
openNode.pairedPos = tagFrom;
pairedTagPos = parseObj.tree[parseObj.lastOpenNode].start + parseObj.tree[parseObj.lastOpenNode].tagLength
pairedPos = parseObj.tree[parseObj.lastOpenNode].start + parseObj.tree[parseObj.lastOpenNode].tagLength;
 
// add new closing element to tree
parseObj.tree.push(pushNode = {
'tag': tag,
'start': tagFrom,
'tagLength': tagLength,
'type': 'close',
'paired': parseObj.lastOpenNode,
'pairedTagPos': pairedTagPos
'pairedPos': pairedPos,
} );
'parent': openNode.parent
};
parseObj.tree.push(pushNode);
 
// up one level
if ( (parseObj.lastOpenNode !== 0) && (parseObj.lastOpenNode !== null) ) {
parseObj.lastOpenNode = parseObj.tree[parseObj.lastOpenNode].parent;
}
 
break;
}
 
// get new top and second-to-top nodes, ignoring unpaired p tags
WikEdHighlightGetLevelwikEd.HighlightGetLevel(parseObj);
}
 
// add extra properties
if ( (pushNode !== undefined) && (tagProperties !== undefined) ) {
for (var i = 0; i < tagProperties.length; i ++) {
pushNode[tagProperties[i][0]] = tagProperties[i][1];
}
}
 
return;
};
Line 11,645 ⟶ 14,788:
 
//
// WikEdHighlightMarkLastOpenNodewikEd.HighlightMarkLastOpenNode: redefine last open node as an error, ignore p and spare, handle pipe subnodes
//
 
windowwikEd.WikEdHighlightMarkLastOpenNodeHighlightMarkLastOpenNode = function (errorText, parseObj) {
 
var lastOpenNode = parseObj.lastOpenNode;
Line 11,655 ⟶ 14,798:
if ( (openNode.tag != 'p') && (openNode.tag != 'spare') ) {
 
// mark pipes
if ( (openNode.tag == 'linkPiped') || (openNode.tag == 'parameterPiped') || (openNode.tag == 'template') || (openNode.tag == 'paramTempl') ) {
var childNode = parseObj.tree[openNode.firstChild];
if (childNode !== nullundefined) {
parseObj.tree[openNode.firstChild] = {
'start': childNode.start,
Line 11,668 ⟶ 14,811:
}
 
// mark child nodes of error nodes with lower priority (table elements)
// mark unmatched opening tags
wikEd.HighlightMarkNestedErrors(lastOpenNode, errorText, parseObj);
 
// mark unmatched opening tags
parseObj.tree[lastOpenNode] = {
'start': openNode.start,
Line 11,677 ⟶ 14,823:
}
return;
};
 
 
//
// wikEd.HighlightMarkNestedErrors: mark child nodes of error nodes with lower priority (table elements)
// WikEdHighlightGetLevel: get current innermost (top) element name from parse stack, ignoring unpaired p tags
//
 
windowwikEd.WikEdHighlightGetLevelHighlightMarkNestedErrors = function (parent, errorText, parseObj) {
 
var tagNesting = {
'table': 'tableCaption|row|tableAttrib',
'tableCaption': 'captionAttrib',
'row': 'header|cell|rowAttrib',
'header': 'headerAttrib',
'cell': 'cellAttrib'
};
 
var regExp = null;
if (tagNesting.hasOwnProperty(parseObj.tree[parent].tag) === true) {
regExp = new RegExp('^(' + tagNesting[parseObj.tree[parent].tag ]+ ')$');
}
 
for (var i = 0; i < parseObj.tree.length; i ++) {
var node = parseObj.tree[i];
if ( (node.parent == parent) && (regExp !== null) && (regExp.test(node.tag) === true) ) {
wikEd.HighlightMarkNestedErrors(i, errorText, parseObj);
node.type = 'error';
node.left = errorText;
}
}
return;
};
 
 
//
// wikEd.HighlightGetLevel: get current innermost (top) element name from parse stack, ignoring unpaired p tags
//
 
wikEd.HighlightGetLevel = function (parseObj) {
 
parseObj.lastOpenTag = null;
Line 11,690 ⟶ 14,867:
parseObj.lastOpenTagFiltered = null;
parseObj.secondlastOpenNodeFiltered = null;
parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered = null;
 
if ( (parseObj.lastOpenNode == 0) || (parseObj.lastOpenNode == null) ) {
if ( (parseObj.lastOpenNode === 0) || (parseObj.lastOpenNode === null) ) {
return;
}
Line 11,697 ⟶ 14,875:
parseObj.lastOpenTag = parseObj.tree[parseObj.lastOpenNode].tag;
var nodeNo = parseObj.lastOpenNode;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
var node = parseObj.tree[nodeNo];
if ( (node.tag != 'p') && (node.tag != 'spare') ) {
Line 11,707 ⟶ 14,885:
}
 
if ( (nodeNo !== 0) && (nodeNo !== null) ) {
nodeNo = parseObj.tree[nodeNo].parent;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
var node = parseObj.tree[nodeNo];
if ( (node.tag != 'p') && (node.tag != 'spare') ) {
parseObj.secondlastOpenNodeFiltered = nodeNo;
parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered = parseObj.tree[nodeNo].tag;
break;
}
Line 11,725 ⟶ 14,903:
 
//
// WikEdHighlightAddCodewikEd.HighlightAddCode: add actual highlighting html code to parse tree elements
//
 
windowwikEd.WikEdHighlightAddHtmlHighlightAddHtml = function (parseObj, obj) {
 
// cycle through currently existing parse array
var from = 0;
var i = 0;
var cellCount = 0;
while (i < parseObj.tree.length) {
 
var node = parseObj.tree[i];
var tag = node.tag;
Line 11,739 ⟶ 14,919:
var tagLength = node.tagLength;
var tagType = node.type;
var pairedTagPospairedPos = node.pairedTagPospairedPos;
var tagTo = tagFrom + tagLength;
var tagMatch = '';
Line 11,752 ⟶ 14,932:
var pushRightPos2;
var pushLeft = '';
 
// get sanitized attributes
var attrib = '';
if ( (node.attrib !== undefined) && (node.attrib !== '') ) {
var htmlTag = '';
switch (tag) {
case 'table':
htmlTag = 'table';
break;
case 'tableCaption':
htmlTag = 'tr';
break;
case 'row':
htmlTag = 'tr';
break;
case 'header':
htmlTag = 'th';
break;
case 'cell':
htmlTag = 'td';
break;
}
if (htmlTag !== '') {
attrib = wikEd.SanitizeAttributes(htmlTag, node.attrib, true);
if (attrib !== '') {
 
// adjust rowspan in headers and cells
if ( (htmlTag == 'th') || (htmlTag == 'td') ) {
attrib = attrib.replace(/\b(rowspan\s*=\s*('|"|)\s*\+?)(\d+)(\s*\2)/gi,
function (p, p1, p2, p3, p4) {
return p1 + (p3 * 2 - 1) + p4;
}
);
}
attrib = ' ' + attrib;
}
}
}
 
// get parent and paired
var parent = null;
if ( (node.parent !== undefined) && (node.parent !== null) && (node.parent > 0) ) {
parent = parseObj.tree[node.parent];
}
var paired = null;
if ( (node.paired !== undefined) && (node.paired > 0) ) {
paired = parseObj.tree[node.paired];
}
 
// get linebreaks before tag
var newlineClass = '';
var newlineHtml = '';
if (node.newline === true) {
 
// add actual linebreak after headers/cells instead for pasting of table to raw text (still adds tabs as cell separators)
if ( (cellCount > 0) && (tagType == 'open') && ( (tag == 'header') || (tag == 'cell') ) ) {
newlineHtml = '<div class="wikEdTableBR"><br class="wikEdTableBR"></div><!--wikEdTableBR-->';
}
else {
newlineClass = 'BR';
}
}
var parentNewlineClass = '';
if ( (parent !== null) && (parent.newline === true) ) {
parentNewlineClass = 'BR';
}
var pairedNewlineClass = '';
if ( (paired !== null) && (paired.newline === true) ) {
pairedNewlineClass = 'BR';
}
 
switch (tagType) {
 
// tag type: open
case 'open':
var innerPlain = '';
if (pairedTagPospairedPos !== nullundefined) {
innerPlain = obj.html.substring(tagTo, pairedTagPospairedPos);
}
switch (tag) {
Line 11,770 ⟶ 15,022:
case 'link':
case 'linkPiped':
var interlinkClass = 'wikEdLink';
var follow = '';
var interClean = '';
var ns = '';
var nsClean = '';
var linkClass = 'wikEdLink';
var article = '';
var param = '';
var follow = '';
 
// detect interlink and namespace
// 1 12123 inter:2 3 12 3445 : 4 5 6 namespace 53 64 6template7template 67 78 9param 89param 8798
var regExpLink = /^(\s*)(([\w\- ]+)\:\s*)?((\:\s*)?([^\:\|\[\]\{\}\n\t]*\s*\:\s*))?([^\|\n]+?)\s*(\|((.|\n)*))?\s*$/gi;
regExpLink.lastIndex = 0;
var regExpMatch;
if ( (regExpMatch = regExpLink.exec(innerPlain)) !== null) {
 
// get interwiki, namespace, article, paramters
ifvar pre = (regExpMatch[1] != null)|| {'';
var inter = regExpMatch[12] || '';
var ns = regExpMatch[4] || '';
var article = regExpMatch[7] || '';
var param = regExpMatch[9] || '';
 
if (inter !== '') {
interClean = inter;
interClean = interClean.replace(/\s/g, ' ');
Line 11,795 ⟶ 15,048:
interClean = interClean.replace(/^ $/, '');
}
var interStart = tagTo + regExpMatch.index + pre.length;
 
if (regExpMatch[3]ns !== null'') {
ns = regExpMatch[3];
nsClean = ns;
nsClean = nsClean.replace(/\s/g, ' ');
Line 11,803 ⟶ 15,056:
nsClean = nsClean.replace(/: :/, '');
nsClean = nsClean.replace(/^ $/, '');
}
var nsStart = interStart + ns.length;
 
// change interwiki into more common namespace if ambiguous
if ( (interClean !== '') && (nsClean === '') ) {
ns = inter;
nsClean = interClean;
nsnsStart = interinterStart;
inter = '';
interClean = '';
}
}
 
// detect cross-namespace links
linkClass = 'wikEdLink';
if (wikEdPageNamespacewikEd.pageNamespace !== null) {
if (ns != wikEdPageNamespacewikEd.pageNamespace) {
linkClass = 'wikEdLinkCrossNs';
}
}
 
// highlight interwiki and namespace
article = regExpMatch[6];
if (article !== '') {
 
if // (regExpMatch[8]highlight != null) {interwiki
paramif (inter !== '') regExpMatch[8];{
wikEd.HighlightBuildTree('linkInter', 'block', interStart, inter.length, parseObj);
}
 
// highlight interwiki and namespace
if (article != '') {
 
// highlight interwiki
if (inter != '') {
WikEdHighlightBuildTree('linkInter', 'block', tagFrom + 2, inter.length, parseObj);
}
 
// highlight namespace
if (ns !== '') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('linkNamespace', 'block', tagFrom + 2 + inter.lengthnsStart, ns.length, parseObj);
}
 
// linkify
var regExpCasing = new RegExp('(^|\\:)' + wikEdConfig['wikEd.config.text']['wikicode Category'] + '(\\:|$)', 'i');
nsClean = nsClean.replace(regExpCasing, '$1' + wikEdConfig['wikEd.config.text']['wikicode Category'] + '$2');
if (nsClean == ':') {
nsClean = '';
}
follow = ' ' + WikEdHighlightLinkifywikEd.HighlightLinkify(interClean + nsClean, article);
}
}
 
if (nsClean.toLowerCase() == wikEdConfig['text']['wikicode Category'].toLowerCase() + ':') {
if (nsClean.toLowerCase() == wikEd.config.text['wikicode Category'].toLowerCase() + ':') {
insertLeft = '<span class="wikEdCat"' + follow + '><span class="wikEdLinkTag">';
insertRight = '</span><!--wikEdLinkTag--><span class="wikEdCatName">';
Line 11,864 ⟶ 15,114:
case 'file':
var previewCode = '';
var regExpFile = new RegExp('^\\s*(Image|File|Media|' + wikEdConfig['wikEd.config.text']['wikicode Image'] + '|' + wikEdConfigwikEd.config.text['textwikicode File'] + '|' + wikEd.config.text['wikicode FileMedia'] + ')\\s*:\\s*([^\\|\\n]*)', 'i');
var regExpMatch = regExpFile.exec(innerPlain);
if (regExpMatch === null) {
insertLeft = '<span class="wikEdFile"><span class="wikEdFileTag">';
}
 
// linkify and preview
else {
var filefileTag = regExpMatch[1] + ':' + regExpMatch[2];
filevar =fileName file.replace(/= /g,'_')regExpMatch[2];
 
// add file preview box
var filePlain = fileTag + ':' + fileName.replace(/<[^>]*>/g, '');
if (wikEdConfig['filePreview'] == true) {
filePlain = filePlain.replace(/ /g,'_');
if (wikEd.config.filePreview === true) {
 
// get image size
var filePreviewSize = wikEdConfig['wikEd.config.filePreviewSize'];
var regExpMatch;
if ( (regExpMatch = /\|(\d+)px(\||$)/.exec(innerPlain)) !== null) {
var size = parseInt(regExpMatch[1]);
if ( (size > 0) && (size < wikEdConfig['wikEd.config.filePreviewSize']) ) {
filePreviewSize = size;
}
}
 
// get image url and size from cache
var style = '';
var fileObj = wikEdFilePreviewCachewikEd.filePreviewCache['wikEd' + filefilePlain + filePreviewSize];
if (fileObj !== nullundefined) {
var filePreviewHeight = filePreviewSize;
if (fileObj.height !== null) {
filePreviewHeight = fileObj.height;
}
var filePreviewWidth = filePreviewSize;
if (fileObj.width !== null) {
filePreviewWidth = fileObj.width;
}
Line 11,903 ⟶ 15,155:
}
 
// get image url and size through an ajax request
else {
style = 'display: none; height: ' + filePreviewSize + 'px; width: ' + filePreviewSize + 'px;';
var fileTagPreview = fileTag;
wikEdFilePreviewRequest += '\n' + file + ' ' + filePreviewSize + ' [[' + file + '|' + filePreviewSize + 'px|' + filePreviewSize + 'x' + filePreviewSize + 'px]]\n';
if ( (fileTag == 'Media') || (fileTag == wikEd.config.text['wikicode Media']) ) {
wikEdFilePreviewIds[wikEdFilePreviewNo] = file + filePreviewSize;
fileTagPreview = 'File';
}
wikEd.filePreviewRequest += '\n' + filePlain + ' ' + filePreviewSize + ' [[' + fileTagPreview + ':' + fileName + '|' + filePreviewSize + 'px|' + filePreviewSize + 'x' + filePreviewSize + 'px]]\n';
wikEd.filePreviewIds[wikEd.filePreviewNo] = filePlain + filePreviewSize;
}
previewCode = '<span class="wikEdFilePreview" id="wikEdFilePreview' + wikEdFilePreviewNowikEd.filePreviewNo + '" style="' + style + '" title="' + wikEdConfig['wikEd.config.text']['.wikEdFilePreview'] + ' (' + filefilePlain + ')"></span><!--wikEdFilePreview-->';
wikEdFilePreviewNowikEd.filePreviewNo ++;
}
insertLeft += '<span class="wikEdFile" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', filefilePlain) + '><span class="wikEdFileTag">';
}
insertRight = previewCode + '</span><!--wikEdLinkTag--><span class="wikEdFileName">';
Line 11,919 ⟶ 15,175:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(innerPlain)) !== null) {
url = regExpMatch[0];
}
insertLeft = '<span class="wikEdURL" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', '', url) + '><span class="wikEdLinkTag">';
insertRight = '</span><!--wikEdLinkTag-->';
break;
Line 11,929 ⟶ 15,185:
break;
case 'template':
 
// do not hide templates if it has no parameters or if it shorter than wikEdConfig['templNoHideLength'] chars
if ( (innerPlain.indexOf('|') == -1) || (innerPlain.length < wikEdConfig['templNoHideLength']) ) {
node.noHide = true;
}
var mod = '';
var inter = '';
Line 11,943 ⟶ 15,194:
var follow = '';
 
// 12 mod 2 : 1 34 : 4 5 namespace 53 6 template 6 7 89 param 98
var regExpTempl = new RegExp('^\\s*((' + wikEdTemplModifierwikEd.templModifier + ')\\:\\s*)?((\\:\\s*)?([^\\:\\|\\[\\]\\{\\}\\s\\x00\\x01]*\\s*\\:))?\\s*([^\\:\\n\\x00\\x01\\{\\}]+?)\\s*(\\|((.|\\n)*?))?\\s*$', 'gi');
 
// detect parser variables and functions, might slow main regexp down
var regExpMatch;
var parserVarisParserVar = false;
if ( (regExpMatch = regExpTempl.exec(innerPlain)) !== null) {
 
// get modifier, namespace, template, paramters
ifvar p1 = (regExpMatch[1] != null)|| {'';
modif (p1 !== '') regExpMatch[1];{
mod = p1;
interClean = mod.replace(/\s+$/g, '');
interClean = inter.replace(/:$/g, '');
}
 
ifvar p3 = (regExpMatch[3] != null)|| {'';
nsif (p3 !== '') regExpMatch[3];{
ns = p3;
nsClean = ns.replace(/^\s+|\s+$/g, '');
nsClean = nsClean.replace(/\s*\:\s*()/g, ':');
Line 11,966 ⟶ 15,219:
}
 
template = regExpMatch[6] || '';
param = regExpMatch[8] || '';
var parserVar = ns.substr(0, ns.length - 1);
 
// {{VARIABLE}}
if (regExpMatch[8] != null) {
paramif (isParserVar === false) regExpMatch[8];{
if ( (template !== '') && (ns === '') && (param === '') ) {
}
var regExpParserVar = new RegExp('^(' + wikEd.parserVariables + '|' + wikEd.parserVariablesR + ')$', '');
 
var regExpMatchParserVar;
// {{VARIABLE}}
if ( (regExpMatchParserVar = regExpParserVar.exec(template)) !== null) {
if (parserVar == false) {
isParserVar = true;
if ( (template != '') && (ns == '') && (param == '') ) {
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.length, parseObj);
var regExpParserVar = new RegExp('^(' + wikEdParserVariables + wikEdParserVariablesR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(template)) != null) {
parserVar = true;
WikEdHighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.length, parseObj);
}
}
}
 
// {{VARIABLE:R}}
if (parserVarisParserVar === false) {
if ( (ns !== '') && (template == 'R') ) {
var regExpParserVar = new RegExp('^(' + wikEdParserVariablesRwikEd.parserVariablesR + ')$', '');
var regExpMatchParserVar;
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1))) != null) {
if ( (regExpMatchParserVar = regExpParserVar.exec(parserVar)) !== null) true;{
WikEdHighlightBuildTreeisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
}
}
 
// {{FUNCTION:param|R}}
if (parserVarisParserVar === false) {
if ( (ns !== '') && ( (param === '') || (param == 'R') ) ) {
var regExpParserVar = new RegExp('^(' + wikEdParserFunctionsRwikEd.parserFunctionsR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
parserVarisParserVar = true;
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
}
}
 
// {{function:param|param}}
if (parserVarisParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(' + wikEdParserFunctionswikEd.parserFunctions + ')$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
parserVarisParserVar = true;
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
}
}
 
// {{#function:param|param}}
if (parserVarisParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(#(' + wikEdParserFunctionsHashwikEd.parserFunctionsHash + '))$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
 
parserVar = true;
// #property: linkify wikibase template (wikidata)
WikEdHighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
if (parserVar == '#property') {
 
// item id from parameter
var item = '';
var regExpMatchItem;
if ( (regExpMatchItem = /(^|\|)id=([^|]+)/.exec(param)) !== null) {
item = regExpMatchItem[2];
}
 
// item name from parameter
else if ( (regExpMatchItem = /(^|\|)of=([^|]+)/.exec(param)) !== null) {
item = wikEd.EncodeTitle(regExpMatchItem[2]);
item = 'Special:ItemByTitle/' + wikEd.wikibase.currentSite.globalSiteId + '/' + item;
}
 
// get item name from article name
else {
item = wikEd.EncodeTitle();
item = 'Special:ItemByTitle/' + wikEd.wikibase.currentSite.globalSiteId + '/' + item ;
}
 
// get wikibase repository url
follow = ' ' + wikEd.HighlightLinkify('', '', (wikEd.wikibase.repoUrl + wikEd.wikibase.repoArticlePath).replace(/\$1/, item));
}
 
// #invoke: template scripting (LUA)
if (parserVar == '#invoke') {
follow = ' ' + wikEd.HighlightLinkify('Module:', template);
}
 
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
}
}
 
// highlight template
if (parserVarisParserVar === false) {
 
// highlight modifier
if (mod !== '') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateModifier', 'block', tagFrom + 2, mod.length, parseObj);
}
 
// highlight namespace
if (ns !== '') {
WikEdHighlightBuildTreewikEd.HighlightBuildTree('templateNamespace', 'block', tagFrom + 2 + mod.length, ns.length, parseObj);
}
 
// add missing template namespace and linkify
if (ns == ':') {
ns = '';
}
else if (ns === '') {
 
// no Template: addition for subpage linking
if (template.indexOf('/') !== 0) {
ns = wikEdConfig['wikEd.config.text']['wikicode Template'] + ':';
}
}
follow = ' ' + WikEdHighlightLinkifywikEd.HighlightLinkify(ns, template);
}
}
var hideStyle = '';
var hideClass = 'wikEdTempl';
if ( (template !== '') && (parserVarisParserVar === false) && (node.noHide != true) ) {
if (wikEdRefHidewikEd.refHide === true) {
 
// show first template immediately following a template or reference
var hideButtonClass = 'wikEdTemplButton';
var hideButtonStyle = '';
if ( (node.parent != null) && (node.parent > 0) ) {
varif parentNode(parent !== parseObj.tree[node.parent];null) {
if (parentNode !(parent.tag == null'template') || (parent.tag == 'ref') ) {
if (/^\s*$/.test(obj.html.substring(parent.start + parent.tagLength, tagFrom)) === true) {
if ( (parentNode.tag == 'template') || (parentNode.tag == 'ref') ) {
hideButtonClass = hideButtonClass.replace(/Button(Show)?/, 'ButtonShow');
if (/^\s*$/.test(obj.html.substring(parentNode.start + parentNode.tagLength, tagFrom)) == true) {
hideClass = 'wikEdTemplShow';
hideButtonClass = hideButtonClass.replace(/Button(Show)?/, 'ButtonShow');
hideClasshideButtonStyle = 'wikEdTemplShow style="display: block"';
hideButtonStyle = ' style="display: block"';
hideStyle = ' style="display: block"';
}
}
}
}
insertLeft = '<span class="wikEdTemplContainer"><button class="' + hideButtonClass + wikEdTemplateArraywikEd.templateArray.length + '" titlestyle="' + wikEdConfig[hideButtonStyle + 'text'][" title="' + wikEd.config.text.wikEdTemplButtonTooltip'] + '"></button><!--wikEdTemplButton--></span><!--wikEdTemplContainer-->';
wikEdTemplateArraywikEd.templateArray.push( {'text': template, 'added': false} );
}
}
insertLeft += '<span class="' + hideClass + '"' + hideStyle + '><span class="wikEdTemplTag">';
insertRight = '</span><!--wikEdTemplTag--><span class="wikEdTemplName"' + follow + '>';
break;
Line 12,095 ⟶ 15,376:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 12,114 ⟶ 15,395:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,123 ⟶ 15,406:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtml"><span class="wikEdHtmlTag">';
Line 12,146 ⟶ 15,429:
break;
case 'p':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEdConfig['wikEd.config.text']['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,153 ⟶ 15,436:
case 'ref':
 
// ref no hide
if (node.noHide === true) {
insertLeft = '<span class="wikEdRef">';
}
 
// ref hide
else {
var refName = '';
var regExpMatch;
if ( (regExpMatch = /(\bname\s*=\s*(\'|\"))([^\x01]+?)\2/i.exec(tagMatch)) !== null) {
refName = regExpMatch[3] || '';
WikEdHighlightBuildTreewikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[3].length, parseObj);
}
else if ( (regExpMatch = /(\bname\s*=\s*)(\w+)/i.exec(tagMatch)) !== null) {
refName = regExpMatch[2];
WikEdHighlightBuildTreewikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
if (wikEdRefHidewikEd.refHide === true) {
if (refName !== '') {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton' + wikEdReferenceArraywikEd.referenceArray.length + '" title="' + wikEdConfig['wikEd.config.text']['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
wikEdReferenceArraywikEd.referenceArray.push( {'text': refName, 'added': false} );
}
else {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton" title="' + wikEdConfig['wikEd.config.text']['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
}
}
Line 12,189 ⟶ 15,472:
case 'heading':
var heading = innerPlain.replace(/^\s+|\s+$/g, '');
if ( (heading == wikEdConfig['wikEd.config.text']['See also']) || (heading == wikEdConfig['wikEd.config.text']['.References']) || (heading == wikEdConfig['wikEd.config.text']['External links']) ) {
insertLeft = '<span class="wikEdHeadingWP">';
}
Line 12,196 ⟶ 15,479:
}
break;
case 'table':/// \n| = </td><td>, \n|- = </t></tr><tr> not blocks but td, th, tr
if (parseObj.tableMode == true) {
 
// table open
// wikitable
case 'table':
var regExpTable = /\{\| *((\w+ *= *(\'|\")[^\n\'\"]*\3 *)*)(\n|$)/gi;
regExpTableif (wikEd.lastIndextableMode === true) tagFrom;{
insertLeft = '<table class="wikEdTableMode" border="1" cellspacing="0"' + attrib + '><tr class="wikEdTableTag"><td class="wikEdTableTag" colspan="1000" align="left" valign="top"><span class="wikEdTableTag">';
var regExpMatch = regExpTable.exec(obj.html);
if (regExpMatchwikEd.refHide === nulltrue) {
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableStart, 'added': false} );
}
insertLeft += '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
}
else {
insertLeft = '<span class="wikEdTableBlock"><span class="wikEdTableTag"><span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
if (node.attrib === undefined) {
insertRight += '</span><!--wikEdTableTag-->';
}
}
break;
case 'tableAttrib':
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableTagAttrib">';
}
break;
case 'tableCaption':
if (wikEd.tableMode === true) {
insertRight = '</span><!--wikEdTableCode-->';
insertLeft = '<tr class="wikEdTableCaption"><td class="wikEdTableCaption" colspan="1000" align="left" valign="top"><span class="wikEdTableCaption' + newlineClass + '"' + attrib + '>';
if (wikEd.refHide === true) {
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableCaption, 'added': false} );
if (node.attrib === undefined) {
insertRight += '</span><!--wikEdTable-->';
}
}
insertLeft += '<span class="wikEdTableCode">';
}
else {
insertLeft = '<span class="wikEdTableCaption"><span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
}
break;
case 'captionAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCaptionAttrib">';
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCaptionAttrib">';
}
}
break;
 
// pushRight because of dash highlighting
// html table
case 'row':
regExpTable = /<table\b\s*((\w+\s*=\s*(\'|\")[^>\'\"]*\3\s*)*)\s*>/gi;
regExpTable.lastIndexcellCount = tagFrom0;
if (tagLength > 0) {
regExpMatch = regExpTable.exec(obj.html)
if (wikEd.tableMode === true) {
insertLeft = '<tr class="wikEdTableRow"' + attrib + '><td class="wikEdTableRow" colspan="1000" align="left" valign="top"><span class="wikEdTableRow' + newlineClass + '">';
if (wikEd.refHide === true) {
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableRow, 'added': false} );
}
insertLeft += '<span class="wikEdTableCode">';
pushRight = '</span><!--wikEdTableCode-->';
}
else {
insertLeft = '<span class="wikEdTableRow"><span class="wikEdTableCode">';
pushRight = '</span><!--wikEdTableCode-->';
}
}
 
if// (regExpMatchrow !=without null) {tag
else {
if (regExpMatch.index == tagFrom) {
var paramsinsertLeft = regExpMatch[1]'<tr class="wikEdTableMode">';
if (params != '') {}
params += ' 'break;
}case 'rowAttrib':
if (wikEd.tableMode === true) {
insertLeft = '<table ' + params + ' border="1" class="wikEdTableEdit"><!--wikEdTableMode';
if (parent.attrib !== undefined) {
pushRight2 = '-->';
insertLeft = '<span class="wikEdTableRowAttrib">';
pushRightPos2 = regExpMatch.index + regExpMatch[0].length;
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableRowAttrib">';
}
}
break;
case 'header':
cellCount ++;
if (wikEd.tableMode === true) {
insertLeft = '<td class="wikEdTableHeader"' + attrib + ' align="left" valign="top">' + newlineHtml + '<span class="wikEdTableHeader' + newlineClass + '">';
insertRight = '</span><!--wikEdTableCode-->';
if (wikEd.refHide === true) {
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableHeader, 'added': false} );
if (node.attrib === undefined) {
insertRight += '</span><!--wikEdTable-->';
}
else {}
insertLeft += '<span class="wikEdTableCode">';
parseObj.tableMode = false;
}
else {
insertLeft = '<span class="wikEdTableHeader"><span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
}
break;
case 'headerAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableHeaderAttrib">';
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableHeaderAttrib">';
}
}
break;
case 'cell':
cellCount ++;
if (wikEd.tableMode === true) {
insertLeft = '<td class="wikEdTableCell"' + attrib + ' align="left" valign="top">' + newlineHtml + '<span class="wikEdTableCell' + newlineClass + '">';
insertRight = '</span><!--wikEdTableCode-->';
if (wikEd.refHide === true) {
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableCell, 'added': false} );
if (node.attrib === undefined) {
insertRight += '</span><!--wikEdTable-->';
}
}
insertLeft += '<span class="wikEdTableCode">';
else {
}
parseObj.tableMode = false;
else {
insertLeft = '<span class="wikEdTableCell"><span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
}
break;
case 'cellAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCellAttrib">';
}
}
else {
if (parseObj.tableMode == false) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTable"><span class="wikEdTableTag">';
insertRight insertLeft = '</span><!--wikEdTableTag-- class="wikEdTableCellAttrib">';
}
}
break;
}
break;
 
// tag type: close
case 'close':
switch (tag) {
Line 12,283 ⟶ 15,684:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 12,302 ⟶ 15,703:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,311 ⟶ 15,714:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtmlTag">';
Line 12,334 ⟶ 15,737:
break;
case 'p':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEdConfig['wikEd.config.text']['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,348 ⟶ 15,751:
insertRight = '</span><!--wikEdHeading/WP-->';
break;
 
// table close
case 'table':
if (parseObjwikEd.tableMode === true) {
insertLeft = '<tr class="wikEdTableTag"><td class="wikEdTableTag" colspan="1000" align="left" valign="top"><span class="wikEdTableTag' + newlineClass + '">';
insertLeft = '</table><!--wikEdTableMode';
pushRightif (wikEd.refHide === true) '-->';{
insertLeft += '<span class="wikEdTableContainer"><button class="wikEdTableButton' + wikEd.tableArray.length + '" title="' + wikEd.config.text.wikEdTableButtonTooltip + '"></button><!--wikEdTableButton--></span><!--wikEdTableContainer--><span class="wikEdTable">';
wikEd.tableArray.push( {'text': wikEd.config.text.hideTableEnd, 'added': false} );
}
insertLeft += '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode-->';
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
insertRight += '</span><!--wikEdTableTag' + newlineClass + '--></td><!--wikEdTableTag--></tr><!--wikEdTableTag--></table><!--wikEdTableMode-->';
}
else {
insertLeft = '<span class="wikEdTableTag"><span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableTag--></span><!--wikEdTablewikEdTableBlock-->';
}
break;
case 'tableAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertRight = '</span><!--wikEdTableTagAttrib-->';
}
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
insertRight += '</span><!--wikEdTableTag' + parentNewlineClass + '--></td><!--wikEdTableTag--></tr><!--wikEdTableTag-->';
}
else {
if (parent.attrib !== undefined) {
insertRight = '</span><!--wikEdTableTagAttrib--></span><!--wikEdTableTag-->';
}
}
break;
case 'tableCaption':
if (wikEd.tableMode === true) {
insertRight = '</span><!--wikEdTableCaption' + pairedNewlineClass + '--></td><!--wikEdTableCaption--></tr><!--wikEdTableCaption-->';
}
else {
insertRight = '</span><!--wikEdTableCaption-->';
}
break;
case 'captionAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableCaptionAttrib-->';
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
}
else {
insertRight = '';
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableCaptionAttrib-->';
}
}
break;
case 'row':
if ( (paired !== null) && (paired.tagLength > 0) ) {
insertRight = '</tr><!--wikEdTableRow-->';
}
else {
insertRight = '</tr><!--wikEdTableMode-->';
}
break;
case 'rowAttrib':
var parentAttrib = parent.attrib || '';
if (parentAttrib !== '') {
parentAttrib = wikEd.SanitizeAttributes('tr', parentAttrib, true);
if (parentAttrib !== '') {
parentAttrib = ' ' + parentAttrib;
}
}
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertRight = '</span><!--wikEdTableRowAttrib-->';
}
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
insertRight += '</span><!--wikEdTableRow' + parentNewlineClass + '--></td><!--wikEdTableRow--></tr><!--wikEdTableRow--><tr class="wikEdTableRow"' + parentAttrib + '>';
}
else {
if (parent.attrib !== undefined) {
insertRight = '</span><!--wikEdTableRowAttrib-->';
}
insertRight += '</span><!--wikEdTableRow-->';
}
break;
case 'header':
if (wikEd.tableMode === true) {
insertRight = '</span><!--wikEdTableHeader' + pairedNewlineClass + '--></td><!--wikEdTableHeader-->';
}
else {
insertRight = '</span><!--wikEdTableHeader-->';
}
break;
case 'headerAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableHeaderAttrib-->';
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableHeaderAttrib-->';
}
}
break;
case 'cell':
if (wikEd.tableMode === true) {
insertRight = '</span><!--wikEdTableCell' + pairedNewlineClass + '--></td><!--wikEdTableCell-->';
}
else {
insertRight = '</span><!--wikEdTableCell-->';
}
break;
case 'cellAttrib':
if (wikEd.tableMode === true) {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableCellAttrib-->';
if (wikEd.refHide === true) {
insertRight += '</span><!--wikEdTable-->';
}
}
}
else {
if (parent.attrib !== undefined) {
insertLeft = '<span class="wikEdTableCode">';
insertRight = '</span><!--wikEdTableCode--></span><!--wikEdTableCellAttrib-->';
}
}
break;
}
break;
 
// tag type: block
case 'block':
switch (tag) {
 
// pushRight instead of insertRight if enclosed text can contain other highlighting, e.g. single character highlighting
case 'linkNamespace':
insertLeft = '<span class="wikEdLinkNs">';
Line 12,375 ⟶ 15,915:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(tagMatch)) !== null) {
url = regExpMatch[0];
}
insertLeft = '<span class="wikEdURLName" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', '', url) + '>';
pushRight = '</span><!--wikEdURLName-->';
break;
Line 12,400 ⟶ 15,940:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d+/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0];
}
insertLeft = '<span class="wikEdPMID" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', '', 'http://www.ncbi.nlm.nih.gov/pubmed/' + idNumber) + '>';
insertRight = '</span><!--wikEdPMID-->';
break;
Line 12,409 ⟶ 15,949:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d[\s\d\-]+x?/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0].replace(/\D/g, '');
}
insertLeft = '<span class="wikEdISBN" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', 'Special:BookSources/' + idNumber) + '>';
pushRight = '</span><!--wikEdISBN-->';
break;
Line 12,418 ⟶ 15,958:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d[\s\d\-]+x?/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0].replace(/\D/g, '');
}
insertLeft = '<span class="wikEdISBN" ' + WikEdHighlightLinkifywikEd.HighlightLinkify('', '', 'http://tools.ietf.org/html/rfc' + idNumber) + '>';
pushRight = '</span><!--wikEdISBN-->';
break;
Line 12,429 ⟶ 15,969:
break;
case 'signature':
var title = wikEdConfig['wikEd.config.text']['wikEdSignature' + tagLength];
insertLeft = '<span class="wikEdSignature" title="' + title + '">';
insertRight = '</span><!--wikEdSignature-->';
Line 12,443 ⟶ 15,983:
case 'fileParam':
 
// make text parameters a caption
var params = '';
if (pairedTagPospairedPos !== nullundefined) {
params = obj.html.substring(tagFrom + 1, parseObj.tree[node.parent].pairedTagPospairedPos - 1);
}
if (/^\s*(thumb|thumbnail|frame|right|left|center|none|\d+px|\d+x\d+px|link\=.*?|upright|border)\s*(\||$)/.test(params) === true) {
insertLeft = '</span><!--wikEdFileName/Param--><span class="wikEdFileTag">';
insertRight = '</span><!--wikEdFileTag--><span class="wikEdFileParam">';
Line 12,469 ⟶ 16,009:
insertRight = '</span><!--wikEdTemplTag--><span class="wikEdParamDefault">';
break;
case 'brvoid'://inlineTag class
case 'html':
case 'htmlEmpty':
Line 12,476 ⟶ 16,016:
break;
case 'htmlUnknown':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEdConfig['wikEd.config.text']['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,482 ⟶ 16,022:
var refName = '';
var regExpMatch;
if ( (regExpMatch = /(\bname\s*=\s*(\'|\"))([^\x01]+?)\2/i.exec(tagMatch)) !== null) {
refName = regExpMatch[3];
WikEdHighlightBuildTreewikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[3].length, parseObj);
}
else if ( (regExpMatch = /(\bname\s*=\s*)(\w+)/i.exec(tagMatch)) !== null) {
refName = regExpMatch[2];
WikEdHighlightBuildTreewikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
if (wikEdRefHidewikEd.refHide === true) {
if (refName !== '') {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton' + wikEdReferenceArraywikEd.referenceArray.length + '" title="' + wikEdConfig['wikEd.config.text']['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
wikEdReferenceArraywikEd.referenceArray.push( {'text': refName + ' ↑', 'added': false} );
}
else {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton" title="' + wikEdConfig['wikEd.config.text']['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
}
}
Line 12,513 ⟶ 16,053:
insertLeft = '<span class="wikEdMath">';
pushRight = '</span><!--wikEdMath-->';
break;
case 'score':
insertLeft = '<span class="wikEdScore">';
pushRight = '</span><!--wikEdScore-->';
break;
case 'nowiki':
Line 12,537 ⟶ 16,081:
pushLeft = '<span class="wikEdSpace">';
pushRight = '</span><!--wikEdSpace-->';
break;
case 'caption':
case 'row':
case 'header':
case 'headerParam':
case 'headerSep':
case 'cell':
/*
if (parseObj.tableMode == true) {
var regExpTable = /\| *((\w+ *= *(\'|\")[^\n\'\"]*\3 *)*)\|\|/gi;
regExpTable.lastIndex = tagFrom;
var regExpMatch;
if ( (regExpMatch = regExpTable.exec(obj.html) ) != null) {
if (regExpMatch.index == tagFrom) {
var params = regExpMatch[1];
if (params != '') {
params += ' ';
}
insertLeft = '<table ' + params + ' border="1" class="wikEdTableEdit"><!--wikEdTableMode';
pushRight2 = '-->';
pushRightPos2 = regExpMatch.index + regExpMatch[0].length;
}
else {
parseObj.tableMode = false;
}
}
else {
parseObj.tableMode = false;
}
}
if (parseObj.tableMode == false) {
insertLeft = '<span class="wikEdTable"><span class="wikEdTableTag">';
insertRight = '</span><!--wikEdTableTag-->';
}
*/
break;
case 'cellParam':
case 'cellSep':
insertLeft = '<span class="wikEdTableTag">';
insertRight = '</span><!--wikEdTableTag-->';
break;
case 'colorLight':
Line 12,632 ⟶ 16,136:
break;
case 'ctrl':
insertLeft = '<span class="wikEdCtrl" title="' + wikEdControlCharHighlightingwikEd.controlCharHighlighting[tagMatch.charCodeAt(0).toString()] + '">';
insertRight = '</span><!--wikEdCtrl-->';
break;
case 'char':
var titleClasscharName = wikEdCharHighlightingwikEd.charHighlighting[tagMatch.charCodeAt(0).toString()];
var charClass = 'wikEd' + charName;
insertLeft = '<span class="' + titleClass + '" title="' + titleClass + '">';
insertRightinsertLeft = '</span><!-- class="' + charClass + '" title="' + titleClasswikEd.config.text[charName] + '--">';
insertRight = '</span><!--' + charClass + '-->';
break;
case 'charEntity':
var regExpMatch = /&(\w+);/i.exec(tagMatch);
var character = wikEdCharEntitiesByNamewikEd.charEntitiesByName[ regExpMatch[1] ];
if (character !== nullundefined) {
if (wikEdRefHidewikEd.refHide === true) {
insertLeft = '<span class="wikEdCharEntityContainer"><button class="wikEdCharEntityButton' + wikEdCharEntityArraywikEd.charEntityArray.length + '" title="' + wikEdConfig['wikEd.config.text']['.wikEdCharEntityButtonTooltip'] + '"></button><!--wikEdCharEntityButton--></span><!--wikEdCharEntityContainer-->';
wikEdCharEntityArraywikEd.charEntityArray.push( {'text': character, 'added': false} );
}
insertLeft += '<span class="wikEdCharEntity">';
Line 12,654 ⟶ 16,159:
}
break;
 
// tag type: various
case 'comment':
insertLeft = '<span class="wikEdComment">' + node.left + '</span><!--wikEdComment-->';
break;
case 'keep':
insertLeft = '<span class="wikEdKeep">' + node.left + '</span><!--wikEdKeep-->';
break;
case 'error':
insertLeft = '<span class="wikEdError" title="' + node.left + '">';
if (wikEdConfig['wikEd.config.highlightError'] === true) {
insertLeft += '<span class="wikEdHighlightError">' + node.left + '</span><!--wikEdHighlightError-->';
}
Line 12,668 ⟶ 16,178:
break;
case 'root':
break;
case undefined:
break;
}
 
// add left html into existing entry
if (insertLeft !== '') {
node.left = insertLeft;
node.index = i;
}
 
// add left html as new array element to allow for overlapping highlighting as in hr
else if (pushLeft !== '') {
parseObj.tree.push( { 'start': tagFrom, 'tagLength': 0, 'left': pushLeft, 'index': i - 0.5 } );
}
 
// add right html into existing entry
if (insertRight !== '') {
node.right = insertRight;
node.index = i;
}
 
// add right html as new array element to allow for overlapping highlighting as in html-like tags and urls
else if (pushRight !== '') {
parseObj.tree.push( { 'start': tagTo, 'tagLength': 0, 'right': pushRight, 'index': i + 0.5 } );
}
if (pushRight2 !== '') {
parseObj.tree.push( { 'start': pushRightPos2, 'tagLength': 0, 'right': pushRight2, 'index': i + 0.5 } );
}
 
 
from = tagTo;
Line 12,706 ⟶ 16,217:
 
//
// WikEdHighlightMergeHtmlwikEd.HighlightMergeHtml: merge parse tree highlighting html code with article text
//
 
windowwikEd.WikEdHighlightMergeHtmlHighlightMergeHtml = function (parseObj, obj) {
 
if (parseObj.tree.length <= 1) {
Line 12,715 ⟶ 16,226:
}
 
// sort parse array by position, length, and index
parseObj.tree.sort(
function(a, b) {
 
// by start position
if (a.start != b.start) {
return( a.start - b.start);
}
 
// by length
if (a.tagLength != b.tagLength) {
return( a.tagLength - b.tagLength);
}
 
// by index
return( a.index - b.index);
}
);
 
// add comments and highlighting
var from = 0;
var htmlArray = [];
 
// cycle through parse array and assemble html array
for (var i = 0; i < parseObj.tree.length; i ++) {
var node = parseObj.tree[i];
Line 12,747 ⟶ 16,258:
var tagTo = tagFrom + tagLength;
 
// drop overlapping highlighting //// |- in tables?!
if (tagFrom < from) {
continue;
}
 
// ignore root
if (tagFrom === nullundefined) {
continue;
}
 
// push leading plain text
htmlArray.push(obj.html.substring(from, tagFrom));
 
// push left html
if (htmlLeft !== nullundefined) {
htmlArray.push(htmlLeft);
}
 
// push right html
if (htmlRight !== nullundefined) {
htmlArray.push(obj.html.substring(tagFrom, tagTo));
htmlArray.push(htmlRight);
Line 12,777 ⟶ 16,288:
htmlArray.push(obj.html.substring(from));
 
// join html array
obj.html = htmlArray.join('');
 
// display highlighted html:
// WED(obj.html.replace(/\x00/g, '&lt;').replace(/\x01/g, '&gt;'));
 
return;
Line 12,788 ⟶ 16,299:
 
//
// WikEdHighlightLinkifywikEd.HighlightLinkify: prepare the span tag parameters for ctrl-click opening of highlighted links, addding redirect info, and highlighting redlinks
//
 
windowwikEd.WikEdHighlightLinkifyHighlightLinkify = function (linkPrefix, linkTitle, linkUrl) {
 
if (wikEdConfig['linkify'] != true) {
return('');
}
var linkName = '';
var subpage = false;
var link = '';
var info = '';
 
// generate url from interlanguage or namespace prefix and title
if (typeof linkUrl =!= null'string') {
 
// test for illegal characters
if ( (/[\{\|\}\[\]<>#]/.test(linkPrefix) == true) || (/[<>]/.test(linkUrl) == true) ) {
return( '');
}
 
// clean prefix and title
// remove highlighting code
linkPrefix = linkPrefixwikEd.replaceCleanLink(/<.*?>/g, ''linkPrefix);
linkTitle = linkTitlewikEd.replaceCleanLink(/<.*?>/g, ''linkTitle);
linkName = linkPrefix + linkTitle;
 
link = linkName;
// remove control chars
var regExp = new RegExp('[' + wikEdControlCharHighlightingStr + '\t\n\r]', 'g');
linkPrefix = linkPrefix.replace(regExp, '');
linkTitle = linkTitle.replace(regExp, '');
 
// fix strange white spaces, leading colons
linkPrefix = linkPrefix.replace(/\s/g, ' ');
linkPrefix = linkPrefix.replace(/^ +/, '');
linkPrefix = linkPrefix.replace(/^:+ *()/, '');
linkPrefix = linkPrefix.replace(/ +/g, '_');
 
linkTitle = linkTitle.replace(/\s/g, ' ');
linkTitle = linkTitle.replace(/ +$/, '');
linkTitle = linkTitle.replace(/^:+ *()/, '');
linkTitle = linkTitle.replace(/ +/g, '_');
 
// character accentuation for Esperanto, see [[Help:Special_characters#Esperanto]]
if (wikEdWikiGlobals['wikEd.wikiGlobals.wgContentLanguage'] == 'eo') {
linkTitle = linkTitle.replace(/([cghjsu])(x+)/gi,
function (p, p1, p2) {
var accentChar = p1;
var xString = p2;
Line 12,843 ⟶ 16,339:
xString = xString.replace(/(x)x/gi, '$1');
}
return( accentChar + xString);
}
);
}
 
// [[/subpage]] refers to a subpage of the current page, [[#section]] to a section of the current page
if ( (linkPrefix === '') && ( (linkTitle.indexOf('/') === 0) || (linkTitle.indexOf('#') === 0) ) ) {
subpage = true;
}
 
// Wiktionary differentiates between lower and uppercased titles, interwiki should not be uppercased
if (subpage === true) {
linkUrl = linkPrefix + wikEdPageNamewikEd.pageName + linkTitle;
}
else {
linkUrl = linkPrefix + linkTitle;
}
linkUrl = wikEd.EncodeTitle(linkUrl);
 
if (typeof wikEd.config.linkifyArticlePath == 'string') {
linkUrl = encodeURI(linkUrl);
linkUrl = linkUrlwikEd.config.linkifyArticlePath.replace(/%25(\d\d)$1/g, '%$1'linkUrl);
}
linkUrl = linkUrl.replace(/\'/g, '%27');
else if (typeof wikEd.wikiGlobals.wgArticlePath == 'string') {
linkUrl = linkUrl.replace(/#/g, '%23');
linkUrl = wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, linkUrl);
if (wikEdWikiGlobals['wgArticlePath'] == null) {
}
else {
linkUrl = '';
}
 
// detect redirect and redlink info
if ( (Object.prototype.hasOwnProperty.call(wikEd.linkInfo, link) === true) && (wikEd.linkInfo[link].updated === true) ) {
 
// redirect
if (wikEd.linkInfo[link].redirect === true) {
var target = wikEd.linkInfo[link].target;
if ( (target !== undefined) && (target !== null) ) {
info += wikEd.config.text.redirect + ' ' + target;
}
}
 
// redlinks
if (wikEd.linkInfo[link].missing === true) {
info += wikEd.config.text.redlink;
}
}
 
// collect new links
else {
wikEd.linkInfo[link] = {
linkUrl = wikEdWikiGlobals['wgArticlePath'].replace(/\$1/, linkUrl);
update: true,
linkName = linkPrefix + linkTitle;
updated: false,
};
}
}
 
// url provided
else {
 
// test for templatesillegal characters
if (/\{|\}[<>]/.test(linkUrl) === true) {
return( '');
}
 
linkName = linkUrl;
// test for templates
linkUrl = encodeURI(linkUrl);
if (/\{|\}/.test(linkUrl) === true) {
linkUrl = linkUrl.replace(/%25(\d\d)/g, '%$1');
return '';
linkUrl = linkUrl.replace(/\'/g, '%27');
}
linkName = wikEd.EncodeTitle(linkUrl);
}
 
var linkPopup = linkName;
if (subpage === true) {
linkPopup = wikEdPageNamewikEd.pageName + linkPopup;
}
linkPopup = linkPopup.replace(/<\t/g, '&lt; ');
linkPopup = linkPopupwikEd.replaceEscapeHtml(/>/g, '&gt;'linkPopup);
linkPopup = linkPopup.replace(/\"/g, '&quot;');
var linkParam = '';
 
if (linkUrl != '') {
if (linkUrl !== '') {
var titleClick;
if (wikEdPlatformwikEd.platform == 'mac') {
titleClick = wikEdConfig['wikEd.config.text']['.followLinkMac'];
}
else {
titleClick = wikEdConfig['wikEd.config.text']['.followLink'];
}
var id = 'wikEdWikiLink' + Object.getOwnPropertyNames(wikEd.wikiLinks).length;
linkParam += 'id="wikEdLinkify' + wikEdLinkifyArray.length + '" title="' + linkPopup + ' ' + titleClick + '"';
var linkify = linkPopup + ' ' + titleClick;
wikEdLinkifyArray.push(linkUrl);
linkParam += 'id="' + id + '" title="' + linkify + info + '"';
 
// save link infos for linkification and redlinking
wikEd.wikiLinks[id] = { url: linkUrl, link: link, linkify: linkify, info: info };
}
return( linkParam);
};
 
 
//
// wikEd.CleanLink: clean and normalize article title
// WikEdUpdateTextarea: copy frame content to textarea
//
 
windowwikEd.WikEdUpdateTextareaCleanLink = function (link) {
 
// remove highlighting code
// remove dynamically inserted nodes by other scripts
link = link.replace(/<[^>]*>/g, '');
WikEdCleanNodes(wikEdFrameDocument);
 
// remove control chars
var regExp = new RegExp('[' + wikEd.controlCharHighlightingStr + '\t\n\r]', 'g');
link = link.replace(regExp, '');
 
// fix strange white spaces, leading colons
link = link.replace(/\s/g, ' ');
link = link.replace(/^ +/, '');
link = link.replace(/^:+ *()/, '');
link = link.replace(/ +/g, '_');
 
// quotes and ampersand
link = link.replace(/&amp;quot;/g, '"');
link = link.replace(/&amp;apos;/g, '\'');
link = link.replace(/&amp;/g, '&');
 
return link;
};
 
 
//
// wikEd.EncodeTitle: encode article title for use in url (code copied to wikEdDiff.js)
//
 
wikEd.EncodeTitle = function (title) {
 
if (title === undefined) {
title = wikEd.wikiGlobals.wgTitle;
}
 
// characters not supported
title = title.replace(/[<>\[\]|{}]/g, '');
 
title = title.replace(/ /g, '_');
title = encodeURI(title);
title = title.replace(/%25(\d\d)/g, '%$1');
title = title.replace(/&/g, '%26');
title = title.replace(/#/g, '%23');
title = title.replace(/'/g, '%27');
title = title.replace(/\?/g, '%3F');
title = title.replace(/\+/g, '%2B');
return title;
};
 
 
//
// wikEd.EscapeHtml: escape html code, &<> to character entities
//
 
wikEd.EscapeHtml = function (html) {
 
html = html.replace(/&/g, '&amp;');
html = html.replace(/</g, '&lt;');
html = html.replace(/>/g, '&gt;');
return html;
};
 
 
 
//
// wikEd.UpdateTextarea: copy frame content or provided text to textarea
//
 
wikEd.UpdateTextarea = function (text) {
 
// get frame content
var obj = {};
if (text !== undefined) {
obj.html = wikEdFrameBody.innerHTML;
obj.html = text;
}
 
// get frame content, remove dynamically inserted nodes by other scripts
// remove trailing blanks and newlines at end of text
else {
wikEd.CleanNodes(wikEd.frameDocument);
obj.html = wikEd.frameBody.innerHTML;
}
 
// remove trailing blanks and newlines at end of text
obj.html = obj.html.replace(/((<br\b[^>]*>)|\s)+$/g, '');
 
// remove leading spaces in lines
obj.html = obj.html.replace(/(<br\b[^>]*>)[\n\r]* *()/g, '$1');
 
// textify so that no html formatting is submitted
WikEdTextifywikEd.Textify(obj);
obj.plain = obj.plain.replace(/&nbsp;|&#160;|\xa0/g, ' ');
obj.plain = obj.plain.replace(/&lt;/g, '<');
Line 12,935 ⟶ 16,533:
obj.plain = obj.plain.replace(/&amp;/g, '&');
 
// convert all &nbsp; char entitities to actual characters (customization option only)
// copy to textarea
if (wikEd.config.nbspToChar === true) {
wikEdTextarea.value = obj.plain;
obj.plain = obj.plain.replace(/&nbsp;/g, '\xa0');
}
 
// copy to textarea
wikEd.textarea.value = obj.plain;
 
// remember frame scroll position
wikEdFrameScrollTopwikEd.frameScrollTop = wikEdFrameBodywikEd.frameBody.scrollTop;
 
return;
Line 12,946 ⟶ 16,549:
 
//
// WikEdUpdateFramewikEd.UpdateFrame: copy textarea content or provided html to frame
//
 
windowwikEd.WikEdUpdateFrameUpdateFrame = function (html) {
 
// get textarea content
var obj = {};
if (html !== undefined) {
obj.html = wikEdTextarea.value;
obj.html = obj.html.replace(/&/g, '&amp;');
}
obj.html = obj.html.replace(/>/g, '&gt;');
else {
obj.html = obj.html.replace(/</g, '&lt;');
obj.html = wikEd.textarea.value;
obj.html = wikEd.EscapeHtml(obj.html);
 
// convert \xa (nbsp) to character entities so they do not get converted to blanks
// Opera 0.9.51
obj.html = obj.html.replace(/\r\n|\n\r|\rxa0/g, '\n&amp;nbsp;');
}
 
// highlight the syntax
if (wikEdHighlightSyntaxwikEd.highlightSyntax === true) {
obj.whole = true;
WikEdHighlightSyntaxwikEd.HighlightSyntax(obj);
}
 
// at least display tabs
else {
obj.html = obj.html.replace(/(\t)/g, '<span class="wikEdTabPlain">$1</span><!--wikEdTabPlain-->');
}
 
// multiple blanks to blank-&nbsp;
obj.html = obj.html.replace(/(^|\n) /g, '$1&nbsp;');
obj.html = obj.html.replace(/ (\n|$)/g, '&nbsp;$1');
Line 12,978 ⟶ 16,584:
obj.html = obj.html.replace(/ {2}/g, '&nbsp; ');
 
// newlines to <br>
obj.html = obj.html.replace(/\n/g, '<br>');
 
// insert content into empty frame
// select the whole text after replacing the whole text and scroll to same height
if ( (wikEd.readOnly === true) || (wikEd.frameBody.firstChild === null) || (/^<br[^>]*>\s*$/.test(wikEd.frameBody.innerHTML) === true) ) {
if (wikEdMSIE == true) {
wikEd.frameBody.innerHTML = obj.html;
 
}
else {
obj.sel = WikEdGetSelection();
WikEdRemoveAllRanges(obj.sel);
}
 
// insert content into empty frame
if ( (wikEdFrameBody.firstChild == null) || (/^<br[^>]*>\s*$/.test(wikEdFrameBody.innerHTML) == true) ) {
wikEdFrameBody.innerHTML = obj.html;
}
 
// insert content into frame, preserve history
else {
obj.sel = wikEd.GetSelection();
var range = wikEdFrameDocument.createRange();
obj.sel.removeAllRanges();
range.setStartBefore(wikEdFrameBody.firstChild);
var range = wikEd.frameDocument.createRange();
range.setEndAfter(wikEdFrameBody.lastChild);
range.setStartBefore(wikEd.frameBody.firstChild);
range.setEndAfter(wikEd.frameBody.lastChild);
obj.sel.addRange(range);
 
// replace the frame content with the new text, do not scroll
var scrollOffset = window.pageYOffset || document.body.scrollTop;
if (obj.html !== '') {
WikEdFrameExecCommandwikEd.frameDocument.execCommand('inserthtml', false, obj.html);
}
else {
WikEdFrameExecCommandwikEd.frameDocument.execCommand('delete');
}
window.scroll(0, scrollOffset);
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
 
// scroll to previous position
if (wikEdFrameScrollTopwikEd.frameScrollTop !== null) {
wikEdFrameBodywikEd.frameBody.scrollTop = wikEdFrameScrollTopwikEd.frameScrollTop;
}
}
wikEdFrameScrollTopwikEd.frameScrollTop = null;
 
// add event handlers and labels
if (wikEdHighlightSyntaxwikEd.highlightSyntax === true) {
 
// name ref and template buttons
wikEd.HighlightNamedHideButtons();
WikEdHighlightNamedHideButtons();
 
// add event handlers to unhide refs and templates
wikEd.HideAddHandlers();
WikEdHideAddHandlers();
 
// add event handlers to make highlighted frame links ctrl-clickable
wikEd.LinkifyLinks();
WikEdLinkifyAddHandlers();
}
 
// get link infos from server (redirects, redlinks)
wikEd.LinkInfoCall();
}
return;
};
Line 13,038 ⟶ 16,639:
 
//
// wikEd.HtmlToPlain: convert html to plain text, called from wikEd.GetText
// WikEdKeyHandler: event handler for keydown events in main document and frame
// detects emulated accesskey and traps enter in find/replace input elements
//
 
windowwikEd.WikEdKeyHandlerHtmlToPlain = function (eventobj) {
 
obj.plain = obj.html.replace(/[\n ]{2,}/g, ' ');
// event compatibility fixes
obj.plain = obj.plain.replace(/<br\b[^>]*>/g, '\n');
event = WikEdEvent(event, this);
obj.plain = obj.plain.replace(/\xa0/g, ' ');
if (event == null) {
return;
}
 
return;
if (wikEdUseWikEd == true) {
};
 
// trap enter in find/replace input elements
if ( (event.type == 'keydown') && (event.keyCode == 13) ) {
if (event.target.id == 'wikEdFindText') {
event.preventDefault();
event.stopPropagation();
if (event.shiftKey == true) {
WikEdEditButton(null, 'wikEdFindPrev');
}
else if (event.ctrlKey == true) {
WikEdEditButton(null, 'wikEdFindAll');
}
else {
WikEdEditButton(null, 'wikEdFindNext');
}
}
else if (event.target.id == 'wikEdReplaceText') {
event.preventDefault();
event.stopPropagation();
if (event.shiftKey == true) {
WikEdEditButton(null, 'wikEdReplacePrev');
}
else if (event.ctrlKey == true) {
WikEdEditButton(null, 'wikEdReplaceAll');
}
else {
WikEdEditButton(null, 'wikEdReplaceNext');
}
}
}
 
//
// detect emulated accesskeys
// wikEd.KeyHandler: event handler for keydown events in main document and frame
else if ( (event.shiftKey == true) && (event.ctrlKey == false) && (event.altKey == true) && (event.metaKey == false) ) {
// detects emulated accesskey and traps enter in find/replace input elements
//
 
wikEd.KeyHandler = function (event) {
// get wikEd button id from keycode
var buttonId = wikEdButtonKeyCode[event.keyCode];
if (buttonId != null) {
event.preventDefault();
event.stopPropagation();
 
// trap enter in find/replace input elements
// execute the button click handler code
if ( (event.type == 'keydown') && (event.keyCode == 13) ) {
var obj = document.getElementById(buttonId);
if (event.target.id == 'wikEdFindText') {
objId = obj.id;
event.preventDefault();
eval(wikEdEditButtonHandler[buttonId]);
event.stopPropagation();
if (event.shiftKey === true) {
wikEd.EditButton(null, 'wikEdFindPrev');
}
else if (event.ctrlKey === true) {
wikEd.EditButton(null, 'wikEdFindAll');
}
else {
wikEd.EditButton(null, 'wikEdFindNext');
}
}
else if (event.target.id == 'wikEdReplaceText') {
event.preventDefault();
event.stopPropagation();
if (event.shiftKey === true) {
wikEd.EditButton(null, 'wikEdReplacePrev');
}
else if (event.ctrlKey === true) {
wikEd.EditButton(null, 'wikEdReplaceAll');
}
else {
wikEd.EditButton(null, 'wikEdReplaceNext');
}
}
}
return;
};
 
// detect emulated accesskeys
else if ( (event.shiftKey === true) && (event.ctrlKey === false) && (event.altKey === true) && (event.metaKey === false) ) {
 
// get wikEd button id from keycode
//
var buttonId = wikEd.buttonKeyCode[event.keyCode];
// WikEdFrameExecCommand: wrapper for execCommand method
if (buttonId !== undefined) {
//
event.preventDefault();
event.stopPropagation();
 
// execute the button click handler code, obj required for eval
window.WikEdFrameExecCommand = function(command, option) {
var obj = document.getElementById(buttonId);
 
eval(wikEd.editButtonHandler[buttonId]);
if (typeof(wikEdFrameDocument.execCommand) == 'function') {
return;
wikEdFrameDocument.execCommand(command, false, option);
}
 
// MSIE workaround, breaks the undo history
else if (command == 'inserthtml') {
wikEdFrameDocument.selection.createRange().pasteHTML(option);
}
return;
Line 13,121 ⟶ 16,709:
 
//
// WikEdFindAheadwikEd.FindAhead: find-as-you-type, event handler for find field, supports insensitive and regexp settings
//
 
windowwikEd.WikEdFindAheadFindAhead = function () {
 
if (WikEdGetAttributewikEd.findAhead.getAttribute(wikEdFindAhead, 'checked') == 'true') {
 
// get the find text
var findText = wikEdFindTextwikEd.findText.value;
if (findText === '') {
return;
}
 
// remember input field selection
var findTextSelectionStart = wikEdFindTextwikEd.findText.selectionStart;
var findTextSelectionEnd = wikEdFindTextwikEd.findText.selectionEnd;
 
// remember frame selection
var sel = WikEdGetSelectionwikEd.GetSelection();
var range = sel.getRangeAt(sel.rangeCount - 10).cloneRange();
var rangeClone = range.cloneRange();
var scrollTop = wikEdFrameBodywikEd.frameBody.scrollTop;
 
// collapse selection to the left
sel.removeAllRanges();
WikEdRemoveAllRanges(sel);
range.collapse(true);
range = sel.addRange(range);
 
// create obj for regexp search
var obj = {};
 
// get insensitive and regexp button states
// get the replace text
var regExpChecked = wikEd.regExp.getAttribute('checked');
var replaceText = wikEdInputElement['replace'].value;
var caseSensitiveChecked = wikEd.caseSensitive.getAttribute('checked');
 
// get insensitive and regexp button states
var regExpChecked = WikEdGetAttribute(wikEdRegExp, 'checked');
var caseSensitiveChecked = WikEdGetAttribute(wikEdCaseSensitive, 'checked');
 
// get case sensitive setting
var caseSensitive = false;
if (caseSensitiveChecked == 'true') {
Line 13,165 ⟶ 16,750:
}
 
// get regexp setting
var useRegExp = false;
if (regExpChecked == 'true') {
Line 13,171 ⟶ 16,756:
}
 
// parameters: obj, findText, caseSensitive, backwards, wrap, useRegExp
var found = WikEdFindwikEd.Find(obj, findText, caseSensitive, false, true, useRegExp);
 
// restore original frame selection
if (found === false) {
wikEdFrameBodywikEd.frameBody.scrollTop = scrollTop;
sel.removeAllRanges();
WikEdRemoveAllRanges(sel);
sel.addRange(rangeClone);
}
else {
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// scroll to selection
WikEdScrollToSelectionwikEd.ScrollToSelection();
}
 
// restore input field selection (needed for FF 3.6)
wikEd.findText.select();
wikEd.findText.setSelectionRange(findTextSelectionStart, findTextSelectionEnd);
}
return;
};
 
// restore input field selection (needed for FF 3.6)
wikEdFindText.select();
wikEdFindText.setSelectionRange(findTextSelectionStart, findTextSelectionEnd);
 
//
// wikEd.DebugInfo: click handler for ctrl-click of logo buttons, pastes debug info into edit field or popup; shift-ctrl-click: extended info with resource loader modules
//
 
wikEd.DebugInfo = function (event) {
 
// ctrl-click
if (event.ctrlKey !== true) {
return;
}
 
// get debug infos
var debug = wikEd.GetDebugInfo(event.shiftKey);
debug = debug.replace(/(^|\n(?=.))/g, '$1* ');
debug = '=== wikEd bug report: ____ (Please add short title) === \n\n' + debug;
debug += '* Error console: ____ (Firefox: Tools → Web Developer → Browser console; push clear and reload the page. Chrome: Control button → Tools → JavaScript console. Copy and paste error messages related to wikEd.js)\n';
debug += '* Problem description: ____ (Please be as specific as possible about what is wrong, including when it happens, what happens, what is broken, and what still works)\n';
debug += '* Steps to reproduce: ____ (Please include what happens at each step. Your problems cannot be fixed without reproducing them first!)\n';
 
// print to iframe, textarea, debug area, or alert
if (event.target == wikEd.logo) {
window.alert(debug);
}
else if (wikEd.useWikEd === true) {
debug = wikEd.EscapeHtml('\n' + debug).replace(/\n/g, '<br>');
wikEd.frameDocument.execCommand('inserthtml', false, debug);
}
else if (wikEd.textarea !== null) {
wikEd.textarea.value += '\n' + debug;
}
else {
wikEd.Debug(debug, undefined, true);
}
return;
};
Line 13,198 ⟶ 16,819:
 
//
// wikEd.GetDebugInfo: compiles debug info into string
// WikEdMainSwitch: click handler for program logo
//
 
windowwikEd.WikEdMainSwitchGetDebugInfo = function (extended) {
 
var loader = '';
// disable function if browser is incompatible
var mediawiki = '';
if (wikEdBrowserNotSupported == true) {
var gadgets = '';
var scripts = '';
 
// cycle through script urls
var pageScripts = document.getElementsByTagName('script');
for (var i = 0; i < pageScripts.length; i ++) {
var src = pageScripts[i].src;
if (src !== '') {
 
// resource loader modules
var regExpMatch = /load.php\?(|.*?&)modules=(.*?)(&|$)/.exec(src);
if (regExpMatch !== null) {
loader += decodeURIComponent(regExpMatch[2]).replace(/\|/g, '; ') + '; ';
}
 
// mediawiki: scripts
else {
var regExpMatch = /index.php\?(|.*?&)title=(.*?)(&|$)/.exec(src);
if (regExpMatch !== null) {
var script = regExpMatch[2];
if (/^MediaWiki:Gadget/.test(script) === true) {
gadgets += script.replace(/^MediaWiki:/, '') + ', ';
}
else if (/^MediaWiki:/.test(script) === true) {
mediawiki += script.replace(/^MediaWiki:/, '') + ', ';
}
else {
scripts += script + ', ';
}
}
 
// other scripts
else {
var regExpScript = new RegExp(wikEd.wikiGlobals.wgServer + '(' + wikEd.wikiGlobals.wgScriptPath + ')?');
scripts += src.replace(regExpScript, '').replace(/\?.*/, '') + ', ';
}
}
}
}
 
// get date
var date = new Date();
var time = (date.getUTCFullYear() + '-' + (date.getUTCMonth() + 1) + '-' + date.getUTCDate() + ' ' + date.getUTCHours() + ':' + date.getUTCMinutes() + ':' + date.getUTCSeconds() + ' UTC').replace(/\b(\d)\b/g, '0$1');
 
// get user subpages
var protocol = document.___location.href.replace(/\/\/.*/, '');
var subPages = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, 'Special:PrefixIndex/' + wikEd.wikiGlobals.wgFormattedNamespaces[2] + ':' + wikEd.EncodeTitle(wikEd.wikiGlobals.wgUserName) + '/');
if (/^\/\//.test(subPages) === true) {
subPages = protocol + subPages;
}
 
// get user js pages
var userPage = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, wikEd.wikiGlobals.wgFormattedNamespaces[2] + ':' + wikEd.EncodeTitle(wikEd.wikiGlobals.wgUserName));
if (/^\/\//.test(userPage) === true) {
userPage = protocol + userPage;
}
var skinJs = userPage + '/' + wikEd.wikiGlobals.skin + '.js';
var commonJs = userPage + '/common.js';
 
// remove trailing separators
loader = loader.replace(/; $/, '');
mediawiki = mediawiki.replace(/, $/, '');
gadgets = gadgets.replace(/, $/, '');
scripts = scripts.replace(/, $/, '');
 
var debug = '';
debug += 'Date: ' + time + '\n';
debug += 'wikEd version: ' + wikEd.programVersion + wikEd.installationType + ' (' + wikEd.programDate + ')\n';
debug += 'Browser: ' + window.navigator.userAgent + ' (' + window.navigator.platform + ')\n';
debug += 'Skin: ' + wikEd.wikiGlobals.skin + ' (detected: ' + wikEd.skin + ')\n';
debug += 'MediaWiki: ' + wikEd.wikiGlobals.wgVersion + '\n';
debug += 'Gadgets: ' + gadgets + '\n';
debug += 'MediaWiki scripts: ' + mediawiki + '\n';
debug += 'Scripts: ' + scripts + '\n';
if (extended === true) {
debug += 'Loader: ' + loader + '\n';
}
debug += 'URL: ' + window.___location.href + '\n';
debug += 'User subpages: ' + subPages + '\n';
debug += 'User/skin.js: ' + skinJs + '\n';
debug += 'User/common.js: ' + commonJs + '\n';
 
return debug;
};
 
 
//
// wikEd.MainSwitch: click handler for program logo
//
 
wikEd.MainSwitch = function (event) {
 
// ctrl-click for debug info
if (event.ctrlKey === true) {
return;
}
 
// disable function if browser is incompatible
// enable wikEd
if (wikEdDisabledwikEd.browserNotSupported === true) {
return;
wikEdDisabled = false;
}
WikEdSetPersistent('wikEdDisabled', '0', 0, '/');
 
// enable wikEd
// turn rich text frame on
if (wikEdTurnedOnwikEd.disabled === falsetrue) {
 
// check for active code editor
// setup wikEd
wikEd.CodeEditorCheck();
WikEdTurnOn(false);
 
// do not turn on when code editor is active
if (wikEd.useCodeEditor === true) {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', 'Code Editor');
return;
}
 
wikEd.disabled = false;
wikEd.SetPersistent('wikEdDisabled', '0', 0, '/');
 
// turn rich text frame on
if (wikEd.turnedOn === false) {
 
// setup wikEd
wikEd.TurnOn(false);
}
else {
WikEdSetLogowikEd.SetLogo();
var useWikEd = false;
if (WikEdGetAttribute(document.getElementById('wikEdUseWikEd'), .getAttribute('checked') == 'true') {
useWikEd = true;
}
WikEdSetEditAreawikEd.SetEditArea(useWikEd);
wikEdUseWikEdwikEd.useWikEd = useWikEd;
if (window.wikEdUseWikEd == true) {wikEd.useWikEd;
if (wikEd.useWikEd === true) {
WikEdUpdateFrame();
wikEd.UpdateFrame();
}
wikEdButtonsWrapperwikEd.buttonBarWrapper.style.display = 'block';
wikEdButtonBarPreviewwikEd.buttonBarPreview.style.display = 'block';
if (wikEdButtonBarJumpwikEd.buttonBarJump !== null) {
wikEdButtonBarJumpwikEd.buttonBarJump.style.display = 'block';
}
 
// run scheduled custom functions
WikEdExecuteHookwikEd.ExecuteHook(wikEdConfig['wikEd.config.onHook']);
}
}
 
// disable wikEd
else {
WikEdSetPersistentwikEd.SetPersistent('wikEdDisabled', '1', 0, '/');
if (wikEdTurnedOnwikEd.turnedOn === false) {
wikEdUseWikEdwikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEdDisabled = true;
wikEd.disabled = true;
WikEdSetLogo();
wikEd.SetLogo();
}
else {
 
if (wikEdFullScreenMode == true) {
// interrupt fullscreen mode
WikEdFullScreen(false);
if (wikEd.fullscreen === true) {
wikEd.FullScreen(false);
}
 
// turn classic textarea on
if (wikEdUseWikEdwikEd.useWikEd === true) {
WikEdUpdateTextareawikEd.UpdateTextarea();
}
WikEdSetEditAreawikEd.SetEditArea(false);
 
// reset textarea dimensions
wikEdTextareawikEd.textarea.style.height = (wikEdTextareaOffsetHeightInitialwikEd.textareaOffsetHeightInitial - wikEdFrameBorderHeightwikEd.frameBorderHeight) + 'px';
wikEdTextareawikEd.textarea.style.width = '100%';
 
wikEdFrameHeightwikEd.frameHeight = (wikEdTextareaOffsetHeightInitialwikEd.textareaOffsetHeightInitial - wikEdFrameBorderHeightwikEd.frameBorderHeight) + 'px';
wikEdFrameWidthwikEd.frameWidth = (wikEdEditorWrapperwikEd.editorWrapper.clientWidth - wikEdFrameBorderWidthwikEd.frameBorderWidth) + 'px';
wikEdFramewikEd.frame.style.height = wikEdFrameHeightwikEd.frameHeight;
wikEdFramewikEd.frame.style.width = wikEdFrameWidthwikEd.frameWidth;
 
wikEdButtonsWrapperwikEd.buttonBarWrapper.style.display = 'none';
wikEdButtonBarPreviewwikEd.buttonBarPreview.style.display = 'none';
 
wikEdLocalPrevWrapper.style.display = 'none';
wikEdPreviewBoxwikEd.previewArticle.style.heightdisplay = 'autonone';
wikEd.previewDiff.style.display = 'none';
if (wikEdButtonBarJump != null) {
wikEdButtonBarJumpwikEd.localPrevWrapper.style.display = 'none';
wikEd.localPrevWrapper.style.height = 'auto';
 
if (wikEd.buttonBarJump !== null) {
wikEd.buttonBarJump.style.display = 'none';
}
 
wikEdUseWikEdwikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEdDisabled = true;
wikEd.disabled = true;
WikEdSetLogo();
wikEd.SetLogo();
 
// run scheduled custom functions
WikEdExecuteHookwikEd.ExecuteHook(wikEdConfig['wikEd.config.offHook']);
}
}
Line 13,290 ⟶ 17,030:
 
//
// WikEdFullScreenwikEd.FullScreen: change to fullscreen edit area or back to normal view
//
 
windowwikEd.WikEdFullScreenFullScreen = function (fullscreen, notFrameupdateButton) {
 
// resize only
// hide or show elements
if (fullscreen === undefined) {
var displayStyle;
if ( fullscreen == true) {wikEd.fullscreen;
displayStyle = 'none';
}
else {
displayStyle = 'block';
}
 
// no fullscreen for special edit pages
// elements above input wrapper
if (wikEd.editArticle === false) {
var node = document.getElementById('editform').previousSibling;
fullscreen = false;
while (node != null) {
updateButton = false;
if ( (node.nodeName == 'DIV') || (node.nodeName == 'H3') ) {
node.style.display = displayStyle;
}
node = node.previousSibling;
}
document.getElementsByTagName('H1')[0].style.display = displayStyle;
 
// no fullscreen for textarea view
// divs below input wrapper
if (wikEd.useWikEd === false) {
var node = wikEdInputWrapper.nextSibling;
fullscreen = false;
while (node != null) {
updateButton = false;
if (node.nodeName == 'DIV') {
node.style.display = displayStyle;
}
node = node.nextSibling;
}
 
// skip for repeat calls
// divs below input wrapper, some levels up
if (fullscreen != wikEd.fullscreen) {
var node = document.getElementById('column-one');
 
while (node != null) {
// disable frame resizing
if (node.nodeName == 'DIV') {
if ( (wikEd.fullscreen === false) && (wikEd.frameDocument !== null) ) {
node.style.display = displayStyle;
wikEd.ResizeStopHandler();
}
node = node.nextSibling;
}
 
// setup fullscreen
// insert wrapper
if (fullscreen === true) {
document.getElementById('wikEdInsertWrapper').style.display = displayStyle;
document.body.classList.add('wikEdFullscreen');
 
// inactivate scroll-to buttons
// change styles
document.getElementById('wikEdScrollToPreview').className = 'wikEdButtonInactive';
if (fullscreen == true) {
document.getElementById('wikEdScrollToEdit').className = 'wikEdButtonInactive';
if (notFrame != true) {
wikEdInputWrapper.className = 'wikEdInputWrapperFull';
}
 
wikEdButtonBarPreview.className = 'wikEdButtonBarPreviewFull';
// back to normal
}
else {
document.body.classList.remove('wikEdFullscreen');
if (notFrame != true) {
 
wikEdInputWrapper.className = 'wikEdInputWrapper';
// activate scroll-to buttons
document.getElementById('wikEdScrollToPreview').className = 'wikEdButton';
document.getElementById('wikEdScrollToEdit').className = 'wikEdButton';
}
wikEdButtonBarPreview.className = 'wikEdButtonBarPreview';
}
var switched = (fullscreen != wikEd.fullscreen);
if (switched === true) {
wikEd.fullscreen = fullscreen;
 
// resizeset the framefullscreen button state
if (fullscreenupdateButton === true) {
wikEd.Button(document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, fullscreen);
 
wikEd.fullScreenMode = fullscreen;
// end frame resizing
WikEdRemoveEventListener(wikEdFrameDocument, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(document, 'mouseup', WikEdResizeStopHandler, true);
WikEdRemoveEventListener(wikEdFrameDocument, 'mousemove', WikEdResizeDragHandlerFrame, true);
WikEdRemoveEventListener(document, 'mousemove', WikEdResizeDragHandlerDocument, true);
wikEdResizeFrameMouseOverGrip = false;
WikEdRemoveEventListener(wikEdFrameDocument, 'mousedown', WikEdResizeStartHandler, true);
wikEdFrameBody.style.cursor = 'auto';
wikEdResizeFrameActive = false;
 
var consoleTop = WikEdGetOffsetTop(wikEdConsoleWrapper);
var consoleHeight = wikEdConsoleWrapper.offsetHeight;
var frameHeight = wikEdFrame.offsetHeight;
var windowHeight = WikEdGetWindowInnerHeight();
 
wikEdFrame.style.height = (frameHeight + (windowHeight - (consoleTop + consoleHeight) ) - 2) + 'px';
wikEdFrame.style.width = (wikEdEditorWrapper.clientWidth - wikEdFrameBorderWidth) + 'px';
}
else {
if (wikEdFrameHeight == 0) {
wikEdFrameHeight = (wikEdTextareaOffsetHeightInitial - wikEdFrameBorderHeight) + 'px';
wikEdFrameWidth = (wikEdEditorWrapper.clientWidth - wikEdFrameBorderWidth) + 'px';
}
wikEdFrame.style.height = wikEdFrameHeight;
wikEdFrame.style.width = wikEdFrameWidth;
}
 
// resize and scroll to edit-frame
wikEd.ResizeWindowHandler();
if (fullscreen == false) {
if ( (switched === true) && (fullscreen === false) ) {
window.scroll(0, WikEdGetOffsetTop(wikEdInputWrapper) - 2);
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper) - 2);
}
 
// setgrey theout fullscreen button state
WikEdButton(var button = document.getElementById('wikEdFullScreen'), 'wikEdFullScreen', null, fullscreen);
if ( (wikEd.editArticle === false) || (wikEd.useWikEd === false) ) {
 
button.className = 'wikEdButtonInactive';
// grey out or re-activate scroll-to buttons
}
var hideButtonClass;
else if (fullscreenwikEd.fullScreenMode === true) {
button.className = 'wikEdButtonChecked';
hideButtonClass = 'wikEdButtonInactive';
}
else {
button.className = 'wikEdButtonUnchecked';
hideButtonClass = 'wikEdButton';
}
document.getElementById('wikEdScrollToPreview').className = hideButtonClass;
document.getElementById('wikEdScrollToPreview2').className = hideButtonClass;
document.getElementById('wikEdScrollToEdit').className = hideButtonClass;
document.getElementById('wikEdScrollToEdit2').className = hideButtonClass;
 
// resize the summary field
WikEdResizeSummary();
 
wikEdFullScreenMode = fullscreen;
 
return;
Line 13,410 ⟶ 17,112:
 
//
// WikEdResizeSummarywikEd.ResizeSummary: recalculate the summary width after resizing the window
//
 
windowwikEd.WikEdResizeSummaryResizeSummary = function () {
 
// check if combo field exists
if (wikEdSummarySelectwikEd.summarySelect === null) {
return;
}
 
wikEdSummaryTextwikEd.summaryText.style.width = '';
wikEdSummarySelectwikEd.summarySelect.style.width = '';
 
wikEdSummaryTextWidthwikEd.summaryTextWidth = wikEdSummaryWrapperwikEd.summaryWrapper.clientWidth - ( WikEdGetOffsetLeftwikEd.GetOffsetLeft(wikEdSummaryTextwikEd.summaryText) - WikEdGetOffsetLeftwikEd.GetOffsetLeft(wikEdSummaryWrapperwikEd.summaryWrapper) );
if (wikEdSummaryTextWidthwikEd.summaryTextWidth < 150) {
wikEdSummaryTextWidthwikEd.summaryTextWidth = 150;
}
wikEdSummaryTextwikEd.summaryText.style.width = wikEdSummaryTextWidthwikEd.summaryTextWidth + 'px';
WikEdResizeComboInputwikEd.ResizeComboInput('summary');
return;
};
Line 13,434 ⟶ 17,136:
 
//
// WikEdResizeComboInputwikEd.ResizeComboInput: set the size of theinput backgroundand select boxesfields so that only the select button is visible behind the input field
// calculates the select button width as the difference between select and option width
// adjusts widths so that only the select button is visible behind the input field
//
 
windowwikEd.WikEdResizeComboInputResizeComboInput = function (field) {
 
// check if combo field exists
if (wikEdSelectElementwikEd.selectElement[field] === nullundefined) {
return;
}
 
// short names
// detect browser for MS IE fixes
var input = wikEd.inputElement[field];
var standardBrowser = true;
var select = wikEd.selectElement[field];
if (wikEdSelectElement[field].options.offsetWidth != null ) {
standardBrowser = false;
}
 
// setsave select heightoptions and topempty select
var selectInnerHTML = select.innerHTML;
if (standardBrowser == false) {
select.innerHTML = '';
wikEdSelectElement[field].style.height = (wikEdInputElement[field].clientHeight + 6) + 'px';
wikEdSelectElement[field].style.top = '3px';
wikEdInputElement[field].style.top = '3px';
}
 
// set measuring styles
// add a dummy option if no option exists yet
select.style.fontFamily = 'sans-serif';
var dummy;
input.style.margin = '0';
var testOption = 1;
select.style.margin = '0';
if (standardBrowser == true) {
select.style.width = 'auto';
if (wikEdSelectElement[field].options.length == 0) {
testOption = 0;
wikEdSelectElement[field].options[0] = new Option('');
dummy = true;
}
}
 
// get button width from small empty select box
// set option widths to 0
var inputWidth = input.offsetWidth;
if (standardBrowser == true) {
var selectWidth = select.offsetWidth;
for (var i = 0; i < wikEdSelectElement[field].options.length; i ++) {
var selectBorder = parseInt(wikEd.GetStyle(select, 'borderTopWidth'), 10);
wikEdSelectElement[field].options[i].style.width = '0';
var buttonWidth = selectWidth - selectBorder - 8;
}
}
 
// delete measuring styles
// get input width
select.style.margin = null;
var inputBorder = (wikEdInputElement[field].offsetWidth - wikEdInputElement[field].clientWidth);
input.style.fontFamily = null;
var inputWidthInner = wikEdInputElement[field].clientWidth;
select.style.fontFamily = null;
var inputWidthOuter = wikEdInputElement[field].offsetWidth;
 
// getfor selectlong fields shorten input width
if (inputWidth + buttonWidth > 150) {
var selectWidthInner = wikEdSelectElement[field].clientWidth;
input.style.width = (inputWidth - buttonWidth) + 'px';
var selectWidthOuter = wikEdSelectElement[field].offsetWidth;
select.style.width = inputWidth + 'px';
 
// get option width and calculate button width
var optionWidthInner;
var buttonWidth;
if (standardBrowser == true) {
 
// Firefox < 3.0
if ( typeof(wikEdSelectElement[field].options[testOption].clientLeft) == 'undefined' ) {
optionWidthInner = wikEdSelectElement[field].options[testOption].clientWidth;
buttonWidth = selectWidthInner - optionWidthInner - 6;
}
 
// Firefox >= 3.0
else {
optionWidthInner = wikEdSelectElement[field].options[testOption].clientWidth;
buttonWidth = selectWidthInner - optionWidthInner;
}
}
else {
buttonWidth = selectWidthOuter - selectWidthInner - 4;
}
 
// otherwise increase select width
// for long fields shorten input
if (inputWidthOuter + buttonWidth > 150) {
wikEdInputElement[field].style.width = (inputWidthInner - inputBorder - buttonWidth) + 'px';
wikEdSelectElement[field].style.width = (inputWidthInner) + 'px';
}
 
// otherwise increase select width
else {
wikEdSelectElement[field]select.style.width = (inputWidthOuterinputWidth + buttonWidth) + 'px';
}
 
// restore select options
// delete dummy option
select.innerHTML = selectInnerHTML;
if (dummy == true) {
wikEdSelectElement[field].options[0] = null;
}
 
// set option widths to auto
if (standardBrowser == true) {
for (var i = 0; i < wikEdSelectElement[field].options.length; i ++) {
wikEdSelectElement[field].options[i].style.width = 'auto';
}
}
return;
};
Line 13,534 ⟶ 17,190:
 
//
// WikEdChangeComboInputwikEd.ChangeComboInput: sets the input value to selected option; onchange event handler for select boxes
//
 
windowwikEd.WikEdChangeComboInputChangeComboInput = function (field) {
 
// get selection index (-1 for unselected)
var selected = wikEdSelectElementwikEd.selectElement[field].selectedIndex;
if (selected >= 0) {
wikEdSelectElementwikEd.selectElement[field].selectedIndex = -1;
 
// get selected option
var option = wikEdSelectElementwikEd.selectElement[field].options[selected];
if (option.text !== '') {
 
// jump to heading
if ( (field == 'find') && (/^=.*?=$/.test(option.value) === true) ) {
var obj = {};
var findText = option.value.replace(/([\\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1');
findText = '^' + findText + '$';
 
// find and select heading text
var found = WikEdFindwikEd.Find(obj, findText, true, false, true, true);
WikEdRemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// and scroll it into the viewport
WikEdScrollToSelectionwikEd.ScrollToSelection();
return;
}
 
// update input field
else {
 
// add a tag to the summary box
if (field == 'summary') {
wikEdInputElementwikEd.inputElement[field].value = WikEdAppendToSummarywikEd.AppendToSummary(wikEdInputElementwikEd.inputElement[field].value, option.text);
}
 
// add case and regexp checkboxes to find / replace fields
else if (option.value == 'setcheck') {
WikEdButtonwikEd.Button(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, (option.text.charAt(0) == wikEdCheckMarkerwikEd.checkMarker[true]) );
WikEdButtonwikEd.Button(document.getElementById('wikEdRegExp'), 'wikEdRegExp', null, (option.text.charAt(1) == wikEdCheckMarkerwikEd.checkMarker[true]) );
wikEdInputElementwikEd.inputElement[field].value = option.text.substr(3);
}
 
// add option text
else {
wikEdInputElementwikEd.inputElement[field].value = option.text;
}
 
// find the new text
if ( (field == 'find') && (WikEdGetAttributewikEd.findAhead.getAttribute(wikEdFindAhead, 'checked') == 'true') ) {
WikEdFindAheadwikEd.FindAhead();
}
}
}
}
wikEdInputElementwikEd.inputElement[field].focus();
 
return;
Line 13,598 ⟶ 17,254:
 
//
// WikEdAppendToSummarywikEd.AppendToSummary: append a phrase to the summary text
//
 
windowwikEd.WikEdAppendToSummaryAppendToSummary = function (summary, append) {
 
summary = summary.replace(/^[, ]+/, '');
summary = summary.replace(/[, ]+$/, '');
if (summary !== '') {
if (summary.match(/ \*\/$/.test(summary) !=== nulltrue) {
summary += ' ';
}
else if (summary.match(/[\.\;\:]$/.test(summary) !=== nulltrue) {
summary += ' ';
}
else if (summary.match(/^[\wŠŒŽšœžŸÀ-ÖØ-öø-\u0220\u0222-\u0233ΆΈΉΊΌΎΏΑ-ΡΣ-ώ\u0400-\u0481\u048a-\u04ce\u04d0-\u04f5\u04f8\u04f9\(\)\"\'\+\-]/) == null) {
summary += ' ';
}
else {
var regExp = new RegExp('^[' + wikEd.letters + '_0-9()"\'+\\-]', '');
summary += ', ';
if (regExp.test(summary) === false) {
summary += ' ';
}
else {
summary += ', ';
}
}
}
summary += append;
 
return( summary);
};
 
 
//
// WikEdAddToHistorywikEd.AddToHistory: add an input value to the saved history
//
 
windowwikEd.WikEdAddToHistoryAddToHistory = function (field) {
 
if (wikEdInputElementwikEd.inputElement[field].value !== '') {
 
// load history from saved settings
WikEdLoadHistoryFromSettingswikEd.LoadHistoryFromSettings(field);
 
// add current value to history
wikEdFieldHistwikEd.fieldHist[field].unshift(wikEdInputElementwikEd.inputElement[field].value);
 
// add case and regexp checkboxes to find / replace value
if ( (field == 'find') || (field == 'replace') ) {
wikEdFieldHistwikEd.fieldHist[field][0] =
wikEdCheckMarkerwikEd.checkMarker[ (WikEdGetAttributewikEd.caseSensitive.getAttribute(wikEdCaseSensitive, 'checked') == 'true') ] +
wikEdCheckMarkerwikEd.checkMarker[ (WikEdGetAttributewikEd.regExp.getAttribute(wikEdRegExp, 'checked') == 'true') ] +
' ' + wikEdFieldHistwikEd.fieldHist[field][0];
}
 
// remove paragraph names from summary
if (field == 'summary') {
wikEdFieldHistwikEd.fieldHist[field][0] = wikEdFieldHistwikEd.fieldHist[field][0].replace(/^\/\* .*? \*\/ *()/, '');
}
 
// remove multiple old copies from history
var i = 1;
while (i < wikEdFieldHistwikEd.fieldHist[field].length) {
if (wikEdFieldHistwikEd.fieldHist[field][i] == wikEdFieldHistwikEd.fieldHist[field][0]) {
wikEdFieldHistwikEd.fieldHist[field].splice(i, 1);
}
else {
Line 13,663 ⟶ 17,322:
}
 
// remove new value if it is a preset value
if (wikEdConfig['wikEd.config.comboPresetOptions'][field] !== nullundefined) {
var i = 0;
while (i < wikEdConfig['wikEd.config.comboPresetOptions'][field].length) {
if (wikEdConfig['wikEd.config.comboPresetOptions'][field][i] == wikEdFieldHistwikEd.fieldHist[field][0]) {
wikEdFieldHistwikEd.fieldHist[field].shift();
break;
}
Line 13,677 ⟶ 17,336:
}
 
// cut history number to maximal history length
wikEdFieldHistwikEd.fieldHist[field] = wikEdFieldHistwikEd.fieldHist[field].slice(0, wikEdConfig['wikEd.config.historyLength'][field]);
 
// save history to settings
if (wikEdFieldHistwikEd.fieldHist[field][0] !== '') {
WikEdSaveHistoryToSettingwikEd.SaveHistoryToSetting(field);
}
}
Line 13,690 ⟶ 17,349:
 
//
// WikEdSetComboOptionswikEd.SetComboOptions: generate the select options from saved history; onfocus handler for select box
//
 
windowwikEd.WikEdSetComboOptionsSetComboOptions = function (field) {
 
// load history from saved settings
WikEdLoadHistoryFromSettingswikEd.LoadHistoryFromSettings(field);
 
var option = {};
var selectedOption = null;
 
// delete options
var options = wikEdSelectElementwikEd.selectElement[field].options;
for (var i = 0; i < options.length; i ++) {
wikEdSelectElementwikEd.selectElement[field].remove(i);
}
 
// delete optgroup
option = document.getElementById(field + 'Optgroup');
if (option !== null) {
wikEdSelectElementwikEd.selectElement[field].removeChild(option);
}
 
// workaround for onchange not firing when selecting first option from unselected dropdown
option = document.createElement('option');
option.style.display = 'none';
var j = 0;
wikEdSelectElementwikEd.selectElement[field].options[j++] = option;
 
// add history entries
for (var i = 0; i < wikEdFieldHistwikEd.fieldHist[field].length; i ++) {
if (wikEdFieldHistwikEd.fieldHist[field][i] !== nullundefined) {
if (wikEdFieldHistwikEd.fieldHist[field][i] == wikEdInputElementwikEd.inputElement[field].value) {
selectedOption = j;
}
option = document.createElement('option');
 
// replace spaces with nbsp to allow for multiple, leading, and trailing spaces
option.text = wikEdFieldHistwikEd.fieldHist[field][i].replace(/ /g, '\xa0');
if ( (field == 'find') || (field == 'replace') ) {
option.value = 'setcheck';
}
wikEdSelectElementwikEd.selectElement[field].options[j++] = option;
}
}
 
// add preset entries
var startPreset = 0;
if (wikEdConfig['wikEd.config.comboPresetOptions'][field] !== nullundefined) {
startPreset = j;
for (var i = 0; i < wikEdConfig['wikEd.config.comboPresetOptions'][field].length; i ++) {
if (wikEdConfig['wikEd.config.comboPresetOptions'][field][i] !== nullundefined) {
 
// replace spaces with nbsp to allow for multiple, leading, and trailing spaces
wikEdConfig['wikEd.config.comboPresetOptions'][field][i] = wikEdConfig['wikEd.config.comboPresetOptions'][field][i].replace(/ /g, '\xa0');
 
// select a dropdown value
if (wikEdConfig['wikEd.config.comboPresetOptions'][field][i] == wikEdInputElementwikEd.inputElement[field].value) {
selectedOption = j;
}
 
option = document.createElement('option');
option.text = wikEdConfig['wikEd.config.comboPresetOptions'][field][i].replace(/ /g, '\xa0');
if (field == 'summary') {
option.text = option.text.replace(/\{wikEdUsing\}/g, wikEdConfig['wikEd.config.summaryUsing']);
}
wikEdSelectElementwikEd.selectElement[field].options[j++] = option;
}
}
}
 
// set the selection
wikEdSelectElementwikEd.selectElement[field].selectedIndex = selectedOption;
 
// add a blank preset separator
if ( (startPreset > 1) && (startPreset < j) ) {
option = document.createElement('optgroup');
option.label = '\xa0';
option.id = field + 'Optgroup';
wikEdSelectElementwikEd.selectElement[field].insertBefore(option, wikEdSelectElementwikEd.selectElement[field].options[startPreset]);
}
 
// add the TOC jumper to the find field
var startTOC = 0;
if (field == 'find') {
startTOC = j;
 
// get the whole plain text
var plain = wikEdFrameBodywikEd.frameBody.innerHTML;
plain = plain.replace(/<br\b[^>]*>/g, '\n');
plain = plain.replace(/<.[^>]*?>/g, '');
plain = plain.replace(/&nbsp;/g, '\xa0');
plain = plain.replace(/&gt;/g, '>');
Line 13,786 ⟶ 17,445:
plain = plain.replace(/&amp;/g, '&');
 
// cycle through the headings
var headingregExpMatchHeading = plain.match(/(^|\n)=+.+?=+[^\n=]*[ =\t]*(?=(\n|$))/g);
if (headingregExpMatchHeading !== null) {
for (var i = 0; i < headingregExpMatchHeading.length; i ++) {
var headingMatch = headingregExpMatchHeading[i].match(/\n?((=+) *(.+?)( *\2))/);
var headingIndent = headingMatch[2];
headingIndent = headingIndent.replace(/^=/g, '');
headingIndent = headingIndent.replace(/\=/g, '\xa0');
 
// add headings to the select element
option = document.createElement('option');
option.text = '\u21d2' + headingIndent + headingMatch[3];
option.value = headingMatch[1];
wikEdSelectElementwikEd.selectElement[field].options[j++] = option;
}
}
}
 
// add a blank TOC separator
if ( (startTOC > 1) && (startTOC < j) ) {
option = document.createElement('optgroup');
option.label = '\xa0';
option.id = field + 'Optgroup';
wikEdSelectElementwikEd.selectElement[field].insertBefore(option, wikEdSelectElementwikEd.selectElement[field].options[startTOC]);
}
 
Line 13,817 ⟶ 17,476:
 
//
// WikEdClearHistorywikEd.ClearHistory: clear the history of combo input fields
//
 
windowwikEd.WikEdClearHistoryClearHistory = function (field) {
 
WikEdSetPersistent(wikEdSavedName[field], '', 0, '/');
wikEd.SetPersistent(wikEd.savedName[field], '', 0, '/');
WikEdSetComboOptions(field);
wikEd.SetComboOptions(field);
return;
};
Line 13,828 ⟶ 17,488:
 
//
// WikEdLoadHistoryFromSettingswikEd.LoadHistoryFromSettings: get the input box history from the respective saved settings
//
 
windowwikEd.WikEdLoadHistoryFromSettingsLoadHistoryFromSettings = function (field) {
 
var setting = WikEdGetPersistent(wikEdSavedName[field]);
ifvar (setting != ''wikEd.GetPersistent(wikEd.savedName[field]) {;
if ( (setting !== null) && (setting !== '') ) {
setting = decodeURIComponent(setting);
wikEdFieldHistwikEd.fieldHist[field] = setting.split('\n');
}
else {
wikEdFieldHistwikEd.fieldHist[field] = [];
}
return;
Line 13,845 ⟶ 17,506:
 
//
// WikEdSaveHistoryToSettingwikEd.SaveHistoryToSetting: save the input box history to the respective saved settings
//
 
windowwikEd.WikEdSaveHistoryToSettingSaveHistoryToSetting = function (field) {
 
var setting = '';
setting = wikEdFieldHistwikEd.fieldHist[field].join('\n');
setting = setting.replace(/\n$/, '');
setting = encodeURIComponent(setting);
WikEdSetPersistentwikEd.SetPersistent(wikEdSavedNamewikEd.savedName[field], setting, 0, '/');
return;
};
Line 13,860 ⟶ 17,521:
 
//
// WikEdGetSelectionwikEd.GetSelection: cross-browser method to get the current iframe selection
//
 
windowwikEd.WikEdGetSelectionGetSelection = function () {
 
var sel = wikEd.frameWindow.getSelection();
// standard
var sel;
if (typeof(wikEdFrameWindow.getSelection) == 'function') {
sel = wikEdFrameWindow.getSelection();
}
 
// make sure there is at least an empty range
// MS IE compatibility
if ( (sel !== null) && (sel.rangeCount === 0) ) {
else if (typeof(wikEdFrameDocument.selection) == 'object') {
sel.collapse(wikEd.frameBody, 0);
sel = wikEdFrameDocument.selection;
}
return sel;
 
// make sure there is at least an empty range
if (sel.rangeCount == 0) {
sel.collapse(wikEdFrameBody, 0);
}
 
return(sel);
};
 
 
//
// wikEd.SetRange: set a range, control for non-text nodes
// WikEdClearSelection: cross-browser method to clear the currently selected text
//
 
wikEd.SetRange = function (range, startNode, startOffset, endNode, endOffset) {
window.WikEdRemoveAllRanges = function(sel) {
 
wikEd.SetRangeStart(range, startNode, startOffset);
if (typeof(sel.removeAllRanges) == 'function') {
wikEd.SetRangeEnd(range, endNode, endOffset);
sel.removeAllRanges();
}
 
// MS IE compatibility
else if (typeof(sel.empty) == 'function') {
sel.empty();
}
return;
};
Line 13,904 ⟶ 17,549:
 
//
// wikEd.SetRangeStart: set range start
// WikEdSetRange: set a range, control for non-text nodes (Opera 10.50 beta bug)
//
 
windowwikEd.WikEdSetRangeSetRangeStart = function (range, startNode, startOffset, endNode, endOffset) {
 
WikEdSetRangeStart(range, startNode, startOffset);
WikEdSetRangeEnd(range, endNode, endOffset);
return;
};
 
 
//
// WikEdSetRangeStart: set range start
//
 
window.WikEdSetRangeStart = function(range, startNode, startOffset) {
 
if ( (startNode.childNodes.length > 0) && (startOffset < startNode.childNodes.length) ) {
Line 13,927 ⟶ 17,560:
if (startNode.nodeName == '#text') {
range.setStart(startNode, startOffset);
}
else if (startNode.childNodes.length === 0) {
range.setStart(startNode, 0);
}
else {
Line 13,936 ⟶ 17,572:
 
//
// WikEdSetRangeEndwikEd.SetRangeEnd: set range end
//
 
windowwikEd.WikEdSetRangeEndSetRangeEnd = function (range, endNode, endOffset) {
 
if ( (endNode.childNodes.length > 0) && (endOffset < endNode.childNodes.length) ) {
Line 13,947 ⟶ 17,583:
if (endNode.nodeName == '#text') {
range.setEnd(endNode, endOffset);
}
else if (endNode.childNodes.length === 0) {
range.setEndBefore(endNode);
}
else {
Line 13,956 ⟶ 17,595:
 
//
// WikEdGetSavedSettingwikEd.GetSavedSetting: get a wikEd setting, returns boolean
//
 
windowwikEd.WikEdGetSavedSettingGetSavedSetting = function (settingName, preset) {
 
var setting = WikEdGetPersistentwikEd.GetPersistent(settingName);
if (setting == '1') {
setting = preset;
}
else if (setting == '1') {
setting = true;
}
else {
if ( (setting === null) || (setting === '') ) false;{
setting = preset;
}
if (typeof setting !== 'boolean') {
setting = false;
}
}
return( setting);
};
 
 
//
// WikEdGetPersistentwikEd.GetPersistent: get a cookie or a Greasemonkey persistent value (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdGetPersistentGetPersistent = function (name) {
 
var getStr;
 
// check for web storage
var getStr = '';
wikEd.DetectWebStorage();
 
// get a value from web storage
if (wikEdWebStoragewikEd.webStorage === true) {
getStr = window.localStorage.getItem(name);
}
 
// get a Greasemonkey persistent value
else if (wikEdGreasemonkeywikEd.greasemonkey === true) {
getStr = GM_getValue(name, '');
}
 
// get a cookie value
else {
getStr = WikEdGetCookiewikEd.GetCookie(name);
}
 
return(getStr);
// return string
if (typeof getStr != 'string') {
getStr = '';
}
return getStr;
};
 
 
//
// WikEdSetPersistentwikEd.SetPersistent: set a cookie or a Greasemonkey persistent value, deletes the value for expire = -1
//
 
windowwikEd.WikEdSetPersistentSetPersistent = function (name, value, expires, path, ___domain, secure) {
 
// check for web storage
wikEd.DetectWebStorage();
 
// set a value in web storage
if (wikEdWebStoragewikEd.webStorage === true) {
if (expires == -1) {
value = '';
localStorage.removeItem(name, '');
}
else {
localStorage.setItem(name, value);
}
window.localStorage.setItem(name, value);
}
 
// set a Greasemonkey persistent value
else if (wikEdGreasemonkeywikEd.greasemonkey === true) {
if (expires == -1) {
GM_setValue(name,value = '');
}
 
else {
// see http://wiki.greasespot.net/Greasemonkey_access_violation
window.setTimeout(function() {
GM_setValue(name, value);
}, 0);
}
 
// set a cookie value
else {
WikEdSetCookiewikEd.SetCookie(name, value, expires, path, ___domain, secure);
}
return;
};
 
 
//
// wikEd.DetectWebStorage: detect if local storage is available (code copied to wikEdDiff.js)
//
 
wikEd.DetectWebStorage = function () {
 
if (wikEd.webStorage === null) {
wikEd.webStorage = false;
 
// https://bugzilla.mozilla.org/show_bug.cgi?id=748620
try {
if (typeof window.localStorage == 'object') {
 
// web storage does not persist between local html page loads in firefox
if (/^file:\/\//.test(wikEd.pageOrigin) === false) {
wikEd.webStorage = true;
}
}
}
catch (exception) {
}
}
return;
Line 14,037 ⟶ 17,714:
 
//
// WikEdGetCookiewikEd.GetCookie: get a cookie (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdGetCookieGetCookie = function (cookieName) {
 
var cookie = ' ' + document.cookie;
Line 14,058 ⟶ 17,735:
cookieValue = decodeURIComponent(cookieValue);
}
return( cookieValue);
};
 
 
//
// WikEdSetCookiewikEd.SetCookie: set a cookie, deletes a cookie for expire = -1 (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdSetCookieSetCookie = function (name, value, expires, path, ___domain, secure) {
 
var cookie = name + '=' + encodeURIComponent(value);
 
if ( (expires !== undefined) && (expires !== null) ) {
 
// generate a date 1 hour ago to delete the cookie
if (expires == -1) {
var cookieExpire = new Date();
Line 14,079 ⟶ 17,756:
}
 
// get date from expiration preset
else if (expires === 0) {
var cookieExpire = new Date();
expires = cookieExpire.setTime(cookieExpire.getTime() + wikEdConfig['wikEd.config.cookieExpireSec'] * 1000);
expires = cookieExpire.toUTCString();
}
cookie += '; expires=' + expires;
}
if (typeof path !== null'string') {
cookie += '; path=' + path;
}
if (typeof ___domain !== null'string') {
cookie += '; ___domain=' + ___domain;
}
if (secure !=== nulltrue) {
cookie += '; secure';
}
Line 14,102 ⟶ 17,779:
 
//
// WikEdGetOffsetTopwikEd.GetOffsetTop: get element offset relative to window top (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdGetOffsetTopGetOffsetTop = function (element) {
 
var offset = 0;
do {
offset += element.offsetTop;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
 
//
// WikEdGetOffsetLeftwikEd.GetOffsetLeft: get element offset relative to left window border
//
 
windowwikEd.WikEdGetOffsetLeftGetOffsetLeft = function (element) {
 
var offset = 0;
do {
offset += element.offsetLeft;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
 
//
// WikEdAppendScriptwikEd.AppendScript: append script to head
//
 
windowwikEd.WikEdAppendScriptAppendScript = function (scriptUrl, onLoadFunction) {
 
var head = document.getElementsByTagName('head')[0];
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', scriptUrl);
wikEd.head.appendChild(script);
if (onLoadFunction !== nullundefined) {
WikEdAddEventListener(script, .addEventListener('load', onLoadFunction, false);
}
return script;
};
 
 
//
// WikEdCleanNodeswikEd.CleanNodes: remove DOM elements dynamically inserted by other scripts
//
 
windowwikEd.WikEdCleanNodesCleanNodes = function (node) {
 
if (wikEdCleanNodeswikEd.cleanNodes === false) {
return;
}
 
// remove Web of Trust (WOT) tags
var divs = node.getElementsByTagName('div');
for (var i = 0; i < divs.length; i ++) {
var div = divs[i];
 
// test for WOT class names
var divClass = div.className;
if (/^wot-/.test(divClass) === true) {
var divParent = div.parentNode;
if (divParent !== null) {
divParent.removeChild(div);
}
Line 14,170 ⟶ 17,848:
}
 
// test for WOT attributes
var divAttrs = div.attributes;
for (var j = 0; j < divAttrs.length; ++ j) {
var attr = divAttrs.item(j);
if ( (attr.nodeName == 'wottarget') || (/^link[0-9a-f]{30,}/.test(attr.nodeName) === true) ) {
var divParent = div.parentNode;
if (divParent !== null) {
divParent.removeChild(div);
}
Line 14,188 ⟶ 17,866:
 
//
// WikEdParseDOMwikEd.ParseDOM: parses a DOM subtree into a linear array of plain text fragments
//
 
windowwikEd.WikEdParseDOMParseDOM = function (obj, topNode) {
 
obj.plainLength = 0;
Line 14,200 ⟶ 17,878:
 
var anchorNode = obj.sel.anchorNode;
var focusNode = obj.sel.focusNode;
var anchorOffset = obj.sel.anchorOffset;
var focusOffset = obj.sel.focusOffset;
 
WikEdParseDOMRecursivewikEd.ParseDOMRecursive(obj, topNode, anchorNode, anchorOffset, focusNode, focusOffset);
obj.plain = obj.plainArray.join('');
obj.plain = obj.plain.replace(/\xa0/g, ' ');
return;
};
Line 14,211 ⟶ 17,890:
 
//
// WikEdParseDOMRecursivewikEd.ParseDOMRecursive: parses a DOM subtree into a linear array of plain text fragments
//
 
windowwikEd.WikEdParseDOMRecursiveParseDOMRecursive = function (obj, currentNode, anchorNode, anchorOffset, focusNode, focusOffset) {
 
// cycle through the child nodes of currentNode
var childNodes = currentNode.childNodes;
for (var i = 0; i < childNodes.length; i ++) {
var childNode = childNodes.item(i);
 
// check for selection, non-text nodes
if ( (currentNode == anchorNode) && (i == anchorOffset) ) {
obj.plainAnchor = obj.plainLength;
Line 14,229 ⟶ 17,908:
}
 
// check for selection, text nodes
if (childNode == obj.sel.anchorNode) {
obj.plainAnchor = obj.plainLength + obj.sel.anchorOffset;
Line 14,237 ⟶ 17,916:
}
 
// get text of child node
var value = null;
switch (childNode.nodeType) {
case childNode.ELEMENT_NODE:
 
// skip hidden elements
if (WikEdGetStylewikEd.GetStyle(childNode, 'display') == 'none') {
continue;
}
if ( (childNode.childNodes.length === 0) && (wikEdLeafElementswikEd.leafElements[childNode.nodeName] === true) ) {
if (childNode.nodeName == 'BR') {
value = '\n';
Line 14,252 ⟶ 17,931:
}
else {
WikEdParseDOMRecursivewikEd.ParseDOMRecursive(obj, childNode, anchorNode, anchorOffset, focusNode, focusOffset);
}
break;
Line 14,264 ⟶ 17,943:
}
 
// add text to text object
if (value !== null) {
 
// array of text fragments
obj.plainArray.push(value);
 
// array of text fragment node references
obj.plainNode.push(childNode);
 
// array of text fragment text positions
obj.plainStart.push(obj.plainLength);
 
// node references containing text positions
obj.plainPos[childNode] = obj.plainLength;
 
// current text length
obj.plainLength += value.length;
}
Line 14,288 ⟶ 17,967:
 
//
// WikEdGetInnerHTMLwikEd.GetInnerHTML: get the innerHTML of a document fragment
//
 
windowwikEd.WikEdGetInnerHTMLGetInnerHTML = function (obj, currentNode) {
 
// initialize string
if (obj.html === nullundefined) {
obj.html = '';
}
if (obj.plain === nullundefined) {
obj.plain = '';
}
if (obj.plainArray === nullundefined) {
obj.plainArray = [];
obj.plainNode = [];
Line 14,313 ⟶ 17,992:
obj.html += '<' + childNode.nodeName.toLowerCase();
for (var j = 0; j < childNode.attributes.length; j ++) {
if (childNode.attributes.item(j).nodeValuevalue !== null) {
obj.html += ' ' + childNode.attributes.item(j).nodeName + '="' + childNode.attributes.item(j).nodeValuevalue.replace(/</g, '&lt;').replace(/>/g, '&gt;') + '"';
}
}
if ( (childNode.childNodes.length === 0) && (wikEdLeafElementswikEd.leafElements[childNode.nodeName] === true) ) {
obj.html += '>';
if (childNode.nodeName == 'BR') {
Line 14,328 ⟶ 18,007:
else {
obj.html += '>';
WikEdGetInnerHTMLwikEd.GetInnerHTML(obj, childNode);
obj.html += '</' + childNode.nodeName.toLowerCase() + '>';
}
Line 14,334 ⟶ 18,013:
case childNode.TEXT_NODE:
var value = childNode.nodeValue;
 
value = value.replace(/\n/g, ' '); // important for pasted page content
// newline handling important for pasted page content
obj.plainArray.push(value); // plain array contains & < > instead of &amp; &lt; &gt;
if (currentNode.nodeName != 'PRE') {
value = value.replace(/[ \r]*\n[ \r\n]*/g, ' ');
}
 
// plain array contains & < > instead of &amp; &lt; &gt;
obj.plainArray.push(value);
obj.plainNode.push(childNode);
obj.plainStart.push(obj.plain.length);
value = valuewikEd.replaceEscapeHtml(/&/g, '&amp;'value);
 
value = value.replace(/</g, '&lt;');
if (currentNode.nodeName == 'PRE') {
value = value.replace(/>/g, '&gt;');
obj.html += value.replace(/\n/g, '<br>');
}
else {
obj.html += value;
}
obj.plain += value;
break;
Line 14,366 ⟶ 18,055:
 
//
// WikEdGetNextNodewikEd.GetNextNode: recurse through DOM to next text-like node for anti-highlight bleeding
//
 
windowwikEd.WikEdGetNextTextNodeGetNextTextNode = function (obj, currentNode, currentLevel) {
 
// ascend until there is a sibling
while (currentNode != wikEdFrameBodywikEd.frameBody) {
 
// check for sibling
var nextNode = null;
if ( (obj.backwards === true) && (currentNode.previousSibling !== null) ) {
nextNode = currentNode.previousSibling;
}
else if ( (obj.backwards !== true) && (currentNode.nextSibling !== null) ) {
nextNode = currentNode.nextSibling;
}
 
// found sibling
if (nextNode !== null) {
currentNode = nextNode;
 
// skip hidden nodes
// found text-like node
if (
( (wikEd.refHide === true) && (/^((wikEd(Ref|Templ|CharEntity|Table))|(wikEdTableBR))$/.test(currentNode.className) === true) ) ||
(/^(wikEdScroll(Before|After))$/.test(currentNode.className) === true)
) {
continue;
}
 
// found text-like node
if (
(currentNode.nodeName == '#text') ||
(currentNode.nodeType == currentNode.ENTITY_REFERENCE_NODE) ||
(wikEdLeafElementswikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
obj.foundLevel = currentLevel;
Line 14,398 ⟶ 18,095:
}
 
// recurse into child nodes
if ( (currentNode.nodeType == currentNode.ELEMENT_NODE) && (/wikEdScroll(Before|After)/.test(currentNode.className) != true) ) {
WikEdGetNextTextNodeChildswikEd.GetNextTextNodeChilds(obj, currentNode, currentLevel - 1);
if (obj.foundNode !== nullundefined) {
return;
}
Line 14,407 ⟶ 18,104:
}
 
// no sibling, ascend to parent
else {
currentNode = currentNode.parentNode;
Line 14,417 ⟶ 18,114:
 
 
//
// WikEdGetNextTextNodeChilds: recurse through child nodes to next text-like node for anti-highlight bleeding
// wikEd.GetNextTextNodeChilds: recurse through child nodes to next text-like node for anti-highlight bleeding
//
 
windowwikEd.WikEdGetNextTextNodeChildsGetNextTextNodeChilds = function (obj, currentNode, currentLevel) {
 
// set direction
var childNodes = currentNode.childNodes;
if (childNodes.length === 0) {
return;
}
var start = 0;
var add = 1;
if (obj.backwards === true) {
start = childNodes.length - 1;
add = -1;
}
 
// cycle through child nodes (left or right)
for (var i = start; ( (obj.backwards === true) && (i >= 0) ) || ( (obj.backwards !== true) && (i < childNodes.length) ); i = i + add) {
var currentNode = childNodes.item(i);
 
// skip hidden nodes
// found text-like node
if (
( (wikEd.refHide === true) && (/^((wikEd(Ref|Templ|CharEntity|Table))|(wikEdTableBR))$/.test(currentNode.className) === true) ) ||
(/^(wikEdScroll(Before|After))$/.test(currentNode.className) === true)
) {
continue;
}
 
// found text-like node
if (
(currentNode.nodeName == '#text') ||
(currentNode.nodeType == currentNode.ENTITY_REFERENCE_NODE) ||
(wikEdLeafElementswikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
obj.foundLevel = currentLevel;
Line 14,448 ⟶ 18,155:
}
 
// recurse into child nodes
if ( (currentNode.nodeType == currentNode.ELEMENT_NODE) && (/wikEdScroll(Before|After)/.test(currentNode.className) != true) ) {
WikEdGetNextTextNodeChildswikEd.GetNextTextNodeChilds(obj, currentNode, currentLevel - 1);
if (obj.foundNode !== nullundefined) {
return;
}
Line 14,461 ⟶ 18,168:
 
//
// WikEdApplyCSSwikEd.ApplyCSS: Attach css rules to document
//
 
windowwikEd.WikEdApplyCSSApplyCSS = function (cssDocument, cssRules) {
 
var stylesheet = new WikEdStyleSheetwikEd.StyleSheet(cssDocument);
var rules = '';
for (var ruleName in cssRules) {
if (cssRulesObject.prototype.hasOwnProperty.call(cssRules, ruleName) === true) {
var ruleStyle = cssRules[ruleName];
 
// replace {wikedImage:image} in css rules with image path
ruleStyle = ruleStyle.replace(/\{wikEdImage:(\w+)\}/g,
function (p, p1) {
return(wikEdConfig[' wikEd.config.image'][p1]);
}
);
 
// replace {wikedText:text} in css rules with translation
ruleStyle = ruleStyle.replace(/\{wikEdText:(\w+)\}/g,
function (p, p1) {
return(wikEdConfig[' wikEd.config.text'][p1]);
}
);
Line 14,489 ⟶ 18,196:
}
}
stylesheet.WikEdAddRulesAddCSSRules(rules);
return;
};
Line 14,495 ⟶ 18,202:
 
//
// WikEdStyleSheetwikEd.StyleSheet: create a new style sheet object (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdStyleSheetStyleSheet = function (contextObj) {
 
if (contextObj === nullundefined) {
contextObj = document;
}
this.styleElement = null;
 
this.styleElement = contextObj.createElement('style');
// MS IE compatibility
this.styleElement.from = 'text/css';
if (contextObj.createStyleSheet) {
this.styleElement var insert = contextObj.createStyleSheetgetElementsByTagName('head')[0];
if (insert !== undefined) {
insert.appendChild(this.styleElement);
}
 
// standards compliant browsers
else {
this.styleElement = contextObj.createElement('style');
this.styleElement.from = 'text/css';
var insert = contextObj.getElementsByTagName('head')[0];
if (insert != null) {
this.styleElement.appendChild(contextObj.createTextNode('')); // Safari 3 fix
insert.appendChild(this.styleElement);
}
}
 
//
// wikEd.StyleSheet.AddCSSRules: add or replace all rules at once
// WikEdStyleSheet.WikEdAddRule: add one rule at the time using DOM method, very slow
//
 
this.WikEdAddRuleAddCSSRules = function(selector, declaration(rules) {
 
this.styleElement.appendChild(contextObj.createTextNode(rules));
// MS IE compatibility
if (this.styleElement.WikEdAddRule != null) {
if (declaration.length > 0) {
this.styleElement.WikEdAddRule(selector, declaration);
}
}
 
// standards compliant browsers
else {
if (this.styleElement.sheet != null) {
if (this.styleElement.sheet.insertRule != null) {
this.styleElement.sheet.insertRule(selector + ' { ' + declaration + ' } ', 0);
}
}
}
};
 
 
//
// WikEdStyleSheet.WikEdAddRules: add or replace all rules at once, much faster
//
 
this.WikEdAddRules = function(rules) {
 
// MS IE compatibility
if (this.styleElement.innerHTML == null) {
this.styleElement.cssText = rules;
}
 
// Safari, Chrome, WebKit
else if ( (wikEdSafari == true) || (wikEdChrome == true) || (wikEdWebKit == true) ) {
if (this.styleElement.firstChild != null) {
this.styleElement.removeChild(this.styleElement.firstChild);
}
this.styleElement.appendChild(contextObj.createTextNode(rules));
}
 
// via innerHTML
else {
this.styleElement.innerHTML = rules;
}
return;
};
Line 14,574 ⟶ 18,233:
 
//
// WikEdGetStylewikEd.GetStyle: get computed style properties for non-inline css definitions
//
 
windowwikEd.WikEdGetStyleGetStyle = function (element, styleProperty) {
 
var styleDocument = element.ownerDocument;
 
var style;
if (element !== null) {
ifstyle ( (styleDocument.defaultView != null) && (styleDocument.defaultView.getComputedStyle != null(element) ) {[styleProperty];
style = styleDocument.defaultView.getComputedStyle(element, null)[styleProperty];
}
 
// MS IE compatibility
else if (element.currentStyle != null) {
style = element.currentStyle[styleProperty];
 
// recurse up trough the DOM tree
if (style == 'inherit') {
style = WikEdGetStyle(element.parentNode, styleProperty);
}
}
else {
style = element.style[styleProperty];
}
}
return( style);
};
 
 
//
// wikEd.AjaxRequest: wrapper for Ajax requests
// WikEdAjaxPreview: get rendered page text using an Ajax non-api POST call
//
 
windowwikEd.WikEdAjaxPreviewAjaxRequest = function (textValuerequestMethod, requestUrl, postFields, overrideMimeType, ResponseHandler, livePrevieworigin) {
 
// prepare the url
var requestUrl;
if ( (wikEdUploadEdit == true) || (wikEdWatchlistEdit == true) || (wikEdViewDeleted == true) ) {
requestUrl = wikEdWikiGlobals['wgServer'] + wikEdWikiGlobals['wgScript'] + '?title=wikEdPreview&action=submit';
}
else {
requestUrl = wikEdEditForm.action;
}
 
// prepare the form fields
var postFields = {};
postFields['wpTextbox1'] = textValue;
if (wikEdEdittime != null) {
postFields['wikEdEdittime'] = wikEdEdittime;
}
if (wikEdEditToken != null) {
postFields['wpEditToken'] = wikEdEditToken;
}
postFields['wpPreview'] = 'true';
if (livePreview != false) {
postFields['live'] = 'true';
}
 
// make the ajax request
var requestMethod = 'POST';
var overrideMimeType = 'text/html';
WikEdAjaxRequest(requestMethod, requestUrl, postFields, overrideMimeType, ResponseHandler);
 
return;
};
 
 
 
//
// WikEdAjaxRequest: cross browser wrapper for Ajax requests (code copied to wikEdDiff.js)
//
 
window.WikEdAjaxRequest = function(requestMethod, requestUrl, postFields, overrideMimeType, ResponseHandler) {
 
var request;
var headers = {};
var formData;
 
// prepare POST request
// generate body data from form field object
var headerName = null;
var headerValue = null;
var bodyData = '';
if (requestMethod == 'POST') {
 
// assemble string body
//create boundary
if (typeof FormData != 'function') {
var boundary = WikEdCreateRandomString(12);
 
// create boundary
// POST header
var boundary = wikEd.CreateRandomString(12);
headerName = 'Content-Type';
headerValue = 'multipart/form-data; boundary=' + boundary;
 
// POST header, charset: WebKit workaround http://aautar.digital-radiation.com/blog/?p=1645
// assemble body data
headers['Content-Type'] = 'multipart/form-data; charset=UTF-8; boundary=' + boundary;
for (var fieldName in postFields) {
 
if (postFields.hasOwnProperty(fieldName) == true) {
// assemble body data
var fieldValue = postFields[fieldName];
bodyDataformData += '--' + boundary + '\r\n';
for (var fieldName in postFields) {
bodyData += 'Content-Disposition: form-data; name="' + fieldName + '"\r\n\r\n' + fieldValue + '\r\n';
if (Object.prototype.hasOwnProperty.call(postFields, fieldName) === true) {
formData += '--' + boundary + '\r\n';
formData += 'Content-Disposition: form-data; name="' + fieldName + '"\r\n\r\n' + postFields[fieldName] + '\r\n';
}
}
formData += '--' + boundary + '--\r\n';
}
 
// use FormData object
else {
formData = new window.FormData();
for (var fieldName in postFields) {
if (Object.prototype.hasOwnProperty.call(postFields, fieldName) === true) {
formData.append(fieldName, postFields[fieldName]);
}
}
}
bodyData += '--' + boundary + '--\r\n';
}
 
// usesend the request using Greasemonkey GM_xmlhttpRequest
if (wikEdGreasemonkeywikEd.greasemonkey === true) {
var headerObj = { headers['User-Agent':] = window.navigator.userAgent };
if (headerNameorigin !=== nulltrue) {
headers['Origin'] = window.___location.origin;
headerObj[headerName] = headerValue;
}
 
// workaround for Error: Greasemonkey access violation: unsafeWindow cannot call GM_xmlhttpRequest.
// see http://wiki.greasespot.net/Greasemonkey_access_violation
window.setTimeout(function() {
new GM_xmlhttpRequest({
'method': requestMethod,
'url': requestUrl,
'overrideMimeType': overrideMimeType,
'headers': headerObjheaders,
'data': bodyDataformData,
'onreadystatechange':
function(ajax) {
Line 14,700 ⟶ 18,317:
}
});
}, 0);
}
 
// use standard XMLHttpRequest
else {
 
// create new XMLHttpRequest object
// allow ajax request from local copy for testing
request = new window.XMLHttpRequest();
if (wikEdConfig['allowLocalAjax'] == true) {
if (typeof(netscape) == 'object') {
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
}
 
// newopen ajaxthe request object
request.open(requestMethod, requestUrl, true);
if (typeof(XMLHttpRequest) == 'object') {
request = new XMLHttpRequest();
}
 
// set the headers
// IE
for (var headerName in headers) {
else if (typeof(ActiveXObject) == 'object') {
if (Object.prototype.hasOwnProperty.call(headers, headerName) === true) {
 
request.setRequestHeader(headerName, headers[headerName]);
// IE 6
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
}
}
 
// set the mime type
// IE 5.5
if ( (request.overrideMimeType !== undefined) && (typeof overrideMimeType == 'string') ) {
catch(err) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(err) {
return;
}
}
}
if (request == null) {
return;
}
request.open(requestMethod, requestUrl, true);
if (headerName != null) {
request.setRequestHeader(headerName, headerValue);
}
if ( (request.overrideMimeType != null) && (overrideMimeType != null) ) {
request.overrideMimeType(overrideMimeType);
}
 
// send the request, catch security violations Opera 0.9.51
try {
request.send(bodyDataformData);
}
catch (errexception) {
return;
}
 
// wait for the data
request.onreadystatechange = function() {
request.onreadystatechange = function () {
if (request.readyState != 4) {
return;
Line 14,768 ⟶ 18,363:
 
//
// WikEdGetGlobalswikEd.GetGlobals: copyparse global context variables into Greasemonkey context (code copied to wikEdDiff.js)
// uses Greasemonkey postMessage, ___locationhead hackscript, and JSON encoding for Greasemonkey global to GM context access
 
windowwikEd.WikEdGetGlobalsGetGlobals = function (names, gotGlobalsHook) {
 
if (gotGlobalsHook !== undefined) {
if ( (typeof(window.postMessage) != 'function') || (typeof(JSON) != 'object') ) {
wikEd.gotGlobalsHook.push(gotGlobalsHook);
return;
}
 
// setcode ___locationalready href to execute coderunning in global context
if (wikEd.greasemonkey !== true) {
var locationHackCode = 'var globalObj = {};';
var globalScopeCode = '';
if (gotGlobalsHook != null) {
for (var i = 0; i < names.length; i ++) {
wikEdGotGlobalsHook.push(gotGlobalsHook);
globalScopeCode += '' +
locationHackCode += 'globalObj.hookNumber = ' + (wikEdGotGlobalsHook.length - 1) + ';';
'if (typeof ' + names[i] + ' != \'undefined\') {' +
}
' wikEd.wikiGlobals.' + names[i] + ' = ' + names[i] + ';' +
locationHackCode += 'globalObj.wikEdGetGlobals = {};';
'}';
for (var i = 0; i < names.length; i ++) {
locationHackCode += ''
+ 'if (typeof(' + names[i] + ') != \'undefined\') {'
+ ' globalObj.wikEdGetGlobals[\'' + names[i] + '\'] = ' + names[i] + ';'
+ '}';
}
locationHackCode += ''
+ 'var globalObjStr = JSON.stringify(globalObj);'
+ 'window.postMessage(globalObjStr, \'' + window.___location.protocol + '//' + window.___location.host + '\');'
+ 'void(0);';
___location.href = 'javascript:' + locationHackCode;
return;
};
 
 
//
// WikEdGetGlobalsReceiver: event handler for WikEdGetGlobals postMessage
//
 
window.WikEdGetGlobalsReceiver = function(event) {
 
if (event.source != window) {
return;
}
if (event.origin != window.___location.protocol + '//' + window.___location.host) {
return;
}
if (event.data != '') {
var globalObj = JSON.parse(event.data);
var globals = globalObj.wikEdGetGlobals;
if (globals != null) {
for (var key in globals) {
if (globals.hasOwnProperty(key) == true) {
wikEdWikiGlobals[key] = globals[key];
}
}
 
// run scheduled functions only once
if (globalObj.hookNumber != null) {
WikEdExecuteHook(wikEdGotGlobalsHook[globalObj.hookNumber], true);
}
}
if (gotGlobalsHook !== undefined) {
}
globalScopeCode += 'wikEd.ExecuteHook(wikEd.gotGlobalsHook[' + (wikEd.gotGlobalsHook.length - 1) + '], true);';
return;
}
 
 
//
// WikEdGetAttribute: MS IE compatibility wrapper for element.getAttribute()
//
 
window.WikEdGetAttribute = function(element, attribName) {
 
var attribValue = element.getAttribute(attribName);
 
// MS IE compatibility for checked
if (attribName == 'checked') {
if ( typeof(attribValue) == 'boolean' ) {
if (attribValue == true) {
attribValue = 'true';
}
else {
attribValue = 'false';
}
}
eval(globalScopeCode);
return;
}
return(attribValue);
};
 
// prepare code to be executed in global context for Greasemonkey
 
if ( (window.postMessage === undefined) || (typeof JSON != 'object') ) {
//
return;
// WikEdGetWindowInnerHeight: MS IE compatibility wrapper for window.innerHeight
}
//
var globalScopeCode = 'var globalObj = {};';
 
if (gotGlobalsHook !== undefined) {
window.WikEdGetWindowInnerHeight = function() {
wikEd.gotGlobalsHook.push(gotGlobalsHook);
 
globalScopeCode += 'globalObj.hookNumber = ' + (wikEd.gotGlobalsHook.length - 1) + ';';
var value = window.innerHeight;
if (value == null) {
if (document.documentElement != null) {
value = document.documentElement.clientHeight;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientHeight;
}
}
globalScopeCode += 'globalObj.scriptId = \'wikEdGetGlobalScript' + wikEd.getGlobalsCounter + '\';';
return(value);
globalScopeCode += 'globalObj.wikEdGetGlobals = {};';
};
 
// add global scope variables
 
for (var i = 0; i < names.length; i ++) {
//
globalScopeCode += '' +
// WikEdGetWindowInnerWidth: MS IE compatibility wrapper for window.innerWidth
'if (typeof ' + names[i] + ' != \'undefined\') {' +
//
' globalObj.wikEdGetGlobals[\'' + names[i] + '\'] = ' + names[i] + ';' +
 
'}';
window.WikEdGetWindowInnerWidth = function() {
 
var value = window.innerWidth;
if (value == null) {
if (document.documentElement != null) {
value = document.documentElement.clientWidth;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientWidth;
}
}
globalScopeCode += 'var globalObjStr = \'wikEd:\' + JSON.stringify(globalObj);';
return(value);
var origin = wikEd.pageOrigin;
};
if (origin == 'file://') {
origin = '*';
}
globalScopeCode += 'window.postMessage(globalObjStr, \'' + origin + '\');';
 
// create head script to execute the code
 
var script = document.createElement('script');
//
script.id = 'wikEdGetGlobalScript' + wikEd.getGlobalsCounter;
// WikEdAddEventListener: wrapper for addEventListener (http://ejohn.org/projects/flexible-javascript-events/)
wikEd.getGlobalsCounter ++;
//
if (script.innerText !== undefined) {
 
script.innerText = globalScopeCode;
window.WikEdAddEventListener = function(domElement, eventType, eventHandler, useCapture) {
 
if (domElement == null) {
return;
}
if (typeof(domElement.addEventListener) == 'function') {
domElement.addEventListener(eventType, eventHandler, useCapture);
}
else {
script.textContent = globalScopeCode;
domElement['wikEd' + eventType + eventHandler] = eventHandler;
domElement[eventType + eventHandler] = function() {
var eventRootElement = document;
if (document.addEventListener == null) {
eventRootElement = window;
}
domElement['wikEd' + eventType + eventHandler](eventRootElement.event);
};
domElement.attachEvent('on' + eventType, domElement[eventType + eventHandler] );
}
wikEd.head.appendChild(script);
return;
};
Line 14,920 ⟶ 18,430:
 
//
// wikEd.GetGlobalsReceiver: event handler for wikEd.GetGlobals postMessage (code copied to wikEdDiff.js)
// WikEdRemoveEventListener: wrapper for removeEventListener
//
 
wikEd.GetGlobalsReceiver = function (event) {
window.WikEdRemoveEventListener = function(domElement, eventType, eventHandler, useCapture) {
 
if (domElementevent.source =!= nullwindow) {
return;
}
if ( (event.origin != 'null') && (event.origin != wikEd.pageOrigin) ) {
if (typeof(domElement.removeEventListener) == 'function') {
return;
domElement.removeEventListener(eventType, eventHandler, useCapture);
}
if (event.data !== '') {
else {
domElement.detachEvent('on' + eventType, domElement[eventType + eventHandler]);
domElement[eventType + eventHandler] = null;
}
return;
};
 
// test if sent by wikEd
if (/^wikEd:/.test(event.data) === false) {
return;
}
event.stopPropagation();
var data = event.data.replace(/wikEd:/, '');
var globalObj = JSON.parse(data);
var globals = globalObj.wikEdGetGlobals;
if (globals !== null) {
for (var key in globals) {
if (Object.prototype.hasOwnProperty.call(globals, key) === true) {
wikEd.wikiGlobals[key] = globals[key];
}
}
 
// get MediaWiki file paths from wikiGlobals
//
wikEd.GetPaths();
// WikEdEvent: MS IE and Mozilla compatibility fix for event object
//
 
// run scheduled functions only once
window.WikEdEvent = function(event, thisElement) {
if ( (globalObj.hookNumber !== undefined) && (wikEd.gotGlobalsHook[globalObj.hookNumber] !== undefined) ) {
 
wikEd.ExecuteHook(wikEd.gotGlobalsHook[globalObj.hookNumber], true);
var eventAlt;
if (window.event != null) {
eventAlt = window.event;
}
else if (wikEdFrameWindow != null) {
if (typeof(wikEdFrameWindow.event) != 'undefined') {
eventAlt = wikEdFrameWindow.event;
}
}
if (eventAlt != null) {
event = eventAlt;
event.stopPropagation = function() {
event.cancelBubble = true;
};
event.preventDefault = function() {
event.returnValue = false;
};
if (event.target == null) {
event.target = event.srcElement;
}
if (event.currentTarget == null) {
event.currentTarget = thisElement;
}
if (event.relatedTarget == null) {
if (event.type == 'mouseout') {
event.relatedTarget = event.toElement;
}
else if (event.type == 'mouseover') {
event.relatedTarget = event.fromElement;
}
}
}
 
// clean up head script
// avoid strange Mozilla security error https://bugzilla.mozilla.org/show_bug.cgi?id=101197, fixed in FF3.6
var script = document.getElementById(globalObj.scriptId);
if ( (event.type == 'mouseout') || (event.type == 'mouseover') ) {
if (script !== null) {
event.safeRelatedTarget = event.relatedTarget;
wikEd.head.removeChild(script);
if (wikEdMozilla == true) {
try {
event.safeRelatedTarget.toString();
}
catch(error) {
event.safeRelatedTarget = null;
}
}
}
return(event);
};
 
 
//
// wikEd.GetPreviousSiblingNode: getPreviousSibling, ignore non-element nodes such as comments
// WikEdGetElementsByClassName: cross browser / backwards compatibility wrapper
//
 
windowwikEd.WikEdGetElementsByClassNameGetPreviousSiblingNode = function (className, tagName, parentnode) {
 
ifwhile (parentnode !== null) {
node = node.previousSibling;
parent = document.body;
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
}
break;
 
// new browsers
var nodeList = [];
if (document.getElementsByClassName != null) {
nodeList = parent.getElementsByClassName(className);
}
 
// querySelector (IE8 standards mode)
else if (parent.querySelectorAll != null) {
nodeList = parent.querySelectorAll(tagName + '.' + className);
}
 
// all others (slow)
else {
var tags = parent.getElementsByTagName(tagName);
for (var i = 0; i < tags.length; i ++) {
if (tags[i].className == className) {
nodeList.push(tags[i]);
}
}
}
return(nodeList) node;
};
 
 
//
// WikEdGetPreviousSiblingNodewikEd.GetNextSiblingNode: getPreviousSiblinggetNextSibling, ignore non-element nodes such as comments
//
 
windowwikEd.WikEdGetPreviousSiblingNodeGetNextSiblingNode = function (node) {
 
while (node !== null) {
node = node.previousSiblingnextSibling;
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return( node);
};
 
 
//
// WikEdGetNextSiblingNodewikEd.GetFirstChildNode: getNextSiblinggetFirstChild, ignore non-element nodes such as comments
//
 
windowwikEd.WikEdGetNextSiblingNodeGetFirstChildNode = function (node) {
 
whileif (node !== null) {
node = node.nextSiblingfirstChild;
if ( (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
node = wikEd.GetNextSiblingNode(node);
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return( node);
};
 
 
//
// WikEdGetFirstChildNodewikEd.GetLastChildNode: getFirstChildgetLastChild, ignore non-element nodes such as comments
//
 
windowwikEd.WikEdGetFirstChildNodeGetLastChildNode = function (node) {
 
if (node !== null) {
node = node.firstChildlastChild;
if ( (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
WikEdGetNextSiblingNode(node);
node = wikEd.GetPreviousSiblingNode(node);
}
}
return( node);
};
 
 
//
// wikEd.CreateRandomString: create random string of specified length and character set (code copied to wikEdDiff.js)
// WikEdGetLastChildNode: getLastChild, ignore non-element nodes such as comments
//
 
windowwikEd.WikEdGetLastChildNodeCreateRandomString = function (nodestrLength, charSet) {
 
if (nodecharSet !=== nullundefined) {
charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789';
node = node.lastChild;
}
WikEdGetPreviousSiblingNode(node);
var str = '';
return(node);
for (var i = 0; i < strLength; i ++) {
str += charSet.charAt(Math.floor(Math.random() * charSet.length));
}
return str;
};
 
 
//
// wikEd.TabifyHTML: indent html for debugging
// WikEdCreateRandomString: create random string of specified length and character set
//
 
windowwikEd.WikEdCreateRandomStringTabifyHTML = function(strLength, charSet(html) {
 
var indent = '';
if (charSet == null) {
var html = html.replace(/((<(\/)?(\w+)[^>]*>)(<!--(.|\n)*?-->)?)([^<]*)/g,
charSet = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_';
function(p, p1, p2, p3, p4, p5, p6, p7) {
}
var strhtml = '';
var code = p1;
for (var i = 0; i < strLength; i ++) {
var slash = p3;
str += charSet.charAt(Math.floor(Math.random() * charSet.length));
var tag = p4;
}
var text = p7;
return(str);
if ( (slash == '/') && (indent === '') ) {
}
html += '\n### Missing opening tag ###';
}
if ( (slash == '/') && (indent.length > 0) ) {
indent = indent.substr(0, indent.length - 1);
}
if ( (slash === '') && (tag.toLowerCase() == 'tr') ) {
html += '\n';
}
html += '\n' + indent + code;
if ( (slash === '') && (tag.toLowerCase() != 'br') ) {
indent += '\t';
}
if (text !== '') {
text = text.replace(/\n(?!($))/g, '\n' + indent);
html += '\n' + indent + text;
}
return html;
}
);
return html;
};
 
 
//
// WikEdDebugwikEd.Debug: print the value of variables
// use either a single value or a description followed by a value
// popup = true: use alert popup if debug textarea is not yet setup
//
 
windowwikEd.WikEdDebugDebug = function (objectName, object, usePopup) {
 
// string
var value = '';
if (typeof( object) == 'string') {
value = ': ' + '"' + object + '"';
}
 
// objects
else if (typeof( object) == 'object') {
 
// null
if (object === null) {
value = ': [null]';
}
 
// whole highlighting parse tree array
// { 'tag': , 'parent': , 'firstChild': , 'nextSibling': , 'start': , 'tagLength': , 'type': , 'pairedTagPospaired': , 'pairedPos': , 'left': , 'right': , 'index': , 'attrib': , 'newline': }
else if ( (typeof( object[0]) == 'object') && (typeof( object[0].type) == 'string') ) {
value = ': Parse tree full:\n';
for (var i = 0; i < object.length; i ++) {
value += i + ': ';
var node = object[i];
if (node === null) {
value += '(null)\n';
}
Line 15,149 ⟶ 18,634:
else {
value += '[type: "' + node.type + '", tag: "' + node.tag + '", start: ' + node.start + ', tagLength: ' + node.tagLength + ', parent: ' + node.parent;
if (typeof( node.left) == 'string') {
value += ', left: "' + node.left + '", right: "' + node.right + '"';
}
Line 15,158 ⟶ 18,643:
}
 
// whole highlighting parse tree up
else if ( (typeof( object.tree) == 'object') && (typeof( object.lastOpenNode) == 'number') ) {
xxxx;
value = ': Parse tree upwards:\n';
var parseTreeIndex = object.lastOpenNode;
var node = object.tree[parseTreeIndex];
while (node !== nullundefined) {
if (node.type == 'root') {
value += parseTreeIndex + ': [type: "' + node.type + '"]\n';
Line 15,170 ⟶ 18,654:
else {
value += parseTreeIndex + ': [type: "' + node.type + '", tag: "' + node.tag + '", start: ' + node.start + ', tagLength: ' + node.tagLength + ', parent: ' + node.parent;
if (typeof( node.left) == 'string') {
value += ', left: "' + node.left + '", right: "' + node.right + '"';
}
Line 15,184 ⟶ 18,668:
}
 
// highlighting parse tree node
// { 'tag': , 'parent': , 'firstChild': , 'nextSibling': , 'start': , 'tagLength': , 'type': , 'pairedTagPospaired': , 'pairedPos': , 'left': , 'right': , 'index': }
else if (typeof( object.type)tag == 'string') {
var node = object;
if (node.type == 'root') {
Line 15,196 ⟶ 18,680:
}
 
// DOM nodes
else if (typeof( object.nodeName) == 'string') {
value = ': [node; nodeName: ' + object.nodeName;
if (typeof( object.id) == 'string') {
if (object.id !== '') {
value += ', id: "' + object.id + '"';
}
}
if (typeof( object.className) == 'string') {
if (object.className !== '') {
value += ', class: "' + object.className + '"';
}
}
if (typeof( object.nodeValue) == 'string') {
value += ', nodeValue: "' + object.nodeValue + '"';
}
if ( (typeof object.innerHTML !== null'string') && (object.innerHTML !== '') ) {
var html = object.innerHTML;
if (html.length > wikEdConfig['wikEd.config.debugInnerHtmlLength']) {
html = html.substr(0, wikEdConfig['wikEd.config.debugInnerHtmlLength'] - 3) + '...';
}
value += ', innerHTML: "' + html + '"';
Line 15,222 ⟶ 18,706:
}
 
// default
else {
value = ': [' + object + ']';
Line 15,228 ⟶ 18,712:
}
 
// undefined
else if (typeof(object) === 'undefined') {
value = '';
}
 
// default
else {
value = ': ' + object;
}
 
// use debug textarea
var useDebug = false;
if (typeof(wikEdDebug)wikEd.debug !== 'undefined'null) {
useDebug = true;
if (wikEdDebug != null) {
useDebug = true;
}
}
if (useDebug === true) {
if (wikEdDebugOpenwikEd.debugOpen === false) {
wikEdDebugWrapperwikEd.debugWrapper.style.visibilitydisplay = 'visibleblock';
wikEdDebug.style.display = 'block';
window.scroll(0, WikEdGetOffsetTop(wikEdDebug));
wikEdDebugOpen = true;
}
if (objectName == null) {
wikEdDebug.value = '';
}
else {
 
// resize fullscreen frame
// cut text if having reached maximum length
if (wikEd.fullscreen === true) {
value = objectName + value + '\n';
wikEd.ResizeWindowHandler();
if (wikEdDebug.value.length > wikEdConfig['debugMaxLength']) {
wikEdDebug.value = value + wikEdDebug.value.substr(0, wikEdConfig['debugMaxLength'] * 2 / 3);
}
else {
window.scroll(0, wikEd.GetOffsetTop(wikEd.debug));
wikEdDebug.value = value + wikEdDebug.value;
}
wikEd.debugOpen = true;
}
 
// cut text if having reached maximum length
value = objectName + value + '\n';
if (wikEd.debug.value.length > wikEd.config.debugMaxLength) {
wikEd.debug.value = value + wikEd.debug.value.substr(0, wikEd.config.debugMaxLength * 2 / 3);
}
else {
wikEd.debug.value = value + wikEd.debug.value;
}
}
 
// use popup alert
else if (usePopup === true) {
if (object === null) {
window.alert(objectName);
}
else {
window.alert(objectName + ': ' + value);
}
}
 
// use error console
else {
var msg;
if (object === null) {
msg = objectName + '';
}
else {
msg = objectName + ': ' + value;
}
wikEd.ConsoleLog(msg);
msg = msg.replace(/\'/g, '\\\'');
setTimeout('throw new Error(\'WikEdDebug: ' + msg + '\')', 0);
}
return;
Line 15,295 ⟶ 18,777:
 
//
// wikEd.ConsoleLog: log message to console
// WikEdDebugTimer: show all measured timepoints
// mw.log no longer works
// add a new time measurement: wikEdDebugTimer.push([1234, new Date]);
 
wikEd.ConsoleLog = function (msg) {
 
if ( (typeof console == 'object') && (typeof console.error == 'function') ) {
console.error('[wikEd debug]', msg);
}
else {
msg = msg.replace(/\n/g, '\\n');
msg = msg.replace(/([\'\"\\])/g, '\\$1');
window.setTimeout('throw new Error(\'[wikEd debug] ' + msg + '\')', 0);
}
return;
};
 
 
//
// wikEd.DebugTimer: show all measured timepoints
// add a new time measurement: wikEd.debugTimer.push([1234, new Date]);
 
wikEd.DebugTimer = function () {
 
window.WikEdDebugTimer = function() {
var times = '';
var start = wikEdDebugTimerwikEd.debugTimer[0][1].getTime();
var prev = 0;
for (var i = 0; i < wikEdDebugTimerwikEd.debugTimer.length; i ++) {
var curr = wikEdDebugTimerwikEd.debugTimer[i][1].getTime() - start;
var diff = curr - prev;
prev = curr;
times += wikEdDebugTimerwikEd.debugTimer[i][0] + ': ' + curr + ' ms (+ ' + diff + ' ms)\n';
}
WikEdDebugwikEd.Debug(times);
wikEdDebugTimerwikEd.debugTimer = [];
};
 
 
//
// WikEdInsertTagswikEd.InsertTags: overrides the insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars
//
 
windowwikEd.WikEdInsertTagsInsertTags = function (openTag, closeTag, sampleText) {
 
if (wikEdUseWikEdwikEd.useWikEd === true) {
WikEdEditButtonwikEd.EditButton(document.getElementById('wikEdInsertTags'), 'wikEdInsertTags', [openTag, closeTag, sampleText]);
}
else if (WikEdInsertTagsOriginalwikEd.InsertTagsOriginal !== null) {
WikEdInsertTagsOriginalwikEd.InsertTagsOriginal(openTag, closeTag, sampleText);
}
return;
Line 15,330 ⟶ 18,831:
 
//
// WikEdInsertAtCursorwikEd.InsertAtCursor: overrides the insertAtCursor function in wikia.com MediaWiki:Functions.js
//
 
windowwikEd.WikEdInsertAtCursorInsertAtCursor = function (myField, myValue) {
 
if (wikEdUseWikEdwikEd.useWikEd === true) {
if (myField == wikEdTextareawikEd.textarea) {
WikEdEditButtonwikEd.EditButton(document.getElementById('wikEdInsertTags'), 'wikEdInsertTags', [ myValue ]);
}
}
else if (WikEdInsertAtCursorOriginalwikEd.InsertAtCursorOriginal !== null) {
WikEdInsertAtCursorOriginalwikEd.InsertAtCursorOriginal(myField, myValue);
}
return;
Line 15,348 ⟶ 18,849:
 
//
// WikEdExecuteHookwikEd.ExecuteHook: executes scheduled custom functions from functionsHook array (code copied to wikEdDiff.js)
//
 
windowwikEd.WikEdExecuteHookExecuteHook = function (functionsHook, onlyOnce) {
 
if (functionsHook === null) {
return;
}
for (var i = 0; i < functionsHook.length; i ++) {
if (typeof functionsHook[i]( == 'function'); {
functionsHook[i]();
}
}
if (onlyOnce === true) {
functionsHook = [];
}
Line 15,364 ⟶ 18,870:
 
//
// WikEdInitUnicodewikEd.InitUnicode: define character tables used in WikedFixUnicodewikEd.FixUnicode()
// see http://kmi.open.ac.uk/projects/ceryle/doc/docs/NOTE-charents.html
 
windowwikEd.WikEdInitUnicodeInitUnicode = function () {
 
// define only once
if (wikEdSupportedCharswikEd.supportedChars !== null) {
return;
}
 
// supported chars in Mozilla and IE
wikEd.supportedChars = [
wikEdSupportedChars = [
[ 'a1', 'iexcl'], // ¡
[ 'a2', 'cent'], // ¢
Line 15,594 ⟶ 19,100:
];
 
// reserved for internal wikEd use
wikEdReservedCharswikEd.reservedChars = [
[ '26', 'amp'], // &
[ '3c', 'lt'], // <
Line 15,602 ⟶ 19,108:
];
 
// special chars (spaces and invisible characters)
wikEdSpecialCharswikEd.specialChars = [
['2002', 'ensp'], //   en space
[ 'ad', 'shy'], // ­ soft hyphen
Line 15,614 ⟶ 19,120:
];
 
// unsupported chars in IE6
wikEdProblemCharswikEd.problemChars = [
[ '3d1', 'thetasym'], // ϑ
[ '3d2', 'upsih'], // ϒ
Line 15,644 ⟶ 19,150:
 
 
// index to all existing 253 HTML/XHTML character entities
var allCharEntities = wikEdSupportedCharswikEd.supportedChars.concat(wikEdReservedCharswikEd.reservedChars, wikEdSpecialCharswikEd.specialChars, wikEdProblemCharswikEd.problemChars);
for (var i = 0; i < allCharEntities.length; i ++) {
wikEdCharEntitiesByNamewikEd.charEntitiesByName[ allCharEntities[i][1] ] = String.fromCharCode(parseInt(allCharEntities[i][0], 16));
}
 
// syntax highlighting of ASCII control characters and invisibles (decimal value, title)
wikEd.controlCharHighlighting = {
wikEdControlCharHighlighting = {
'0': 'null',
'1': 'start of heading',
Line 15,688 ⟶ 19,194:
'8233': 'paragraph separator' // \u2028
};
for (var decimalValue in wikEdControlCharHighlightingwikEd.controlCharHighlighting) {
if (wikEdControlCharHighlightingObject.prototype.hasOwnProperty.call(wikEd.controlCharHighlighting, decimalValue) === true) {
wikEdControlCharHighlightingStrwikEd.controlCharHighlightingStr += '\\' + String.fromCharCode(decimalValue);
}
}
 
// character syntax highlighting: strange spaces, hyphens, and dashes (decimal value, class = title)
wikEd.charHighlighting = {
wikEdCharHighlighting = {
'9': 'wikEdTabtab', // \u0009 ' '
'8194': 'wikEdEnSpaceenSpace', // \u2002 ' '
'8195': 'wikEdEmSpaceemSpace', // \u2003 ' '
'8201': 'wikEdThinSpacethinSpace', // \u2009 ' '
'12288': 'wikEdIdeographicSpaceideographicSpace', // \u3000 ' '
'45': 'wikEdHyphenDashhyphenDash', // \u00a0 '-'
'173': 'wikEdSoftHyphensoftHyphen', // \u00ad '­'
'8210': 'wikEdFigureDashfigureDash', // \u2012 '‒'
'8211': 'wikEdEnDashenDash', // \u2013 '–'
'8212': 'wikEdEmDashemDash', // \u2014 '—'
'8213': 'wikEdBarDashbarDash', // \u2015 '―'
'8722': 'wikEdMinusDashminusDash' // \u2212 '−'
};
for (var decimalValue in wikEdCharHighlightingwikEd.charHighlighting) {
if (wikEdCharHighlightingObject.prototype.hasOwnProperty.call(wikEd.charHighlighting, decimalValue) === true) {
wikEdCharHighlightingStrwikEd.charHighlightingStr += '\\' + String.fromCharCode(decimalValue);
}
}
 
// UniCode support for regexps, without _0-9, from http://xregexp.com/addons/unicode/unicode-base.js v1.0.0
wikEd.letters = '0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-05270531-055605590561-058705D0-05EA05F0-05F20620-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A082408280840-085808A008A2-08AC0904-0939093D09500958-09610971-09770979-097F0985-098C098F09900993-09A809AA-09B009B209B6-09B909BD09CE09DC09DD09DF-09E109F009F10A05-0A0A0A0F0A100A13-0A280A2A-0A300A320A330A350A360A380A390A59-0A5C0A5E0A72-0A740A85-0A8D0A8F-0A910A93-0AA80AAA-0AB00AB20AB30AB5-0AB90ABD0AD00AE00AE10B05-0B0C0B0F0B100B13-0B280B2A-0B300B320B330B35-0B390B3D0B5C0B5D0B5F-0B610B710B830B85-0B8A0B8E-0B900B92-0B950B990B9A0B9C0B9E0B9F0BA30BA40BA8-0BAA0BAE-0BB90BD00C05-0C0C0C0E-0C100C12-0C280C2A-0C330C35-0C390C3D0C580C590C600C610C85-0C8C0C8E-0C900C92-0CA80CAA-0CB30CB5-0CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510C710CD10D0-10FA10FC-1248124A-124D1250-12561258125A-125D1260-1288128A-128D1290-12B012B2-12B512B8-12BE12C012C2-12C512C8-12D612D8-13101312-13151318-135A1380-138F13A0-13F41401-166C166F-167F1681-169A16A0-16EA1700-170C170E-17111720-17311740-17511760-176C176E-17701780-17B317D717DC1820-18771880-18A818AA18B0-18F51900-191C1950-196D1970-19741980-19AB19C1-19C71A00-1A161A20-1A541AA71B05-1B331B45-1B4B1B83-1BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2CF22CF32D00-2D252D272D2D2D30-2D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31BA31F0-31FF3400-4DB54E00-9FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDAAE0-AAEAAAF2-AAF4AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA6DFA70-FAD9FB00-FB06FB13-FB17FB1DFB1F-FB28FB2A-FB36FB38-FB3CFB3EFB40FB41FB43FB44FB46-FBB1FBD3-FD3DFD50-FD8FFD92-FDC7FDF0-FDFBFE70-FE74FE76-FEFCFF21-FF3AFF41-FF5AFF66-FFBEFFC2-FFC7FFCA-FFCFFFD2-FFD7FFDA-FFDC'.replace(/(\w{4})/g, '\\u$1');
 
return;
Line 15,719 ⟶ 19,228:
 
 
// call wikEd on startup, but not for the iframe under Greasemonkey
wikEd.Startup();
if (window == top) {
WikEdStartup();
}
 
 
// </nowiki></presyntaxhighlight>