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

Content deleted Content added
test
Maintenance: Remove use of deprecated wgEnableAPI (always true) - mw:RL/MGU
 
(28 intermediate revisions by one other user not shown)
Line 1:
// <syntaxhighlight lang="JavaScript">
// <pre><nowiki>
 
// JSHint options
if (typeof(wikEd) == 'undefined') { window.wikEd = {}; }
/* 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 */
/* global GM_getValue, GM_setValue, GM_xmlhttpRequest, console */
 
// turn on ECMAScript 5 strict mode
// version info
'use strict';
wikEd.programVersion = '0.9.93';//a test
wikEd.programDate = 'September 26, 2010';
 
// define global object
/*
var wikEd; if (wikEd === undefined) { wikEd = {}; }
 
Program description:
 
wikEd is a full-featured Wikipedia-integrated advanced text editor for regular to advanced wiki users.
wikEd features syntax highlighting with code check and reference and template folding,
on-page Show preview and Show changes, and advanced search and replace functions.
wikEd works under all web browsers except Internet Explorer and Opera.
The code has to be saved as UTF-8 in your editor to preserve Unicode characters like ♥ (heart)
 
Greasemonkey metadata:
 
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
// @homepagesource http https://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
// @sourceauthor httpCacycle (https://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:
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).
 
*/};
PLEASE DO NOT COPY THE WHOLE PROGRAM in order to get the frequent updates and bug fixes and to save disk space!
See http://en.wikipedia.org/wiki/User:Cacycle/wikEd for installation instructions
 
*/
 
// define global objects
var wikEdConfig;
var wikEdText;
var WED;
var WikEdDiff;
 
//
Line 47 ⟶ 49:
//
 
wikEd.InitGlobalConfigs = 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(wikEd.config.text) === 'undefined') { wikEd.config.text = {}; }
 
// wikEd.InitText: define built-in user interface texts
wikEd.InitText = function () {
wikEd.InitObject(wikEd.config.text, {
 
// logo
'wikEdLogo alt': 'wikEd',
'wikEdLogo title': 'wikEd {wikEdProgramVersion} ({wikEdProgramDate}) Click to disable',
Line 64 ⟶ 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 81 ⟶ 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 105 ⟶ 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 113 ⟶ 130:
'wikEdRedoAll title': 'Redo all changes',
 
// formatting buttons, bottom row
'wikEdWikiLink alt': 'Link',
'wikEdWikiLink title': 'Wiki link',
Line 133 ⟶ 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 154 ⟶ 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 169 ⟶ 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 183 ⟶ 208:
'wikEdFixRedirect title': 'Fix redirects',
 
// fix buttons, bottom row
'wikEdFixDashes alt': 'Fix dashes',
'wikEdFixDashes title': 'Fix dashes',
Line 197 ⟶ 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 215 ⟶ 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 244 ⟶ 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 254 ⟶ 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 264 ⟶ 292:
'wikEdScrollToEdit2 title': 'Scroll to edit field',
 
// preview and changes buttons, bottom
'wikEdScrollToPreview3 alt': 'Scroll to preview',
'wikEdScrollToPreview3 title': 'Scroll to preview field',
Line 270 ⟶ 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 282 ⟶ 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 296 ⟶ 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 350 ⟶ 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
'clonedWarningsNote': 'Duplicated edit warnings (wikEd):'
 
}, wikEd.config.showMissingTranslations);
};
 
// define built-in user interface texts
wikEd.InitText();
 
// use local copies of images for testing (set to true in local copy of edit page), also defined in wikEdDiff.js
if (typeof(wikEd.config.useLocalImages) === 'undefined') { wikEd.config.useLocalImages = false; }
 
// path to local wikEd images for testing, also defined in wikEdDiff.js
if (wikEd.config.imagePathLocal === undefined) { wikEd.config.imagePathLocal = 'file:///D:/wikEd/images/'; }
 
// path to localwikEd images for testing, also defined in wikEdDiff.js
if (typeof(wikEd.config.imagePathLocal)imagePath === 'undefined') { wikEd.config.imagePathLocalimagePath = 'file://upload.wikimedia.org/D:/wikEdwikipedia/imagescommons/'; }
 
// pathwikEd toimage imagesfilenames, also defined in wikEdDiff.js
if (typeof(wikEd.config.imagePath)image === 'undefined') { wikEd.config.imagePathimage = '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(wikEd.config.image) == 'undefined') { wikEd.config.image = {}; }
 
// wikEd.InitImages: define built-in image URLs
wikEd.InitImages = function() {
wikEd.InitImage(wikEd.config.image, {
'barDash': '5/52/WikEd_bar_dash.png',
Line 386 ⟶ 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 418 ⟶ 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 438 ⟶ 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 457 ⟶ 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 467 ⟶ 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 473 ⟶ 517:
};
 
// edit-frame css rules
if (typeof(wikEd.config.frameCSS) === 'undefined') { wikEd.config.frameCSS = {}; }
 
// wikEd.InitFrameCSS: define built-in edit frame css
wikEd.InitFrameCSS = function () {
wikEd.InitObject(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 506 ⟶ 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 563 ⟶ 629:
'span.wikEdISBN:hover': 'text-decoration: underline;',
 
// external links
'.wikEdURL': '',
'.wikEdURLName': 'color: #00e; font-weight: bold;',
Line 571 ⟶ 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;',
 
// tables
'.wikEdCharEntity, .wikEdCharEntityShow':
'.wikEdFrameBodySyntax .wikEdTableContainer': 'display: block; position: fixed; left: -10000em;',
'color: #000; background: #e8e8e8; text-shadow: none;',
'.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;',
 
// wikEd.frameBodyNewbiewikEdFrameBodyNewbie ref and template hiding
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRef, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTempl, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNs,':
'position: fixed; left: -10000em;',
'.wikEdFrameBodyNewbie wikEd.refContainerwikEdRefContainer + .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 696 ⟶ 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 709 ⟶ 786:
};
 
// main window css rules
if (typeof(wikEd.config.mainCSS) === 'undefined') { wikEd.config.mainCSS = {}; }
 
// wikEd.InitMainCSS: define built-in main window css
wikEd.InitMainCSS = function () {
wikEd.InitObject(wikEd.config.mainCSS, {
 
// logo
'.wikEdLogoList': 'list-style-type: none;',
'.wikEdLogo': 'margin-left: 0.5em;',
Line 723 ⟶ 800:
};
 
// main window css rules for edit pages only
if (typeof(wikEd.config.mainEditCSS) === 'undefined') { wikEd.config.mainEditCSS = {}; }
 
// wikEd.InitMainEditCSS: define built-in main window css for edit pages only
wikEd.InitMainEditCSS = function () {
wikEd.InitObject(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 743 ⟶ 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 792 ⟶ 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;',
'.wikEdSubmitWrapper': '',
'.wikEdSubmitButtonsWrapper': 'float: left; margin: 0.4em 0.75em 0;',
'.wikEdEditOptionsWrapper': 'float: left; margin-right: 1em0.4em 0.75em 0;',
'.wikEdEditHelp': 'float: left: display: inline-block; white-space: nowrap;',
'.wikEdLocalPrevWrapperwikEdInsertWrapper': 'marginfloat: 0.5emleft; 0clear: 0both; margin-top: 0.25em;',
'.wikEdFullscreen .wikEdInsertWrapper p': 'display: inline; margin: '0;',
'.wikEdLocalPrevWrapper': 'float: left; width: 100%;',
 
// various
'.editCheckboxes': 'margin-bottom: 0;',
'.wikEdEditOptions': 'display: inline-block; white-space: nowrap; vertical-align: text-top;',
'.wikEdEditOptions LABELlabel': 'vertical-align: text-bottom;',
'#editpage-specialcharscopywarn': 'clear: both; '',
'#editpage-specialchars': '',
 
'#wikEdClonedWarnings': '',
// wDiff
'#wikEdClonedWarningsNote': 'background: #fff; color: #888; font-size: 75%; display: inline;',
'.wDiffParagraph:before': 'content: "¶";'
'.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(wikEd.config.button) === 'undefined') { wikEd.config.button = {}; }
 
// 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)
wikEd.InitButton = function () {
wikEd.InitObject(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', wikEd.config.text['wikEdUndo title'], wikEd.config.image['undo'], '16', '16', wikEd.config.text['wikEdUndo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
2: ['wikEdRedo', 'wikEdButtonInactive', wikEd.config.text['wikEdRedo title'], wikEd.config.image['redo'], '16', '16', wikEd.config.text['wikEdRedo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
3: ['wikEdBold', 'wikEdButton', wikEd.config.text['wikEdBold title'], wikEd.config.image['bold'], '16', '16', wikEd.config.text['wikEdBold alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
4: ['wikEdItalic', 'wikEdButton', wikEd.config.text['wikEdItalic title'], wikEd.config.image['italic'], '16', '16', wikEd.config.text['wikEdItalic alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
5: ['wikEdUnderline', 'wikEdButton', wikEd.config.text['wikEdUnderline title'], wikEd.config.image['underline'], '16', '16', wikEd.config.text['wikEdUnderline alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
6: ['wikEdStrikethrough', 'wikEdButton', wikEd.config.text['wikEdStrikethrough title'], wikEd.config.image['strikethrough'], '16', '16', wikEd.config.text['wikEdStrikethrough alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
7: ['wikEdNowiki', 'wikEdButton', wikEd.config.text['wikEdNowiki title'], wikEd.config.image['nowiki'], '16', '16', wikEd.config.text['wikEdNowiki alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
8: ['wikEdSuperscript', 'wikEdButton', wikEd.config.text['wikEdSuperscript title'], wikEd.config.image['superscript'], '16', '16', wikEd.config.text['wikEdSuperscript alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
9: ['wikEdSubscript', 'wikEdButton', wikEd.config.text['wikEdSubscript title'], wikEd.config.image['subscript'], '16', '16', wikEd.config.text['wikEdSubscript alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
10: ['wikEdRef', 'wikEdButton', wikEd.config.text['wikEdRef title'], wikEd.config.image['ref'], '16', '16', wikEd.config.text['wikEdRef alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdRef\'); } else { wikEd.EditButton(obj, \'wikEdRefNamed\'); }' ],
12: ['wikEdCase', 'wikEdButton', wikEd.config.text['wikEdCase title'], wikEd.config.image['case'], '16', '16', wikEd.config.text['wikEdCase alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
80: ['wikEdSort', 'wikEdButton', wikEd.config.text['wikEdSort title'], wikEd.config.image['sort'], '16', '16', wikEd.config.text['wikEdSort alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
25: ['wikEdRedirect', 'wikEdButton', wikEd.config.text['wikEdRedirect title'], wikEd.config.image['redirect'], '16', '16', wikEd.config.text['wikEdRedirect alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
13: ['wikEdUndoAll', 'wikEdButton', wikEd.config.text['wikEdUndoAll title'], wikEd.config.image['undoAll'], '16', '16', wikEd.config.text['wikEdUndoAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
14: ['wikEdRedoAll', 'wikEdButtonInactive', wikEd.config.text['wikEdRedoAll title'], wikEd.config.image['redoAll'], '16', '16', wikEd.config.text['wikEdRedoAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// format bottom
15: ['wikEdWikiLink', 'wikEdButton', wikEd.config.text['wikEdWikiLink title'], wikEd.config.image['wikiLink'], '16', '16', wikEd.config.text['wikEdWikiLink alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
16: ['wikEdWebLink', 'wikEdButton', wikEd.config.text['wikEdWebLink title'], wikEd.config.image['webLink'], '16', '16', wikEd.config.text['wikEdWebLink alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
17: ['wikEdHeading', 'wikEdButton', wikEd.config.text['wikEdHeading title'], wikEd.config.image['heading'], '16', '16', wikEd.config.text['wikEdHeading alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseHeading\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseHeading\'); }' ],
19: ['wikEdBulletList', 'wikEdButton', wikEd.config.text['wikEdBulletList title'], wikEd.config.image['bulletList'], '16', '16', wikEd.config.text['wikEdBulletList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseBulletList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseBulletList\'); }' ],
20: ['wikEdNumberList', 'wikEdButton', wikEd.config.text['wikEdNumberList title'], wikEd.config.image['numberList'], '16', '16', wikEd.config.text['wikEdNumberList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseNumberList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseNumberList\'); }' ],
21: ['wikEdIndentList', 'wikEdButton', wikEd.config.text['wikEdIndentList title'], wikEd.config.image['indentList'], '16', '16', wikEd.config.text['wikEdIndentList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseIndentList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseIndentList\'); }' ],
22: ['wikEdDefinitionList', 'wikEdButton', wikEd.config.text['wikEdDefinitionList title'], wikEd.config.image['definitionList'], '16', '16', wikEd.config.text['wikEdDefinitionList alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
23: ['wikEdImage', 'wikEdButton', wikEd.config.text['wikEdImage title'], wikEd.config.image['image'], '16', '16', wikEd.config.text['wikEdImage alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
24: ['wikEdTable', 'wikEdButton', wikEd.config.text['wikEdTable title'], wikEd.config.image['table'], '16', '16', wikEd.config.text['wikEdTable alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
11: ['wikEdReferences', 'wikEdButton', wikEd.config.text['wikEdReferences title'], wikEd.config.image['references'], '16', '16', wikEd.config.text['wikEdReferences alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id); } else { wikEd.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', wikEd.config.text['wikEdWikify title'], wikEd.config.image['wikify'], '16', '16', wikEd.config.text['wikEdWikify alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
27: ['wikEdTextify', 'wikEdButton', wikEd.config.text['wikEdTextify title'], wikEd.config.image['textify'], '16', '16', wikEd.config.text['wikEdTextify alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
 
// control top
77: ['wikEdRefHide', 'wikEdButtonUnchecked', wikEd.config.text['wikEdRefHide title'], wikEd.config.image['refHide'], '16', '16', wikEd.config.text['wikEdRefHide alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
29: ['wikEdTextZoom', 'wikEdButton', wikEd.config.text['wikEdTextZoom title'], wikEd.config.image['textZoom'], '16', '16', wikEd.config.text['wikEdTextZoom alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.Button(obj, \'wikEdTextZoomDown\'); } else { wikEd.Button(obj, \'wikEdTextZoomUp\'); }' ],
30: ['wikEdClearHistory', 'wikEdButton', wikEd.config.text['wikEdClearHistory title'], wikEd.config.image['clearHistory'], '16', '16', wikEd.config.text['wikEdClearHistory alt'], 'wikEd.Button(obj, objIdobj.id);' ],
31: ['wikEdScrollToPreview', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview title'], wikEd.config.image['scrollToPreviewDown'], '16', '16', wikEd.config.text['wikEdScrollToPreview alt'], 'wikEd.Button(obj, objIdobj.id);' ],
32: ['wikEdScrollToEdit', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit title'], wikEd.config.image['scrollToEditDown'], '16', '16', wikEd.config.text['wikEdScrollToEdit alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// control bottom
33: ['wikEdUseWikEd', 'wikEdButtonChecked', wikEd.config.text['wikEdUseWikEd title'], wikEd.config.image['useWikEd'], '16', '16', wikEd.config.text['wikEdUseWikEd alt'], 'if (!event.ctrlKey) { wikEd.Button(obj, objIdobj.id, true); } else { wikEd.DebugInfo(event); }' ],
34: ['wikEdHighlightSyntax', 'wikEdButtonUnchecked', wikEd.config.text['wikEdHighlightSyntax title'], wikEd.config.image['highlightSyntax'], '16', '16', wikEd.config.text['wikEdHighlightSyntax alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
35: ['wikEdSource', 'wikEdButton', wikEd.config.text['wikEdSource title'], wikEd.config.image['source'], '16', '16', wikEd.config.text['wikEdSource alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
75: ['wikEdCloseToolbar', 'wikEdButtonUnchecked', wikEd.config.text['wikEdCloseToolbar title'], wikEd.config.image['closeToolbar'], '16', '16', wikEd.config.text['wikEdCloseToolbar alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
36: ['wikEdUsing', 'wikEdButtonUnchecked', wikEd.config.text['wikEdUsing title'], wikEd.config.image['using'], '16', '16', wikEd.config.text['wikEdUsing alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
37: ['wikEdFullScreen', 'wikEdButtonUnchecked', wikEd.config.text['wikEdFullScreen title'], wikEd.config.image['fullScreen'], '16', '16', wikEd.config.text['wikEdFullScreen alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
79: ['wikEdTableMode', 'wikEdButtonUnchecked', wikEd.config.text['wikEdTableMode title'], wikEd.config.image['tableMode'], '16', '16', wikEd.config.text['wikEdTableMode alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
 
// find top
39: ['wikEdFindAll', 'wikEdButton', wikEd.config.text['wikEdFindAll title'], wikEd.config.image['findAll'], '16', '16', wikEd.config.text['wikEdFindAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
40: ['wikEdFindPrev', 'wikEdButton', wikEd.config.text['wikEdFindPrev title'], wikEd.config.image['findPrev'], '16', '16', wikEd.config.text['wikEdFindPrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
41: ['wikEdFindNext', 'wikEdButton', wikEd.config.text['wikEdFindNext title'], wikEd.config.image['findNext'], '16', '16', wikEd.config.text['wikEdFindNext alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
43: ['wikEdJumpPrev', 'wikEdButton', wikEd.config.text['wikEdJumpPrev title'], wikEd.config.image['jumpPrev'], '16', '16', wikEd.config.text['wikEdJumpPrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
44: ['wikEdJumpNext', 'wikEdButton', wikEd.config.text['wikEdJumpNext title'], wikEd.config.image['jumpNext'], '16', '16', wikEd.config.text['wikEdJumpNext alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// find bottom
46: ['wikEdReplaceAll', 'wikEdButton', wikEd.config.text['wikEdReplaceAll title'], wikEd.config.image['replaceAll'], '16', '16', wikEd.config.text['wikEdReplaceAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
47: ['wikEdReplacePrev', 'wikEdButton', wikEd.config.text['wikEdReplacePrev title'], wikEd.config.image['replacePrev'], '16', '16', wikEd.config.text['wikEdReplacePrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
48: ['wikEdReplaceNext', 'wikEdButton', wikEd.config.text['wikEdReplaceNext title'], wikEd.config.image['replaceNext'], '16', '16', wikEd.config.text['wikEdReplaceNext alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
49: ['wikEdCaseSensitive', 'wikEdButtonUnchecked', wikEd.config.text['wikEdCaseSensitive title'], wikEd.config.image['caseSensitive'], '16', '16', wikEd.config.text['wikEdCaseSensitive alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
50: ['wikEdRegExp', 'wikEdButtonUnchecked', wikEd.config.text['wikEdRegExp title'], wikEd.config.image['regExp'], '16', '16', wikEd.config.text['wikEdRegExp alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
51: ['wikEdFindAhead', 'wikEdButtonUnchecked', wikEd.config.text['wikEdFindAhead title'], wikEd.config.image['findAhead'], '16', '16', wikEd.config.text['wikEdFindAhead alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
 
// fix top
52: ['wikEdFixBasic', 'wikEdButton', wikEd.config.text['wikEdFixBasic title'], wikEd.config.image['fixBasic'], '16', '16', wikEd.config.text['wikEdFixBasic alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
53: ['wikEdFixHtml', 'wikEdButton', wikEd.config.text['wikEdFixHtml title'], wikEd.config.image['fixHtml'], '16', '16', wikEd.config.text['wikEdFixHtml alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
54: ['wikEdFixCaps', 'wikEdButton', wikEd.config.text['wikEdFixCaps title'], wikEd.config.image['fixCaps'], '16', '16', wikEd.config.text['wikEdFixCaps alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
55: ['wikEdFixUnicode', 'wikEdButton', wikEd.config.text['wikEdFixUnicode title'], wikEd.config.image['fixUnicode'], '16', '16', wikEd.config.text['wikEdFixUnicode alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
81: ['wikEdFixRedirect', 'wikEdButton', wikEd.config.text['wikEdFixRedirect title'], wikEd.config.image['fixRedirect'], '16', '16', wikEd.config.text['wikEdFixRedirect alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
56: ['wikEdFixAll', 'wikEdButton', wikEd.config.text['wikEdFixAll title'], wikEd.config.image['fixAll'], '16', '16', wikEd.config.text['wikEdFixAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
57: ['wikEdFixRegExTypo', 'wikEdButton', wikEd.config.text['wikEdFixRegExTypo title'], wikEd.config.image['fixRegExTypo'], '16', '16', wikEd.config.text['wikEdFixRegExTypo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// fix bottom
58: ['wikEdFixDashes', 'wikEdButton', wikEd.config.text['wikEdFixDashes title'], wikEd.config.image['fixDash'], '16', '16', wikEd.config.text['wikEdFixDashes alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
59: ['wikEdFixPunct', 'wikEdButton', wikEd.config.text['wikEdFixPunct title'], wikEd.config.image['fixPunct'], '16', '16', wikEd.config.text['wikEdFixPunct alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
60: ['wikEdFixMath', 'wikEdButton', wikEd.config.text['wikEdFixMath title'], wikEd.config.image['fixMath'], '16', '16', wikEd.config.text['wikEdFixMath alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
61: ['wikEdFixChem', 'wikEdButton', wikEd.config.text['wikEdFixChem title'], wikEd.config.image['fixChem'], '16', '16', wikEd.config.text['wikEdFixChem alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
62: ['wikEdFixUnits', 'wikEdButton', wikEd.config.text['wikEdFixUnits title'], wikEd.config.image['fixUnits'], '16', '16', wikEd.config.text['wikEdFixUnits alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// preview top
65: ['wikEdClose', 'wikEdButton', wikEd.config.text['wikEdClose title'], wikEd.config.image['close'], '16', '16', wikEd.config.text['wikEdClose alt'], 'wikEd.Button(obj, objIdobj.id);' ],
66: ['wikEdScrollToPreview2', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview2 title'], wikEd.config.image['scrollToPreviewDown'], '16', '16', wikEd.config.text['wikEdScrollToPreview2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
67: ['wikEdScrollToEdit2', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit2 title'], wikEd.config.image['scrollToEdit'], '16', '16', wikEd.config.text['wikEdScrollToEdit2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// preview bottom
70: ['wikEdClose2', 'wikEdButton', wikEd.config.text['wikEdClose2 title'], wikEd.config.image['close'], '16', '16', wikEd.config.text['wikEdClose2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
71: ['wikEdScrollToPreview3', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview3 title'], wikEd.config.image['scrollToPreview'], '16', '16', wikEd.config.text['wikEdScrollToPreview3 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
72: ['wikEdScrollToEdit3', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit3 title'], wikEd.config.image['scrollToEdit'], '16', '16', wikEd.config.text['wikEdScrollToEdit3 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// jump
7874: ['wikEdDiffwikEdScrollToEdit4', 'wikEdButtonSolo', 'wikEdButtonUnchecked', wikEd.config.text['wikEdDiffwikEdScrollToEdit4 title'], wikEd.config.image['wikEdDiffscrollToEditDown'], '16', '16', wikEd.config.text['wikEdDiffwikEdScrollToEdit4 alt'], 'wikEd.Button(obj, objId, trueobj.id);' ],
74: ['wikEdScrollToEdit4', 'wikEdButtonSolo', wikEd.config.text['wikEdScrollToEdit4 title'], wikEd.config.image['scrollToEditDown'], '16', '16', wikEd.config.text['wikEdScrollToEdit4 alt'], 'wikEd.Button(obj, objId);' ],
 
// dummy (empty placeholder)
76: ['wikEdDummy', 'wikEdButtonDummy', '', 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(wikEd.config.buttonKey) === 'undefined') { wikEd.config.buttonKey = {}; }
 
// wikEd.InitButtonKey: define accesskeys for edit buttons (wikEd button number: [key string, JS key code])
wikEd.InitButtonKey = function () {
wikEd.InitObject(wikEd.config.buttonKey, {
 
// wikEd button number: [key string, JS key code]
26: ['b', 66], // wikify
27: ['o', 79], // textify
Line 985 ⟶ 1,084:
};
 
// button bars (id, class, button numbers)
if (typeof(wikEd.config.buttonBar) === 'undefined') { wikEd.config.buttonBar = {}; }
 
// wikEd.InitButtonBar: define built-in button bars (id outer, class outer, id inner, class inner, height, grip title, button numbers)
wikEd.InitButtonBar = function () {
wikEd.InitObject(wikEd.config.buttonBar, {
 
'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,76] ],
// button name: [id outer, class outer, id inner, class inner, height, grip title, button numbers, bar title
'textify': ['wikEdButtonBarTextify', 'wikEdButtonBarTextify', 'wikEdButtonsTextify', 'wikEdButtonsTextify', 44, wikEd.config.text['wikEdGripTextify title'], [26,'br',27] ],
'custom1format': ['wikEdButtonBarCustom1wikEdButtonBarFormat', 'wikEdButtonBarCustom1wikEdButtonBarFormat', 'wikEdButtonsCustom1wikEdButtonsFormat', 'wikEdButtonsCustom1wikEdButtonsFormat', 44, wikEd.config.text['wikEdGripCustom1wikEdGripFormat 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'] ],
'findtextify': ['wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonsFindwikEdButtonsTextify', 'wikEdButtonsFindwikEdButtonsTextify', 44, 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, wikEd.config.text['wikEdGripFixwikEdGripCustom1 title'], [ ], wikEd.config.text[52,53,54,55,56,81,'brwikEdBarCustom1 title',58,59,60,61,62,57] ],
'custom2find': ['wikEdButtonBarCustom2wikEdButtonBarFind', 'wikEdButtonBarCustom2wikEdButtonBarFind', 'wikEdButtonsCustom2wikEdButtonsFind', 'wikEdButtonsCustom2wikEdButtonsFind', 44, wikEd.config.text['wikEdGripCustom2wikEdGripFind title'], [39,40,'find',41,76,43,44,'br',46,47,'replace',48,49,50,51], wikEd.config.text['wikEdBarFind title'] ],
'controlfix': ['wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonsControlwikEdButtonsFix', 'wikEdButtonsControlwikEdButtonsFix', 44, 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(wikEd.config.historyLength) === 'undefined') { wikEd.config.historyLength = {}; }
wikEd.InitHistoryLength = function () {
wikEd.InitObject(wikEd.config.historyLength, {
'find': 10,
Line 1,014 ⟶ 1,116:
};
 
// presets for combo input fields dropdown options, {wikEdUsing} appends a link to this script
if (typeof(wikEd.config.comboPresetOptions) === 'undefined') { wikEd.config.comboPresetOptions = {}; }
if (typeof(wikEd.config.comboPresetOptions['.summary']) === 'undefined') { wikEd.config.comboPresetOptions['.summary'] = wikEd.config.text['.wikEdPresetSummary']; }
 
// text for summary link to this script
if (typeof(wikEd.config.summaryUsing) == 'undefined') { wikEd.config.summaryUsing = wikEd.config.text['wikEdSummaryUsing']; }
 
// expiration time span for permanent cookies in seconds
if (typeof(wikEd.config.cookieExpireSec) == 'undefined') { wikEd.config.cookieExpireSec = 1 * 30 * 24 * 60 * 60; }
 
// text for summary link to this script
// disable wikEd preset
if (typeof(wikEd.config.disabledPreset)summaryUsing === 'undefined') { wikEd.config.disabledPresetsummaryUsing = falsewikEd.config.text.wikEdSummaryUsing; }
 
// expiration time span for permanent cookies in seconds, also defined in wikEdDiff.js
// find ahead as you type checkbox preset
if (typeof(wikEd.config.findAheadSelected)cookieExpireSec === 'undefined') { wikEd.config.findAheadSelectedcookieExpireSec = true1 * 30 * 24 * 60 * 60; }
 
// highlightdisable syntaxwikEd preset
if (typeof(wikEd.config.highlightSyntaxPreset)disabledPreset === 'undefined') { wikEd.config.highlightSyntaxPresetdisabledPreset = truefalse; }
 
// enablefind wikEdahead as you type checkbox preset
if (typeof(wikEd.config.useWikEdPreset)findAheadSelected === 'undefined') { wikEd.config.useWikEdPresetfindAheadSelected = true; }
 
// addhighlight '...using wikEd' to summarysyntax preset
if (typeof(wikEd.config.usingPreset)highlightSyntaxPreset === 'undefined') { wikEd.config.usingPresethighlightSyntaxPreset = falsetrue; }
 
// enable wikEd preset
// scroll to edit field on non-preview pages
if (typeof(wikEd.config.scrollToEdit)useWikEdPreset === 'undefined') { wikEd.config.scrollToEdituseWikEdPreset = true; }
 
// add '...using wikEd' to summary preset
// focus the edit field on non-preview pages
if (typeof(wikEd.config.focusEdit)usingPreset === 'undefined') { wikEd.config.focusEditusingPreset = truefalse; }
 
// scroll to edit field on non-preview pages
// wikEdDiff preset
if (typeof(wikEd.config.diffPreset)scrollToEdit === 'undefined') { wikEd.config.diffPresetscrollToEdit = falsetrue; }
 
// focus the edit field on non-preview pages
// fullscreen mode preset
if (typeof(wikEd.config.fullScreenModePreset)focusEdit === 'undefined') { wikEd.config.fullScreenModePresetfocusEdit = falsetrue; }
 
// showfullscreen MediaWiki toolbarmode preset
if (typeof(wikEd.config.closeToolbarPreset)fullScreenModePreset === 'undefined') { wikEd.config.closeToolbarPresetfullScreenModePreset = false; }
 
// hideshow refMediaWiki tagstoolbar preset
if (typeof(wikEd.config.refHidePreset)closeToolbarPreset === 'undefined') { wikEd.config.refHidePresetcloseToolbarPreset = false; }
 
// hide ref tags preset
// text size adjustment for edit window (percentage)
if (typeof(wikEd.config.textSizeAdjust)refHidePreset === 'undefined') { wikEd.config.textSizeAdjustrefHidePreset = 100false; }
 
// text size adjustment for edit window (percentage)
// remove invisible syntax highlighting comments after closing tag
if (typeof(wikEd.config.removeHighlightComments)textSizeAdjust === 'undefined') { wikEd.config.removeHighlightCommentstextSizeAdjust = true100; }
 
// remove invisible syntax highlighting comments after closing tag
// show the text-to-source button for testing purposes
if (typeof(wikEd.config.showSourceButton)removeHighlightComments === 'undefined') { wikEd.config.showSourceButtonremoveHighlightComments = falsetrue; }
 
// show the usingtext-wikEdto-source button for testing purposes
if (typeof(wikEd.config.showUsingButton)showSourceButton === 'undefined') { wikEd.config.showUsingButtonshowSourceButton = false; }
 
// show the using-wikEd button
// the wikEd help page link to be displayed after the editing help link, an empty string disables the link
if (typeof(wikEd.config.helpPageLink)showUsingButton === 'undefined') { wikEd.config.helpPageLinkshowUsingButton = wikEd.config.text['wikEdHelpPageLink']false; }
 
// the wikEd help page link to be displayed after the editing help link, an empty string disables the link
// enable external diff script
if (typeof(wikEd.config.loadDiffScript)helpPageLink === 'undefined') { wikEd.config.loadDiffScripthelpPageLink = truewikEd.config.text.wikEdHelpPageLink; }
 
// enable external wikEdDiffdiff script
if (typeof(wikEd.config.loadDiff)loadDiffScript === 'undefined') { wikEd.config.loadDiffloadDiffScript = true; }
 
// enable external InstaViewwikEdDiff script
if (typeof(wikEd.config.loadInstaView)loadDiff === 'undefined') { wikEd.config.loadInstaViewloadDiff = true; }
 
// RegExTypoFix rules page, the address must have the exact same ___domain name as the used wiki
// enable external IERange script
if (typeof(wikEd.config.loadIERange)regExTypoFixURL === 'undefined') { wikEd.config.loadIERangeregExTypoFixURL = truewikEd.config.homeBaseUrl + 'w/index.php?title=Wikipedia:AutoWikiBrowser/Typos&action=raw'; }
 
// enable RegExTypoFix button (https://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix)
// RegExTypoFix rules page, the address must have the exact same ___domain name as the used wiki
if (typeof(wikEd.config.regExTypoFixURL)regExTypoFix === 'undefined') { wikEd.config.regExTypoFixURLregExTypoFix = wikEd.config.homeBaseUrl + 'w/index.php?title=Wikipedia:AutoWikiBrowser/Typos&action=raw'false; }
 
// enable highlighting as links
// enable RegExTypoFix button (http://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix)
if (typeof(wikEd.config.regExTypoFix)followHighlightedLinks === 'undefined') { wikEd.config.regExTypoFixfollowHighlightedLinks = false; }
 
// skip the browser detection to run wikEd under IE and Opera
// enable highlighting as links
if (typeof(wikEd.config.followHighlightedLinks)skipBrowserTest === 'undefined') { wikEd.config.followHighlightedLinksskipBrowserTest = false; }
 
// skip the browserscript detectiontest tothat rundisables wikEd underif IEcertain andscripts Operaare present
if (typeof(wikEd.config.skipBrowserTest)skipScriptTest === 'undefined') { wikEd.config.skipBrowserTestskipScriptTest = false; }
 
// skip the scriptadd-on test that disables wikEd if certain scriptsadd-ons are present
if (typeof(wikEd.config.skipScriptTest)skipAddonTest === 'undefined') { wikEd.config.skipScriptTestskipAddonTest = false; }
 
// skip the read-only detection
if (typeof(wikEd.config.skipReadOnlyTest) === 'undefined') { wikEd.config.skipReadOnlyTest = false; }
 
// disable wikEd if incompatible scripts are active
// button access keys
if (typeof(wikEd.config.incompatibleScripts) === 'undefined') { wikEd.config.incompatibleScripts = {}; }
 
// wikEd.InitIncompatibleScripts: disable wikEd if incompatible scripts are active
// wikEd.InitButtonKey: define accesskeys for edit buttons (wikEd button number: [key string, JS key code])
// 'name in error message': 'regexp', case insensitive for script file name from URL w/o .js, use '\\' for '\'
wikEd.InitIncompatibleScripts = function() {
wikEd.InitIncompatibleScripts = function () {
wikEd.InitObject(wikEd.config.incompatibleScripts, {
'CKEditor': 'ckeditor.js\\bckeditor',
'FCKEditor': 'fckeditor.js',
'less edit clutter': 'less.?edit.?clutter', // [[User:Magnus_Manske/less_edit_clutter.js]]
'MagnusEditBox': 'MagnusEditBox' // less_edit_clutter gadget on fr
});
};
 
// disable beta toolbar CodeEditor button
// set the button bar grip width in px
if (typeof(wikEd.config.buttonBarGripWidth)disableCodeEditorButton === 'undefined') { wikEd.config.buttonBarGripWidthdisableCodeEditorButton = 8true; }
 
// set the button bar grip width in px
// enable local preview (Pilaf's InstaView)
if (typeof(wikEd.config.useLocalPreview)buttonBarGripWidth === 'undefined') { wikEd.config.useLocalPreviewbuttonBarGripWidth = true7; }
 
// enable server preview (Ajax)
// allow ajax requests from local copy for testing, also defined in wikEdDiff.js
if (typeof(wikEd.config.allowLocalAjax)useAjaxPreview === 'undefined') { wikEd.config.allowLocalAjaxuseAjaxPreview = falsetrue; }
 
// enable serverauto previewupdate (Ajax)
if (typeof(wikEd.config.useAjaxPreview)autoUpdate === 'undefined') { wikEd.config.useAjaxPreviewautoUpdate = true; }
 
// hours between update check (monobook.js)
// enable appending '<references/> for Ajax section previews
if (typeof(wikEd.config.SectionPreviewRefs)autoUpdateHours === 'undefined') { wikEd.config.SectionPreviewRefsautoUpdateHours = true20; }
 
// enablehours autobetween update check (AjaxGreasemonkey)
if (typeof(wikEd.config.autoUpdate)autoUpdateHoursGM === 'undefined') { wikEd.config.autoUpdateautoUpdateHoursGM = true40; }
 
// hours betweenauto update: version checkurl (monobook.jsAjax)
if (typeof(wikEd.config.autoUpdateHours)autoUpdateUrl === 'undefined') { wikEd.config.autoUpdateHoursautoUpdateUrl = 20wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/wikEd_current_version&action=raw&maxage=0'; }
 
// hours betweenauto update: checkscript url for (Greasemonkey) update
if (typeof(wikEd.config.autoUpdateHoursGM)autoUpdateScriptUrl === 'undefined') { wikEd.config.autoUpdateHoursGMautoUpdateScriptUrl = 40wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd.user.js'; }
 
// 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(wikEd.config.autoUpdateUrl)autoUpdateScriptUrlBugfix === 'undefined') { wikEd.config.autoUpdateUrlautoUpdateScriptUrlBugfix = 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 (typeof(wikEd.config.autoUpdateScriptUrl)linkify === 'undefined') { wikEd.config.autoUpdateScriptUrllinkify = wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/wikEd.user.js'true; }
 
// 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(wikEd.config.fullDiff)linkifyArticlePath === 'undefined') { wikEd.config.fullDifflinkifyArticlePath = falsenull; }
 
// hide refs and templates in newbie mode
// make links ctrl-clickable
if (typeof(wikEd.config.linkify)hideContent === 'undefined') { wikEd.config.linkifyhideContent = true; }
 
// unhide refs and templates in newbie mode by hover-shift instead of mouseover
// absolute instead of relative linkify links, URL with "$1" as article name placeholder
if (typeof(wikEd.config.linkifyArticlePath)unhideShift === 'undefined') { wikEd.config.linkifyArticlePathunhideShift = nullfalse; }
 
// wikify table parameters, replaces original table parameters with this string
// hide refs and templates in newbie mode
if (typeof(wikEd.config.hideContent)wikifyTableParameters === 'undefined') { wikEd.config.hideContentwikifyTableParameters = true''; }
 
// do not rearrange page elements
// wikify table parameters, replaces original table parameters with this string
if (typeof(wikEd.config.wikifyTableParameters)noRearrange === 'undefined') { wikEd.config.wikifyTableParametersnoRearrange = ''false; }
 
// use French rules for fix punctuation
// do not rearrange page elements
if (typeof(wikEd.config.noRearrange)fixPunctFrench === 'undefined') { wikEd.config.noRearrangefixPunctFrench = false; }
 
// wikEd.config.setupHook, executed after wikEd has been set up, usage: wikEd.config.setupHook.push(YourFunction);
// use French rules for fix punctuation
if (typeof(wikEd.config.fixPunctFrench)setupHook === 'undefined') { wikEd.config.fixPunctFrenchsetupHook = false[]; }
 
// wikEd.config.setupHookonHook, executed after wikEd has been setre-enabled upby logo click, usage: wikEd.config.setupHookonHook.push(YourFunction);
if (typeof(wikEd.config.setupHook)onHook === 'undefined') { wikEd.config.setupHookonHook = []; }
 
// wikEd.config.onHookoffHook, executed after wikEd has been re-enableddisabled by logo click, usage: wikEd.config.onHookoffHook.push(YourFunction);
if (typeof(wikEd.config.onHook)offHook === 'undefined') { wikEd.config.onHookoffHook = []; }
 
// wikEd.config.offHooktextareaHook, executed after wikEdclassic textarea has been disabledenabled by logo clickuser, usage: wikEd.config.offHooktextareaHook.push(YourFunction);
if (typeof(wikEd.config.offHook)textareaHook === 'undefined') { wikEd.config.offHooktextareaHook = []; }
 
// wikEd.config.textareaHookframeHook, executed after classicwikEd edit textareaframe has been enabled by user, usage: wikEd.config.textareaHookframeHook.push(YourFunction);
if (typeof(wikEd.config.textareaHook)frameHook === 'undefined') { wikEd.config.textareaHookframeHook = []; }
 
// wikEd.config.frameHookpreviewHook, executed after wikEdthe editlocal framepreview has been enabledadded to bythe userpage, usage: wikEd.config.frameHookpreviewHook.push(YourFunction);
if (typeof(wikEd.config.frameHook)previewHook === 'undefined') { wikEd.config.frameHookpreviewHook = []; }
 
// wikEd.config.diffHook, executed after the local changes diff has been added to the page, usage: wikEd.config.diffHook.push(YourFunction);
// custom edit form id instead of 'editform'
if (typeof(wikEd.config.customEditFormId)dHook === 'undefined') { wikEd.config.customEditFormIddiffHook = ''[]; }
 
// custom textareaedit form id instead of 'wpTextbox1editform'
if (typeof(wikEd.config.customTextAreaId)customEditFormId === 'undefined') { wikEd.config.customTextAreaIdcustomEditFormId = ''; }
 
// custom save buttontextarea id instead of 'wpSavewpTextbox1'
if (typeof(wikEd.config.customSaveButtonId)customTextAreaId === 'undefined') { wikEd.config.customSaveButtonIdcustomTextAreaId = ''; }
 
// custom save button id instead of 'wpSave'
// show table mode togle button
if (typeof(wikEd.config.showTableModeButton)customSaveButtonId === 'undefined') { wikEd.config.showTableModeButtoncustomSaveButtonId = false''; }
 
// display tables as editable html tables (table mode)
// maximal time for syntax highlighting in ms
if (typeof(wikEd.config.maxHighlightTime)tableMode === 'undefined') { wikEd.config.maxHighlightTimetableMode = 3000true; }
 
// show table mode toggle button
// first char of article names is case sensitive (e.g. Wiktionary)
if (typeof(wikEd.config.articlesCaseSensitive)showTableModeButton === 'undefined') { wikEd.config.articlesCaseSensitiveshowTableModeButton = false; }
 
// maximal time for syntax highlighting in ms
// force immediate update if this version string is newer
if (typeof(wikEd.config.forcedUpdate)maxHighlightTime === 'undefined') { wikEd.config.forcedUpdatemaxHighlightTime = ''3000; }
 
// first char of article names is case sensitive (e.g. Wiktionary)
// display highlighting error messages in text
if (typeof(wikEd.config.highlightError)articlesCaseSensitive === 'undefined') { wikEd.config.highlightErrorarticlesCaseSensitive = false; }
 
// force immediate update if this version string is newer
// display preview of files in text
if (typeof(wikEd.config.filePreview)forcedUpdate === 'undefined') { wikEd.config.filePreviewforcedUpdate = true''; }
 
// filedisplay previewhighlighting imageerror sizemessages in pixelstext
if (typeof(wikEd.config.filePreviewSize)highlightError === 'undefined') { wikEd.config.filePreviewSizehighlightError = 75false; }
 
// filedisplay preview imageof sizefiles in pixelstext
if (typeof(wikEd.config.antiHighlightBleeding)filePreview === 'undefined') { wikEd.config.antiHighlightBleedingfilePreview = true; }
 
// file preview image size in pixels
// do not hide templates shorter than this number of chars
if (typeof(wikEd.config.templNoHideLength)filePreviewSize === 'undefined') { wikEd.config.templNoHideLengthfilePreviewSize = 4075; }
 
// move cursor/caret outside syntax highlighted element
// debug window maximal length in chars
if (typeof(wikEd.config.debugMaxLength)antiHighlightBleeding === 'undefined') { wikEd.config.debugMaxLengthantiHighlightBleeding = 50000false; }
 
// debug display of DOM nodes:window maximal length of innerHTML in chars
if (typeof(wikEd.config.debugInnerHtmlLength)debugMaxLength === 'undefined') { wikEd.config.debugInnerHtmlLengthdebugMaxLength = 150500000; }
 
// 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,227 ⟶ 1,350:
 
// init config
if (typeof(wikEd.config) === 'undefined') { wikEd.config = {}; }
 
// wikEd code home base URL, foralso httpsdefined compatibilityin wikEdDiff.js
if (typeof(wikEd.config.homeBaseUrlStandard)homeBaseUrl === 'undefined') { wikEd.config.homeBaseUrlStandardhomeBaseUrl = 'http://en.wikipedia.org/'; }
if (typeof(wikEd.config.homeBaseUrlSecure) == 'undefined') { wikEd.config.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:') {
wikEd.config.homeBaseUrl = wikEd.config.homeBaseUrlSecure;
}
else {
wikEd.config.homeBaseUrl = wikEd.config.homeBaseUrlStandard;
}
 
// diff script URL
if (typeof(wikEd.config.diffScriptSrc) == 'undefined') { wikEd.config.diffScriptSrc = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/diff.js&action=raw&ctype=text/javascript'; }
 
// wikEdDiff script URL, also defined in wikEdDiff.js
if (typeof(wikEd.config.diffSrc) === 'undefined') { wikEd.config.diffSrc = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/wikEdDiff.js&action=raw&ctype=text/javascript'; }
 
// InstaView script URL
if (typeof(wikEd.config.instaViewSrc) == 'undefined') { wikEd.config.instaViewSrc = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Pilaf/include/instaview.js&action=raw&ctype=text/javascript'; }
 
// IERange script URL (MS IE compatibility library)
if (typeof(wikEd.config.IERangeSrc) == 'undefined') { wikEd.config.IERangeSrc = wikEd.config.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(wikEd.config.gadget) === 'undefined') { wikEd.config.gadget = null; }
 
// duplicate edit warnings from the top of the page to above the edit window
if (typeof(wikEd.config.doCloneWarnings) === 'undefined') { wikEd.config.doCloneWarnings = true; }
 
// startup debugging
if (typeof(wikEd.config.debugStartUp) === 'undefined') { wikEd.config.debugStartUp = ''; }
 
// show missing translations
if (typeof(wikEd.config.showMissingTranslations) === 'undefined') { wikEd.config.showMissingTranslations = false; }
 
// content language default, also used for wikEd UI localization
if (typeof(wikEd.config.languageDefault) === 'undefined') { wikEd.config['.languageDefault'] = ''; }
 
// load external translation
if (typeof(wikEd.config.loadTranslation) === 'undefined') { wikEd.config['.loadTranslation'] = true; }
 
// translation javascript URLs
if (typeof(wikEd.config.translations) === 'undefined') { wikEd.config.translations = {}; }
 
// wikEd.InitTranslations: define translation javascript URLs ('': internal default)
wikEd.InitTranslations = function () {
wikEd.InitObject(wikEd.config.translations, {
'en': '',
'af': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Arnobarnard/wikEd_international_af.js',
'ar': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:ترجمان05/wikEd_international_ar.js',
'zh-hans': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Shibo77/wikEd_international_zh.js',
'zh-hant': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Quest_for_TruthLiflon/wikEd_international_zh-hant.js',
'cs': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Sevela.p/wikEd_international_cs.js',
'nl': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Jeronevw/wikEd_international_nl.js',
'eo': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:ArnoLagrangeTlustulimu/wikEd-eowikEd_international_eo.js',
'fi': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Ejs-80/wikEd international fiwikEd_international_fi.js',
'fr': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Leag/wikEd-fr.js',
'degl': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Matthias_M.Toliño/wikEd_international_dewikEd_international_gl.js',
'de': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:PerfektesChaos/wikEd_international_de.js',
'he': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:שמוליק/wikEd_international_he.js',
'huhr': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Csörföly DSpeedyGonsales/wikEd-huwikEd_international_hr.js',
'hu': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Tsch81/wikEd-hu.js',
'it': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Jalo/wikEd_international_it.js',
'ja': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Hatukanezumi/wikEd_international_ja.js',
'kk': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Arystanbek/wikEd_international_kk.js',
'ko': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Ilovesabbath/wikEd_international_ko.js',
'dsb': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Michalwiki/wikEd_international_dsb.js',
Line 1,296 ⟶ 1,408:
'no': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Dvyjones/wikEd_international_no.js',
'nn': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Frokor/wikEd_international_nn.js',
'fa': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Reza1615/wikEd_international_fa.js',
'pl': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Konradek/wikEd_international_pl.js',
'pt': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:MoscaHe7d3r/Tools/wikEd_international_pt.js',
'ro': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Roamataa/wikEd_international_ro.js',
'ru': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:IGW/wikEd_international_ru.js',
'scn': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Meloscn/wikEd_international_scn.js',
'sk': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Helix84/wikEd_international_sk.js',
Line 1,304 ⟶ 1,418:
'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',
'hsb': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Michalwiki/wikEd_international_hsb.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'
});
Line 1,311 ⟶ 1,425:
 
// Mediawiki page and skin detection, logo placement
if (typeof(wikEd.config.MediaWikiSkinIds)mediaWikiSkinIds === 'undefined') { wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds = {}; }
 
// wikEd.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 ],
wikEd.InitMediaWikiSkinIds = function () {
wikEd.InitObject(wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds, {
 
// 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,334 ⟶ 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,476:
//
 
wikEd.InitGlobals = function () {
 
// global variables
wikEd.turnedOn = false;
wikEd.disabled = true;
wikEd.uploadEdit = false;
wikEd.viewDeleted = false;
wikEd.language = '';
wikEd.watchlistEdit = false;
wikEd.debugOpen = false;
wikEd.pageName = null;
wikEd.pageNamespace = null;
wikEd.frameLoaded = false;
 
// edit page types
// history
wikEd.editArticle = false;
wikEd.editUpload = false;
wikEd.editReadOnly = false;
wikEd.editSemanticForm = false;
wikEd.viewDeleted = false;
wikEd.editWatchlist = false;
wikEd.cssPage = false;
wikEd.jsPage = false;
wikEd.editSection = null;
 
// beta toolbar, CodeEditor
wikEd.useBetaToolbar = false;
wikEd.useCodeEditor = false;
wikEd.codeEditorButtonPollCount = 0;
 
// history
wikEd.fieldHist = [];
wikEd.savedName = [];
Line 1,383 ⟶ 1,511:
wikEd.checkMarker[false] = '◊';
 
// undo all, redo all
wikEd.origVersion = '';
wikEd.lastVersion = null;
 
// global dom elements
wikEd.logo = null;
wikEd.logoList = null;
wikEd.bodyContent = null;
 
wikEd.debug = null;
wikEd.wikiEditor = null;
wikEd.wikiEditorFrame = null;
wikEd.wikiEditorTop = null;
wikEd.wikiEditorLeft = null;
wikEd.wikiEditorBar = null;
wikEd.wikiEditorBottom = null;
Line 1,403 ⟶ 1,532:
wikEd.frameOuter = null;
wikEd.frame = null;
wikEd.frameDocument = null;
wikEd.frameBody = null;
wikEd.frameDocumentframeHtml = null;
wikEd.frameWindow = null;
 
Line 1,419 ⟶ 1,549:
wikEd.buttonsWrapper = null;
wikEd.summaryWrapper = null;
wikEd.consoleTopWrapper = null;
wikEd.summaryInputWrapper = null;
wikEd.editOptionsWrapper = null;
Line 1,424 ⟶ 1,555:
wikEd.submitButtonsWrapper = null;
wikEd.localPrevWrapper = null;
wikEd.wikiPreview = null;
wikEd.catLinks = null;
wikEd.insertWrapper = null;
wikEd.textBoxTable = null;
 
// edit form fields
wikEd.editForm = null;
wikEd.starttime = null;
wikEd.edittime = null;
wikEd.editToken = null;
wikEd.autoSummary = null;
wikEd.textarea = null;
 
Line 1,445 ⟶ 1,579:
wikEd.buttonBarPreview2 = null;
wikEd.buttonBarJump = null;
wikEd.previewBoxbuttonBarPasted = null;
wikEd.previewArticle = null;
wikEd.previewDiff = null;
wikEd.clearSummary = null;
wikEd.clearSummaryImg = null;
Line 1,460 ⟶ 1,596:
wikEd.summaryTextWidth = null;
 
wikEd.editOptions = null;
wikEd.editHelp = null;
wikEd.saveButton = null;
wikEd.previewButton = null;
wikEd.lDiffButton = null;
wikEd.localPreview = null;
wikEd.localDiff = null;
wikEd.diffPreviewButton = null;
wikEd.summaryLabel = null;
Line 1,472 ⟶ 1,605:
wikEd.highlightNamedHideButtonsStylesheet = null;
 
// frame resizing
wikEd.resizeGripWidth = 16;
wikEd.resizeGripHeight = 16;
Line 1,486 ⟶ 1,619:
wikEd.textareaWidth = '';
 
// various
wikEd.insertCounter = 0;
wikEd.editButtonHandler = {};
Line 1,494 ⟶ 1,627:
wikEd.textareaOffsetHeightInitial = 0;
wikEd.clearSummaryWidth = null;
 
// fullscreen button state and actual fullscreen state
wikEd.fullScreenMode = false;
wikEd.fullscreen = false;
 
wikEd.addNewSection = null;
wikEd.browserNotSupported = false;
wikEd.frameScrollTop = null;
wikEd.textareaUpdated = nulltrue;
wikEd.previewIsAjax = null;
wikEd.buttonKeyCode = [];
wikEd.direction = null;
Line 1,506 ⟶ 1,642:
wikEd.previewPage = false;
wikEd.clonedWarnings = false;
wikEd.geSHiCSSsyntaxHighlightTagCSS = [];
wikEd.loader = false;
wikEd.wikibase = {};
wikEd.keepSelRange = null;
 
// override site javascript functions
wikEd.insertTagsOriginalInsertTagsOriginal = null;
wikEd.insertAtCursorOriginal = null;
 
// wikEd settings
wikEd.refHide = false;
wikEd.using = false;
wikEd.useWikEd = false;
wikEd.closeToolbar = false;
wikEd.highlightSyntax = false;
Line 1,524 ⟶ 1,662:
wikEd.readOnly = false;
 
// unicode fixing and char highlighting
wikEd.supportedChars = null;
wikEd.reservedChars = null;
Line 1,537 ⟶ 1,675:
wikEd.charHighlightingStr = '';
 
wikEd.letters = '';
// linkification and hiding
 
wikEd.linkifyIdNo = 0;
// linkification and hiding
wikEd.linkifyArray = [];
wikEd.wikiLinks = {};
wikEd.referenceArray = [];
wikEd.templateArray = [];
wikEd.charEntityArray = [];
wikEd.tableArray = [];
wikEd.scheduledUnhide = null;
 
// RegExtypoFix rules
wikEd.typoRulesFind = [];
wikEd.typoRulesReplace = [];
 
// store link infos (normalizations, redirects, redlinks)
// redirect fixing
wikEd.redirectsCachelinkInfo = {};
wikEd.externalLinkInfo = {};
 
// filearticle preview: named reference definitions
wikEd.namedRefs = {};
 
// file preview
wikEd.filePreviewCache = {};
wikEd.filePreviewRequest = '';
Line 1,557 ⟶ 1,702:
wikEd.filePreviewIds = [];
 
// debugging time measurement, usage: wikEd.debugTimer.push([1234, new Date]); wikEd.DebugTimer();
wikEd.debugTimer = [];
 
// syntax highlighting
wikEd.parseObj = {};
 
// MediaWiki file paths for use in regexps
wikEd.server = '';
wikEd.articlePath = '';
Line 1,570 ⟶ 1,715:
wikEd.scriptName = '';
wikEd.scriptURL = '';
wikEd.useExternalApi = false;
 
// pasting object
wikEd.paste = null;
 
// magic words and parser functions, see httphttps://www.mediawiki.org/wiki/Help:Magic_words
// __MAGICWORDS__
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:...}}
// see httphttps://meta.wikimedia.org/wiki/Help:Magic_words#Template_modifiers
wikEd.templModifier = 'int|msg|msgnw|raw|subst';
 
// parser variables {{variable}}
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';
 
// 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,
Line 1,608 ⟶ 1,757:
 
// hash of loaded scripts, also defined in wikEdDiff.js
if (typeof(wikEd.externalScripts) === 'undefined') { wikEd.externalScripts = null; }
if (typeof(wikEd.pageLoaded)externalScriptsString === 'undefined') { wikEd.pageLoadedexternalScriptsString = false''; }
if (wikEd.pageLoaded === undefined) { wikEd.pageLoaded = false; }
if (wikEd.programVersion === undefined) { wikEd.programVersion = ''; }
if (wikEd.programDate === undefined) { wikEd.programDate = ''; }
 
// browser and os identificationr
if (typeof(wikEd.browserName) === 'undefined') { wikEd.browserName = ''; }
if (typeof(wikEd.browserFlavor) === 'undefined') { wikEd.browserFlavor = ''; }
if (typeof(wikEd.browserVersion) === 'undefined') { wikEd.browserVersion = 0; }
if (typeof(wikEd.msie) === 'undefined') { wikEd.msie = false; }
if (typeof(wikEd.mozilla) === 'undefined') { wikEd.mozilla = false; }
if (typeof(wikEd.opera) === 'undefined') { wikEd.opera = false; }
if (typeof(wikEd.safari) === 'undefined') { wikEd.safari = false; }
if (typeof(wikEd.webkit) === 'undefined') { wikEd.webkit = false; }
if (typeof(wikEd.chrome) === 'undefined') { wikEd.chrome = false; }
if (typeof(wikEd.greasemonkey) === 'undefined') { wikEd.greasemonkey = false; }
if (typeof(wikEd.platform)testVersion === 'undefined') { wikEd.platformtestVersion = nullfalse; }
if (wikEd.platform === undefined) { wikEd.platform = null; }
if (wikEd.installationType === undefined) { wikEd.installationType = ''; }
 
// global variables for Greasemonkey
if (typeof(wikEd.wikiGlobals) === 'undefined') { wikEd.wikiGlobals = {}; }
if (typeof(wikEd.text) === 'undefined') { wikEd.text = {}; }
 
// skins
if (typeof(wikEd.logoContainerId) === 'undefined') { wikEd.logoContainerId = ''; }
if (typeof(wikEd.rearrange) === 'undefined') { wikEd.rearrange = false; }
if (typeof(wikEd.logoToList) === 'undefined') { wikEd.logoToList = false; }
if (typeof(wikEd.skin)enableLocalPreview === 'undefined') { wikEd.skinenableLocalPreview = ''false; }
if (wikEd.skin === undefined) { wikEd.skin = ''; }
 
// various
if (typeof(wikEd.gotGlobalsHook) === 'undefined') { wikEd.gotGlobalsHook = []; }
if (typeof(wikEd.getGlobalsCounter) === 'undefined') { wikEd.getGlobalsCounter = 0; }
if (typeof(wikEd.loadingTranslation) === 'undefined') { wikEd.loadingTranslation = false; }
if (typeof(wikEd.webStorage) === 'undefined') { wikEd.webStorage = falsenull; }
if (typeof(wikEd.pageOrigin) == 'undefined') { wikEd.pageOrigin = ''; }
 
// customization
if (typeof(wikEd.wikEdTextAdded)useWikEd === 'undefined') { wikEd.wikEdTextAddeduseWikEd = false; }
if (typeof(wikEd.wikEdConfigAdded)wikEdTextAdded === 'undefined') { wikEd.wikEdConfigAddedwikEdTextAdded = false; }
if (wikEd.wikEdConfigAdded === undefined) { wikEd.wikEdConfigAdded = false; }
 
// check for web storage availability, throws error in FF 3.6 with dom.storage.enabled=false, see bug 599479 (code copied to wikEdDiff.js)
if (typeof(wikEdTypeofLocalStorage) == 'undefined') {
window.wikEdTypeofLocalStorage = '';
setTimeout('window.wikEdTypeofLocalStorage = typeof(window.localStorage);', 0);
}
 
// global dom elements, also defined in wikEdDiff.js
if (typeof(wikEd.head)pageOrigin === 'undefined') { wikEd.headpageOrigin = null''; }
if (wikEd.head === undefined) { wikEd.head = null; }
 
// also defined in wikEdDiff.js
if (wikEd.pageName === undefined) { wikEd.pageName = null; }
 
 
Line 1,659 ⟶ 1,812:
//
 
wikEd.InitObject = 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') {
wikEd.config.debugStartUp += '\t\t\t\'' + key + '\': \'' + target[key].replace(/\n/g, '\\n') + '\',\n';
}
Line 1,683 ⟶ 1,836:
//
 
wikEd.AddToObject = 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,697 ⟶ 1,859:
//
 
wikEd.InitImage = function (target, source) {
 
var server = window.___location.href.replace(/^(\w+:\/\/.*?)\/.*/, '$1');
var protocol = server.replace(/^(\w+:)\/\/.*/, '$1');
 
for (var key in source) {
if (typeof( target[key]) == 'undefined') {
 
// 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 {
target[key] = wikEd.config.imagePath + source[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,721 ⟶ 1,894:
//
 
wikEd.Startup = function () {
 
// redirect WED shortcut to wikEd.Debug(objectName, object, popup)
// check if this has already been run
ifWED = (wikEd.startup == true) {Debug;
 
// 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;
}
wikEd.startup = true;
 
// check if wikEd has already started up
// redirect WED shortcut to wikEd.Debug(objectName, object, popup)
if (document.getElementsByName('wikEdStartupFlag')[0] !== undefined) {
window.WED = wikEd.Debug;
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) {
wikEd.browserName = 'Mozilla';
wikEd.browserFlavor = agentMatchregExpMatchAgent[1];
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEd.mozilla = true;
}
 
// check for MSIE
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/(MSIE)\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEd.browserName = 'MSIE';
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEd.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) {
wikEd.browserName = 'Opera';
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
if (wikEd.browserVersion == 9.80) {
var versionMatch = window.navigator.userAgent.match(/(Version)\W+(\d+\.\d+)/i);
if (versionMatch !== null) {
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
}
}
Line 1,765 ⟶ 1,968:
}
 
// 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) {
wikEd.browserName = 'ChromeOpera';
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEd.chromeopera = 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) {
wikEd.browserName = 'SafariChrome';
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[2]);
wikEd.safarichrome = true;
}
 
// check for other WebKitSafari
else {
agentMatchregExpMatchAgent = window.navigator.userAgent.match(/\b(WebKit)(GTK\+Safari)?\W+(\d+\.\d+)/i);
if (agentMatchregExpMatchAgent !== null) {
wikEd.browserName = 'WebKitSafari';
wikEd.browserVersion = parseFloat(agentMatchregExpMatchAgent[32]);
wikEd.webkitsafari = 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,797 ⟶ 2,010:
}
 
// check OS
var osregExpMatchOS = window.navigator.platform.match(/^(win|mac|unix|linux)/i);
if (osregExpMatchOS !== null) {
wikEd.platform = osregExpMatchOS[1].toLowerCase();
}
 
// import customization (try now again after page load for user/skin.js)
if ( (typeof(wikEdConfig) !== 'object'undefined) && (wikEd.wikEdConfigAdded === false) ) {
wikEd.AddToObject(wikEd.config, wikEdConfig);
wikEd.wikEdConfigAdded = true;
}
if ( (typeof(wikEdText) !== 'object'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;
Line 1,820 ⟶ 2,033:
window.WikEdEditButton = wikEd.EditButton;
 
// check if this runs under Greasemonkey
if (typeof(GM_getValue) GM_info == 'functionobject') {
wikEd.greasemonkey = true;
}
 
// parse global-context (MediaWiki) variables into hash (for Greasemonkey)
// define head
var globalNames = ['skin', 'wgServer', 'wgTitle', 'wgCanonicalNamespace', 'wgArticlePath', 'wgScript', 'wgScriptPath', 'wgUserName', 'wgCurRevisionId', 'wgContentLanguage', 'wgUserLanguage', 'wgPageName', 'wgNamespaceIds', 'wgFormattedNamespaces', 'wgUseAutomaticEditSummaries', 'wgVersion', 'wgPageContentModel'];
wikEd.head = document.getElementsByTagName('head')[0];
if (wikEd.greasemonkey === true) {
// get site of origin (window.___location.href is about:blank if Firefox during page load)
var url = window.___location.href;
if (url == 'about:blank') {
url = wikEd.head.baseURI
}
wikEd.pageOrigin = url.replace(/^((https?|file):\/\/[^\/?#]*)?.*$/, '$1');
 
// parse global-context (MediaWiki) variables into hash (for Greasemonkey)
wikEd.AddEventListener(window, 'message', wikEd.GetGlobalsReceiver, false);
var globalNames = ['skin', 'wgServer', 'wgTitle', 'wgCanonicalNamespace', 'wgArticlePath', 'wgScript', 'wgScriptPath', 'wgUserName', 'wgCurRevisionId', 'wgContentLanguage', 'wgUserLanguage', 'wgEnableAPI', 'wgPageName', 'wgNamespaceIds', 'wgFormattedNamespaces', 'wgUseAutomaticEditSummaries', 'wikEdTypeofLocalStorage'];
if (wikEd.greasemonkey == 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) ) {
wikEd.AddToObject(wikEd.config, wikEd.wikiGlobals.wikEdConfig);
wikEd.wikEdConfigAdded = true;
}
if ( (typeof( wikEd.wikiGlobals.wikEdText) == 'object') && (wikEd.wikEdTextAdded === false) ) {
wikEd.AddToObject(wikEd.text, wikEd.wikiGlobals.wikEdText, wikEd.config.text);
wikEd.wikEdTextAdded = true;
}
Line 1,857 ⟶ 2,059:
];
 
// and load translations when done
if ( (wikEd.config.loadTranslation === true) && (wikEd.loadingTranslation === false) ) {
gotGlobalsHook.push(wikEd.LoadTranslations);
}
 
// set listener for GetGlobals messaging
// parse globals (asynchronous)
window.addEventListener('message', wikEd.GetGlobalsReceiver, false);
 
// parse globals (asynchronous)
wikEd.GetGlobals(globalNames, gotGlobalsHook);
 
// schedule the setup routine; readyState interactive gives GM security error
if (document.readyState == 'complete') {
wikEd.AddEventListener(window, 'load', wikEd.Setup, false);
wikEd.Setup();
}
 
// with DOMContentLoaded event wikEd does not load for first (uncached) section edit
else {
window.addEventListener('load', wikEd.Setup, false);
}
 
return;
Line 1,876 ⟶ 2,088:
//
 
wikEd.LoadTranslations = function () {
 
if ( (wikEd.config.loadTranslation === true) && (wikEd.loadingTranslation === false) ) {
var contentLang = wikEd.wikiGlobals.wgContentLanguage || '';
var userLang = wikEd.wikiGlobals.wgUserLanguage || '';
if ( (wikEd.config.languageDefault !== '') || (userLang !== '') || (contentLang !== '') ) {
 
// simplified Chinese
if (contentLang == 'zh') {
contentLang = 'zh-hans';
Line 1,891 ⟶ 2,103:
}
 
// traditional Chinese
else if ( (userLang == 'zh-hk') || (userLang == 'zh-tw') ) {
userLang = 'zh-hant';
Line 1,898 ⟶ 2,110:
wikEd.InitTranslations();
var scriptUrl = wikEd.config.translations[wikEd.config.languageDefault] || '';
if (scriptUrl === '') {
scriptUrl = wikEd.config.translations[userLang] || '';
if (scriptUrl === '') {
scriptUrl = wikEd.config.translations[contentLang] || '';
}
}
if (scriptUrl !== '') {
wikEd.AppendScript(scriptUrl, function () {
 
// copy custom text after values have arrived
var gotGlobalsHook = function () {
wikEd.AddToObject(wikEd.text, wikEd.wikiGlobals.wikEdText, wikEd.config.text);
return;
};
 
// parse globals (asynchronous)
wikEd.GetGlobals(['wikEdText'], [gotGlobalsHook]);
wikEd.loadingTranslation = true;
Line 1,925 ⟶ 2,137:
 
//
// wikEd.Setup: basic setup routine, scheduled after DOM or page load
//
 
wikEd.Setup = function () {
 
wikEddocument.RemoveEventListenerremoveEventListener(window, 'loadDOMContentLoaded', wikEd.Setup, 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
// import customization (try later again after page load for user/skin.js)
var flag = document.createElement('meta');
if ( (typeof(wikEdConfig) == 'object') && (wikEd.wikEdConfigAdded == false) ) {
flag.setAttribute('name', 'wikEdSetupFlag');
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 != wikEd.config.diffScriptSrc) ) {
continue;
}
 
wikEd.externalScripts[scriptName] = true;
// ignore resource loader
if (scriptName == 'load.php') {
continue;
}
 
wikEd.externalScripts[scriptName] = pageScripts[i];
wikEd.externalScriptsString += scriptName + '\n';
}
}
Line 1,971 ⟶ 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 (wikEd.externalScripts['wikEd.js']testVersion == true) {;
}
 
// 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;
Line 1,982 ⟶ 2,213:
}
 
// detect wikEd running as a gadget
// redirect Greasemonkey debugging function to wikEd.Debug if run as a wiki user script
if (wikEd.config.gadget === null) {
else {
if (wikEd.externalScripts['MediaWiki:Gadget-wikEd.js'] !== undefined) {
window.GM_log = wikEd.Debug;
}
 
// detect wikEd running as a gadget
if (wikEd.config.gadget == null) {
if (wikEd.externalScripts['MediaWiki:Gadget-wikEd.js'] == true) {
wikEd.config.gadget = true;
}
}
 
// set alreadyinstallation run flagtype
if (wikEd.config.gadget === true) {
var flag = document.createElement('span');
wikEd.installationType += ' G';
flag.id = 'wikEdSetupFlag';
}
flag.className = 'wikEdSetupFlag';
else if (wikEd.greasemonkey === true) {
flag.style.display = 'none';
wikEd.installationType += ' GM';
flag.style.visibility = 'hidden';
}
document.body.appendChild(flag);
 
// detect MediaWiki page and its skin
wikEd.InitMediaWikiSkinIds();
for (var skin in wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds) {
if (wikEdObject.config.MediaWikiSkinIdsprototype.hasOwnProperty.call(wikEd.config.mediaWikiSkinIds, skin) === true) {
var logoContainerId = wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds[skin][0];
var logoToList = wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds[skin][1];
var rearrange = wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds[skin][2];
var skinIds = wikEd.config.MediaWikiSkinIdsmediaWikiSkinIds[skin][3];
var enableLocalPreview = wikEd.config.mediaWikiSkinIds[skin][4];
for (var i = 0; i < skinIds.length; i ++) {
if (document.getElementById(skinIds[i]) === null) {
break;
}
Line 2,020 ⟶ 2,247:
wikEd.rearrange = rearrange;
wikEd.logoToList = logoToList;
wikEd.enableLocalPreview = enableLocalPreview;
break;
}
Line 2,025 ⟶ 2,253:
}
 
// not a MediaWiki page
if (wikEd.skin === '') {
return;
}
 
// initialize user configurable variables
wikEd.InitGlobalConfigs();
 
// import custom text and translations
wikEd.AddToObject(wikEd.config.text, wikEd.text);
 
// do not rearrange page elements
if (wikEd.config.noRearrange !== false) {
wikEd.rearrange = false;
}
 
// initialize non-configurable variables
wikEd.InitGlobals();
 
// check for updates
wikEd.AutoUpdate();
 
// initialize images (needed here for logo)
wikEd.InitImages();
 
// load css for edit and non-edit pages
wikEd.InitMainCSS();
 
// add stylesheet definitions
wikEd.ApplyCSS(document, wikEd.config.mainCSS);
 
// add image path to image filename
if (wikEd.logo === null) {
 
// create logo
wikEd.logo = document.createElement('img');
wikEd.logo.id = 'wikEdLogoImg';
 
// insert logo into page
var logoContainer;
if (wikEd.logoContainerId !== '') {
logoContainer = document.getElementById(wikEd.logoContainerId);
}
if (logoContainer !== null) {
 
// logo as last element of specified list (e.g. monobook, simple, myskin, gumax)
if (wikEd.logoToList === true) {
wikEd.logoList = document.createElement('li');
wikEd.logoList.id = 'wikEdLogoList';
Line 2,077 ⟶ 2,305:
wikEd.logoList.appendChild(wikEd.logo);
var list;
var logo;
if (logoContainer.tagName == 'UL') {
list = logoContainer;
Line 2,084 ⟶ 2,311:
list = logoContainer.getElementsByTagName('ul')[0];
}
if (list !== nullundefined) {
list.appendChild(wikEd.logoList);
wikEd.logo.className = 'wikEdLogo';
Line 2,090 ⟶ 2,317:
}
 
// logo as last child of specified element
else {
logoContainer.appendChild(wikEd.logo);
Line 2,097 ⟶ 2,324:
}
 
// logo as first page element, fallback for undetected skin
if (wikEd.logo.className === '') {
document.body.insertBefore(wikEd.logo, document.body.firstChild);
wikEd.logo.className = 'wikEdLogoFallBack';
}
 
// add event listenerlisteners to logo
wikEd.AddEventListener(wikEd.logo, .addEventListener('click', wikEd.MainSwitch, true);
wikEd.logo.addEventListener('click', wikEd.DebugInfo, true);
}
 
// page loaded flag for dynamically loaded scripts
wikEd.pageLoaded = true;
 
// load the external wikEd diff library script if not already done
if ( (wikEd.config.loadDiffScript === true) && (wikEd.externalScripts['diff.js'] === nullundefined) ) {
if (typeof(WDiffString)WikEdDiff === 'undefined') {
var sep = '&';
wikEd.AppendScript(wikEd.config.diffScriptSrc);
if (wikEd.config.diffScriptSrc.indexOf('?') == -1) {
}
sep = '?';
wikEd.externalScripts['diff.js'] = true;
}
wikEd.externalScripts['diff.js'] = wikEd.AppendScript(wikEd.config.diffScriptSrc + sep + wikEd.programVersion);
 
// load the external wikEdDiff script if not already done
if ( (wikEd.config.loadDiff == true) && (wikEd.externalScripts['wikEdDiff.js'] == null) ) {
if (typeof(wikEd.Diff) == 'undefined') {
wikEd.AppendScript(wikEd.config.diffSrc);
}
wikEd.externalScripts['wikEdDiff.js'] = true;
}
 
// load the MSexternal IEwikEdDiff selection/rangescript if compatibilitynot libraryalready IERangedone
if ( (wikEd.msieconfig.loadDiff === true) && (wikEd.externalScripts['wikEdDiff.js'] === undefined) ) {
if (wikEd.Diff === undefined) {
if ( (wikEd.config.loadIERange == true) && (wikEd.externalScripts['ierange.js'] == null) ) {
ifvar (typeof(DOMUtils)sep == 'undefined&') {;
wikEd.AppendScriptif (wikEd.config.IERangeSrcdiffSrc.indexOf('?') == -1); {
sep = '?';
}
wikEd.externalScripts['ierangewikEdDiff.js'] = truewikEd.AppendScript(wikEd.config.diffSrc + sep + wikEd.programVersion);
}
}
 
// init syntax highlighting regExp object
// check if disabled
wikEd.HighlightSyntaxInit();
 
// check if disabled
wikEd.disabled = wikEd.GetSavedSetting('wikEdDisabled', wikEd.config.disabledPreset);
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) {
wikEd.pageName = wikEd.wikiGlobals.wgPageName;
var str = wikEd.config.text.iconPage;
 
// get current namespace
if (wikEd.pageName != null) {
var colonPos = wikEd.pageName.indexOf(':');
if (colonPos == -1) {
wikEd.pageNamespace = '';
}
else {
wikEd.pageNamespace = wikEd.pageName.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 = wikEd.config.text['iconPage'];
for (var imageKey in wikEd.config.image) {
if (Object.prototype.hasOwnProperty.call(wikEd.config.image.hasOwnProperty(, imageKey) === true) {
var imageAddress = wikEd.config.image[imageKey];
if (typeof( imageAddress) == 'string') {
str += '<img src="' + imageAddress + '"> ';
}
Line 2,173 ⟶ 2,387:
}
 
// continue setup
// init syntax highlighting regExp object
wikEd.HighlightSyntaxInit();
 
// continue setup
wikEd.TurnOn(true);
 
Line 2,187 ⟶ 2,398:
//
 
wikEd.TurnOn = function (scrollToEditFocus) {
 
// check if setup was already run
if (wikEd.turnedOn === true) {
return;
}
 
// set error logo
wikEd.SetLogo('error');
 
// check for active code editor and .js or .css page
// no id, no wikEd
wikEd.CodeEditorCheck();
if (navigator.appName == null) {
 
// no id, no wikEd
if (window.navigator.appName === null) {
wikEd.browserNotSupported = true;
}
 
// check browser versions
switch (wikEd.browserName) {
 
// check Mozilla version
case 'Mozilla':
if (
Line 2,216 ⟶ 2,430:
break;
 
// check MSIE version
case 'MSIE':
wikEd.browserNotSupported = true;
break;
 
// check Opera version
case 'Opera':
if (wikEd.browserVersion < 10.5115) {
 
// too buggy (inserthtml, parentNode...)
wikEd.browserNotSupported = true;
}
 
// 10.50 beta, 10.51 are too buggy (inserthtml, parentNode...)
wikEd.browserNotSupported = true;
 
break;
 
// check Google Chrome version
case 'Chrome':
if (wikEd.browserVersion < 0.2) {
Line 2,239 ⟶ 2,451:
break;
 
// check Safari version
case 'Safari':
if (wikEd.browserVersion < 500) {
Line 2,247 ⟶ 2,459:
}
 
// browser or version not supported, set error message and exit
if ( (wikEd.browserNotSupported === true) && (wikEd.config.skipBrowserTest === false) ) {
wikEd.disabled = true;
wikEd.SetLogo('browser');
return;
}
 
// get form elements
var array;
array = document.getElementsByName('wpEdittime');
if (array[0] !== nullundefined) {
wikEd.edittime = array[0].value;
}
array = document.getElementsByName('wpStarttime');
if (array[0] !== nullundefined) {
wikEd.starttime = array[0].value;
}
array = document.getElementsByName('wpAutoSummary');
if (array[0] !== nullundefined) {
wikEd.autoSummary = array[0].value;
}
array = document.getElementsByName('wpEditToken');
if (array[0] !== nullundefined) {
wikEd.editToken = array[0].value;
}
 
// page type detection
 
// detect custom edit page
if (wikEd.config.customEditFormId !== '') {
wikEd.editForm = document.getElementById(wikEd.config.customEditFormId);
}
if (wikEd.config.customTextAreaId !== '') {
wikEd.textarea = document.getElementById(wikEd.config.customTextAreaId);
}
if (wikEd.config.customSaveButtonId !== '') {
wikEd.saveButton = document.getElementById(wikEd.customwikEdSaveButtonId);
}
 
// detect standard edit page
if (wikEd.textarea === null) {
 
wikEd.textarea = 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 (wikEd.editForm === null) {
wikEd.editForm = document.getElementById('editform');
}
if (wikEd.saveButton === null) {
wikEd.saveButton = document.getElementById('wpSave');
}
wikEd.diffPreviewButton = document.getElementById('wpDiff');
wikEd.previewButton = document.getElementById('wpPreview');
wikEd.editArticle = true;
 
// detect MediaWikiread-only Semanticedit Forms extensionpage
if ( (wikEd.textarea !== null) && (wikEd.editForm === null) && (wikEd.saveButton === null) ) {
wikEd.editReadOnly = true;
wikEd.editForm = document.getElementsByName('createbox')[0];
wikEd.editArticle = false;
wikEd.textarea = document.getElementsByName('free_text')[0];
wikEd.readOnly = true;
}
 
// detect editsemantic rawforms watchlist pageextension
else if ( (wikEd.editFormtextarea == null) || (wikEd.textarea == null) ) {
wikEd.textareaeditForm = document.getElementById('titlessfForm');
if (wikEd.textarea != nulldocument.getElementById('sf_free_text') {;
if ( (wikEd.editForm !== null) && (wikEd.textarea !== null) ) {
wikEd.watchlistEdit = true;
wikEd.editArticle = false;
wikEd.editSemanticForm = true;
}
 
// get watchlistdetect edit formraw watchlist page
else {
var node = wikEd.textarea;
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;
}
}
}
}
wikEd.editForm = node;
}
 
// detect upload page
// get watchlist submit button
if ( (wikEd.textarea === null) || (wikEd.editForm !=== null) || (wikEd.saveButton === null) ) {
var textarea = document.getElementsByName('wpUploadDescription')[0];
var submits = wikEd.editForm.getElementsByTagName('input');
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) ) {
wikEd.saveButton = 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) || (wikEd.editForm == null) || (wikEd.saveButton == null) ) {
wikEd.SetLogo();
wikEd.textarea = document.getElementsByName('wpUploadDescription')[0];
return;
wikEd.editForm = document.getElementById('mw-upload-form');
}
wikEd.saveButton = document.getElementsByName('wpUpload')[0];
 
if ( (wikEd.textarea != null) && (wikEd.editForm != null) && (wikEd.saveButton != null) ) {
// do not turn on when code editor is active
wikEd.uploadEdit = true;
if (wikEd.rearrangeuseCodeEditor === true) false;{
wikEd.disabled = true;
wikEd.SetLogo('incompatible', 'Code Editor');
return;
}
 
// check if the textarea is read-only
if (wikEd.config.skipReadOnlyTest === false) {
if ( (wikEd.textarea.getAttribute('readonly') !== null) || (wikEd.saveButton === null) ) {
wikEd.readOnly = true;
}
}
 
// check for section edits
// detect view and restore deleted pages
var section = document.getElementsByName('wpSection');
if ( (wikEd.textarea == null) || (wikEd.editForm == null) || (wikEd.saveButton == null) ) {
if (
wikEd.textarea = document.getElementsByTagName('textarea')[0];
if (wikEd.textareasection !== null) {&&
section.length > 0
) {
wikEd.editSection = section[0].value;
}
 
// get missing wg variables from footer link (code copied to wikEdDiff.js)
// get form
if (wikEd.wikiGlobals.wgArticlePath === undefined) {
var node = document.getElementsByName('preview')[0];
var printfooter = document.body.getElementsByClassName('printfooter')[0];
while (node != null) {
if (printfooter !== undefined) {
node = node.parentNode;
var articleLink = printfooter.getElementsByTagName('a')[0];
if (node.tagName == 'FORM') {
if (articleLink !== undefined) {
break;
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, ' ') );
}
}
wikEd.editForm = node;
if (wikEd.editForm != null) {
wikEd.previewButton = document.getElementsByName('preview')[0];
wikEd.viewDeleted = true;
wikEd.rearrange = false;
}
}
}
 
// get missing wg variables from form action url
// set page detection error indicator
if ( (wikEd.textareawikiGlobals.wgScript == null) || (wikEd.editForm == null) undefined) {
var form = wikEd.SetLogo()editForm;
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 (wikEd.config.skipReadOnlyTest == false) {
 
if ( (wikEd.GetAttribute(wikEd.textarea, 'readonly') != null) || (wikEd.saveButton == null) ) {
// get current namespace
wikEd.readOnly = 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
wikEd.GetPaths();
 
// check if we can call external API for redlink detection
var regExpDomains = new RegExp('//(.*?\\.)?(' + wikEd.config.externalApiDomains.replace(/\s*,\s*/g, '|').replace(/\./g, '\\.') + '$)', 'g');
wikEd.useExternalApi = regExpDomains.test(window.___location.origin);
 
// get page elements
wikEd.catLinks = document.getElementById('catlinks');
 
// check if mw.loader is available
if ( (window.mw !== undefined) && (window.mw.loader !== undefined) && (window.mw.config !== undefined) ) {
wikEd.loader = true;
}
 
// 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');
});
}
catch (exception) {
}
 
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
wikEd.InitFrameCSS();
wikEd.InitMainEditCSS();
Line 2,388 ⟶ 2,735:
wikEd.InitIncompatibleScripts();
 
// check for incompatible scripts
var incompatible = '';
if (wikEd.config.skipScriptTest === false) {
var scriptNames = '';
for (var key in wikEd.config.incompatibleScripts) {
if (Object.prototype.hasOwnProperty.call(wikEd.config.incompatibleScripts.hasOwnProperty(, key) === true) {
var regExp = new RegExp(wikEd.config.incompatibleScripts[key].replace(/\.js$/g, ''), 'gim');
var generalName = key;
if (regExp.test(wikEd.externalScriptsString) === true) {
var scriptName = wikEd.config.incompatibleScripts[key];
if (wikEd.externalScripts[scriptName]incompatible !== true'') {
if incompatible (scriptNames !+= ', ') {;
scriptNames += ', ';
}
scriptNamesincompatible += generalNamekey;
}
}
}
}
if (scriptNames != '') {
 
wikEd.SetLogo('incompatible', scriptNames);
// detect incompatible add-ons
return;
if (wikEd.config.skipAddonTest === false) {
 
// Ginger add-on breaks undo history, corrupts text (<tag><!-- -->)
if (document.body.getAttribute('ginger_software_stylesheet') !== null) {
if (incompatible !== '') {
incompatible += ', ';
}
incompatible += 'Ginger';
}
}
 
// incompatible script or add-on error
// define Unicode characters for fixing function
if (incompatible !== '') {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', incompatible);
return;
}
 
// define Unicode characters for fixing function
wikEd.InitUnicode();
 
// detect if we add a new section (+ tab)
if (/(\?|&)section=new\b/.test(window.___location.search) === true) {
wikEd.addNewSection = true;
}
else {
var section = document.getElementsByName('wpSection');
if ( (section[0] !== undefined) && (section[0].value == 'new') null) {
wikEd.addNewSection = true;
if (section.length > 0) {
if (section[0].value == 'new') {
wikEd.addNewSection = true;
}
}
}
}
 
// get initial textarea dimensions
// load the external InstaView script
if ( (wikEd.greasemonkey == false) && (wikEd.config.loadInstaView == true) && (wikEd.externalScripts['instaview.js'] == null) ) {
if (typeof(InstaView) == 'undefined') {
wikEd.AppendScript(wikEd.config.instaViewSrc);
}
wikEd.externalScripts['instaview.js'] = true;
}
else if ( (wikEd.greasemonkey == false) || (wikEd.config.loadInstaView != true) ) {
wikEd.config.useLocalPreview = false;
}
 
// get initial textarea dimensions
wikEd.textareaBorderHeight = parseInt(wikEd.GetStyle(wikEd.textarea, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.textarea, 'borderBottomWidth'), 10);
 
if (wikEd.GetStyle(wikEd.textarea, 'display') != 'none') {
wikEd.textareaOffsetHeightInitial = wikEd.textarea.offsetHeight;
Line 2,451 ⟶ 2,796:
wikEd.textareaWidth = '100%';
 
// setup the undo buffers and save the original text for local changes view
// remove frame border if textarea has none
var styleFrameContainer = '';
if (wikEd.textareaBorderHeight == 0) {
styleFrameContainer = 'border-width: 0;';
}
 
// setup the undo buffers and save the original text for local changes view
wikEd.origVersion = wikEd.textarea.value;
 
// add stylesheet definitions
// Opera 0.9.51
wikEd.origVersion = wikEd.origVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
// add stylesheet definitions
wikEd.ApplyCSS(document, wikEd.config.mainEditCSS);
 
// get button settings from saved settings
wikEd.using = wikEd.GetSavedSetting('wikEdSummaryUsing', wikEd.config.usingPreset);
wikEd.useWikEd = ! wikEd.GetSavedSetting('wikEdUseClassic', ! wikEd.config.useWikEdPreset);
Line 2,473 ⟶ 2,809:
wikEd.closeToolbar = wikEd.GetSavedSetting('wikEdCloseToolbar', wikEd.config.closeToolbarPreset);
wikEd.refHide = wikEd.GetSavedSetting('wikEdRefHide', wikEd.config.refHidePreset);
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.diff = wikEd.GetSavedSetting('wikEdDiff', wikEd.config.diffPreset);
if (wikEd.config.tableMode === true) false;{
wikEd.tableMode = wikEd.refHide;
}
else {
wikEd.tableMode = false;
}
 
// detect preview page
if (window.___location.search.match(/(\?|&)action=submit\b/.test(window.___location.search) !=== nulltrue) {
wikEd.previewPage = true;
}
 
// disable wikEd for Lupin's autoedit scripts
// no fullscreen for preview and upload pages
if ( /(wikEd\?|&)autoedit=/.uploadEdit == true) || test(wikEdwindow.previewPage___location.search) === true) ) {
wikEd.fullScreenMode = false;
}
 
// disable wikEd for Lupin's autoedit scripts
if (window.___location.search.match(/(\?|&)autoedit=/) != null) {
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
}
 
// disable wikEd for .js and .css pages
if (/\.js$/.test (wikEd.wikiGlobals.wgTitlejsPage === true) || (wikEd.cssPage === true) ) {
wikEd.noSpellcheck = true;
if ( (wikEd.wikiGlobals.wgCanonicalNamespace != 'User_talk') && (wikEd.wikiGlobals.wgCanonicalNamespace != 'Talk') ) {
if (wikEd.noSpellcheckorigVersion.length > =20000) true;{
if (wikEd.origVersion.length >useWikEd 20000)= {false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.useWikEd = false;
}
else {
wikEd.highlightSyntax = false;
}
}
}
 
// disable highlighting for module namespace (Scribunto/Lua templates)
// no spellcheck for watchlist editing
if (wikEd.watchlistEditwikiGlobals.wgCanonicalNamespace == true'Module') {
wikEd.noSpellcheck = true;
wikEd.highlightSyntax = false;
}
 
// no spellcheck for watchlist editing
// disable spellchecker for textarea
if (wikEd.noSpellcheckeditWatchlist === true) {
wikEd.noSpellcheck = true;
}
 
// disable spellchecker for textarea
if (wikEd.noSpellcheck === true) {
wikEd.textarea.setAttribute('spellcheck', false);
}
 
// preset frame related styles to avoid browser crashes
var styleFrameBody;
var styleFrameWrapperPosition;
var styleFrameWrapperVisibility;
var styleTextareaWrapperPosition;
var styleTextareaWrapperVisibility;
if (wikEd.useWikEd === true) {
styleFrameBody = 'display: block;';
styleFrameWrapperPosition = 'static';
styleFrameWrapperVisibility = 'visible';
Line 2,528 ⟶ 2,868:
}
else {
styleFrameBody = 'display: none;';
styleFrameWrapperPosition = 'absolute';
styleFrameWrapperVisibility = 'hidden';
styleTextareaWrapperPosition = 'static';
styleTextareaWrapperVisibility = 'visible';
}
var inputWrapperClass;
if (wikEd.fullScreenMode == true) {
inputWrapperClass = 'wikEdInputWrapperFull';
}
else {
inputWrapperClass = 'wikEdInputWrapper';
}
 
// find proper insertion point of input wrapper
// check if we use the wikEd.editor user interface of the vector skin
 
// inside the wikiEditor interface
// wikEd.wikiEditor = document.getElementById('wikiEditor-ui');
wikEd.var wikiEditor = wikEddocument.GetElementsByClassNamebody.getElementsByClassName('wikiEditor-ui', 'div')[0];
if (wikiEditor !== undefined) {
 
if ( wikEd.wikiEditor == null) {wikiEditor;
wikEd.textareaContainerwikiEditorFrame = wikEd.textareawikiEditor.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;
wikEd.wikiEditorFrame = wikEd.wikiEditor.getElementsByTagName('IFRAME')[0];
var parent = node.parentNode;
wikEd.wikiEditorTop = wikEd.GetElementsByClassName('wikiEditor-ui-top', 'div')[0];
while (wikEd.GetFirstChildNode(parent) == wikEd.GetLastChildNode(parent) ) {
wikEd.wikiEditorBar = wikEd.GetElementsByClassName('wikiEditor-ui-toolbar', 'div')[0];
if (/^(SPAN|DIV|P)$/.test(parent.nodeName) === false) {
wikEd.wikiEditorBottom = wikEd.GetElementsByClassName('wikiEditor-ui-bottom', 'div')[0];
break;
wikEd.wikiEditorText = wikEd.GetElementsByClassName('wikiEditor-ui-text', 'div')[0];
}
wikEd.textareaContainer = wikEd.wikiEditor;
node = parent;
parent = node.parentNode;
}
wikEd.textareaContainer = node;
}
 
// create input wrapper, contains the whole wikEd and wikiEditor user interface, is the fullscreen contentcontainer
wikEd.inputWrapper = document.createElement('div');
wikEd.inputWrapper.id = 'wikEdInputWrapper';
wikEd.inputWrapper.className = inputWrapperClass'wikEdInputWrapper';
if (wikEd.wikiEditor !== null) {
wikEd.textareaContainer.parentNode.insertBefore(wikEd.inputWrapper, wikEd.textareaContainer);
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
wikEd.editorWrapper = document.createElement('div');
if (wikEd.wikiEditor != null) {
wikEd.editorWrapper.id = wikEd.wikiEditor'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);
wikEd.editorWrapper = document.createElement('div');
wikEd.editorWrapper.id = 'wikEdEditorWrapper';
wikEd.editorWrapper.className = 'wikEdEditorWrapper';
}
wikEd.inputWrapper.appendChild(wikEd.editorWrapper);
 
// create toolbarbuttons wrapper for toolbar, wikiEditor, and wikEd button bars
wikEd.buttonsWrapper = document.createElement('div');
wikEd.buttonsWrapper.id = 'wikEdButtonsWrapper';
wikEd.buttonsWrapper.className = 'wikEdButtonsWrapper';
if (wikEd.wikiEditor !== null) {
wikEd.wikiEditorBar.parentNode.insertBefore(wikEd.buttonsWrapper, wikEd.wikiEditorBar);
wikEd.buttonsWrapper.appendChild(wikEd.wikiEditorBar);
}
else {
wikEd.editorWrapper.appendChild(wikEd.buttonsWrapper);
}
 
// create toolbar wrapper
wikEd.toolbarWrapper = document.createElement('div');
wikEd.toolbarWrapper.id = 'wikEdToolbarWrapper';
wikEd.toolbarWrapper.className = 'wikEdToolbarWrapper';
wikEd.buttonsWrapper.appendChild(wikEd.toolbarWrapper);
 
// fill toolbar wrapper
wikEd.toolbar = document.getElementById('toolbar');
if (wikEd.toolbar !== null) {
wikEd.editorWrappertoolbarWrapper.appendChild(wikEd.toolbarWrappertoolbar);
}
else if (wikEd.wikiEditorBar !== null) {
wikEd.wikiEditorBar.parentNode.insertBefore(wikEd.toolbarWrapper, wikEd.wikiEditorBar);
wikEd.toolbarWrapper.appendChild(wikEd.wikiEditorBar);
}
wikEd.buttonsWrapper.appendChild(wikEd.toolbarWrapper);
else {
wikEd.editorWrapper.appendChild(wikEd.toolbarWrapper);
}
 
// create captchadebug textarea wrapper
wikEd.debugWrapper = document.createElement('div');
wikEd.textBoxTable;
wikEd.debugWrapper.id = 'wikEdDebugWrapper';
if (wikEd.rearrange == true) {
wikEd.debugWrapper.className = 'wikEdDebugWrapper';
wikEd.debugWrapper.style.display = 'none';
wikEd.editorWrapper.insertBefore(wikEd.debugWrapper, wikEd.editorWrapper.firstChild);
 
// create captcha wrapper
if ( (wikEd.rearrange === true) && (wikEd.readOnly === false) ) {
wikEd.captchaWrapper = document.createElement('div');
wikEd.captchaWrapper.id = 'wikEdCaptchaWrapper';
wikEd.captchaWrapper.className = 'wikEdCaptchaWrapper';
wikEd.editorWrapper.appendChildinsertBefore(wikEd.captchaWrapper, wikEd.editorWrapper.firstChild);
 
// fill captcha wrapper with elements between form and textarea (table)
wikEd.textBoxTable = document.getElementById('textBoxTable');
if ( (wikEd.uploadEdit == false) && (wikEd.watchlistEdit == false) ) {
var node = wikEd.editForm.firstChild;
while (node != null) {
if ( (node == wikEd.inputWrapper) || (node == wikEd.wikiEditor) ) {
break;
}
var nextNode = node.nextSibling;
wikEd.captchaWrapper.appendChild(node);
node = nextNode;
}
}
}
 
// create debugeditor wrapper, contains toolbar, textarea, wrappertoc, but not the summary
wikEd.debugWrapper = document.createElement('div');
wikEd.debugWrapper.id = 'wikEdDebugWrapper';
wikEd.debugWrapper.className = 'wikEdDebugWrapper';
wikEd.debugWrapper.style.visibility = 'hidden';
wikEd.editorWrapper.appendChild(wikEd.debugWrapper);
 
// create edit wrapper for textarea and frame wrapper
wikEd.editWrapper = document.createElement('div');
wikEd.editWrapper.id = 'wikEdEditWrapper';
wikEd.editWrapper.className = 'wikEdEditWrapper';
if (wikEd.wikiEditor !== null) {
wikEd.editorWrapper.appendChild(wikEd.editWrapper);
wikEd.textarea.parentNode.appendChild(wikEd.editWrapper);
}
else {
wikEd.inputWrapper.appendChild(wikEd.editWrapper);
}
 
// create textarea wrapper
wikEd.textareaWrapper = document.createElement('div');
wikEd.textareaWrapper.id = 'wikEdTextareaWrapper';
Line 2,636 ⟶ 2,993:
wikEd.editWrapper.appendChild(wikEd.textareaWrapper);
 
// create frame wrapper
wikEd.frameWrapper = document.createElement('div');
wikEd.frameWrapper.id = 'wikEdFrameWrapper';
Line 2,642 ⟶ 2,999:
wikEd.frameWrapper.style.position = styleFrameWrapperPosition;
wikEd.frameWrapper.style.visibility = styleFrameWrapperVisibility;
wikEd.editWrappertextareaWrapper.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';
Line 2,652 ⟶ 3,009:
}
 
// create buttonsbutton bar wrapper for toolbar and wikEd button bars
if (wikEd.wikiEditor != null) {
wikEd.buttonsWrapper = wikEd.wikiEditorTop;
}
else {
wikEd.buttonsWrapper = document.createElement('div');
wikEd.buttonsWrapper.id = 'wikEdButtonsWrapper';
wikEd.buttonsWrapper.className = 'wikEdButtonsWrapper';
}
wikEd.editorWrapper.insertBefore(wikEd.buttonsWrapper, wikEd.editWrapper);
 
// create button bar wrapper
wikEd.buttonBarWrapper = document.createElement('div');
wikEd.buttonBarWrapper.id = 'wikEdButtonBarWrapper';
Line 2,669 ⟶ 3,015:
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 (wikEd.addNewSection === true) {
wikEd.consoleTopWrapper = document.createElement('div');
wikEd.summaryWrapper.className = 'wikEdSummaryWrapperTop';
wikEd.consoleTopWrapper.id = 'wikEdConsoleTopWrapper';
wikEd.inputWrapper.insertBefore(wikEd.summaryWrapper, wikEd.inputWrapper.firstChild);
wikEd.consoleTopWrapper.className = 'wikEdConsoleTopWrapper';
wikEd.consoleTopWrapper.appendChild(wikEd.summaryWrapper);
wikEd.inputWrapper.insertBefore(wikEd.consoleTopWrapper, wikEd.inputWrapper.firstChild);
}
else {
wikEd.summaryWrapper.className = 'wikEdSummaryWrapper';
wikEd.consoleWrapper.appendChild(wikEd.summaryWrapper);
}
 
// create summary input wrapper
wikEd.summaryInputWrapper = document.createElement('div');
wikEd.summaryInputWrapper.id = 'wikEdSummaryInputWrapper';
Line 2,690 ⟶ 3,039:
wikEd.summaryWrapper.appendChild(wikEd.summaryInputWrapper);
 
// create minor edit and watch page wrapper
wikEd.editOptionsWrapper = document.createElement('div');
wikEd.editOptionsWrapper.id = 'wikEdEditOptionsWrapper';
wikEd.editOptionsWrapper.className = 'wikEdEditOptionsWrapper';
 
// create submit wrapper for submit elements
wikEd.submitWrapper = document.createElement('div');
wikEd.submitWrapper.id = 'wikEdSubmitWrapper';
Line 2,701 ⟶ 3,050:
wikEd.consoleWrapper.appendChild(wikEd.submitWrapper);
 
// create submit buttons wrapper for submit buttons and help links
wikEd.submitButtonsWrapper = document.createElement('div');
wikEd.submitButtonsWrapper.id = 'wikEdSubmitButtonsWrapper';
Line 2,707 ⟶ 3,056:
}
 
// create preview wrapper for preview and diff box
if (wikEd.enableLocalPreview !== false) {
wikEd.localPrevWrapper = document.createElement('div');
wikEd.localPrevWrapper.id = document.createElement('wikEdLocalPrevWrapperdiv');
wikEd.localPrevWrapper.classNameid = 'wikEdLocalPrevWrapper';
wikEd.localPrevWrapper.style.displayclassName = 'nonewikEdLocalPrevWrapper';
wikEd.localPrevWrapper.style.display = 'none';
if (wikEd.rearrange == true) {
if (wikEd.rearrange === true) {
wikEd.inputWrapper.appendChild(wikEd.localPrevWrapper);
}
else if (wikEd.saveButton !== null) {
wikEd.saveButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
else if (wikEd.previewButton !== null) {
wikEd.previewButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
else if (wikEd.diffPreviewButton !== null) {
wikEd.diffPreviewButton.parentNode.appendChild(wikEd.localPrevWrapper);
}
}
 
// create insert wrapper for insert special chars links
if (wikEd.rearrange === true) {
wikEd.insertWrapper = document.createElement('div');
wikEd.insertWrapper.id = 'wikEdInsertWrapper';
Line 2,733 ⟶ 3,084:
}
 
// fill the wrappers
// append input wrapper to document
if ( (wikEd.rearrange == true) && (wikEd.watchlistEdit == false) ) {
wikEd.editForm.insertBefore(wikEd.inputWrapper, wikEd.editForm.firstChild);
}
 
// fill the wrappers
 
// create debug textarea and add to debug wrapper
wikEd.debug = document.createElement('textarea');
wikEd.debug.id = 'wikEdDebugTextarea';
wikEd.debug.className = 'wikEdDebugTextarea';
wikEd.debug.rows = 20;
wikEd.debug.style.display = 'none';
wikEd.debug.setAttribute('spellcheck', false);
wikEd.debugWrapper.appendChild(wikEd.debug);
 
// display startup error messages
if (wikEd.config.debugStartUp !== '') {
wikEd.Debug(wikEd.config.debugStartUp);
}
 
// wikEdDiff enhanced ajax diff
if (typeof( wikEd.diffTable) == 'object') {
if ( (wikEd.diffTable !== null) && (wikEd.diff === true) ) {
if (typeof(wikEd.Diff) !== 'function'undefined) {
wikEd.Diff();
}
Line 2,761 ⟶ 3,108:
}
 
// hide toolbar wrapper
if (wikEd.closeToolbar === true) {
wikEd.toolbarWrapper.style.display = 'none';
}
Line 2,769 ⟶ 3,116:
}
 
// call wikibits:mwSetupToolbar() now because it would terminate with an error after setting textarea to display: none
if (wikEd.toolbar !== null) {
if (wikEd.toolbar.getElementsByTagName('IMG').length === 0) {
if (typeof(window.mwSetupToolbar) !== 'function'undefined) {
window.mwSetupToolbar();
wikEdwindow.RemoveEventListenerremoveEventListener(window, 'load', window.mwSetupToolbar, false);
}
}
}
 
// dropdowns from toolbar should go over wikEd toolbar
if (wikEd.wikiEditorBar !== null) {
wikEd.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) {
wikEd.editOptions = wpSummary[0].parentNode;
wikEd.editOptions.className = 'wikEdEditOptions';
}
 
// add summary elements to summary input wrapper
if (wikEd.rearrange == true) {
wikEd.summaryLabel = document.getElementById('wpSummaryLabel');
if (wikEd.summaryLabel != null) {
wikEd.summaryInputWrapper.appendChild(wikEd.summaryLabel);
}
wikEd.summaryText = document.getElementsByName('wpSummary')[0];
if (wikEd.summaryText != null) {
wikEd.summaryInputWrapper.appendChild(wikEd.summaryText);
}
}
 
// move editpage-copywarn out of summary wrapper
// needs to be done before appending editOptions to summary wrapper otherwise a linebreak stays (Mozilla bug)
if (wikEd.rearrange == true) {
var copywarn = document.getElementById('editpage-copywarn');
if (copywarn !== null) {
wikEd.inputWrapper.parentNode.insertBefore(copywarn, wikEd.inputWrapper.nextSibling);
copywarn.style.clear = 'both';
}
}
 
// add submita buttonslink to submitthe wrapperwikEd help page
var editHelp = document.getElementsByClassName('editHelp')[0];
if (wikEd.rearrange == true) {
if (editHelp !== undefined) {
var wpEditButtons;
if (typeof wikEd.saveButtonconfig.helpPageLink !== null'string') {
wikEd.editHelp = document.createElement('span');
wpEditButtons = wikEd.saveButton.parentNode;
wikEd.editHelp.id = 'wikEdEditHelp';
}
wikEd.editHelp.className = 'wikEdEditHelp';
else if (wikEd.previewButton != null) {
wikEd.editHelp.innerHTML = wikEd.config.helpPageLink.replace(/\{wikEdHomeBaseUrl\}/g, wikEd.config.homeBaseUrl);
wpEditButtons = wikEd.previewButton.parentNode;
editHelp.parentNode.insertBefore(wikEd.editHelp, editHelp.nextSibling);
}
else if (wikEd.diffPreviewButton != null) {
wpEditButtons = wikEd.diffPreviewButton.parentNode;
}
if (wpEditButtons != null) {
wikEd.submitButtonsWrapper.appendChild(wpEditButtons);
}
}
 
// add submit buttons to submit wrapper, leaving only checkboxes in editOptions
// add a link to the wikEd help page
if (wikEd.rearrange === true) {
var editButtons = document.getElementsByClassName('editButtons')[0];
if ( (wikEd.config.helpPageLink != '') && (wikEd.config.helpPageLink != null) ) {
if (editButtons === undefined) {
var editHelpParent = wikEd.diffPreviewButton;
whileif (editHelpParentwikEd.saveButton !== null) {
 
if (editHelpParent.tagName == 'SPAN') {
// edit watchlist, semantic forms
break;
if (wikEd.editWatchlist === true) {
editButtons = wikEd.saveButton;
}
 
// semantic forms
else {
editButtons = wikEd.saveButton.parentNode;
}
editHelpParent = editHelpParent.nextSibling;
}
else if (wikEd.previewButton !== null) {
 
// edit watchlist
if (editHelpParent != null) {
if (wikEd.editWatchlist === true) {
var editHelp = editHelpParent.lastChild;
editButtons = wikEd.previewButton;
while (editHelp != null) {
if (editHelp.tagName == 'A') {
break;
}
editHelp = editHelp.previousSibling;
}
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
if (editHelp != null) {
var editCheckboxes;
wikEd.helpSpan = document.createElement('span');
if (wikEd.editForm !== null) {
wikEd.helpSpan.id = 'wikEdHelpSpan';
editCheckboxes = wikEd.editForm.getElementsByClassName('editCheckboxes')[0];
wikEd.helpSpan.className = 'wikEdHelpSpan';
}
wikEd.helpSpan.innerHTML = wikEd.config.helpPageLink.replace(/\{wikEdHomeBaseUrl\}/g, wikEd.config.homeBaseUrl);
editHelpParent.insertBefore(wikEd.helpSpan, editHelp.nextSibling);
 
// non-standard page (old, semantic forms...)
wikEd.editHelp = wikEd.helpSpan.parentNode;
if (editCheckboxes === undefined) {
wikEd.editHelp.id = 'wikEdEditHelp';
var checkbox = document.getElementById('wpMinoredit');
wikEd.editHelp.className = 'wikEdEditHelp';
if (checkbox === null) {
checkbox = document.getElementById('wpWatchthis');
}
var summary = document.getElementsByName('wpSummary')[0];
if ( (summary !== undefined) && (checkbox !== null) ) {
 
// get checkbox container, e.g. semantic forms <p>
if ( (summary.nextSibling == checkbox.parentNode) || (summary.parentNode.nextSibling == checkbox.parentNode) ) {
editCheckboxes = checkbox.parentNode;
editCheckboxes.className = 'wikEdEditCheckboxes';
}
 
// old MediaWiki versions: create edit options container
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;
}
}
}
Line 2,863 ⟶ 3,226:
}
 
// add submitsummary buttons,elements editto options, and edit help tosummary submitinput wrapper
if (wikEd.submitWrapperrearrange !=== nulltrue) {
wikEd.summaryLabel = document.getElementById('wpSummaryLabel');
if (wikEd.submitButtonsWrapper != null) {
if (wikEd.summaryLabel !== null) {
wikEd.summaryInputWrapper.appendChild(wikEd.summaryLabel);
}
wikEd.summaryText = document.getElementsByName('wpSummary')[0] || null;
if (wikEd.summaryText !== null) {
wikEd.summaryInputWrapper.appendChild(wikEd.summaryText);
}
}
 
// add submit buttons, edit options, and edit help to submit wrapper
if (wikEd.submitWrapper !== null) {
if (wikEd.submitButtonsWrapper !== null) {
wikEd.submitWrapper.appendChild(wikEd.submitButtonsWrapper);
}
if (wikEd.editOptionsWrapper !== null) {
wikEd.submitWrapper.appendChild(wikEd.editOptionsWrapper);
if (wikEd.editOptionseditCheckboxes !== nullundefined) {
wikEd.editOptionsWrapper.appendChild(wikEd.editOptionseditCheckboxes);
 
// remove linebreak before minor edit checkbox
var node = wikEd.editOptionseditCheckboxes.firstChild;
while (node !== null) {
if (node.tagName !== null) {
if (node.tagName == 'BR') {
node.parentNode.removeChild(node);
Line 2,886 ⟶ 3,261:
}
}
}
if (wikEd.editHelp != null) {
 
wikEd.submitWrapper.appendChild(wikEd.editHelp);
// add empty editOptions to wikEdConsoleWrapper
if (wikEd.consoleWrapper !== null) {
var editOptions = document.getElementsByClassName('editOptions')[0];
if (editOptions !== undefined) {
wikEd.consoleWrapper.appendChild(editOptions);
}
}
 
// add textBoxTable or textarea to edittextarea wrapper
if (wikEd.textBoxTable != nulldocument.getElementById('textBoxTable') {;
if (wikEd.textBoxTable !== null) {
wikEd.textareaWrapper.appendChild(wikEd.textBoxTable);
}
else if (wikEd.wikiEditor != null) {
wikEd.textareaWrapper.appendChild(wikEd.wikiEditorBottom);
}
else {
Line 2,902 ⟶ 3,280:
}
 
// fill captcha wrapper with elements between form and textarea (table)
// set frame font family
if (wikEd.captchaWrapper !== null) {
var classFrameBody;
if ( (wikEd.highlightSyntaxeditUpload === false) && (wikEd.editWatchlist === false) true) {
var node = wikEd.editForm.firstChild;
if (wikEd.refHide == true) {
while (node !== null) {
classFrameBody = 'wikEdFrameBodyNewbie';
if ( (node == wikEd.inputWrapper) || (node == wikEd.wikiEditor) || (node == wikEd.captchaWrapper) ) {
}
break;
else {
}
classFrameBody = 'wikEdFrameBodySyntax';
var nextNode = node.nextSibling;
if (node.tagName != 'INPUT') {
wikEd.captchaWrapper.appendChild(node);
}
node = nextNode;
}
}
}
else {
classFrameBody = 'wikEdFrameBodyPlain';
}
 
// addcreate edit-frame toediting frame wrapper
wikEd.frameOuter = document.createElement('div');
// any DOM changes to a starting iframe in designmode may crash mozilla, including DOM move, display: none; and position: absolute;
wikEd.frameOuter.id = 'wikEdFrameOuter';
wikEd.frameOuter.className = 'wikEdFrameOuter';
wikEd.frameWrapper.appendChild(wikEd.frameOuter);
 
wikEd.frameInner = document.createElement('div');
// create the iframe
wikEd.frameInner.id = 'wikEdFrameInner';
var html = '';
wikEd.frameInner.className = 'wikEdFrameInner';
html += '<div id="wikEdFrameOuter" class="wikEdFrameOuter" style="' + styleFrameContainer + '">';
wikEd.frameOuter.appendChild(wikEd.frameInner);
html += '<div id="wikEdFrameInner" class="wikEdFrameInner" style="' + styleFrameContainer + '">';
html += '<iframe id="wikEdFrame" class="wikEdFrame"></iframe>';
html += '</div>';
html += '</div>';
wikEd.frameWrapper.innerHTML = html;
 
// remove frame border if textarea has none
// old Mozilla versions crash when designmode is turned on before the frame has loaded completely
if (wikEd.textareaBorderHeight === 0) {
// but onload workaround has problems starting with Firefox 3.6 (bug 542727)
wikEd.frameInner.style.borderWidth = '0';
var onloadWorkaround = false;
wikEd.frameOuter.style.borderWidth = '0';
if ( (wikEd.mozilla == true) && (
(wikEd.browserFlavor == 'Firefox') && (wikEd.browserVersion < 3.0) ||
(wikEd.browserFlavor == 'Netscape') && (wikEd.browserVersion < 9.0) ||
(wikEd.browserFlavor == 'SeaMonkey') && (wikEd.browserVersion < 2.0) ) ) {
onloadWorkaround = true;
}
 
// create editing frame and initialize after iframe loading
// fill the frame with content
wikEd.frame = document.createElement('iframe');
html = '';
wikEd.frame.addEventListener('load', wikEd.FrameLoadHandler, false);
html += '<html id="wikEdFrameHtml" class="wikEdFrameHtml"><head></head>';
wikEd.frame.id = 'wikEdFrame';
html += '<body id="wikEdFrameBody" class="' + classFrameBody + '" style="' + styleFrameBody + '"';
wikEd.frame.className = 'wikEdFrame';
wikEd.frameInner.appendChild(wikEd.frame);
 
// set frame height and width, border divs shrink around
// disable spellchecker in iframe
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);
if (wikEd.noSpellcheck == true) {
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
html += ' spellcheck="false"';
wikEd.frame.style.height = wikEd.frameHeight;
}
if (wikEd.readOnly == false) {
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>';
 
wikEd.frameOuter = document.getElementById('wikEdFrameOuter');
wikEd.frameInner = document.getElementById('wikEdFrameInner');
wikEd.frame = document.getElementById('wikEdFrame');
wikEd.frameWindow = wikEd.frame.contentWindow;
wikEd.frameDocument = wikEd.frameWindow.document;
 
// set frame 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.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.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
wikEd.frame.style.width = wikEd.frameWidth;
 
// generate button bars and add them to the buttons wrapper
// do not remember sie if started in fullscreen mode
// form wrapper added against summary input submit defaulting to this button
if (wikEd.fullScreenMode == true) {
if (wikEd.frameHeightreadOnly === false) 0;{
wikEd.buttonBarFormat = wikEd.MakeButtonBar(wikEd.config.buttonBar.format);
wikEd.frameWidth = 0;
}
 
// turn on designmode before adding content
if ( (onloadWorkaround == false) && (wikEd.readOnly == false) ) {
wikEd.frameDocument.designMode = 'on';
try { wikEd.frameDocument.execCommand('styleWithCSS', 0, false); } catch (e) {
try { wikEd.frameDocument.execCommand('useCSS', 0, true); } catch (e) {
try { wikEd.frameDocument.execCommand('styleWithCSS', false, false); } catch (e) {
}
}
}
}
 
// MS-IE needs styling for full width frame
if (wikEd.msie == true) {
//// wikEd.frame.style.width = wikEd.textareaWidth + 'px';// 100%
}
 
// fill iframe with content
wikEd.frameDocument.open();
wikEd.frameDocument.write(html);
wikEd.frameDocument.close();
wikEd.frameBody = wikEd.frameDocument.body;
 
// generate button bars and add them to the buttons wrapper
// form wrapper has been added against summary input submit defaulting to this button
if (wikEd.readOnly == false) {
wikEd.buttonBarFormat = MakeButtonBar(wikEd.config.buttonBar['format']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarFormat);
 
wikEd.buttonBarTextify = wikEd.MakeButtonBar(wikEd.config.buttonBar['.textify']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarTextify);
}
 
wikEd.buttonBarControl = wikEd.MakeButtonBar(wikEd.config.buttonBar['.control']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarControl);
 
if (wikEd.config.buttonBar['.custom1'][6].length > 0) {
wikEd.buttonBarCustom1 = wikEd.MakeButtonBar(wikEd.config.buttonBar['.custom1']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarCustom1);
}
 
wikEd.buttonBarFind = wikEd.MakeButtonBar(wikEd.config.buttonBar['.find']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarFind);
 
// inactivate replace buttons for read-only pages
if (wikEd.readOnly == false) {
if (wikEd.readOnly === true) {
wikEd.buttonBarFix = MakeButtonBar(wikEd.config.buttonBar['fix']);
document.getElementById('wikEdReplaceAll').className = 'wikEdButtonInactive';
document.getElementById('wikEdReplacePrev').className = 'wikEdButtonInactive';
document.getElementById('wikEdReplaceNext').className = 'wikEdButtonInactive';
}
 
if (wikEd.readOnly === false) {
wikEd.buttonBarFix = wikEd.MakeButtonBar(wikEd.config.buttonBar.fix);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarFix);
}
 
if (wikEd.config.buttonBar['.custom2'][6].length > 0) {
wikEd.buttonBarCustom2 = wikEd.MakeButtonBar(wikEd.config.buttonBar['.custom2']);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarCustom2);
}
Line 3,032 ⟶ 3,371:
br.style.clear = 'both';
wikEd.buttonsWrapper.appendChild(br);
 
wikEd.caseSensitive = document.getElementById('wikEdCaseSensitive');
wikEd.regExp = document.getElementById('wikEdRegExp');
Line 3,039 ⟶ 3,377:
wikEd.replaceText = document.getElementById('wikEdReplaceText');
 
// add preview box top bar to submit wrapper
wikEd.buttonBarPreview = wikEd.MakeButtonBar(wikEd.config.buttonBar['.preview']);
if ( (wikEd.rearrange === true) && (wikEd.submitWrapper !== null) ) {
if ( (wikEd.fullScreenMode === true) && (wikEd.editArticle === true) && (wikEd.useWikEd === true) ) {
wikEd.submitWrapper.insertBefore(wikEd.buttonBarPreview, wikEd.submitWrapper.firstChild);
wikEd.buttonBarPreview.style.display = 'none';
}
wikEd.submitWrapper.appendChild(wikEd.buttonBarPreview);
}
 
// add previewpasted box and its bottombutton bar to previewframe wrapper
wikEd.buttonBarPasted = wikEd.MakeButtonBar(wikEd.config.buttonBar.pasted);
if (wikEd.localPrevWrapper != 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';
wikEd.localPrevWrapper.appendChild(div);
 
// add article and diff preview containers and their bottom bar to preview wrapper
wikEd.previewBox = document.createElement('div');
if (wikEd.localPrevWrapper !== null) {
wikEd.previewBox.id = 'wikEdPreviewBox';
 
wikEd.previewBox.className = 'wikEdPreviewBox';
// article preview
div.appendChild(wikEd.previewBox);
wikEd.previewArticle = document.createElement('div');
wikEd.buttonBarPreview2 = MakeButtonBar(wikEd.config.buttonBar['preview2']);
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
wikEd.buttonBarPreview2 = wikEd.MakeButtonBar(wikEd.config.buttonBar.preview2);
wikEd.localPrevWrapper.appendChild(wikEd.buttonBarPreview2);
}
 
// add jump box to standard preview
var wikEd.wikiPreview = document.getElementById('wikiPreview');
if (wikEd.wikiPreview !== null) {
if (wikEd.wikiPreview.firstChild !== null) {
wikEd.buttonBarJump = wikEd.MakeButtonBar(wikEd.config.buttonBar['.jump']);
wikEd.wikiPreview.insertBefore(wikEd.buttonBarJump, wikEd.wikiPreview.firstChild);
}
}
 
// add insert special chars to insert wrapper
if (wikEd.insertWrapper !== null) {
var wpSpecialcharsinsert = document.getElementById('editpagemw-specialcharsedittools-charinsert');
if (wpSpecialcharsinsert !=== null) {
insert = document.getElementById('editpage-specialchars');
wikEd.insertWrapper.appendChild(wpSpecialchars);
}
if (insert !== null) {
wikEd.insertWrapper.appendChild(insert);
}
}
 
// wrappers filled
 
// add local preview button next to submit button
if (wikEd.enableLocalPreview !== false) {
wikEd.localPreview = document.createElement('button');
var previewSpan = document.createElement('span');
wikEd.localPreview.id = 'wikEdLocalPreview';
previewSpan.innerHTML = wikEd.MakeButtonCode(82, 'button');
wikEd.localPreview.title = wikEd.config.text['wikEdLocalPreview title'];
if (wikEd.previewButton !== null) {
wikEd.localPreview.className = 'wikEdLocalPreview';
wikEd.previewButton.parentNode.insertBefore(previewSpan, wikEd.previewButton.nextSibling);
 
var localPreviewImg = document.createElement('img');
localPreviewImg.id = 'wikEdLocalPreviewImg';
localPreviewImg.src = wikEd.config.image['preview'];
localPreviewImg.alt = wikEd.config.text['wikEdLocalPreviewImg alt'];
localPreviewImg.title = wikEd.config.text['wikEdLocalPreview title'];
wikEd.localPreview.appendChild(localPreviewImg);
 
if (wikEd.previewButton != null) {
wikEd.previewButton.parentNode.insertBefore(wikEd.localPreview, wikEd.previewButton.nextSibling);
}
else if (wikEd.saveButton != null) {
wikEd.saveButton.parentNode.insertBefore(wikEd.localPreview, wikEd.saveButton.nextSibling);
}
 
// add local diff button next to submit button
if ( ( (wikEd.diffPreviewButton != null) || (wikEd.watchlistEdit == true) ) && (wikEd.readOnly == false) ) {
wikEd.localDiff = document.createElement('button');
wikEd.localDiff.id = 'wikEdLocalDiff';
wikEd.localDiff.title = wikEd.config.text['wikEdLocalDiff title'];
wikEd.localDiff.className = 'wikEdLocalDiff';
 
var localDiffImg = document.createElement('img');
localDiffImg.id = 'wikEdLocalDiffImg';
localDiffImg.src = wikEd.config.image['diff'];
localDiffImg.alt = wikEd.config.text['wikEdLocalDiffImg alt'];
localDiffImg.title = wikEd.config.text['wikEdLocalDiff title'];
 
wikEd.localDiff.appendChild(localDiffImg);
 
if (wikEd.diffPreviewButton != null) {
wikEd.diffPreviewButton.parentNode.insertBefore(wikEd.localDiff, wikEd.diffPreviewButton.nextSibling);
}
else if (wikEd.localPreviewsaveButton !== null) {
wikEd.localPreviewsaveButton.parentNode.insertBefore(wikEd.localDiffpreviewSpan, wikEd.localPreviewsaveButton.nextSibling);
}
else {
else if (wikEd.previewButton != null) {
wikEd.previewButton.parentNodesubmitWrapper.insertBefore(wikEd.localDiffpreviewSpan, wikEd.previewButtonsubmitWrapper.nextSiblingfirstChild);
}
 
// add local diff button next to submit button
if ( ( (wikEd.diffPreviewButton !== null) || (wikEd.editWatchlist === true) ) && (wikEd.readOnly === false) ) {
var diffSpan = document.createElement('span');
diffSpan.innerHTML = wikEd.MakeButtonCode(83, 'button');
if (wikEd.diffPreviewButton !== null) {
wikEd.diffPreviewButton.parentNode.insertBefore(diffSpan, wikEd.diffPreviewButton.nextSibling);
}
else if (previewSpan !== null) {
previewSpan.parentNode.insertBefore(diffSpan, previewSpan.nextSibling);
}
else if (wikEd.previewButton !== null) {
wikEd.previewButton.parentNode.insertBefore(diffSpan, wikEd.previewButton.nextSibling);
}
}
}
 
// correct tab order between check boxes and submits
wikEd.frame.tabIndex = wikEd.textarea.tabIndex;
 
// initialize image buttons
wikEd.Button(document.getElementById('wikEdDiff'), 'wikEdDiff', null, wikEd.diff);
wikEd.Button(document.getElementById('wikEdRefHide'), 'wikEdRefHide', null, wikEd.refHide);
wikEd.Button(document.getElementById('wikEdHighlightSyntax'), 'wikEdHighlightSyntax', null, wikEd.highlightSyntax);
Line 3,143 ⟶ 3,482:
wikEd.Button(document.getElementById('wikEdTableMode'), 'wikEdTableMode', null, wikEd.tableMode);
 
// grey out fullscreen button
// hide typo fix button until typo fix rules are loaded and parsed
if ( (wikEd.editArticle === false) || (wikEd.useWikEd === false) ) {
wikEd.fixRegExTypo = document.getElementById('wikEdFixRegExTypo');
document.getElementById('wikEdFullScreen').className = 'wikEdButtonInactive';
if (wikEd.fixRegExTypo != null) {
wikEd.fixRegExTypo.style.display = 'none';
}
 
// grey out close toolbar button
// hide buttons if API is not available
if (wikEd.rearrange === false) {
if ( (wikEd.wikiGlobals.wgEnableAPI != true) && (wikEd.wikiGlobals.wgEnableAPI != 'true') ) {
var fixRedirect = document.getElementById('wikEdFixRedirectwikEdCloseToolbar').className = 'wikEdButtonInactive';
}
if (fixRedirect != null) {
 
fixRedirect.style.display = 'none';
// hide typo fix button until typo fix rules are loaded and parsed
}
wikEd.fixRegExTypo = document.getElementById('wikEdFixRegExTypo');
if (wikEd.fixRegExTypo !== null) {
wikEd.fixRegExTypo.style.display = 'none';
}
 
// add a clear summary button left to the summary input field
if (wikEd.summaryText !== null) {
var clearSummaryForm = document.createElement('form');
clearSummaryForm.id = 'wikEdClearSummaryForm';
Line 3,169 ⟶ 3,510:
wikEd.clearSummary.alt = wikEd.config.text['wikEdClearSummary alt'];
wikEd.clearSummary.title = wikEd.config.text['wikEdClearSummary title'];
wikEd.clearSummary.style.height = (wikEd.summaryText.clientHeight + 1) +'px';
clearSummaryForm.appendChild(wikEd.clearSummary);
 
Line 3,178 ⟶ 3,518:
wikEd.clearSummary.appendChild(wikEd.clearSummaryImg);
 
// remember button width, might be without image
wikEd.clearSummaryWidth = wikEd.clearSummary.offsetWidth;
 
// make the summary a combo box
var summaryComboInput = document.createElement('span');
summaryComboInput.id = 'wikEdSummaryComboInput';
Line 3,201 ⟶ 3,541:
summaryComboInput.appendChild(wikEd.summaryText);
summaryComboInput.appendChild(wikEd.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 (wikEd.previewButton !== null) {
wikEd.previewButton.value = wikEd.config.text['.shortenedPreview'];
}
if (wikEd.diffPreviewButton !== null) {
wikEd.diffPreviewButton.value = wikEd.config.text['.shortenedChanges'];
}
 
// set up combo input boxes with history
wikEd.fieldHist ['find'] = [];
wikEd.savedName['.find'] = 'wikEdFindHistory';
wikEd.inputElement['.find'] = new Object(wikEd.findText);
wikEd.selectElement['.find'] = new Object(document.getElementById('wikEdFindSelect'));
wikEd.selectElement['.find'].title = wikEd.config.text['wikEdFindSelect title'];
 
wikEd.fieldHist ['replace'] = [];
wikEd.savedName['.replace'] = 'wikEdReplaceHistory';
wikEd.inputElement['.replace'] = new Object(wikEd.replaceText);
wikEd.selectElement['.replace'] = new Object(document.getElementById('wikEdReplaceSelect'));
wikEd.selectElement['.replace'].title = wikEd.config.text['wikEdReplaceSelect title'];
 
if (wikEd.summaryInputWrapper !== null) {
wikEd.fieldHist ['summary'] = [];
wikEd.savedName['.summary'] = 'wikEdSummaryHistory';
wikEd.inputElement['.summary'] = new Object(wikEd.summaryText);
wikEd.selectElement['.summary'] = new Object(document.getElementById('wikEdSummarySelect'));
wikEd.selectElement['.summary'].title = wikEd.config.text['wikEdSummarySelect title'];
}
 
// adjust the select field widths to that of the text input fields
wikEd.ResizeComboInput('find');
wikEd.ResizeComboInput('replace');
if (wikEd.summaryText !== null) {
wikEd.ResizeComboInput('summary');
}
 
// hide the button bars per saved setting
if (wikEd.buttonBarFormat !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFormat);
}
if (wikEd.buttonBarTextify !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarTextify);
}
if (wikEd.buttonBarControl !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarControl);
}
if (wikEd.buttonBarCustom1 !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarCustom1);
}
if (wikEd.buttonBarFind !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFind);
}
if (wikEd.buttonBarFix !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarFix);
}
if (wikEd.buttonBarCustom2 !== null) {
wikEd.ButtonBarInit(wikEd.buttonBarCustom2);
}
 
// copy page warnings above edit window
// display only the textarea or the iframe, dont change the frame
if ( (wikEd.SetEditAreaconfig.doCloneWarnings === true) && (wikEd.useWikEd,editForm true!== null); ) {
if ( (wikEd.clonedWarnings === false) && (wikEd.previewPage === false) && (/(.*\n){2}/.test(wikEd.origVersion) ) === true) {
 
// copy page warnings above edit window
if (wikEd.config.doCloneWarnings == true) {
if ( (wikEd.clonedWarnings == false) && (wikEd.previewPage == false) && (/(.*\n){2}/.test(wikEd.origVersion) ) == true) {
var divs = document.getElementsByTagName('div');
var divWarnings = [];
Line 3,273 ⟶ 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) {
wikEd.editForm.insertBefore(clone, wikEd.editForm.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);
}
}
wikEd.clonedWarnings = 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) {
wikEd.direction = wikEd.GetStyle(document.body, 'direction');
wikEd.frameBodyframe.style.direction =addEventListener('load', wikEd.directionInitializeFrame, false);
wikEd.ApplyCSS(wikEd.frameDocument, wikEd.config.frameCSS);
wikEd.HighlightNamedHideButtonsStylesheet = new wikEd.StyleSheet(wikEd.frameDocument);
 
// copy textarea background
if (wikEd.GetStyle(wikEd.textarea, 'display') != 'none') {
wikEd.frameInner.style.backgroundColor = wikEd.GetStyle(wikEd.textarea, 'backgroundColor');
}
else {
 
wikEd.InitializeFrame();
// 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 the textarea content to the iframe
if (wikEd.useWikEd == true) {
wikEd.UpdateFrame();
}
 
// 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(wikEd.frameWindow, wikEd.frameDocument);
}
 
// focus the input field
// scroll to edit window and focus if it is not a preview page
if ( (scrollToEditFocuswikEd.config.focusEdit === true) && (wikEd.previewPageuseWikEd === false) ) {
wikEd.textarea.setSelectionRange(0, 0);
 
wikEd.textarea.focus();
// focus the input field
if (wikEd.config.focusEdit == true) {
if (wikEd.useWikEd == true) {
wikEd.frameWindow.focus();
}
else {
if (wikEd.msie == true) {
wikEd.textarea.selection.empty();
}
else {
wikEd.textarea.setSelectionRange(0, 0);
}
wikEd.textarea.focus();
}
}
 
// scroll
if ( (wikEd.fullScreenMode === false) && (wikEd.config.scrollToEdit === true) ) {
window.scroll(0, wikEd.GetOffsetTop(wikEd.editForminputWrapper) - 2);
}
}
 
// register edit button click events
for (var buttonId in wikEd.editButtonHandler) {
if (wikEdObject.editButtonHandlerprototype.hasOwnProperty.call(wikEd.editButtonHandler, buttonId) === true) {
var buttonObj = document.getElementById(buttonId);
if (buttonObj !== null) {
wikEdbuttonObj.AddEventListeneraddEventListener(buttonObj, 'click', wikEd.EditButtonHandler, true);
}
}
}
 
// register summary shrinking event after loading the 'Clear summary' image handler
wikEd.AddEventListenerif (wikEd.clearSummaryImg, 'load',!== wikEd.ShrinkSummaryHandler,null) true);{
wikEd.clearSummaryImg.addEventListener('load', wikEd.ShrinkSummaryHandler, true);
}
 
// register summary resize event for window resizing (MS IE bug: fires once always)
wikEdwindow.AddEventListeneraddEventListener(window, 'resize', wikEd.ResizeWindowHandler, true);
 
// register framedocument events
wikEddocument.AddEventListeneraddEventListener(wikEd.frameDocument, 'keydown', wikEd.KeyFrameHandlerKeyHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'keyup', wikEd.KeyFrameHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'keypress', wikEd.KeyFrameHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'mouseup', wikEd.KeyFrameHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'keydown', wikEd.KeyHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'mousemove', wikEd.ResizeGripHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, 'dblclick', wikEd.ResizeFrameResetHandler, true);
 
// registerdblclick documenton wrapper events
wikEd.AddEventListenerdebugWrapper.addEventListener(document, 'keydowndblclick', wikEd.KeyHandlerDebugHandler, true);
wikEd.localPrevWrapper.addEventListener('dblclick', wikEd.PrevWrapperHandler, true);
 
// dblclickregister onfind wrapperahead events
wikEd.AddEventListenerfindText.addEventListener(wikEd.debugWrapper, 'dblclickkeyup', wikEd.DebugHandlerFindAhead, true);
wikEd.AddEventListener(wikEd.localPrevWrapper, 'dblclick', wikEd.PrevWrapperHandler, true);
 
// register findsubmit aheadbutton events
if (wikEd.saveButton !== null) {
wikEd.AddEventListener(wikEd.findText, 'keyup', wikEd.FindAhead, 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) {
wikEd.AddEventListener(wikEd.saveButton, 'click', wikEd.SaveButtonHandler, true);
wikEd.AddEventListenerbuttonBarFormat.firstChild.firstChild.addEventListener(wikEd.previewButton, 'click', wikEd.PreviewButtonHandlerButtonBarGripHandler, truefalse);
}
wikEd.AddEventListener(wikEd.diffPreviewButton, 'click', wikEd.DiffPreviewButtonHandler, true);
if (wikEd.buttonBarTextify !== null) {
wikEd.AddEventListener(wikEd.localPreview, 'click', wikEd.LocalPreviewHandler, true);
wikEd.AddEventListenerbuttonBarTextify.firstChild.firstChild.addEventListener(wikEd.localDiff, 'click', wikEd.LocalDiffHandlerButtonBarGripHandler, truefalse);
}
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) {
wikEd.AddEventListener(window, 'pagehide', wikEd.UnloadHandler, 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 (wikEd.buttonBarFormatclearSummary !== null) {
wikEd.AddEventListenerclearSummary.addEventListener(wikEd.buttonBarFormat.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandlerClearSummaryHandler, false);
}
 
if (wikEd.buttonBarTextify != null) {
// register double click handler on wiki preview area
wikEd.AddEventListener(wikEd.buttonBarTextify.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, false);
if (wikEd.wikiPreview !== null) {
wikEd.wikiPreview.addEventListener('dblclick', wikEd.WikiPreviewHandler, false);
}
 
if (wikEd.buttonBarControl != null) {
// register special char insert select handler for fullscreen resizing
wikEd.AddEventListener(wikEd.buttonBarControl.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, false);
if (wikEd.insertWrapper !== null) {
var select = wikEd.insertWrapper.getElementsByTagName('select')[0];
if (select !== undefined) {
select.addEventListener('change', wikEd.InsertChangeHandler, true);
}
}
 
if (wikEd.buttonBarCustom1 != null) {
// select the text on focus for find and replace fields, tab/shift-tab between find and replace fields
if (wikEd.buttonBarCustom1.firstChild.firstChild != null) {
if (wikEd.findText !== null) {
wikEd.AddEventListener(wikEd.buttonBarCustom1.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, 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 (wikEd.buttonBarFind != null) {
// deprecated insertTags function in wikibits.js
wikEd.AddEventListener(wikEd.buttonBarFind.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, false);
else if (typeof window.insertTags == 'function') {
if (wikEd.InsertTagsOriginal === null) {
wikEd.InsertTagsOriginal = window.insertTags;
}
window.insertTags = wikEd.InsertTags;
}
 
if (wikEd.buttonBarFix != null) {
// hook wikEd into the enhanced new edit toolbar, not Greasemonkey compatible
wikEd.AddEventListener(wikEd.buttonBarFix.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, false);
if (typeof jQuery == 'function') {
jQuery('#wpTextbox1').bind('encapsulateSelection', function (e, before, inside, after) {
if (wikEd.useWikEd === true) {
wikEd.InsertTags(before, after, inside);
}
});
}
 
if (wikEd.buttonBarCustom2 != null) {
// update textarea before using UI LivePreview function, not Greasemonkey compatible
if (wikEd.buttonBarCustom2.firstChild.firstChild != null) {
if ( (typeof jQuery == 'function') && (typeof window.mw == 'object') ) {
wikEd.AddEventListener(wikEd.buttonBarCustom2.firstChild.firstChild, 'click', wikEd.ButtonBarGripHandler, 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();
wikEd.AddEventListener(wikEd.summarySelect, 'change', function() { wikEd.ChangeComboInput('summary'); }, false);
wikEd.turnedOn = true;
wikEd.AddEventListener(wikEd.summarySelect, 'focus', function() { wikEd.SetComboOptions('summary'); }, false);
 
// get frame resize grip image dimensions
wikEd.AddEventListener(wikEd.selectElement['find'], 'change', function() { wikEd.ChangeComboInput('find'); }, false);
var resizeGripImage = document.createElement('img');
wikEd.AddEventListener(wikEd.selectElement['find'], 'focus', function() { wikEd.SetComboOptions('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
wikEd.AddEventListener(wikEd.selectElement['replace'], 'change', function() { wikEd.ChangeComboInput('replace'); }, false);
wikEd.DeleteAccesskeys();
wikEd.AddEventListener(wikEd.selectElement['replace'], 'focus', function() { wikEd.SetComboOptions('replace'); }, false);
 
// disable CodeEditor button when wikEd is active
// register the clear summary click handler
wikEd.DisableCodeEditorButton();
wikEd.AddEventListener(wikEd.clearSummary, 'click', wikEd.ClearSummaryHandler, true);
 
// run scheduled custom functions
// select the text on focus for find and replace fields
wikEd.AddEventListenerExecuteHook(wikEd.findText, 'focus', wikEdconfig.FindReplaceHandler, truesetupHook);
wikEd.AddEventListener(wikEd.replaceText, 'focus', wikEd.FindReplaceHandler, true);
 
// load and parse RegExTypoFix rules if the button is enabled
// tab / shift-tab between find and replace fields
wikEd.LoadTypoFixRules();
wikEd.AddEventListener(wikEd.findText, 'keydown', wikEd.FindReplaceHandler, true);
wikEd.AddEventListener(wikEd.replaceText, 'keydown', wikEd.FindReplaceHandler, true);
 
// done with setup and turn-on
// init MediaWiki file paths for use in regexps
return;
if (wikEd.wikiGlobals.wgServer != null) {
};
 
 
//
// wikEd.GetPaths: get MediaWiki file paths from wikiGlobals if possible
//
 
wikEd.GetPaths = function () {
 
// init MediaWiki file paths for use in regexps
if (wikEd.wikiGlobals.wgServer !== undefined) {
wikEd.server = wikEd.wikiGlobals.wgServer;
}
if (wikEd.wikiGlobals.wgArticlePath !== nullundefined) {
wikEd.articlePath = wikEd.wikiGlobals.wgArticlePath;
}
if (wikEd.wikiGlobals.wgScriptPath !== nullundefined) {
wikEd.scriptPath = wikEd.wikiGlobals.wgScriptPath;
}
if (wikEd.wikiGlobals.wgScript !== nullundefined) {
wikEd.script = wikEd.wikiGlobals.wgScript;
}
Line 3,456 ⟶ 3,888:
wikEd.scriptURL = wikEd.server + wikEd.scriptPath;
 
// prepare for use in regexps
wikEd.server = wikEd.server.replace(/(\W)/g, '\\$1');
wikEd.articlePath = wikEd.articlePath.replace(/(\W)/g, '\\$1');
Line 3,463 ⟶ 3,895:
wikEd.scriptName = wikEd.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) {
 
wikEd.cleanNodes = 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 (wikEd.fullScreenMode == true) {
wikEd.frameDocument.execCommand('enableObjectResizing', false, 'false');
wikEd.FullScreen(wikEd.fullScreenMode, 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 (wikEd.InsertTagsOriginal == null) {
// add frame stylesheets
wikEd.InsertTagsOriginal = 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 = wikEd.InsertTags;
}
 
// 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 = wikEd.InsertTags;
}
 
// 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 (wikEd.useWikEd == true) {
};
wikEd.InsertTags(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 (wikEd.InsertAtCursorOriginalwikiGlobals.wgPageContentModel === nullundefined) {
if (wikEd.GetCookie('wikiEditor-0-codeEditor-enabled') == 1) {
wikEd.InsertAtCursorOriginal = 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 = wikEd.InsertAtCursor;
}
return;
};
 
// reset error indicator
wikEd.SetLogo();
wikEd.turnedOn = true;
 
//
// get frame resize grip image dimensions
// wikEd.DisableCodeEditorButton: disable CodeEditor button when wikEd is active
var resizeGripImage = document.createElement('img');
//
resizeGripImage.id = 'wikEdResizeGrip';
wikEd.AddEventListener(resizeGripImage, 'load', wikEd.ResizeGripLoadHandler, true);
resizeGripImage.src = wikEd.config.image['resizeGrip'];
 
wikEd.DisableCodeEditorButton = function () {
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.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');
wikEd.LoadTypoFixRules();
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,526 ⟶ 4,130:
//
 
wikEd.AutoUpdate = function () {
 
// check only on non-interaction pages
if (/(\?|&)action=/.test(window.___location.search) === true) {
return;
}
 
// check if autoupdate is enabled
if (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 (wikEd.config.forcedUpdate !== '') {
 
// get version numbers from strings
var currentVersion = wikEd.VersionToNumber(wikEd.programVersion);
var forcedVersion = wikEd.VersionToNumber(wikEd.config.forcedUpdate);
WED('currentVersion', currentVersion);
WED('forcedVersion', forcedVersion);
 
// schedule forced update check
if ( (currentVersion !== null'') && (forcedVersion !== null'') ) {
if (forcedVersion > currentVersion) {
forcedUpdate = true;
Line 3,556 ⟶ 4,172:
}
 
// check for regular update
var regularUpdate = false;
var currentDate = new Date();
if (forcedUpdate === false) {
 
// get date of last update check
var lastCheckStr = wikEd.GetPersistent('wikEdAutoUpdate');
var lastCheckDate = new Date(lastCheckStr);
 
WED('lastCheckStr', lastCheckStr);
// fix missing or corrupt saved setting
WED('lastCheckDate', lastCheckDate);
if (isNaN(lastCheckDate.valueOf()) === true) {
// fix missing or corrupt saved setting
if (isNaN(lastCheckDate.valueOf()) == true) {
wikEd.SetPersistent('wikEdAutoUpdate', 'January 1, 1970', 0, '/');
return;
}
 
// get the hours since last update check
var diffHours = (currentDate - lastCheckDate) / 1000 / 60 / 60;
if (wikEd.greasemonkey === true) {
if (diffHours > wikEd.config.autoUpdateHoursGM) {
regularUpdate = true;
Line 3,584 ⟶ 4,199:
}
 
// perform AJAX request to get latest version number
if ( (forcedUpdate === true) || (regularUpdate === true) ) {
 
// save current update check date
wikEd.SetPersistent('wikEdAutoUpdate', currentDate.toUTCString(), 0, '/');
WED('currentDate.toUTCString()', currentDate.toUTCString());
WED('Get', wikEd.GetPersistent('wikEdAutoUpdate'));
 
// make the ajax request
wikEd.AjaxRequest('GET', wikEd.config.autoUpdateUrl, null, 'text/plain', function (ajax, obj) {
 
// get response
var html = ajax.responseText;
 
// get version numbers from strings
var currentVersion = wikEd.VersionToNumber(wikEd.programVersion);
var newVersion = wikEd.VersionToNumber(html);
WED('Ajax currentVersion', currentVersion);
WED('Ajax newVersion', newVersion);
 
// check if downloaded version is newer and perform update
if ( (currentVersion !== null'') && (newVersion !== null'') ) {
if (newVersion > currentVersion) {
wikEd.DoUpdate();
Line 3,614 ⟶ 4,225:
return;
};
 
 
//
Line 3,619 ⟶ 4,231:
//
 
wikEd.VersionToNumber = 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);
};
 
Line 3,635 ⟶ 4,246:
//
 
wikEd.DoUpdate = function () {
 
// update Greasemonkey script by navigating to the script code page
if (wikEd.greasemonkey === true) {
var updatePopup = wikEd.config.text['.wikEdGreasemonkeyAutoUpdate'];
updatePopup = updatePopup.replace(/\{updateURL\}/g, wikEd.config.autoUpdateUrl);
window.alert(updatePopup);
window.___location.href = 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,657 ⟶ 4,268:
//
 
wikEd.LoadTypoFixRules = function () {
 
// load RegExTypoFix rules per Ajax if enabled
if ( (wikEd.config.regExTypoFix === false) || (wikEd.readOnly === true) || (wikEd.typoRulesFind.length > 0) ) {
return;
}
 
// make the ajax request
var sep = '&';
wikEd.AjaxRequest('GET', wikEd.config.regExTypoFixURL, null, 'text/plain', function(ajax) {
if (wikEd.config.regExTypoFixURL.indexOf('?') == -1) {
sep = '?';
}
 
wikEd.AjaxRequest('GET', wikEd.config.regExTypoFixURL + sep + wikEd.programVersion, null, 'text/plain', function (ajax) {
// get response
 
// 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
wikEd.typoRulesFind.push(regExpFind);
wikEd.typoRulesReplace.push(regExpMatch[3]);
}
 
// display typo fix button
if (wikEd.typoRulesFind.length > 0) {
if (wikEd.fixRegExTypo !== null) {
wikEd.fixRegExTypo.style.display = 'inline';
}
Line 3,704 ⟶ 4,323:
//
 
wikEd.EditButtonHandler = function (event) {
 
// execute the button click handler code, obj required in eval context
// event compatibility fixes
var obj = event.currentTarget;
event = wikEd.EventWrapper(event, this);
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;
var diffWidth = wikEd.clearSummary.offsetWidth - wikEd.clearSummaryWidth;
eventShiftKey = event.shiftKey;
wikEd.inputElement.summary.style.width = (wikEd.inputElement.summary.offsetWidth - diffWidth) + 'px';
eval(wikEd.editButtonHandler[objId]);
wikEd.selectElement.summary.style.width = (wikEd.selectElement.summary.offsetWidth - diffWidth) + 'px';
wikEd.clearSummaryWidth = wikEd.clearSummary.offsetWidth;
return;
};
Line 3,732 ⟶ 4,347:
 
//
// wikEd.ShrinkSummaryHandlerInsertChangeHandler: shrinkresize the summaryfullscreen after loadingchanging theinsert 'Clearspecial summary'char imageselection
//
 
wikEd.ShrinkSummaryHandlerInsertChangeHandler = function (event) {
if (wikEd.fullscreen === true) {
wikEd.ResizeWindowHandler();
}
};
 
var diffWidth = wikEd.clearSummary.offsetWidth - wikEd.clearSummaryWidth;
 
//
// Firefox < 3.0
// wikEd.ResizeWindowHandler: adjust fullscreen frame and summary width after resizing the window
if ( typeof(wikEd.inputElement['summary'].clientLeft) == 'undefined' ) {
// browser's dynamic table resizing interferes if wikEd is inserted in table (Special:Upload)
wikEd.inputElement['summary'].style.width = (wikEd.inputElement['summary'].clientWidth - diffWidth) + 'px';
 
wikEd.selectElement['summary'].style.width = (wikEd.selectElement['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 {
wikEd.inputElement['summary'].style.widthframeWidth = (wikEd.inputElement['summary']frameWrapper.clientWidth - diffWidthwikEd.frameBorderWidth) + 'px';
wikEd.selectElement['summary']frame.style.widthheight = (wikEd.selectElement['summary'].clientWidth - diffWidth + 3) + 'px'frameHeight;
wikEd.frame.style.width = wikEd.frameWidth;
}
wikEd.ResizeSummary();
wikEd.clearSummaryWidth = wikEd.clearSummary.offsetWidth;
return;
};
Line 3,756 ⟶ 4,402:
 
//
// wikEd.WikiPreviewHandler: event handler for wiki preview: scroll to edit field on double click
// wikEd.ResizeWindowHandler: adjust the summary width after resizing the window
//
 
wikEd.ResizeWindowHandlerWikiPreviewHandler = function (event) {
 
// filter out selecting double clicks on text
// adjust frame size
var sel = window.getSelection();
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
wikEd.frame.style.width = wikEd.frameWidth;
 
// explicitOriginalTarget (Firefox)
wikEd.ResizeSummary();
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,776 ⟶ 4,433:
//
 
wikEd.UnloadHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// update textarea if not already done in submit handlers
if (wikEd.useWikEd === true) {
if (wikEd.textareaUpdated !=== truefalse) {
wikEd.UpdateTextarea();
}
Line 3,798 ⟶ 4,449:
//
 
wikEd.SaveButtonHandler = function (event) {
 
wikEd.RemoveEventListener(wikEd.saveButton, .removeEventListener('click', wikEd.SaveButtonHandler, true);
 
// update textarea
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
wikEd.textareaUpdated = true;
}
 
// check for interfering scripts or gadgets: mwEmbed for file uploads
if ( (wikEd.uploadEditeditUpload === true) && (typeof(window.MW_EMBED_VERSION) !== 'undefined') ) {
wikEd.AddEventListener(wikEd.saveButton, .addEventListener('click', wikEd.SaveButtonHandler, true);
return;
}
 
// add "using wikEd" to summary, not for adding a new section (+ tab)
if (wikEd.summaryText !== null) {
var text = wikEd.summaryText.value;
text = text.replace(/^[, ]+/, '');
Line 3,821 ⟶ 4,472:
wikEd.AddToHistory('summary');
 
if ( (wikEd.using === true) && (text !== '') ) {
if (text.lastIndexOf(wikEd.config.summaryUsing) < 0) {
if (wikEd.addNewSection !== true) {
text += ' ' + wikEd.config.summaryUsing;
}
Line 3,831 ⟶ 4,482:
}
 
// submit
wikEd.saveButton.click();
 
// reinstate handler in case the browser back button will be used
wikEd.AddEventListener(wikEd.saveButton, .addEventListener('click', wikEd.SaveButtonHandler, true);
 
return;
Line 3,845 ⟶ 4,496:
//
 
wikEd.PreviewButtonHandler = function (event) {
 
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
wikEd.textareaUpdated = true;
Line 3,859 ⟶ 4,510:
//
 
wikEd.DiffPreviewButtonHandler = function (event) {
 
// interrupt fullscreen mode
if (wikEd.fullScreenMode == true) {
if (wikEd.fullscreen === true) {
wikEd.FullScreen(false);
}
 
if (wikEd.useWikEd == true) {
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
wikEd.textareaUpdated = true;
}
 
return;
};
Line 3,877 ⟶ 4,529:
//
 
wikEd.LinkifyHandler = function (event) {
 
if ( (event.shiftKey === false) && ( (event.ctrlKey === true) || (event.metaKey === true) ) && (event.altKey === false) ) {
// event compatibility fixes
event = wikEd.EventWrapper(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 = wikEd.linkifyArray[linkIdNo];
if window.open(linkUrl != null) {;
eventwindow.stopPropagationfocus();
window.open(linkUrl)break;
window.focus();
break;
}
}
}
Line 3,904 ⟶ 4,547:
}
}
return;
};
 
 
//
// wikEd.LocalPreviewHandler: local 'Show preview' image button click handler
//
 
wikEd.LocalPreviewHandler = function(event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
wikEd.Button(wikEd.localPreview, 'wikEdLocalPreview');
return;
};
 
 
//
// wikEd.LocalDiffHandler: local 'Show changes' image button click handler
//
 
wikEd.LocalDiffHandler = function(event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
wikEd.Button(wikEd.localDiff, 'wikEdLocalDiff');
return;
};
Line 3,948 ⟶ 4,555:
//
 
wikEd.ButtonBarGripHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.stopPropagation();
Line 3,966 ⟶ 4,567:
buttonsWrapper.style.position = 'static';
 
// hide the buttons bar
if (buttonsWrapper.className != 'wikEdButtonBarButtonsWrapperHidden') {
buttonsWrapper.className = 'wikEdButtonBarButtonsWrapperHidden';
Line 3,973 ⟶ 4,574:
wikEd.buttonsWrapperWidth[bar.id] = buttonsWrapper.offsetWidth;
buttonsWrapper.style.display = 'none';
wikEdgrip.AddEventListeneraddEventListener(grip, 'mouseover', wikEd.ButtonBarGripHandler, false);
wikEd.SetPersistent(bar.id + 'Hidden', '1', 0, '/');
}
 
// unhide the buttons bar
else {
buttonsWrapper.className = 'wikEdButtonBarButtonsWrapperVisible';
Line 3,983 ⟶ 4,584:
gripWrapper.className = 'wikEdButtonBarGripWrapperVisible';
buttonsWrapper.style.display = 'block';
wikEdgrip.RemoveEventListenerremoveEventListener(grip, 'mouseover', wikEd.ButtonBarGripHandler, false);
wikEd.SetPersistent(bar.id + 'Hidden', '0', 0, '/');
}
}
 
// show the buttons bar on mouseover
else if (event.type == 'mouseover') {
if (buttonsWrapper.className == 'wikEdButtonBarButtonsWrapperHidden') {
wikEdbar.AddEventListeneraddEventListener(bar, 'mouseout', wikEd.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 + wikEd.buttonsWrapperWidth[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 - wikEd.buttonsWrapperWidth[bar.id] + 0.5) + 'px';
}
 
buttonsWrapper.style.top = (gripWrapper.offsetTop + 0.5) + 'px';
// a mozilla bug sometimes gives offsetTop - 1 when the wikEd.toolbarWrapper is hidden
buttonsWrapper.style.top = gripWrapper.offsetTop + 'px';
buttonsWrapper.style.position = 'absolute';
buttonsWrapper.style.display = 'block';
Line 4,017 ⟶ 4,619:
//
 
wikEd.ButtonBarHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.stopPropagation();
 
var bar = event.currentTarget;
 
var barInnerWrapper = bar.firstChild;
var gripWrapper = barInnerWrapper.firstChild;
Line 4,035 ⟶ 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)
)
) {
wikEdbar.RemoveEventListenerremoveEventListener(bar, 'mouseout', wikEd.ButtonBarHandler, false);
buttonsWrapper.style.display = 'none';
buttonsWrapper.style.position = 'static';
Line 4,064 ⟶ 4,658:
//
 
wikEd.ClearSummaryHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.preventDefault();
 
// clear the summary if it is only a paragraph name
if ( /^\/\* .*? \*\/ *$/.test(wikEd.summaryText.value) === true) {
wikEd.summaryText.value = '';
}
 
// clear the summary but leave paragraph names
else {
wikEd.summaryText.value = wikEd.summaryText.value.replace(/^((\/\* .*? \*\/ *)?).*()/,
function (p, p1, p2, p3) {
if (p1.length > 0) {
p1 = p1 + ' ';
}
return( p1);
}
);
Line 4,099 ⟶ 4,687:
//
 
wikEd.FindReplaceHandler = function (event) {
 
// tab / shift-tab between fields
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// tab / shift-tab between fields
if (event.type == 'keydown') {
if (event.keyCode == 9) {
if (event.target == wikEd.findText) {
event.preventDefault();
wikEd.RemoveEventListener(wikEd.replaceText, .removeEventListener('focus', wikEd.FindReplaceHandler, true);
wikEd.replaceText.focus();
wikEd.AddEventListener(wikEd.replaceText, .addEventListener('focus', wikEd.FindReplaceHandler, true);
}
else if (event.target == wikEd.replaceText) {
event.preventDefault();
wikEd.RemoveEventListener(wikEd.findText, .removeEventListener('focus', wikEd.FindReplaceHandler, true);
wikEd.findText.focus();
wikEd.AddEventListener(wikEd.findText, .addEventListener('focus', wikEd.FindReplaceHandler, true);
}
}
}
 
// select on focus
else if (event.type == 'focus') {
event.target.setSelectionRange(0, this.textLength);
if (wikEd.msie == true) {
 
}
else {
event.target.setSelectionRange(0, this.textLength);
}
}
return;
Line 4,142 ⟶ 4,719:
//
 
wikEd.KeyFrameHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
 
event = wikEd.EventWrapper(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 (wikEd.useWikEd == 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 (wikEd.addNewSection === true) {
document.getElementById('wpMinoredit').focus();
}
Line 4,170 ⟶ 4,801:
}
 
// scroll to text input top
if (wikEd.fullScreenModefullscreen === false) {
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
}
Line 4,179 ⟶ 4,810:
break;
 
// after cursor movements set cursor position into closest highest text node so that highlighting does not bleed out
case 'keyup':
switch (event.keyCode) {
case 17: // ctrl-v
case 46: // del
wikEd.AntiHighlightBleeding({});
break;
case 37: // left
case 38: // up
case 33: // page up
case 8: // backspace
wikEd.AntiHighlightBleeding({}, null, 'left');
break;
case 39: // right
case 40: // down
case 33: // page up
case 34: // page down
wikEd.AntiHighlightBleeding({}, null, 'right');
case 46: // del
break;
case 8: // backspace
wikEd.AntiHighlightBleeding(new Object());
}
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':
wikEd.AntiHighlightBleeding(new Object());
case 'keypress':
case 'paste':
 
// grey out inactive buttons
wikEd.InactiveButtons();
}
Line 4,207 ⟶ 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
 
wikEd.PasteFrameHandler = function (event) {
 
if (wikEd.useWikEd !== true) {
event.stopPropagation();
wikEd.paste = null;
return;
}
 
var sel = wikEd.GetSelection();
var range = sel.getRangeAt(0);
 
// 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 === nullundefined) {
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) ) {
wikEd.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) ) {
var objRight = {
'backwards': false
};
wikEd.GetNextTextNode(objRight, focusNode, 0);
if (objRight.foundNode !== undefined) {
}
if rightNode = (objRight.foundNode != null) {;
rightNode rightLevel = objRight.foundNodefoundLevel;
}
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,314 ⟶ 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,323 ⟶ 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 = wikEd.frameDocument.createTextNode('');
Line 4,347 ⟶ 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 = wikEd.frameDocument.createTextNode('');
Line 4,370 ⟶ 5,657:
}
}
 
return;
};
 
 
Line 4,379 ⟶ 5,665:
//
 
wikEd.ResizeGripLoadHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
wikEd.resizeGripWidth = event.currentTarget.width;
wikEd.resizeGripHeight = event.currentTarget.height;
 
return;
};
Line 4,397 ⟶ 5,678:
//
 
wikEd.ResizeGripHandler = function (event) {
 
// Firefox bug during startup ("wikEd is not defined")
// prevent console errors about undefined functions and variables (Firefox bug)
if (typeof(wikEd) === 'undefined') {
return;
}
 
if (wikEd.useWikEd === true) {
// Firefox bug during startup ("WikEdEvent is not defined")
if (typeof(wikEd.EventWrapper) != 'function' ) {
return;
}
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (wikEd.useWikEd == true) {
if (event.type == 'mousemove') {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
 
// move into grip
if (wikEd.resizeFrameMouseOverGrip === false) {
if (event.clientY >= wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) {
if (event.clientX >= wikEd.frameBody.clientWidth - wikEd.resizeGripWidth) {
if ( (event.clientY < wikEd.frameBody.clientHeight) && (event.clientX < wikEd.frameBody.clientWidth) ) {
wikEd.resizeFrameMouseOverGrip = true;
if (wikEd.fullScreenModefullscreen === true) {
wikEd.frameBody.style.cursor = 'alias';
}
else {
wikEd.AddEventListener(wikEd.frameDocument, .addEventListener('mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'move';
}
Line 4,437 ⟶ 5,707:
}
 
// move out of grip
else if (wikEd.resizeFrameActive === false) {
if (
(event.clientY < wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) ||
Line 4,444 ⟶ 5,714:
) {
wikEd.resizeFrameMouseOverGrip = false;
wikEd.RemoveEventListener(wikEd.frameDocument, .removeEventListener('mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'auto';
}
Line 4,459 ⟶ 5,729:
//
 
wikEd.ResizeStartHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
if ( (event.type == wikEd.EventWrapper'mousedown') && (event,.button this=== 0); ) {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
if (event == null) {
return;
}
 
if (wikEd.useWikEd == true) {
if ( (event.type == 'mousedown') && (event.button == 0) ) {
if ( (event.shiftKey == false) && (event.ctrlKey == false) && (event.altKey == false) && (event.metaKey == false) ) {
if (event.clientY >= wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) {
if (event.clientX >= wikEd.frameBody.clientWidth - wikEd.resizeGripWidth) {
Line 4,481 ⟶ 5,745:
wikEd.resizeFrameOffsetHeight = wikEd.frame.offsetHeight;
wikEd.resizeFrameOffsetWidth = wikEd.frame.offsetWidth;
wikEd.AddEventListener(wikEd.frameDocument, .addEventListener('mouseup', wikEd.ResizeStopHandler, true);
wikEddocument.AddEventListeneraddEventListener(document, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.AddEventListener(wikEd.frameDocument, .addEventListener('mousemove', wikEd.ResizeDragHandlerFrame, true);
wikEddocument.AddEventListeneraddEventListener(document, 'mousemove', wikEd.ResizeDragHandlerDocument, true);
}
}
Line 4,499 ⟶ 5,763:
//
 
wikEd.ResizeStopHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
if ( (event === wikEd.EventWrapperundefined) || (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 (wikEd.useWikEd == true) {
if (event.type == 'mouseup') {
wikEd.RemoveEventListener(wikEd.frameDocument, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.RemoveEventListener(document, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.RemoveEventListener(wikEd.frameDocument, 'mousemove', wikEd.ResizeDragHandlerFrame, true);
wikEd.RemoveEventListener(document, 'mousemove', wikEd.ResizeDragHandlerDocument, true);
 
if (
(event === undefined) ||
(event.clientY < wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) ||
(event.clientX < wikEd.frameBody.clientWidth - wikEd.resizeGripWidth)
) {
wikEd.resizeFrameMouseOverGrip = false;
wikEd.RemoveEventListener(wikEd.frameDocument, .removeEventListener('mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'auto';
}
Line 4,533 ⟶ 5,792:
//
 
wikEd.ResizeDragHandlerFrame = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
Line 4,565 ⟶ 5,818:
//
 
wikEd.ResizeDragHandlerDocument = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
Line 4,597 ⟶ 5,844:
//
 
wikEd.ResizeFrameResetHandler = function (event) {
 
if (wikEd.useWikEd === true) {
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (wikEd.useWikEd == true) {
if (event.type == 'dblclick') {
if ( (event.shiftKey === false) && (event.ctrlKey === false) && (event.altKey === false) && (event.metaKey === false) ) {
if (event.clientY > wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) {
if (event.clientX > wikEd.frameBody.clientWidth - wikEd.resizeGripWidth) {
if ( (event.clientY < wikEd.frameBody.clientHeight) && (event.clientX < wikEd.frameBody.clientWidth) ) {
 
// end fullscreen mode
if (wikEd.fullScreenModefullscreen === true) {
wikEd.FullScreen(false, true);
}
 
// reset size to default
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
Line 4,623 ⟶ 5,864:
wikEd.frame.style.width = wikEd.frameWidth;
 
// end resizing
wikEd.RemoveEventListener(wikEd.frameDocument, 'mouseup', wikEd.ResizeStopHandler, true();
wikEd.RemoveEventListener(document, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.RemoveEventListener(wikEd.frameDocument, 'mousemove', wikEd.ResizeDragHandlerFrame, true);
wikEd.RemoveEventListener(document, 'mousemove', wikEd.ResizeDragHandlerDocument, true);
wikEd.resizeFrameMouseOverGrip = false;
wikEd.RemoveEventListener(wikEd.frameDocument, 'mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'auto';
wikEd.resizeFrameActive = false;
}
}
Line 4,643 ⟶ 5,877:
 
//
// wikEd.DebugHandler: event handler tofor cleardebug ortextarea: hideclear the(double debugclick) textareaor onhide (shift/ctrl/alt) -double click)
//
 
wikEd.DebugHandler = function (event) {
 
if ( (event.shiftKey === true) || (event.ctrlKey === true) || (event.altKey === true) || (event.metaKey === true) ) {
wikEd.debugWrapper.style.visibilitydisplay = 'hiddennone';
wikEd.debug.style.display = 'none';
wikEd.debugOpen = false;
 
// resize fullscreen frame
if (wikEd.fullScreenMode === true) {
wikEd.ResizeWindowHandler();
}
}
else {
Line 4,661 ⟶ 5,899:
 
//
// wikEd.PrevWrapperHandler: event handler for preview box: scroll to closeedit previewfield /(double diffclick) boxor onclose (shift/ctrl/alt-double click)
//
 
wikEd.PrevWrapperHandler = function (event) {
 
// close (shift/ctrl/alt-double click)
wikEd.localPrevWrapper.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,675 ⟶ 5,949:
//
 
wikEd.SetLogo = function (state, parameter) {
 
var src = '';
var alt = '';
var title = '';
if (state == 'error') {
wikEd.logo.src = wikEd.config.image['error'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo error alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo error title'];
}
else if (state == 'browser') {
wikEd.logo.src = wikEd.config.image['browser'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo browser alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo browser title'];
}
else if (state == 'incompatible') {
wikEd.logo.src = wikEd.config.image['incompatible'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo incompatible alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo incompatible title'];
}
else {
if (wikEd.disabled === true) {
wikEd.logo.src = wikEd.config.image['disabled'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo disabled alt'];
wikEd.logo.title = 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 {
wikEd.logo.src = wikEd.config.image['logo'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo title'];
}
}
if (parameter !== undefined) {
var version = wikEd.programVersion;
title = title.replace(/\{wikEdParameter\}/g, parameter);
if (wikEd.config.gadget == true) {
version += ' G';
}
title = title.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
else if (wikEd.greasemonkey == true) {
title = title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
version += ' GM';
wikEd.logo.src = src;
}
wikEd.logo.titlealt = wikEd.logo.title.replace(/\{wikEdParameter\}/g, parameter)alt;
wikEd.logo.title = wikEd.logo.title.replace(/\{wikEdProgramVersion\}/g, version);
wikEd.logo.title = wikEd.logo.title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
 
return;
};
Line 4,720 ⟶ 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,733 ⟶ 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,758 ⟶ 6,038:
default:
var currButton = wikEd.config.button[buttonNo];
if (typeof( currButton) != 'object') {
window.alert('Loading error: The button "' + buttonNumbers[i] + '" is not defined.');
}
if ( (currButton[0] == 'wikEdSource') && (wikEd.config.showSourceButton !== true) && (wikEd.config.debug !== true) ) {
break;
}
else if ( (currButton[0] == 'wikEdUsing') && (wikEd.config.showUsingButton !== true) ) {
break;
}
else if ( (currButton[0] == 'wikEdTableMode') && (wikEd.config.showTableModeButton !== true) ) {
break;
}
 
// add accesskey information to button titlehtml andcode
buttons += wikEd.MakeButtonCode(buttonNo);
var accessKey = '';
if (wikEd.config.buttonKey[buttonNo] != null) {
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
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
wikEd.editButtonHandler[ 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,798 ⟶ 6,070:
}
 
// make a grip bar
var html = '';
if (gripTitle !== null) {
var gripStyle = 'width: ' + wikEd.config.buttonBarGripWidth + 'px; ';
if (barHeight > 0) {
Line 4,826 ⟶ 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;
};
 
Line 4,842 ⟶ 6,146:
//
 
wikEd.ButtonBarInit = function (bar) {
 
if (wikEd.GetPersistentGetSavedSetting(bar.id + 'Hidden') === '1'true) {
var barInnerWrapper = bar.firstChild;
var gripWrapper = barInnerWrapper.firstChild;
Line 4,855 ⟶ 6,159:
wikEd.buttonsWrapperWidth[bar.id] = buttonsWrapper.offsetWidth;
buttonsWrapper.style.display = 'none';
wikEdgrip.AddEventListeneraddEventListener(grip, 'mouseover', wikEd.ButtonBarGripHandler, true);
}
return;
Line 4,865 ⟶ 6,169:
//
 
wikEd.SetEditArea = function (useFrame, notFrame) {
 
var scrollRatio = null;
 
// turn rich text frame on
if (useFrame === true) {
scrollRatio = wikEd.textarea.scrollTop / wikEd.textarea.scrollHeight;
 
// remember resized textarea dimensions
wikEd.textareaHeight = (wikEd.textarea.offsetHeight - wikEd.textareaBorderHeight) + 'px';
wikEd.textareaWidth = '100%';
Line 4,881 ⟶ 6,185:
wikEd.textarea.style.display = 'none';
 
if (notFrame !== true) {
wikEd.frameWrapper.style.position = 'static';
wikEd.frameWrapper.style.visibility = 'visible';
Line 4,887 ⟶ 6,191:
}
 
// set visibility of native toolbar
if (wikEd.closeToolbar === true) {
wikEd.toolbarWrapper.style.display = 'none';
}
Line 4,895 ⟶ 6,199:
}
 
if (wikEd.buttonBarFormat !== null) {
wikEd.buttonBarFormat.style.display = 'block';
}
if (wikEd.buttonBarTextify !== null) {
wikEd.buttonBarTextify.style.display = 'block';
}
if (wikEd.buttonBarCustom1 !== null) {
wikEd.buttonBarCustom1.style.display = 'block';
}
if (wikEd.buttonBarFind !== null) {
wikEd.buttonBarFind.style.display = 'block';
}
if (wikEd.buttonBarFix !== null) {
wikEd.buttonBarFix.style.display = 'block';
}
if (wikEd.buttonBarCustom2 !== null) {
wikEd.buttonBarCustom2.style.display = 'block';
}
if (wikEd.buttonBarControl !== null) {
wikEd.buttonBarControl.style.display = 'block';
}
wikEd.frameBody.scrollTop = scrollRatio * wikEd.frameBody.scrollHeight;
wikEd.ResizeWindowHandler();
}
 
// turn classic textarea on
else {
scrollRatio = wikEd.frameBody.scrollTop / wikEd.frameBody.scrollHeight;
if (notFrame !== true) {
 
// get resized frame dimensions for textarea
if (wikEd.useWikEd === true) {
wikEd.textareaHeight = wikEd.frameHeight;
wikEd.textareaWidth = '100%';
Line 4,931 ⟶ 6,236:
wikEd.frameWrapper.style.position = 'absolute';
wikEd.frameWrapper.style.visibility = 'hidden';
// Mozilla or wikEd bug: <br> insertion before text a while after setting display to 'none', test with setTimeout('alert(wikEd.frameBody.innerHTML)', 1000);
// // wikEd.frameBody.style.display = 'none';
}
wikEd.textareaWrapper.style.position = 'static';
Line 4,941 ⟶ 6,246:
wikEd.textarea.style.display = 'block';
 
// force visibility of native toolbar
if (wikEd.toolbarWrapper !== null) {
wikEd.toolbarWrapper.style.display = 'block';
}
if (wikEd.buttonBarFormat !== null) {
wikEd.buttonBarFormat.style.display = 'none';
}
if (wikEd.buttonBarTextify !== null) {
wikEd.buttonBarTextify.style.display = 'none';
}
if (wikEd.buttonBarCustom1 !== null) {
wikEd.buttonBarCustom1.style.display = 'none';
}
if (wikEd.buttonBarFind !== null) {
wikEd.buttonBarFind.style.display = 'none';
}
if (wikEd.buttonBarFix !== null) {
wikEd.buttonBarFix.style.display = 'none';
}
if (wikEd.buttonBarCustom2 !== null) {
wikEd.buttonBarCustom2.style.display = 'none';
}
if (wikEd.buttonBarControl !== null) {
wikEd.buttonBarControl.style.display = 'block';
}
wikEd.textarea.scrollTop = scrollRatio * wikEd.textarea.scrollHeight;
}
 
return;
};
Line 4,978 ⟶ 6,282:
//
 
wikEd.Button = function (buttonObj, buttonId, toggleButton, setButton, classButton, doButton) {
if (buttonObj !== null) {
 
// check if the button is disabled
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 (wikEdbuttonObj.GetAttributesetAttribute(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
wikEd.RemoveElements(['script', 'object', 'applet', 'embed']);
 
switch (buttonId) {
 
// switch between syntax highlighting and plain text
case 'wikEdHighlightSyntax':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.highlightSyntax = true;
wikEd.SetPersistent('wikEdSyntaxOff', '0', 0, '/');
if (wikEd.refHide === true) {
wikEd.frameBody.className = 'wikEdFrameBodyNewbie';
}
Line 5,051 ⟶ 6,356:
}
 
// do not keep whole text selected
wikEd.EditButton( null, 'wikEdUpdateAll', {'keepSel': false} );
break;
 
// toggle table mode // {{TABLE}}button
case 'wikEdTableMode':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') != 'true') {
wikEd.tableMode = false;
wikEd.EditButton( null, 'wikEdUpdateAll', {'keepSel': false} );
}
else {
wikEd.tableMode = true;
wikEd.EditButton( null, 'wikEdTablifywikEdUpdateAll', {'keepSel': false} );
}
break;
 
// align textbox with display top
case 'wikEdScrollToPreview':
case 'wikEdScrollToPreview2':
case 'wikEdScrollToPreview3':
window.scroll(0, wikEd.GetOffsetTop(wikEd.saveButtonsubmitWrapper));
focusFrame = true;
break;
 
// align edit buttons with display top
case 'wikEdScrollToEdit':
case 'wikEdScrollToEdit2':
Line 5,084 ⟶ 6,389:
break;
 
// cycle through different font sizes
case 'wikEdTextZoomDown':
wikEd.textSize = wikEd.textSize / 1.2;
Line 5,094 ⟶ 6,399:
break;
 
// cycle through different font sizes
case 'wikEdTextZoomUp':
wikEd.textSize = wikEd.textSize * 1.2;
Line 5,104 ⟶ 6,409:
break;
 
// display local preview box
case 'wikEdLocalPreview':
if (wikEd.fullScreenMode == trueLocalPreview() {;
wikEd.FullScreen(false);
}
if (wikEd.useWikEd == true) {
wikEd.UpdateTextarea();
}
 
// clear box to display loading indicator, keep wrapper height to prevent scrolling
var previewHeight = wikEd.previewBox.offsetHeight;
if ( (wikEd.previewBox.innerHTML != '') && (previewHeight > 0) ) {
wikEd.previewBox.style.height = previewHeight + 'px';
}
wikEd.previewBox.innerHTML = wikEd.config.text['wikEdPreviewLoading'];
wikEd.localPrevWrapper.style.display = 'inline';
 
// prepare ajax preview
wikEd.previewIsAjax = false;
var bodyData = wikEd.textarea.value;
 
// Opera 0.9.51
bodyData = bodyData.replace(/\r\n|\n\r|\r/g, '\n');
 
if (wikEd.config.useAjaxPreview == true) {
var livePreview = true;
 
// articles on watchlist preview page
if (wikEd.watchlistEdit == 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(wikEd.config.text['talk namespace suffix']) == true) {
talk = article.replace(/([^:]*)/, wikEd.config.text['talk namespace suffix'] + '$1');
}
else {
talk = article.replace(/([^:]*)/, '$1' + wikEd.config.text['talk namespace suffix']);
}
}
else {
talk = wikEd.config.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 = 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 {
 
// 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 (wikEd.geSHiCSS['wikEd' + lang] == null) {
livePreview = false;
wikEd.geSHiCSS['wikEd' + lang] = true;
break;
}
}
}
 
// make the ajax request
wikEd.AjaxPreview(bodyData, wikEd.LocalPreviewAjaxHandler, livePreview);
}
 
// prepare a local preview (Pilaf's InstaView), will be overwritten by Ajax version
if ( (wikEd.config.useLocalPreview == true) && (typeof(InstaView) == 'object') ) {
InstaView.conf.user.name = wikEd.wikiGlobals.wgUserName;
var text = wikEd.textarea.value;
 
// Opera 0.9.51
text = text.replace(/\r\n|\n\r|\r/g, '\n');
 
var instaView = InstaView.convert(text);
if (wikEd.previewIsAjax != true) {
wikEd.previewBox.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.previewBoxpreviewDiff.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 (wikEd.fullScreenMode == true) {
// interrupt fullscreen mode
if (wikEd.fullscreen === true) {
wikEd.FullScreen(false);
}
if (wikEd.useWikEd == true) {
wikEd.UpdateTextarea();
}
 
// display diff, keep wrapper height to prevent scrolling
// add trailing newline
var currentVersionpreviewHeight = wikEd.textarealocalPrevWrapper.valueoffsetHeight;
if ( ( (wikEd.previewArticle.innerHTML !== '') || (wikEd.previewDiff.innerHTML !== '') ) && (previewHeight > 0) ) {
 
wikEd.localPrevWrapper.style.height = previewHeight + 'px';
// Opera 0.9.51
currentVersion = currentVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
if (currentVersion.substr(currentVersion.length - 1, 1) != '\n') {
currentVersion += '\n';
}
if (wikEd.origVersionpreviewDiff.substr(wikEd.origVersion.lengthinnerHTML - 1, 1) !=== '\n') {
wikEd.origVersionpreviewDiff.innerHTML += '\n'wikEd.config.text.wikEdPreviewLoading;
}
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(wikEd.origVersion, currentVersion);
if (wikEd.config.fullDiff != true) {
diffText = WDiffShortenOutput(diffText);
}
 
// add trailing newline
// display diff, keep wrapper height to prevent scrolling
var previewHeightcurrentVersion = wikEd.previewBoxtextarea.offsetHeightvalue;
 
if ( (wikEd.previewBox.innerHTML != '') && (previewHeight > 0) ) {
// call external diff program
wikEd.previewBox.style.height = previewHeight + 'px';
wikEd.previewDiff.innerHTML = wikEd.DiffResponse(wikEd.origVersion, currentVersion);
}
wikEd.previewBox.innerHTML = diffText;
wikEd.localPrevWrapper.style.display = 'block';
 
// scroll to button, textarea, or preview field
wikEd.ScrollToPreview();
 
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.diffHook);
break;
 
// close the preview and diff boxes
// toggle wikEdDiff
case 'wikEdDiff':
 
// turn wikEdDiff off
if (wikEd.GetAttribute(buttonObj, 'checked') != 'true') {
wikEd.diff = false;
wikEd.SetPersistent('wikEdDiff', '0', 0, '/');
if (typeof(wikEd.diffDiv) == 'object') {
if (wikEd.diffDiv != null) {
wikEd.diffDiv.style.display = 'none';
}
}
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
}
 
// turn wikEdDiff on
else {
wikEd.diff = true;
wikEd.SetPersistent('wikEdDiff', '1', 0, '/');
if (typeof(wikEd.diffDiv) == 'object') {
if (wikEd.diffDiv != null) {
wikEd.diffDiv.style.display = 'block';
window.scroll(0, wikEd.GetOffsetTop(wikEd.diffDiv));
wikEd.Diff();
}
}
}
focusFrame = true;
break;
 
// close the preview / diff box
case 'wikEdClose':
case 'wikEdClose2':
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
 
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'none';
 
wikEd.previewBox.style.height = 'auto';
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 (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.useWikEd = true;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.SetPersistent('wikEdUseClassic', '0', 0, '/');
 
// update frame content
wikEd.UpdateFrame();
 
// turndisplay rich text frame on
wikEd.SetEditArea(true);
wikEd.useWikEd = true;
wikEd.SetPersistent('wikEdUseClassic', '0', 0, '/');
 
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.frameHook);
}
 
// turn classic textarea on, disable wikEd
else {
wikEd.PastedOff();
 
// update frame content
wikEd.UpdateTextarea();
 
// 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 (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.using = true;
wikEd.SetPersistent('wikEdSummaryUsing', '1', 0, '/');
Line 5,350 ⟶ 6,527:
break;
 
// hide ref tags
case 'wikEdRefHide':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.refHide = true;
wikEd.SetPersistent('wikEdRefHide', '1', 0, '/');
Line 5,360 ⟶ 6,537:
wikEd.SetPersistent('wikEdRefHide', '0', 0, '/');
}
 
if (wikEd.useWikEd == true) {
if ( (wikEd.refHideconfig.showTableModeButton === false) && (wikEd.config.tableMode === true) ) {
wikEd.tableMode = wikEd.refHide;
}
 
if (wikEd.useWikEd === true) {
if (wikEd.refHide === true) {
wikEd.frameBody.className = 'wikEdFrameBodyNewbie';
}
Line 5,371 ⟶ 6,553:
break;
 
// close the toolbar
case 'wikEdCloseToolbar':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.closeToolbar = true;
wikEd.toolbarWrapper.style.display = 'none';
Line 5,383 ⟶ 6,565:
wikEd.SetPersistent('wikEdCloseToolbar', '0', 0, '/');
}
 
if (wikEd.fullScreenMode == true) {
// resize fullscreen frame
wikEd.FullScreen(wikEd.fullScreenMode);
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 (wikEdbuttonObj.rearrangegetAttribute('checked') == 'true') {
if (wikEd.GetAttributeFullScreen(buttonObjtrue, 'checked') == 'true') {;
wikEd.FullScreenSetPersistent(true'wikEdFullscreen', '1', 0, '/');
}
wikEd.SetPersistent('wikEdFullscreen', '1', 0, '/');
}else {
wikEd.FullScreen(false, true);
else {
wikEd.FullScreenSetPersistent(false'wikEdFullscreen', '0', 0, '/');
wikEd.SetPersistent('wikEdFullscreen', '0', 0, '/');
}
}
break;
 
// clear the saved settings for find, replace, and summary history
case 'wikEdClearHistory':
wikEd.ClearHistory('find');
Line 5,422 ⟶ 6,604:
break;
 
// for testing
case 'wikEdPlaceholder':
break;
Line 5,428 ⟶ 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 ( (wikEd.useWikEd === true) && (focusFrame === true) ) {
wikEd.frameWindow.focus();
}
Line 5,447 ⟶ 6,632:
//
 
wikEd.EditButton = function (buttonObj, buttonId, parameters, CustomHandler) {
 
// check if buttoniframe is disabledenabled
if (buttonObjwikEd.UseWikEd !=== nullfalse) {
return;
}
 
// check if button is disabled
if (buttonObj !== null) {
if (buttonObj.className == 'wikEdButtonInactive') {
return;
Line 5,456 ⟶ 6,646:
}
 
// remove active and non-text content
wikEd.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
wikEd.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':
Line 5,479 ⟶ 6,677:
break;
 
// basic wiki character formatting: selection / focusWord / cursor
case 'wikEdBold':
case 'wikEdItalic':
Line 5,490 ⟶ 6,688:
case 'wikEdWebLink':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,504 ⟶ 6,702:
break;
 
// reference: selection / cursor
case 'wikEdRef':
case 'wikEdRefNamed':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,516 ⟶ 6,714:
break;
 
// references and small references: selection / cursor
case 'wikEdReferences':
case 'wikEdReferencesSection':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
obj.changed = obj.cursor;
}
break;
 
// signature and name only signature: selection / cursor
case 'wikEdSign':
case 'wikEdSignName':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,528 ⟶ 6,738:
break;
 
// character formatting: selection / focusWord / cursor
case 'wikEdCase':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,545 ⟶ 6,755:
break;
 
// multiple line changes: selectionLine / focusLine / cursor
case 'wikEdDecreaseHeading':
case 'wikEdIncreaseHeading':
Line 5,556 ⟶ 6,766:
case 'wikEdDefinitionList':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
Line 5,562 ⟶ 6,772:
else {
wikEd.GetText(obj, 'focusLine');
if (obj.focusLine.plain !== '') {
obj.changed = obj.focusLine;
}
Line 5,571 ⟶ 6,781:
break;
 
// sort: selectionLine / focusLine
case 'wikEdSort':
wikEd.GetText(obj, 'selection, cursor, selectionLine');
if (obj.selection.plain !=== '') {
wikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
}
else if (/\n./.test(obj.selection.plain) === false) {
obj.changed = obj.selection;
}
else {
obj.changed = obj.selectionLine;
wikEd.GetText(obj, 'focusPara');
if (obj.focusPara.plain != '') {
obj.changed = obj.focusPara;
}
}
break;
 
// image: selectionWord (if text is selected) / cursor
case 'wikEdImage':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionWord');
obj.changed = obj.selectionWord;
Line 5,598 ⟶ 6,807:
break;
 
// table: selectionLine / cursor
case 'wikEdTable':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
Line 5,611 ⟶ 6,820:
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') {
Line 5,619 ⟶ 6,848:
else {
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,629 ⟶ 6,858:
break;
 
// textify: selection / whole, without wikifying
case 'wikEdTextify':
wikEd.GetText(obj, 'selection', false);
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,641 ⟶ 6,870:
break;
 
// redirect: whole
case 'wikEdRedirect':
wikEd.GetText(obj, 'whole, selection, cursor');
if (obj.selection.plain === '') {
wikEd.GetText(obj, 'selectionWord');
}
Line 5,650 ⟶ 6,879:
break;
 
// find and replace: selection / focusWord / cursor
case 'wikEdFindPrev':
case 'wikEdFindNext':
Line 5,659 ⟶ 6,888:
case 'wikEdFindAll':
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(obj, 'focusWord');
if (obj.focusWord.plain !== '') {
obj.changed = obj.focusWord;
}
Line 5,673 ⟶ 6,902:
break;
 
// replace all: selection / whole
case 'wikEdReplaceAll':
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,685 ⟶ 6,914:
break;
 
// fixing buttons: selection / whole
case 'wikEdFixBasic':
case 'wikEdFixUnicode':
Line 5,694 ⟶ 6,923:
case 'wikEdFixRedirectReplace':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,703 ⟶ 6,932:
break;
 
// fixing buttons: selection / focusPara / cursor
case 'wikEdFixPunct':
case 'wikEdFixMath':
Line 5,711 ⟶ 6,940:
case 'wikEdFixChem':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(obj, 'focusPara');
if (obj.focusPara.plain !== '') {
obj.changed = obj.focusPara;
}
Line 5,725 ⟶ 6,954:
break;
 
// fixing buttons: selection / focusLine / cursor
case 'wikEdFixChem':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(obj, 'focusLine');
if (obj.focusPara.plain !== '') {
obj.changed = obj.focusLine;
}
Line 5,742 ⟶ 6,971:
break;
 
// source: selection / whole
case 'wikEdSource':
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,754 ⟶ 6,983:
break;
 
// insert tags: selection / focusWord / cursor
case 'wikEdInsertTags':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
else {
wikEd.GetText(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':
wikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
break;
 
// update text view using current control button settings
case 'wikEdUpdateAll':
wikEd.GetText(obj, 'whole');
Line 5,783 ⟶ 7,000:
break;
 
// custom edit functions have to call wikEd.GetText() themselves
default:
wikEd.GetText(obj, 'cursor');
Line 5,790 ⟶ 7,007:
}
 
// exit
if (obj.changed === nullundefined) {
wikEd.frameWindow.focus();
 
// reset button to active, reset cursor
if (buttonObj !== null) {
if (buttonObj.className != 'wikEdButtonInactive') {
buttonObj.className = 'wikEdButton';
Line 5,803 ⟶ 7,020:
}
 
// set local syntax highlighting flag
var highlightSyntax = wikEd.highlightSyntax;
 
// apply selected action
// manipulate the text
var selectChanged = true;
var selectChangedText = '';
var emptyOrSpaces = /^ *$/.test(obj.changed.plain);
switch (buttonId) {
 
// undo
case 'wikEdUndo':
if (wikEd.lastVersion === null) {
wikEd.lastVersion = obj.changed.plain;
}
wikEd.FrameExecCommandframeDocument.execCommand('undo');
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEd.frameBody, 0);
}
obj.changed.range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
obj.changed.plain = null;
obj.changed.keepSel = true;
break;
 
// redo
case 'wikEdRedo':
wikEd.FrameExecCommandframeDocument.execCommand('redo');
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEd.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,884 ⟶ 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,896 ⟶ 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,909 ⟶ 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,922 ⟶ 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,949 ⟶ 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 = 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,985 ⟶ 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 6,004 ⟶ 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 6,023 ⟶ 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 6,046 ⟶ 7,318:
break;
 
// sort alphabetically by visible words, case insensitive, and numerically
case 'wikEdSort':
 
// fix unicode and character entities
wikEd.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 6,066 ⟶ 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,081 ⟶ 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,132 ⟶ 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,144 ⟶ 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,170 ⟶ 7,573:
break;
 
// undo all
case 'wikEdUndoAll':
if (wikEd.lastVersion === null) {
wikEd.lastVersion = obj.changed.plain;
}
obj.changed.plain = wikEd.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 (wikEd.lastVersion !== null) {
obj.changed.plain = wikEd.lastVersion;
}
break;
 
// create wikilink
case 'wikEdWikiLink':
if ( /\[\[((.|\n)*?)\]\]/.test(obj.changed.plain) ) {
Line 6,196 ⟶ 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,208 ⟶ 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,254 ⟶ 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,265 ⟶ 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,276 ⟶ 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,287 ⟶ 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,298 ⟶ 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,309 ⟶ 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">' + wikEd.config.text['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + wikEd.config.text['image width'] + '</span>px|' + obj.changed.plain + ']]';
}
else {
obj.changed.plain = '[[Image:<span class="wikEdInsertHere">' + wikEd.config.text['image filename'] + '</span>|thumb|<span class="wikEdInsertHere">' + 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,334 ⟶ 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 (wikEd.tableMode == true) {
obj.changed.plain = '\n<table{| class="wikitable"\n|+ border="1"><caption><span class="wikEdInsertHere">' + wikEd.config.text['table caption'] + '</span></caption><tr><th>\n! <span class="wikEdinserthere">' + wikEd.config.text['table heading'] + '</span></th><th> !! <span class="wikEdinsertherewikEdInsertHere">' + wikEd.config.text['table heading'] + '</span></th></tr><tr><td>\n|-\n| <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span></td><td> || <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span></td></tr><tr><td>\n|-\n| <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span></td><td> || <span class="wikEdInsertHere">' + 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">' + wikEd.config.text['table caption'] + '</span>\n! <span class="wikEdinserthere">' + wikEd.config.text['table heading'] + '</span> !! <span class="wikEdInsertHere">' + wikEd.config.text['table heading'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span>\n|-\n| <span class="wikEdInsertHere">' + wikEd.config.text['table cell'] + '</span> || <span class="wikEdInsertHere">' + wikEd.config.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':
wikEd.Textify(obj.changed);
Line 6,367 ⟶ 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;
}
Line 6,380 ⟶ 7,870:
}
 
// 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,392 ⟶ 7,882:
obj.changed.plain = '#REDIRECT [[' + linkTarget + ']]';
 
// append to summary
if (wikEd.wikiGlobals.wgUseAutomaticEditSummaries !== true) {
if (wikEd.inputElement['.summary'] !== nullundefined) {
if ( (obj.selection.plain !== '') || (obj.selectionWord.plain !== '') ) {
wikEd.inputElement['.summary'].value = wikEd.inputElement['.summary'].value.replace(/#REDIRECT( \[\[[^\]]*\]\])?(, *)?/g, '');
wikEd.inputElement['.summary'].value = wikEd.AppendToSummary(wikEd.inputElement['.summary'].value, '#REDIRECT [[' + linkTarget + ']]');
}
else {
wikEd.inputElement['.summary'].value = wikEd.AppendToSummary(wikEd.inputElement['.summary'].value, '#REDIRECT');
}
}
Line 6,407 ⟶ 7,897:
break;
 
// find and replace
case 'wikEdFindPrev':
case 'wikEdFindNext':
Line 6,417 ⟶ 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') {
wikEd.inputElement['.find'].value = obj.changed.plain;
}
else {
wikEd.inputElement['.replace'].value = obj.changed.plain;
}
obj.changed.keepSel = true;
Line 6,440 ⟶ 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,450 ⟶ 7,940:
}
 
// get the find text from the find field
else {
if (wikEd.inputElement['.find'].value !== '') {
findText = wikEd.inputElement['.find'].value.replace(/\xa0/g, ' ');
}
else {
Line 6,461 ⟶ 7,951:
}
 
// get button status
var regExpChecked = wikEd.GetAttribute(wikEd.regExp, .getAttribute('checked');
var caseSensitiveChecked = wikEd.GetAttribute(wikEd.caseSensitive, .getAttribute('checked');
 
// get thecase replacesensitive textsetting
var caseSensitive = false;
var replaceText = wikEd.inputElement['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,474 ⟶ 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,505 ⟶ 8,001:
}
 
// check the regexp
var replacedFlag = false;
var regExpFind;
Line 6,513 ⟶ 8,009:
) {
var regExpFindText = findText;
if (useRegExp !== true){
regExpFindText = regExpFindText.replace(/([\\\^\$\*\+\?\.\(\)\[\]\{\}\:\=\!\|\,\-])/g, '\\$1');
}
var regExpFlags = 'gm';
if (caseSensitive !== true) {
regExpFlags += 'i';
}
Line 6,523 ⟶ 8,019:
regExpFind = new RegExp(regExpFindText, regExpFlags);
}
catch (errexception) {
return;
}
}
 
// replace all
if (buttonId == 'wikEdReplaceAll') {
if (regExpFind.test(obj.changed.plain)) {
Line 6,539 ⟶ 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,569 ⟶ 8,066:
(buttonId == 'wikEdFindAll')
) {
if (replacedFlag === false) {
 
// get direction
var backwards = false;
if ( (buttonId == 'wikEdFindPrev') || (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdReplacePrev') ) {
Line 6,577 ⟶ 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
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
var range = wikEd.frameDocument.createRange();
if (wikEd.frameBody.firstChild !== null) {
range.setStartBefore(wikEd.frameBody.firstChild);
}
Line 6,597 ⟶ 8,088:
range = obj.sel.addRange(range);
 
// cycle through matches
var scrollTop = wikEd.frameBody.scrollTop;
do {
 
// wikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
found = wikEd.Find(obj, findText, caseSensitive, false, false, useRegExp);
if (found === true) {
foundRanges.push(obj.changed.range.cloneRange());
}
} while (found === true);
 
// scroll back
if (regExpChecked == 'false') {
wikEd.frameBody.scrollTop = scrollTop;
}
 
// add the found ranges, Webkit does not support multiple selections
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
for (var i = 0; i < foundRanges.length; i ++) {
obj.sel.addRange(foundRanges[i]);
Line 6,622 ⟶ 8,113:
}
 
// normal find
else {
obj.selectChanged = selectChanged;
Line 6,631 ⟶ 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') ) {
wikEd.AddToHistory('find');
Line 6,649 ⟶ 8,138:
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':
wikEd.FixBasic(obj.changed);
Line 6,672 ⟶ 8,161:
break;
case 'wikEdFixRedirect':
wikEd.FixRedirectCallLinkInfoCall(obj.changed, function (ajax); {
wikEd.LinkInfoHandler(ajax);
wikEd.EditButton(null, 'wikEdFixRedirectReplace');
});
return;
case 'wikEdFixRedirectReplace':
Line 6,691 ⟶ 8,183:
break;
case 'wikEdFixRegExTypo':
if ( (wikEd.config.regExTypoFix === true) && (wikEd.typoRulesFind.length > 0) ) {
wikEd.FixTypos(obj.changed);
}
Line 6,708 ⟶ 8,200:
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,752 ⟶ 8,238:
break;
 
// update text view using current control button settings
// convert wiki tables to html // {{TABLE}}
case 'wikEdTablify':
obj.changed.keepSel = true;
if (wikEd.tableMode == true) {
wikEd.WikiTableToHtml(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 = wikEd.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;
}
Line 6,801 ⟶ 8,277:
}
 
// get the scroll position
var frameScrollTop = wikEd.frameBody.scrollTop;
var frameScrollLeft = wikEd.frameBody.scrollLeft;
 
// update the selection ranges, do not add any text changes
if (obj.changed.plain === null) {
if (buttonId != 'wikEdFindAll') {
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// scroll the selected text into the viewport
if (selectChanged !== false) {
wikEd.ScrollToSelection();
}
Line 6,818 ⟶ 8,293:
}
 
// apply text changes
else {
 
// a text change erases the last version for redo all
if ( (buttonId != 'wikEdUndo') && (buttonId != 'wikEdRedo') && (buttonId != 'wikEdUndoAll') ) {
wikEd.lastVersion = null;
}
 
// highlight the syntax
obj.html = obj.changed.plain;
if (highlightSyntax === true) {
if (obj.changed.from == 'whole') {
obj.whole = true;
}
 
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,846 ⟶ 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
wikEd.RemoveAllRanges(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
wikEd.insertCounter ++;
if (wikEd.readOnly === true) {
reselectBefore = '<span class="wikEdScrollBefore" id="wikEdScrollBefore' + wikEd.insertCounter + '"></span>';
wikEd.frameBody.innerHTML = obj.html;
reselectAfter = '<span class="wikEdScrollAfter" id="wikEdScrollAfter' + wikEd.insertCounter + '"></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);
}
wikEd.FrameExecCommand('inserthtml', reselectBefore + obj.html + reselectAfter);
}
else {
else if (obj.sel.isCollapsed == false) {
wikEd.FrameExecCommand('delete')insertCounter ++;
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) ) {
wikEd.RemoveAllRanges(obj.sel);
obj.sel.removeAllRanges();
wikEd.frameBody.scrollTop = frameScrollTop;
var range = wikEd.frameDocument.createRange();
range.setStartBefore(wikEd.frameBody.firstChild);
range.setEndAfter(wikEd.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) {
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
var range = wikEd.frameDocument.createRange();
var startNodeReselect = wikEd.frameDocument.getElementById('wikEdScrollBefore' + wikEd.insertCounter);
var endNodeReselect = wikEd.frameDocument.getElementById('wikEdScrollAfter' + wikEd.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);
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(wikEd.frameBody, 0);
}
Line 6,909 ⟶ 8,405:
}
 
// focus edit area to continue editing as there is no selection that would be overwritten
wikEd.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();
 
// add event handlers to unhide refs and templates
if ( (highlightSyntax === true) && (obj.changed.plain !== null) ) {
 
// add ref and template names to hide buttons
wikEd.HighlightNamedHideButtons();
 
// add event handlers to unhide refs and templates
wikEd.HideAddHandlers();
 
// add event handlers to make highlighted frame links ctrl-clickable
wikEd.LinkifyAddHandlersLinkifyLinks();
 
// get link infos from server (redirects, redlinks)
wikEd.LinkInfoCall();
}
 
// resume frame spellchecking
if (pauseFrameSpellchecking === true) {
wikEd.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
//
 
wikEd.AjaxPreview = function (textValue, ResponseHandler, livePreview, format ) {
 
// get format, json preferred for module updates and summary parsing
if ( format === undefined ) {
format = 'json';
}
if ( format === 'json' && typeof JSON !== 'object' ) {
format = 'xml';
}
 
// API request
if ( livePreview === true ) {
 
// get summary
var summary = '';
if (wikEd.summaryText !== null) {
summary = wikEd.summaryText.value;
}
 
// set request parameters
var postFields = {
'format': format,
'action': 'parse',
'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
else {
 
// prepare the url
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;
};
Line 6,950 ⟶ 8,708:
//
 
wikEd.LocalPreviewAjaxHandler = function ( ajax ) {
 
// get preview html
wikEd.previewIsAjax = true;
var html = '';
 
// json API reponse
// get response
varif html =( 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)
// livepreview
else if (html ajax.responseText.indexOf(" '<livepreview>"' ) != -1 ) {
html = htmlwikEd.replaceStringGetInnerHTML(/\s*<\/livepreview>\s*()/ ajax.responseText, 'preview', '' );
html = html .replace( /\s*<\/preview>\s*()&lt;/g, '<' );
html = html .replace( /&ltgt;/g, '<>' );
html = html .replace( /&gtquot;/g, '>"' );
html = html .replace( /&quotapos;/g, '"\'' );
html = html .replace( /&aposamp;/g, '\'&' );
html = htmlwikEd.replaceRemoveTag( html, 'div', /&amp;\bclass=("|')previewnote("|')/g, '&\x00', '\x01' );
html = html.replace( /(.|\n)*<div class=\'previewnote\'>x00(.|\n)*?<\x01/div>/g, '' );
}
 
// full preview page
else {
html = ajax.responseText;
 
// attach <style> stylesheet declarations to document (GeSHi<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 wikEd.StyleSheet( document );
stylesheet.AddRulesAddCSSRules( 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);
}
);
wikEd.previewBoxpreviewArticle.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' ) {
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;
};
 
 
//
// wikEd.GetArticleText: get full article text
// 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;
};
 
Line 7,020 ⟶ 8,986:
//
 
wikEd.FilePreviewAjaxHandler = 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|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + '):[^ ]+) +(\\d+) +(.*)', 'ig');
var regExpMatch;
while ( (regExpMatch = regExpFile.exec(html)) !== null) {
var file = regExpMatch[1];
var filePreviewSize = regExpMatch[3];
Line 7,044 ⟶ 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]);
}
Line 7,061 ⟶ 9,027:
}
 
// cycle through file preview spans and add missing images as background
for (var i = 0; i < wikEd.filePreviewNo; i ++) {
if (wikEd.filePreviewIds[i] !== '') {
var span = wikEd.frameDocument.getElementById('wikEdFilePreview' + i);
if (span !== null) {
var fileNameSize = wikEd.filePreviewIds[i];
var fileObj = wikEd.filePreviewCache['wikEd' + fileNameSize];
if (fileObj !== nullundefined) {
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';
}
wikEd.filePreviewIds[i] = '';
}
}
Line 7,086 ⟶ 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,096 ⟶ 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,124 ⟶ 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);
};
 
Line 7,154 ⟶ 9,282:
//
 
wikEd.ScrollToPreview = function () {
 
// reset fixed height to auto
wikEd.previewBoxlocalPrevWrapper.style.height = 'auto';
 
var scrollOffset = window.pageYOffset || document.body.scrollTop;
Line 7,163 ⟶ 9,291:
var editOffset = wikEd.GetOffsetTop(wikEd.editWrapper);
var submitOffset = 0;
if (wikEd.saveButton !== null) {
submitOffset = wikEd.GetOffsetTop(wikEd.saveButtonsubmitWrapper);
}
else if (wikEd.previewButton !== null) {
submitOffset = wikEd.GetOffsetTop(wikEd.previewButton);
}
else if (wikEd.diffPreviewButton !== null) {
submitOffset = wikEd.GetOffsetTop(wikEd.diffPreviewButton);
}
else if (wikEd.submitWrapper !== null) {
submitOffset = wikEd.GetOffsetTop(wikEd.submitWrapper);
}
else {
return;
}
var editHeight = wikEd.editWrapper.clientHeight;
Line 7,191 ⟶ 9,325:
 
//
// wikEd.LinkifyAddHandlersLinkifyLinks: register click handlers to make highlighted frame links ctrl-clickable (linkify), add redirect info, and highlight redlinks
//
 
wikEd.LinkifyAddHandlersLinkifyLinks = function () {
 
// detect external files and images
if (wikEd.config.linkify != true) {
var regExpFile = new RegExp('^(Image|File|Media|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + '):', 'i');
return;
}
 
// cycle through spans
// much faster than individual getElementById in SeaMonkey 1.1.18
var spans = wikEd.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) {
wikEd.AddEventListener(spans[i], 'click', wikEd.LinkifyHandler, 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,218 ⟶ 9,420:
//
 
wikEd.HighlightNamedHideButtons = function () {
 
if (wikEd.refHide !== true) {
return;
}
Line 7,226 ⟶ 9,428:
var rules = '';
 
// references
for (var i = 0; i < wikEd.referenceArray.length; i ++) {
if (wikEd.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';
 
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;
}
 
// templates
for (var i = 0; i < wikEd.templateArray.length; i ++) {
if (wikEd.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';
 
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;
}
 
// character entities
for (var i = 0; i < wikEd.charEntityArray.length; i ++) {
if (wikEd.charEntityArray[i].added === true) {
continue;
}
Line 7,264 ⟶ 9,460:
}
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
// add or replace existing css rules
for (var i = 0; i < wikEd.tableArray.length; i ++) {
if (rules != '') {
if (wikEd.tableArray[i].added === true) {
wikEd.HighlightNamedHideButtonsStylesheet.AddRules(rules);
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);
}
return;
Line 7,284 ⟶ 9,493:
//
 
wikEd.HideAddHandlers = function () {
 
if ( (wikEd.config.hideContent !== true) || (wikEd.refHide !== true) ) {
return;
}
Line 7,293 ⟶ 9,502:
var tabClass = hideButton[i].className;
if (
(tabClass.indexOf('wikEdRefButton') === 0) ||
(tabClass.indexOf('wikEdTemplButton') === 0) ||
(tabClass.indexOf('wikEdCharEntityButton') === 0) ||
(tabClass.indexOf('wikEdTableButton')=== 0)
) {
wikEd.AddEventListener(hideButton[i], .addEventListener('click', wikEd.HideShowHandler, true);
if (
(tabClass.indexOf('wikEdRefButtonShow') == -1) &&
(tabClass.indexOf('wikEdTemplButtonShow') == -1) &&
(tabClass.indexOf('wikEdCharEntityButtonShow') == -1) &&
(tabClass.indexOf('wikEdTableButtonShow') == -1)
) {
wikEd.AddEventListener(hideButton[i], .addEventListener('mouseover', wikEd.HideShowHandler, true);
}
}
Line 7,315 ⟶ 9,526:
//
 
wikEd.HideShowHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(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 = wikEd.GetNextSiblingNode(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;
 
hide hideContainer = wikEd.GetPreviousSiblingNode(hideTarget);
if (hideContainer !== wikEd.GetPreviousSiblingNode(hideTargetnull); {
if (/^wikEd(Ref|Templ|CharEntity|Table)Container$/.test(hideContainer.className) !=== nullfalse) {
if (/^wikEd(Ref|Templ|CharEntity)Container$/.test( hideContainer.className) == false) {null;
}
hideContainer = null;
} else {
else {
 
// get button
hideButton = wikEd.GetFirstChildNode(hideContainer);
if (hideButton !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)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);
}
wikEd.RemoveEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
wikEd.AddEventListener(hide, 'mouseout', wikEd.HideShowHandler, true);
wikEd.AddEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, 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 == wikEd.frameBody) {
hideOut = true;
break;
}
if ( (node == hideContainer) || (node == hide) || (node == hideCell) ) {
break;
}
node = node.parentNode;
}
if (hideOut === true) {
hideevent.style.display = 'none'stopPropagation();
wikEd.RemoveEventListener(hide, 'mouseout', wikEd.HideShowHandler, true);
wikEd.RemoveEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, true);
wikEd.AddEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
 
if (hideCell !== null) {
// move cursor out of hidden text
hideCell.removeEventListener('mouseout', wikEd.HideShowHandler, true);
}
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,429 ⟶ 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 = wikEd.config.text[hideButtonClass.replace(/\d+$/g, '') + 'Tooltip'];
 
wikEdhideButton.AddEventListeneraddEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
 
// move cursor out of hidden text
wikEd.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 = wikEd.config.text[hideButtonClass.replace(/\d+$/g, '') + 'Tooltip'];
 
wikEdhideButton.RemoveEventListenerremoveEventListener(hideButton, 'mouseovermouseout', wikEd.HideShowHandler, true);
wikEd.RemoveEventListener(hide, 'mouseout', wikEd.HideShowHandler, true);
wikEd.RemoveEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, true);
}
}
 
// clear scheduled unhide
if (wikEd.scheduledUnhide !== null) {
wikEd.frameDocument.removeEventListener('keydown', wikEd.HideShowHandler, true);
wikEd.scheduledUnhide = null;
}
 
return;
};
Line 7,474 ⟶ 9,756:
//
 
wikEd.UnhideCursor = function (firstHiddenParent, lastHiddenParent) {
 
// get selection and clone range
var sel = wikEd.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 == wikEd.frameBody) {
break;
Line 7,496 ⟶ 9,778:
var endHidden = false;
var node = range.endContainer;
while (node !== null) {
if (node == wikEd.frameBody) {
break;
Line 7,507 ⟶ 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,527 ⟶ 9,809:
//
 
wikEd.GetText = function (obj, whichFragment, wikify) {
 
// remove dynamically inserted nodes by other scripts
wikEd.CleanNodes(wikEd.frameDocument);
 
// get selection object
if (obj.sel === nullundefined) {
obj.sel = wikEd.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 = wikEd.frameDocument.createRange();
wikEd.SetRangeStart(obj.cursor.range, obj.sel.focusNode, obj.sel.focusOffset);
Line 7,551 ⟶ 9,833:
}
 
// 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 = wikEd.frameDocument.createRange();
obj.whole.range.setStart(wikEd.frameBody, 0);
obj.whole.range.setEnd(wikEd.frameBody, wikEd.frameBody.childNodes.length);
 
// get whole plain text
wikEd.GetInnerHTML(obj.whole, wikEd.frameBody);
obj.whole.code = obj.whole.html;
wikEd.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(wikEd.frameBody, 0);
}
obj.selection.range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
var documentFragment = obj.selection.range.cloneContents();
 
// get selected text
wikEd.GetInnerHTML(obj.selection, documentFragment);
obj.selection.code = obj.selection.html;
wikEd.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': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusLine object for the line under the cursor
obj.focusLine = {
'from': 'focusLine',
'keepSel': false,
'range': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusPara object for the paragraph under the cursor
obj.focusPara = {
'from': 'focusPara',
'keepSel': false,
'range': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// find the word and line boundaries
wikEd.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();
wikEd.GetInnerHTML(obj.focusWord, documentFragment);
obj.focusWord.code = obj.focusWord.html;
wikEd.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();
wikEd.GetInnerHTML(obj.focusLine, documentFragment);
obj.focusLine.code = obj.focusLine.html;
wikEd.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();
wikEd.GetInnerHTML(obj.focusPara, documentFragment);
obj.focusPara.code = obj.focusPara.html;
wikEd.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': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup selectionLine object for the lines under the selection
obj.selectionLine = {
'from': 'selectionLine',
'keepSel': false,
'range': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// setup focusPara object for the paragraph under the selection
obj.selectionPara = {
'from': 'selectionPara',
'keepSel': false,
'range': wikEd.frameDocument.createRange(),
'tableEdit': obj.tableEdit
};
 
// find the word and line boundaries
wikEd.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();
wikEd.GetInnerHTML(obj.selectionWord, documentFragment);
obj.selectionWord.code = obj.selectionWord.html;
wikEd.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();
wikEd.GetInnerHTML(obj.selectionLine, documentFragment);
obj.selectionLine.code = obj.selectionLine.html;
wikEd.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();
wikEd.GetInnerHTML(obj.selectionPara, documentFragment);
obj.selectionPara.code = obj.selectionPara.html;
wikEd.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,727 ⟶ 9,987:
//
 
wikEd.Find = function (obj, findText, caseSensitive, backwards, wrap, useRegExp) {
 
var found = false;
 
// get selection
if (obj.sel === nullundefined) {
obj.sel = wikEd.GetSelection();
}
if (obj.sel.rangeCount === 0) {
obj.sel.collapse(wikEd.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 = wikEd.frameDocument.createRange();
 
// regexp instead of plain text search for browser lacking .find (Opera), built in .find() ignores newlines
if (useRegExp !== true) {
if (typeof( 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,766 ⟶ 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 = wikEd.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) {
wikEd.ParseDOM(obj, wikEd.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,810 ⟶ 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,854 ⟶ 10,116:
}
}
return( found);
};
 
Line 7,860 ⟶ 10,122:
//
// wikEd.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 (frameScrollTop, frameScrollLeft, removeHelperNodes) {
 
// get selection and clone range
var obj = {};
obj.sel = wikEd.GetSelection();
if (obj.sel.rangeCount === 0) {
return;
}
 
// get selection plain text
var range = obj.sel.getRangeAt(obj.sel.rangeCount - 10);
var documentFragment = range.cloneContents();
wikEd.GetInnerHTML(obj, documentFragment);
Line 7,882 ⟶ 10,143:
plainText = plainText.replace(/&amp;/g, '&');
 
// select using backwards built-in find
if ( (typeof( wikEd.frameWindow.find) == 'function') && (plainText.length > 0) ) {
obj.sel.collapseToEnd();
 
// Chrome; parameters: wikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
var found = wikEd.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);
}
wikEd.Find(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( wikEd.frameWindow.find) == 'function') && (plainText.length === 0) ) {
var backwards = true;
 
// get plain text from start to selection
var rangeClone = range.cloneRange();
rangeClone.setStartBefore(wikEd.frameBody.firstChild);
Line 7,911 ⟶ 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,926 ⟶ 10,192:
plainText = plainText.replace(/^(\n*[^\n])([\s\S]*?)$/, '$1');
 
// backward or forward find
if (plainTextBack.length > plainText.length) {
backwards = false;
Line 7,935 ⟶ 10,201:
}
 
// Chrome; parameters: wikEd.Find(obj, findText, caseSensitive, backwards, wrap, useRegExp)
var found = wikEd.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, ' ');
wikEd.Find(obj, plainText, true, backwards, false, false);
}
if (backwards === true) {
obj.sel.collapseToEnd();
}
Line 7,952 ⟶ 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
wikEd.insertCounter ++;
var scrollStartNode = wikEd.frameDocument.createElement('span');
Line 7,966 ⟶ 10,232:
scrollEndNode.id = 'wikEdScrollAfter' + wikEd.insertCounter;
 
// get the range border nodes and offsets
var startNode = range.startContainer;
var startOffset = range.startOffset;
Line 7,981 ⟶ 10,247:
}
 
// insert end node
if (endNode.nodeName == '#text') {
if (endOffset === 0) {
endNode.parentNode.insertBefore(scrollEndNode, endNode);
}
Line 7,999 ⟶ 10,265:
}
 
// insert start node
if (startNode.nodeName == '#text') {
if (startOffset === 0) {
startNode.parentNode.insertBefore(scrollStartNode, startNode);
}
Line 8,009 ⟶ 10,275:
else {
 
// collapse as a Firefox bug work around; httphttps://stackoverflow.com/questions/665676
rangeStart.collapse(true);
rangeStart.insertNode(scrollStartNode);
Line 8,021 ⟶ 10,287:
wikEd.ScrollToNodes(scrollStartNode, scrollEndNode);
 
// set selection
range.setStartBefore(scrollStartNode);
range.setEndAfter(scrollEndNode);
obj.sel.removeAllRanges();
wikEd.RemoveAllRanges(sel);
obj.sel.addRange(range);
}
 
Line 8,036 ⟶ 10,302:
//
 
wikEd.ScrollToNodes = function (scrollStartNode, scrollEndNode) {
 
// absolute span for line height detection (Opera and Chrome do not vertically align empty span at bottom)
var lineHeightNode = wikEd.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';
Line 8,061 ⟶ 10,327:
var y = frameScrollTop;
 
// current scroll position
 
// selection above viewport
if (endOffsetBottom < frameScrollTop) {
y = startOffsetTop;
}
 
// selection below viewport
else if (startOffsetTop > frameScrollTop + wikEd.frameBody.clientHeight) {
y = endOffsetBottom - wikEd.frameBody.clientHeight + lineHeight;
}
 
// selection left of viewport
if (endOffsetRight < frameScrollLeft) {
if (endOffsetRight <= wikEd.frameBody.clientWidth) {
Line 8,083 ⟶ 10,349:
}
 
// selection right of viewport
else if (startOffsetLeft > frameScrollLeft + wikEd.frameBody.clientWidth) {
x = endOffsetRight - wikEd.frameBody.clientWidth;
}
 
// do scroll
wikEd.frameWindow.scrollTo(x, y);
 
Line 8,096 ⟶ 10,362:
 
//
// wikEd.RemoveTableModeHighlighting: strip table html, add linebreaks back
// wikEd.WikiTableToHtml: convert wiki tables to html // {{TABLE}}
// expects <br> instead of \n
//
 
wikEd.WikiTableToHtmlRemoveTableModeHighlighting = 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;
};
 
Line 8,110 ⟶ 10,386:
//
 
wikEd.Textify = 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 ( (wikEd.safari == true) || (wikEd.chrome == true) || (wikEd.webkit == 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 (wikEd.tableMode == true) {
obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\x00');
 
// finish html to plain conversion
// override pasted table class // {{TABLE}}
obj.plain = obj.plain.replace(/(<table\b)([^>]*)(>)/gig, '');
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 (wikEd.tableMode == 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,247 ⟶ 10,485:
//
 
wikEd.InactiveButtons = function () {
 
// read only
if (wikEd.readOnly === true) {
return;
}
 
// undo
if (wikEd.frameDocument.queryCommandEnabled('undo') === true ) {
document.getElementById('wikEdUndo').className = 'wikEdButton';
document.getElementById('wikEdUndoAll').className = 'wikEdButton';
Line 8,259 ⟶ 10,502:
}
 
// redo
if (wikEd.frameDocument.queryCommandEnabled('redo') === true ) {
document.getElementById('wikEdRedo').className = 'wikEdButton';
}
Line 8,267 ⟶ 10,510:
}
 
// redo all
if (wikEd.lastVersion !== null) {
document.getElementById('wikEdRedoAll').className = 'wikEdButton';
}
Line 8,282 ⟶ 10,525:
//
 
wikEd.FixBasic = function (obj) {
//// change: double spaces ok after dot
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
wikEd.FixBasic = 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');
 
// empty line before and after headings, spaces around word (lookahead), remove bold, italics, and extra =
// 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=+ ' + wikEd.config.text['External links'] + '? =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEd.config.text['External links'] + ' ==\n');
regExp = new RegExp('\\n=+ ' + wikEd.config.text['See also'] + ' =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEd.config.text['See also'] + ' ==\n');
regExp = new RegExp('\\n=+ ' + wikEd.config.text['.References'] + '? =+\\n', 'gi');
obj.plain = obj.plain.replace(regExp, '\n== ' + 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|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '):.*?\\]\\])', 'ig');
line = line.replace(regExp, '\n$1');
Line 8,363 ⟶ 10,624:
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,376 ⟶ 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|' + 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|' + wikEd.config.text['wikicode Category'] + ')\\s*:[^\\n]*?\\]\\])\\n*(?=\\[\\[(Category|' + 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,425 ⟶ 10,708:
//
 
wikEd.FixPunct = function (obj) {
 
wikEd.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 (wikEd.config.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,473 ⟶ 10,781:
//
 
wikEd.FixUnicode = function (obj) {
 
obj.plain = obj.plain.replace(/&amp;#0*160;|&amp;#x0*a0;/gi, '&amp;nbsp;');
// replace supported chars: change decimal, hex, and character entities into actual char
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 < wikEd.supportedChars.length; i ++) {
var replaceChar = String.fromCharCode(parseInt(wikEd.supportedChars[i][0], 16));
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEd.supportedChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEd.supportedChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// character entity representation
regExpStr = '&amp;' + wikEd.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 < wikEd.problemChars.length; i ++) {
var replaceChar = '&amp;' + wikEd.problemChars[i][1] + ';';
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEd.problemChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEd.problemChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// actual character representation
regExpStr = '\\u' + wikEd.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 < wikEd.specialChars.length; i ++) {
var replaceChar = '&amp;' + wikEd.specialChars[i][1] + ';';
 
// decimal representation
var regExpStr = '&amp;#0*' + parseInt(wikEd.specialChars[i][0], 16) + ';|';
 
// hex representation
regExpStr += '&amp;#x0*' + wikEd.specialChars[i][0] + ';';
 
// case insensitive replace
var regExp = new RegExp(regExpStr, 'gi');
obj.plain = obj.plain.replace(regExp, replaceChar);
 
// actual character representation
regExpStr = '\\u' + wikEd.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,550 ⟶ 10,861:
 
//
// wikEd.FixRedirectCallLinkInfoCall: parseget link targetsinfos into(redirects, wikEd.redirectsCache objectredlinks) using AJAX API call
//
 
wikEd.FixRedirectCallLinkInfoCall = function (obj, handler) {
 
// check if api is enabled
if ( (wikEd.scriptURL === '') ) {
if ( ( (wikEd.wikiGlobals.wgEnableAPI != true) && (wikEd.wikiGlobals.wgEnableAPI != 'true') ) || (wikEd.scriptURL == '') ) {
return;
}
 
// set default handlers
// reset redirects object
var externalHandler = null;
wikEd.redirectsCache = {};
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 (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';
 
// makeprepare the ajaxlink request
if (links !== '') {
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', function(ajax) {
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;
}
wikEd.redirectsCache.from = [];
wikEd.redirectsCache.to = [];
wikEd.redirectsCache.allFrom = '';
 
return;
var regExpRedir = /<(r|n) .*?\bfrom=\"([^\">]*)\".*?\bto=\"([^\"]*)\".*?>/g;
};
while ( (regExpMatch = regExpRedir.exec(txt)) != null) {
wikEd.redirectsCache.from[i] = regExpMatch[2];
wikEd.redirectsCache.allFrom += i + '="' + regExpMatch[2] + '"';
wikEd.redirectsCache.to[i] = regExpMatch[3];
i ++;
}
 
// recurse through chained normalizations and redirects
wikEd.redirectsCache.toIndex = [];
for (var i = 0; i < wikEd.redirectsCache.to.length; i ++) {
wikEd.redirectsCache.toIndex[i] = wikEd.ResolveRedirects(i);
}
 
//
}
// wikEd.ExternalLinkInfoHandler: parse external file link infos from AJAX call for redirect fixing and redlinking
//
 
wikEd.ExternalLinkInfoHandler = function (ajax) {
// replace links
wikEd.EditButton(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,642 ⟶ 11,095:
 
//
// wikEd.ResolveRedirects: recursively follow redirects, calledwhen fromparsing API response in wikEd.FixRedirectCall AjaxLinkInfoCall handler
//
// uses wikEd.redirectsCache.allFrom as a regExp hash
 
wikEd.ResolveRedirects = function (ilinkInfo, link) {
 
var toRegExp = wikEd.redirectsCache.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 = wikEd.redirectsCache.allFrom.match(regExp)) != null) {
i link = wikEd.ResolveRedirects(linkInfo, parseInt(regExpMatchlinkInfo[1link], 10) .to);
}
}
return(i) link;
};
 
 
//
// wikEd.ScanPreviewRedlinks: scan article preview section for redlinks
// wikEd.FixRedirectReplace: replace redirects using wikEd.redirectsCache object prepared in wikEd.FixRedirectCall()
//
 
wikEd.FixRedirectReplaceScanPreviewRedlinks = function (obj) {
 
// check all link tags in preview and cat links section
if (wikEd.redirectsCache.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 (wikEd.redirectsCache.from != null) {
for (var i = 0; i < wikEd.redirectsCache.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*(' + wikEd.redirectsCache.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 = wikEd.redirectsCache.to[ wikEd.redirectsCache.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 (wikEd.config.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;
};
 
 
//
// wikEd.FixRedirectReplace: replace redirects using linkInfo data
//
 
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 (linkTextopenTag !== '[[') {
if ( linkText.replace(/_/g, ' ') !== linkTarget '') {
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,726 ⟶ 11,242:
//
 
wikEd.FixMath = function (obj) {
 
wikEd.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,770 ⟶ 11,288:
//
 
wikEd.FixChem = function (obj) {
 
wikEd.FixBasic(obj);
Line 8,777 ⟶ 11,295:
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,799 ⟶ 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,832 ⟶ 11,351:
//
 
wikEd.FixUnits = function (obj) {
 
wikEd.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,896 ⟶ 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,915 ⟶ 11,444:
//
 
wikEd.FixDashes = function (obj) {
 
wikEd.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,947 ⟶ 11,480:
//
 
wikEd.FixHTML = function (obj) {
 
wikEd.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>');
 
// preserve double spaces after dot
obj.html = obj.html.replace(/([.!?]) {2}(?=\S)/g, '$1\xa0\xa0');
 
// remove syntax highlighting
wikEd.RemoveHighlighting(obj);
 
// keep <br> in blockquotepreformatted 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
wikEd.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 9,047 ⟶ 11,601:
//
 
wikEd.FixCaps = function (obj) {
 
wikEd.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|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + '):([\\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,125 ⟶ 11,684:
//
 
wikEd.FixTypos = function (obj) {
 
wikEd.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,140 ⟶ 11,700:
fragment.push(obj.plain.substring(nextPos));
 
// cycle through the RegExTypoFix rules
for (var i = 0; i < wikEd.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(wikEd.typoRulesFind[i], wikEd.typoRulesReplace[i]);
Line 9,149 ⟶ 11,709:
}
 
// re-assemble text
obj.plain = fragment.join('');
 
Line 9,160 ⟶ 11,720:
//
 
wikEd.FixAll = function (obj) {
wikEd.FixBasic(obj);
wikEd.FixUnicode(obj);
Line 9,173 ⟶ 11,733:
//
 
wikEd.RemoveElements = function (tagNameArray) {
 
// cycle through the element names
for (var i = 0; i < tagNameArray.length; i ++) {
var elementArray = wikEd.frameDocumentframeBody.getElementsByTagName(tagNameArray[i]);
for (var j = 0; j < elementArray.length; j ++) {
elementArray[j].parentNode.removeChild(elementArray[j]);
Line 9,190 ⟶ 11,750:
//
 
wikEd.FindBoundaries = function (word, line, para, whole, selection) {
 
if (whole.plain === '') {
// get the start node and offset
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,206 ⟶ 11,770:
}
}
if (endNode.childNodes !== null) {
if (endNode.childNodes.length > 0) {
endNode = endNode.childNodes.item(endOffset);
Line 9,213 ⟶ 11,777:
}
 
// find the start and end nodes in the whole plain text arrays
var startNodeIndex;
var endNodeIndex;
Line 9,226 ⟶ 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,242 ⟶ 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,249 ⟶ 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,261 ⟶ 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) {
wikEd.SetRangeStart(word.range, whole.plainNode[i], regExp.lastIndex);
foundWord = true;
Line 9,274 ⟶ 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,300 ⟶ 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,307 ⟶ 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,319 ⟶ 11,883:
}
 
// check text node for a word boundary
else if (foundWord === false) {
if (i == endNodeIndex) {
regExp.lastIndex = endOffset;
Line 9,328 ⟶ 11,892:
}
var regExpArray = regExp.exec(plain);
if (regExpArray !== null) {
wikEd.SetRangeEnd(word.range, whole.plainNode[i], regExp.lastIndex - 1);
foundWord = true;
Line 9,335 ⟶ 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,351 ⟶ 11,915:
 
//
// wikEd.DivToBr: convert <div>...</div> to <br> for Safari, Chrome, and WebKit
// remove syntax highlighting and wikify
//
 
wikEd.RemoveHighlightingWikifyDivToBr = 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 ( (wikEd.safari == true) || (wikEd.chrome == true) || (wikEd.webkit == 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
wikEd.RemoveHighlighting(obj);
 
// wikify, don't allow many attributes
if ( (obj.htmlCode === true) && (wikify !== false) ) {
wikEd.WikifyHTML(obj, false);
}
Line 9,402 ⟶ 11,973:
// 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,415 ⟶ 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
 
wikEd.WikifyHTML = 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 + wikEd.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 (wikEd.tableMode == 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 = wikEd.SanitizeAttributes(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,
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, relaxed);
if (p3 == '') {
return('\x00| ');
}
else {
return('\x00|' + p3 + ' | ');
}
}
);
 
// <trtd> table rowscells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<trtd>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|-\x00 ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(trtd) \s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
return('\x00|-'p3 += wikEd.SanitizeAttributes(p2, p3, relaxed) + '\x00'wikiCode);
if (p3 === '') {
return '\x00| ';
}
); else {
return '\x00|' + p3 + ' | ';
}
}
);
 
// <captionth> table captioncells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<captionth>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|+! ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(captionth) \s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, relaxedwikiCode);
if (p3 === '') {
return( '\x00|+! ');
}
else {
return('\x00|+' + p3 + ' | ');
}
}
); 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 (wikEd.config.wikifyTableParameters != '') {
table += ' ' + wikEd.config.wikifyTableParameters;
}
else {
table += wikEd.SanitizeAttributes(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 (wikEd.tableMode == 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 (wikEd.tableMode == 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,713 ⟶ 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 = wikEd.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 = new RegExp(wikEd.server + '(' + wikEd.articlePath + '([^\\"\\?#]+)|' + wikEd.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,747 ⟶ 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,768 ⟶ 12,286:
hrefParamSpecial = true;
}
if (hrefParamAction !== null) {
break;
}
Line 9,774 ⟶ 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,792 ⟶ 12,310:
}
 
// get article name from url path
else if (hrefUrlArticle !== null) {
linkArticle = hrefUrlArticle;
linkArticle = linkArticle.replace(/_/g, ' ');
Line 9,799 ⟶ 12,317:
}
 
// get article name from <a title="">
else {
regExpMatchvar regExpMatchTitle = / title\btitle=\"([^\">]+)\"/.exec(linkParam);
if (regExpMatchregExpMatchTitle !== null) {
linkArticle = regExpMatchregExpMatchTitle[1];
}
}
Line 9,809 ⟶ 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|' + wikEd.config.text['wikicode Category'] + ')\\s*:(.*)', 'i');
regExpMatchvar regExpMatchCat = regExpregExpCat.exec(linkArticle);
if (regExpMatchregExpMatchCat !== null) {
return( '[[' + 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,857 ⟶ 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|' + 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,923 ⟶ 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( '[[' + 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 (wikEd.tableMode == 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 + wikEd.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 10,065 ⟶ 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,080 ⟶ 12,767:
//
// wikEd.RelativeToAbsolutePath
//
// broken for editing article names containing "/", https://bugzilla.mozilla.org/show_bug.cgi?id=430910
 
wikEd.RelativeToAbsolutePath = function (relativePath, fullPath) {
 
var absolutePath = '';
 
// get current url
if (fullPath === nullundefined) {
fullPath = window.___location.href;
fullPath = fullPath.replace(/#.*()/, '');
Line 10,093 ⟶ 12,780:
}
 
// ./index.php
if (/^\.\/()/.test(relativePath) === true) {
relativePath = relativePath.replace(/^\.\/()/, '');
fullPath = fullPath.replace(/\/[^\/]*$/, '');
Line 10,100 ⟶ 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,109 ⟶ 12,797:
}
 
// full path
else {
absolutePath = relativePath;
}
return( absolutePath);
};
 
Line 10,119 ⟶ 12,807:
//
// wikEd.SanitizeAttributes: see Sanitizer.php
// wikiCode === true: allow extended set of attributes for existing wikicode
//
 
wikEd.SanitizeAttributes = function (tag, attributes, relaxedwikiCode, errors) {
 
attributes = attributes || '';
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;
if ( ('|compact|'.indexOf(attribCheck) >= 0) && (attribValue === '') ) {
flag = true;
}
}
}
else if ('fundraising|categorytree|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('fundraisinglogo|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 ('imagemap|math|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|alt|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('inputbox|score|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|lang|midi|override_midi|override_ogg|raw vorbis|').indexOf(attribCheck) >= 0) { valid = true; }
}
else if ('timeline'.indexOf(tag) >= 0) {
}
else if ('gallery'.indexOf(tag) >= 0) {
if ((common + '|perrow|widths|heights').indexOf(attrib) >= 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);
};
 
Line 10,372 ⟶ 13,101:
//
// wikEd.RemoveHighlighting: remove syntax highlighting in obj.html; sets obj.htmlCode if text contains html code
// expects <br> instead of \n
 
wikEd.RemoveHighlighting = 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 (wikEd.config.highlightError == true) {
function(p, p1, p2, p3, p4, p5) {
obj.html = obj.html.replace(/<span\b[^>]*?\bclass=\"wikEdHighlightError\"[^>]*>.*?<\/span><!--wikEdHighlightError-->/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);
}
return p1 + p3 + p5;
if (isRemove.pop() == true) {
return('');
}
return(p1);
}
);
 
// 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,500 ⟶ 13,197:
obj.htmlCode = false;
}
 
return;
};
Line 10,509 ⟶ 13,205:
//
 
wikEd.HighlightSyntaxInit = function () {
 
wikEd.parseObj.matchToTag = [''];
wikEd.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,538 ⟶ 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,554 ⟶ 13,251:
['(^\\s*)#REDIRECT(?=\\s*\\[\\[)', 'redirect', 'block'], // redirect
 
['\\[\\[(?=(Image|File|Media|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + ')\\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,566 ⟶ 13,263:
['\\\'{2,}', 'boldItalic', 'multi'], // bold, italic
 
['__(' + wikEd.magicWords + ')__', 'magic', 'block'], // magic words
['~{3,5}', 'signature', 'block'], // signature
['(^|\\n)\\-{4,}', 'hr', 'block'], // hr
Line 10,573 ⟶ 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,580 ⟶ 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
wikEd.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) {
Line 10,603 ⟶ 13,300:
}
 
// create regExp from or-joined parenthesized sub regExps
wikEd.parseObj.regExpTags = new RegExp(regExpStrings.join('|'), 'gi');
 
Line 10,614 ⟶ 13,311:
// existing highlighting must have been removed using wikEd.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,626 ⟶ 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
wikEd.HighlightSyntax = function(obj, noTimeOut) {
 
// start timer to cancel after wikEd.config.maxHighlightTime ms
var highlightStartDate = new Date();
 
// linkify raw watchlist
if (wikEd.watchlistEditeditWatchlist === true) {
obj.html = obj.html.replace(/(.*)/gm,
function (p, p1) {
var ns = '';
var article = p1;
var regExp = new RegExp(/^((.*?):)(.*)$/);
var regExpMatch = regExp.exec(article);
if (regExpMatch !== null) {
ns = regExpMatch[21];
article = regExpMatch[32];
}
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': wikEd.tableMode
};
 
// add root node
parseObj.tree[0] = { 'type': 'root' };
 
// clear array of link addresses and preview image ids
if (obj.whole === true) {
parseObj.whole = true;
wikEd.linkifyArraywikiLinks = [];
wikEd.referenceArray = [];
wikEd.templateArray = [];
Line 10,713 ⟶ 13,407:
}
 
// 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,729 ⟶ 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', wikEd.parseObj.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'));
 
// cycle through text and find tags with a regexp search
wikEd.parseObj.regExpTags.lastIndex = 0;
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) > wikEd.config.maxHighlightTime) {
Line 10,746 ⟶ 13,450:
}
 
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 < wikEd.parseObj.matchToTag.length; i ++) {
if (typeof( parseObj.regExpMatch[i]) != 'undefined') {
 
// get tag information
tag = wikEd.parseObj.matchToTag[i][0];
tagClass = wikEd.parseObj.matchToTag[i][1];
Line 10,769 ⟶ 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(wikEd.parseObj.regExpTags.lastIndex) == ':') {
var regExpMatch = /(https?|ftp|irc|gopher)$/.exec(tagMatch);
if (regExpMatch !== null) {
wikEd.parseObj.regExpTags.lastIndex = wikEd.parseObj.regExpTags.lastIndex - regExpMatch[0].length;
}
Line 10,782 ⟶ 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) {
wikEd.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 = wikEd.config.text['.wikEdErrorCodeInLinkName'];
}
else if (parseObj.lastOpenTag == 'template') {
errorText = wikEd.config.text['.wikEdErrorCodeInTemplName'];
}
else if (parseObj.lastOpenTag == 'parameter') {
errorText = wikEd.config.text['.wikEdErrorCodeInParamName'];
}
wikEd.HighlightMarkLastOpenNode(errorText, parseObj);
Line 10,825 ⟶ 13,544:
}
 
// 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,843 ⟶ 13,562:
break;
 
// bold and italic
case 'boldItalic':
switch (tagLength) {
Line 10,879 ⟶ 13,598:
switch(parseObj.lastOpenTagFiltered) {
case 'bold':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'italic') {
wikEd.HighlightBuildTree('bold', 'close', tagFrom, 3, parseObj);
wikEd.HighlightBuildTree('italic', 'close', tagFrom + 3, 2, parseObj);
Line 10,889 ⟶ 13,608:
break;
case 'italic':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'bold') {
wikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
wikEd.HighlightBuildTree('bold', 'close', tagFrom + 2, 3, parseObj);
Line 10,902 ⟶ 13,621:
wikEd.HighlightTreeRedefine(parseObj.lastOpenNodeFiltered, 'italic', 3, 2, parseObj);
wikEd.HighlightGetLevel(parseObj);
parseObj.lastOpenTag == 'italic';
wikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
wikEd.HighlightBuildTree('bold', 'close', tagFrom + 2, 3, parseObj);
Line 10,912 ⟶ 13,631:
break;
default:
parseObj.tree.push( { 'start': tagFrom, 'tagLength': tagLength, 'type': 'error', 'left': wikEd.config.text['.wikEdErrorBoldItalic'] } );
break;
}
break;
 
// templParam: template or template parameter
case 'paramTempl':
 
// template or parameter
var paramTemplTag = tag;
if (tagLength == 2) {
Line 10,929 ⟶ 13,648:
}
 
// open paramTempl
if (tagClass == 'open') {
wikEd.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) {
Line 10,941 ⟶ 13,660:
}
 
// close paramTempl
else {
 
// no opening tag, delegate error handling
if ( (parseObj.lastOpenNode === 0) || (parseObj.lastOpenNode === null) ) {
wikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
break;
}
varif (openNode === undefined) parseObj.tree[parseObj.lastOpenNodeFiltered];{
if (openNode == null) {
wikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
break;
}
 
// close template or parameter, open and close defined
if (
( (paramTemplTag == 'template') && (parseObj.lastOpenTagFiltered == 'template') ) ||
Line 10,964 ⟶ 13,682:
}
 
// closing defines ambiguous opening
else if (
( (paramTemplTag == 'template') || (paramTemplTag == 'parameter') ) &&
Line 10,971 ⟶ 13,689:
) {
 
// redefine ambiguous opening
wikEd.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,989 ⟶ 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 11,000 ⟶ 13,718:
'tagLength': node.tagLength,
'type': 'error',
'left': 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
wikEd.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;
}
wikEd.HighlightGetLevel(parseObj);
 
// and close innermost tag
wikEd.HighlightBuildTree(paramTemplTag, tagClass, tagFrom, tagLength, parseObj);
}
 
// opening defines ambiguous closing
else if ( (
(openNode.tag == 'template') ||
Line 11,043 ⟶ 13,761:
}
 
// 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': wikEd.config.text['.wikEdErrorTemplParamAmbig']
} );
parseObj.tree.push( {
Line 11,059 ⟶ 13,777:
'tagLength': tagLength,
'type': 'error',
'left': wikEd.config.text['.wikEdErrorTemplParamAmbig']
} );
}
 
// opening and closing do not match
else {
parseObj.tree.push( {
Line 11,069 ⟶ 13,787:
'tagLength': openNode.tagLength,
'type': 'error',
'left': wikEd.config.text['.wikEdErrorTemplParam']
} );
parseObj.tree.push( {
Line 11,075 ⟶ 13,793:
'tagLength': tagLength,
'type': 'error',
'left': wikEd.config.text['.wikEdErrorTemplParam']
} );
}
Line 11,081 ⟶ 13,799:
break;
 
// wikilink
// table single elements
case 'header':
case 'headerSep':
case 'headerParam':
case 'row':
case 'caption':
if (parseObj.lastOpenTagFiltered == 'table') {
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
}
break;
 
// wikilink
case 'link':
wikEd.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) {
wikEd.parseObj.regExpTags.lastIndex = tagFrom + regExpMatch[1].length;
tagMatch = regExpMatch[1];
Line 11,118 ⟶ 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) {
wikEd.parseObj.regExpTags.lastIndex = tagFrom + tagMatchregExpMatch[1].length;
tagMatch = regExpMatch[1];
tagLength = tagMatch.length;
Line 11,135 ⟶ 13,842:
}
 
// urls in tables are interrupted by ||
else if (node.tag == 'table') {
var regExpMatch;
if ( (regExpMatch = /^(.*?)(\}\}|\|)(.*?)$/.exec(tagMatch)) !== null) {
wikEd.parseObj.regExpTags.lastIndex = tagFrom + tagMatchregExpMatch[1].length;
tagMatch = regExpMatch[1];
tagLength = tagMatch.length;
Line 11,150 ⟶ 13,857:
}
 
// dissect external [url text
if (tag == 'external') {
if (tagClass == 'open') {
Line 11,160 ⟶ 13,867:
}
 
// 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,169 ⟶ 13,876:
node = parseObj.tree[node.parent];
}
if ( (node !== null) && (node !== undefined) ) {
if (node.parent !== null) {
wikEd.HighlightBuildTree('externalText', tagClass, tagFrom, 0, parseObj);
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
Line 11,182 ⟶ 13,889:
break;
 
// <html>
case 'html':
var htmlTag = parseObj.regExpMatch[tagMatchParenth + 1].toLowerCase();
if (/^(ref|references|sub|sup|u|s|p|wbr)$/i.test(htmlTag) === true) {
wikEd.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) {
wikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
Line 11,196 ⟶ 13,903:
break;
 
// <html />
case 'htmlEmpty':
var htmlTag = parseObj.regExpMatch[tagMatchParenth + 1].toLowerCase();
if (/^(references|ref|br|p|wbr)$/i.test(htmlTag) === true) {
wikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
Line 11,207 ⟶ 13,914:
break;
 
// |}}: table end or empty template parameter + template end
case 'pipeTemplateEnd':
ifswitch (parseObj.lastOpenTagFiltered == 'table') {
case 'table':
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) {
wikEd.HighlightBuildTree('templateParam', 'block', tagFrom, 1, parseObj);
case 'tableAttrib':
wikEd.HighlightBuildTree('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') {
Line 11,228 ⟶ 14,047:
break;
 
// \n|: table cell, wikilink separator, file parameter separator, redirect separator, empty template parameter
case 'newlinePipe':
switch (parseObj.lastOpenTagFiltered) {
case 'table':
wikEd.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':
Line 11,244 ⟶ 14,095:
wikEd.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':
wikEd.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':
Line 11,268 ⟶ 14,195:
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;
wikEd.HighlightBuildTree('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':
Line 11,281 ⟶ 14,305:
break;
case 'template':
case 'paramTempl':/ //// check later for parameterPiped
wikEd.HighlightBuildTree('templateParam', tagClass, tagFrom, tagLength, parseObj);
break;
Line 11,290 ⟶ 14,314:
break;
 
// list and preformatted (leading space) lines
case 'preform':
 
// ignore template parameters preceeded with newline-spaces
if (parseObj.lastOpenTagFiltered == 'template') {
wikEd.parseObj.regExpTags.lastIndex = tagFrom + tagLengthtagTo - parseObj.regExpMatch[tagMatchParenth + 3].length;
break;
}
// run through, no break
 
case 'list':
 
// highlight line
wikEd.HighlightBuildTree(tag, tagClass, tagFrom, tagLength, parseObj);
 
// highlight tag
wikEd.HighlightBuildTree(tag + 'Tag', tagClass, tagFrom, parseObj.regExpMatch[tagMatchParenth + 2].length, parseObj);
 
// move text pointer after tag
wikEd.parseObj.regExpTags.lastIndex = tagFrom + tagLengthtagTo - parseObj.regExpMatch[tagMatchParenth + 3].length;
break;
 
// newline, old
case 'newline':
wikEd.HighlightBuildTree(tag, 'close', tagFrom, 0, parseObj);
break;
 
// unrecognized tag
default:
parseObj.tree.push( { 'start': tagFrom, 'tagLength': tagLength, 'type': 'error', 'left': 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) ) {
wikEd.HighlightMarkLastOpenNode(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) {
wikEd.HighlightBuildTree(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) {
wikEd.HighlightBuildTree('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) {
wikEd.HighlightBuildTree('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) {
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) {
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) {
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('[' + wikEd.charHighlightingStr + ']', 'g');
while ( (regExpMatch = regExpCharSpaceDashregExpColorDec.exec(obj.html) ) !== null) {
wikEd.HighlightBuildTree('charcolorDec', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
 
// controlsingle character highlighting: spaces, dashes
var regExpCharCtrlregExpCharSpaceDash = new RegExp('[' + wikEd.controlCharHighlightingStrcharHighlightingStr + ']', 'g');
while ( (regExpMatch = regExpCharCtrlregExpCharSpaceDash.exec(obj.html) ) !== null) {
wikEd.HighlightBuildTree('char', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
if (regExpMatch[0].charCodeAt(0) > 2) {
wikEd.HighlightBuildTree('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 (wikEd.charEntitiesByName[ regExpMatch[1] 0].charCodeAt(0) !=> null2) {
wikEd.HighlightBuildTree('charEntityctrl', 'block', regExpMatch.index, regExpMatch[0].length, parseObj);
}
}
}
 
// character entities
// merge wiki syntax in
var regExpCharEntities = /&(\w+);/g;
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 ( (wikEd.config.filePreview === true) && (wikEd.filePreviewRequest !== '') ) {
wikEd.AjaxPreview(wikEd.filePreviewRequest, wikEd.FilePreviewAjaxHandler);
wikEd.filePreviewRequest = '';
}
 
// merge html and plain text
wikEd.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 (wikEd.config.removeHighlightCommentstableMode === 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,428 ⟶ 14,465:
//
 
wikEd.HighlightTreeRedefine = 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,449 ⟶ 14,485:
// connectivity info: parent, firstChild, nextSibling, paired opening/closing (all array indexes)
 
wikEd.HighlightBuildTree = 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,495 ⟶ 14,532:
}
 
// add new block to tree
pushNode = {
parseObj.tree.push( {
'tag': tag,
'start': tagFrom,
Line 11,503 ⟶ 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,517 ⟶ 14,555:
'parent': parseObj.lastOpenNode
};
parseObj.lastOpenNode = parseObj.tree.push(openNodepushNode) - 1;
 
// get new top and second-to-top nodes, ignoring unpaired p tags
wikEd.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': 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,575 ⟶ 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,592 ⟶ 14,633:
(node.tag == 'boldItalic')
) {
wikEd.HighlightMarkLastOpenNode(wikEd.config.text['.wikEdErrorNewline'], parseObj);
wikEd.HighlightGetLevel(parseObj);
}
Line 11,600 ⟶ 14,641:
}
 
// correct piped link
switch (tag) {
case 'link':
Line 11,608 ⟶ 14,649:
break;
 
// correct piped parameter
case 'parameter':
if (parseObj.lastOpenTag == 'parameterPiped') {
Line 11,616 ⟶ 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,632 ⟶ 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 = wikEd.config.text['wikEdErrorNoClose'];
node.parent = null;
}
nodeNo = node.parent;
wikEd.HighlightGetLevel(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': 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,687 ⟶ 14,727:
}
 
// clean out opening heading
if (ignoreHeading === true) {
 
// add headings in template errors to tree
 
// convert opening tag to error
wikEd.HighlightMarkLastOpenNode(wikEd.config.text['.wikEdErrorTemplHeading'], parseObj);
pushNode = {
 
parseObj.tree.push( {
'start': tagFrom,
'tagLength': tagLength,
'type': 'error',
'left': 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
wikEd.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,740 ⟶ 14,791:
//
 
wikEd.HighlightMarkLastOpenNode = function (errorText, parseObj) {
 
var lastOpenNode = parseObj.lastOpenNode;
Line 11,747 ⟶ 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,760 ⟶ 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,769 ⟶ 14,823:
}
return;
};
 
 
//
// wikEd.HighlightMarkNestedErrors: mark child nodes of error nodes with lower priority (table elements)
//
 
wikEd.HighlightMarkNestedErrors = 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;
};
 
 
Line 11,776 ⟶ 14,861:
//
 
wikEd.HighlightGetLevel = function (parseObj) {
 
parseObj.lastOpenTag = null;
Line 11,782 ⟶ 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,789 ⟶ 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,799 ⟶ 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,820 ⟶ 14,906:
//
 
wikEd.HighlightAddHtml = 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,831 ⟶ 14,919:
var tagLength = node.tagLength;
var tagType = node.type;
var pairedTagPospairedPos = node.pairedTagPospairedPos;
var tagTo = tagFrom + tagLength;
var tagMatch = '';
Line 11,844 ⟶ 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,862 ⟶ 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
var pre = regExpMatch[1] || '';
var inter = regExpMatch[2] || '';
var ns = regExpMatch[4] || '';
var article = regExpMatch[7] || '';
var param = regExpMatch[9] || '';
 
if (inter !== '') {
// get interwiki, namespace, article, paramters
if (regExpMatch[1] != null) {
inter = regExpMatch[1];
interClean = inter;
interClean = interClean.replace(/\s/g, ' ');
Line 11,887 ⟶ 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,895 ⟶ 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 (wikEd.pageNamespace !== null) {
if (ns != wikEd.pageNamespace) {
linkClass = 'wikEdLinkCrossNs';
Line 11,913 ⟶ 15,076:
}
 
// 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 != '') {
wikEd.HighlightBuildTree('linkInter', 'block', tagFrom + 2, inter.length, parseObj);
}
 
// highlight namespace
if (ns !== '') {
wikEd.HighlightBuildTree('linkNamespace', 'block', tagFrom + 2 + inter.lengthnsStart, ns.length, parseObj);
}
 
// linkify
var regExpCasing = new RegExp('(^|\\:)' + wikEd.config.text['wikicode Category'] + '(\\:|$)', 'i');
nsClean = nsClean.replace(regExpCasing, '$1' + wikEd.config.text['wikicode Category'] + '$2');
Line 11,941 ⟶ 15,098:
}
}
 
if (nsClean.toLowerCase() == wikEd.config.text['wikicode Category'].toLowerCase() + ':') {
insertLeft = '<span class="wikEdCat"' + follow + '><span class="wikEdLinkTag">';
Line 11,955 ⟶ 15,113:
break;
case 'file':
 
var previewCode = '';
var regExpFile = new RegExp('^\\s*(Image|File|Media|' + wikEd.config.text['wikicode Image'] + '|' + wikEd.config.text['wikicode File'] + '|' + wikEd.config.text['wikicode Media'] + ')\\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];
var filePlainfileName = regExpMatch[1] + ':' + regExpMatch[2].replace(/<.*?>/g, '');
 
// add file preview box
var filePlain = fileTag + ':' + fileName.replace(/<[^>]*>/g, '');
filePlain = filePlain.replace(/ /g,'_');
if (wikEd.config.filePreview === true) {
 
// get image size
// add file preview box
if (wikEd.config.filePreview == true) {
 
// get image size
var filePreviewSize = wikEd.config.filePreviewSize;
var regExpMatch;
if ( (regExpMatch = /\|(\d+)px(\||$)/.exec(innerPlain)) !== null) {
var size = parseInt(regExpMatch[1]);
if ( (size > 0) && (size < wikEd.config.filePreviewSize) ) {
Line 11,982 ⟶ 15,140:
}
 
// get image url and size from cache
var style = '';
var fileObj = wikEd.filePreviewCache['wikEd' + filePlain + 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,997 ⟶ 15,155:
}
 
// get image url and size through an ajax request
else {
style = 'display: none; height: ' + filePreviewSize + 'px; width: ' + filePreviewSize + 'px;';
var fileTagPreview = fileTag;
wikEd.filePreviewRequest += '\n' + filePlain + ' ' + filePreviewSize + ' [[' + file + '|' + filePreviewSize + 'px|' + filePreviewSize + 'x' + filePreviewSize + 'px]]\n';
if ( (fileTag == 'Media') || (fileTag == wikEd.config.text['wikicode Media']) ) {
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' + wikEd.filePreviewNo + '" style="' + style + '" title="' + wikEd.config.text['.wikEdFilePreview'] + ' (' + filePlain + ')"></span><!--wikEdFilePreview-->';
wikEd.filePreviewNo ++;
}
Line 12,013 ⟶ 15,175:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(innerPlain)) !== null) {
url = regExpMatch[0];
}
Line 12,023 ⟶ 15,185:
break;
case 'template':
 
// do not hide templates if it has no parameters or if it shorter than wikEd.config.templNoHideLength chars
if ( (innerPlain.indexOf('|') == -1) || (innerPlain.length < wikEd.config.templNoHideLength) ) {
node.noHide = true;
}
var mod = '';
var inter = '';
Line 12,037 ⟶ 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*((' + wikEd.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 12,060 ⟶ 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 == '') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariables + wikEd.parserVariablesR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(template)) != null) {
parserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.length, parseObj);
}
Line 12,077 ⟶ 15,235:
}
 
// {{VARIABLE:R}}
if (parserVarisParserVar === false) {
if ( (ns !== '') && (template == 'R') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariablesR + ')$', '');
var regExpMatchParserVar;
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1))) != null) {
if ( (regExpMatchParserVar = regExpParserVar.exec(parserVar)) !== null) true;{
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,088 ⟶ 15,247:
}
 
// {{FUNCTION:param|R}}
if (parserVarisParserVar === false) {
if ( (ns !== '') && ( (param === '') || (param == 'R') ) ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctionsR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,099 ⟶ 15,258:
}
 
// {{function:param|param}}
if (parserVarisParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctions + ')$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,110 ⟶ 15,269:
}
 
// {{#function:param|param}}
if (parserVarisParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(#(' + wikEd.parserFunctionsHash + '))$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) !== null) {
 
parserVar = true;
// #property: linkify wikibase template (wikidata)
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);
}
Line 12,121 ⟶ 15,312:
}
 
// highlight template
if (parserVarisParserVar === false) {
 
// highlight modifier
if (mod !== '') {
wikEd.HighlightBuildTree('templateModifier', 'block', tagFrom + 2, mod.length, parseObj);
}
 
// highlight namespace
if (ns !== '') {
wikEd.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 = wikEd.config.text['wikicode Template'] + ':';
}
Line 12,148 ⟶ 15,339:
}
}
var hideStyle = '';
var hideClass = 'wikEdTempl';
if ( (template !== '') && (parserVarisParserVar === false) && (node.noHide != true) ) {
if (wikEd.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 + wikEd.templateArray.length + '" style="' + hideButtonStyle + '" title="' + wikEd.config.text['.wikEdTemplButtonTooltip'] + '"></button><!--wikEdTemplButton--></span><!--wikEdTemplContainer-->';
wikEd.templateArray.push( {'text': template, 'added': false} );
}
}
insertLeft += '<span class="' + hideClass + '"' + hideStyle + '><span class="wikEdTemplTag">';
insertRight = '</span><!--wikEdTemplTag--><span class="wikEdTemplName"' + follow + '>';
break;
Line 12,189 ⟶ 15,376:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 12,208 ⟶ 15,395:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,217 ⟶ 15,406:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtml"><span class="wikEdHtmlTag">';
Line 12,240 ⟶ 15,429:
break;
case 'p':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEd.config.text['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,247 ⟶ 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] || '';
wikEd.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];
wikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
if (wikEd.refHide === true) {
if (refName !== '') {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton' + wikEd.referenceArray.length + '" title="' + wikEd.config.text['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
wikEd.referenceArray.push( {'text': refName, 'added': false} );
}
else {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton" title="' + wikEd.config.text['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
}
}
Line 12,283 ⟶ 15,472:
case 'heading':
var heading = innerPlain.replace(/^\s+|\s+$/g, '');
if ( (heading == wikEd.config.text['See also']) || (heading == wikEd.config.text['.References']) || (heading == wikEd.config.text['External links']) ) {
insertLeft = '<span class="wikEdHeadingWP">';
}
Line 12,290 ⟶ 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,377 ⟶ 15,684:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 12,396 ⟶ 15,703:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,405 ⟶ 15,714:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtmlTag">';
Line 12,428 ⟶ 15,737:
break;
case 'p':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEd.config.text['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,442 ⟶ 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,469 ⟶ 15,915:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(tagMatch)) !== null) {
url = regExpMatch[0];
}
Line 12,494 ⟶ 15,940:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d+/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0];
}
insertLeft = '<span class="wikEdPMID" ' + wikEd.HighlightLinkify('', '', 'http://www.ncbi.nlm.nih.gov/pubmed/' + idNumber) + '>';
insertRight = '</span><!--wikEdPMID-->';
break;
Line 12,503 ⟶ 15,949:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d[\s\d\-]+x?/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0].replace(/\D/g, '');
}
Line 12,512 ⟶ 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" ' + wikEd.HighlightLinkify('', '', 'http://tools.ietf.org/html/rfc' + idNumber) + '>';
pushRight = '</span><!--wikEdISBN-->';
break;
Line 12,537 ⟶ 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,563 ⟶ 16,009:
insertRight = '</span><!--wikEdTemplTag--><span class="wikEdParamDefault">';
break;
case 'brvoid'://inlineTag class
case 'html':
case 'htmlEmpty':
Line 12,570 ⟶ 16,016:
break;
case 'htmlUnknown':
insertLeft = '<span class="wikEdHtmlUnknown" title="' + wikEd.config.text['.wikEdErrorHtmlUnknown'] + '">';
pushRight = '</span><!--wikEdHtmlUnknown-->';
break;
Line 12,576 ⟶ 16,022:
var refName = '';
var regExpMatch;
if ( (regExpMatch = /(\bname\s*=\s*(\'|\"))([^\x01]+?)\2/i.exec(tagMatch)) !== null) {
refName = regExpMatch[3];
wikEd.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];
wikEd.HighlightBuildTree('refName', 'block', tagFrom + regExpMatch.index + regExpMatch[1].length, regExpMatch[2].length, parseObj);
}
if (wikEd.refHide === true) {
if (refName !== '') {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton' + wikEd.referenceArray.length + '" title="' + wikEd.config.text['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
wikEd.referenceArray.push( {'text': refName + ' ↑', 'added': false} );
}
else {
insertLeft = '<span class="wikEdRefContainer"><button class="wikEdRefButton" title="' + wikEd.config.text['.wikEdRefButtonTooltip'] + '"></button><!--wikEdRefButton--></span><!--wikEdRefContainer-->';
}
}
Line 12,607 ⟶ 16,053:
insertLeft = '<span class="wikEdMath">';
pushRight = '</span><!--wikEdMath-->';
break;
case 'score':
insertLeft = '<span class="wikEdScore">';
pushRight = '</span><!--wikEdScore-->';
break;
case 'nowiki':
Line 12,631 ⟶ 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,730 ⟶ 16,140:
break;
case 'char':
var titleClasscharName = wikEd.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 = wikEd.charEntitiesByName[ regExpMatch[1] ];
if (character !== nullundefined) {
if (wikEd.refHide === true) {
insertLeft = '<span class="wikEdCharEntityContainer"><button class="wikEdCharEntityButton' + wikEd.charEntityArray.length + '" title="' + wikEd.config.text['.wikEdCharEntityButtonTooltip'] + '"></button><!--wikEdCharEntityButton--></span><!--wikEdCharEntityContainer-->';
wikEd.charEntityArray.push( {'text': character, 'added': false} );
}
Line 12,748 ⟶ 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 (wikEd.config.highlightError === true) {
insertLeft += '<span class="wikEdHighlightError">' + node.left + '</span><!--wikEdHighlightError-->';
}
Line 12,762 ⟶ 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,803 ⟶ 16,220:
//
 
wikEd.HighlightMergeHtml = function (parseObj, obj) {
 
if (parseObj.tree.length <= 1) {
Line 12,809 ⟶ 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,841 ⟶ 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,871 ⟶ 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,882 ⟶ 16,299:
 
//
// wikEd.HighlightLinkify: prepare the span tag parameters for ctrl-click opening of highlighted links, addding redirect info, and highlighting redlinks
//
 
wikEd.HighlightLinkify = function (linkPrefix, linkTitle, linkUrl) {
 
if (wikEd.config.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);
 
// remove control chars
var regExp = new RegExp('[' + wikEd.controlCharHighlightingStr + '\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, '_');
 
linkName = linkPrefix + linkTitle;
link = linkName;
 
// character accentuation for Esperanto, see [[Help:Special_characters#Esperanto]]
if (wikEd.wikiGlobals.wgContentLanguage == 'eo') {
linkTitle = linkTitle.replace(/([cghjsu])(x+)/gi,
function (p, p1, p2) {
var accentChar = p1;
var xString = p2;
Line 12,939 ⟶ 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 + wikEd.pageName + linkTitle;
}
Line 12,956 ⟶ 16,356:
linkUrl = linkPrefix + linkTitle;
}
linkUrl = encodeURIwikEd.EncodeTitle(linkUrl);
if (typeof wikEd.config.linkifyArticlePath == 'string') {
linkUrl = linkUrl.replace(/%25(\d\d)/g, '%$1');
linkUrl = linkUrlwikEd.config.linkifyArticlePath.replace(/\'$1/g, '%27'linkUrl);
linkUrl = linkUrl.replace(/#/g, '%23');
if (wikEd.config.LinkifyArticlePath != null) {
linkUrl = wikEd.config.LinkifyArticlePath.replace(/\$1/, linkUrl);
}
else if (typeof wikEd.wikiGlobals.wgArticlePath !== null'string') {
linkUrl = wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, linkUrl);
}
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] = {
update: true,
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 = wikEd.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 (wikEd.platform == 'mac') {
titleClick = wikEd.config.text['.followLinkMac'];
}
else {
titleClick = wikEd.config.text['.followLink'];
}
var id = 'wikEdWikiLink' + Object.getOwnPropertyNames(wikEd.wikiLinks).length;
linkParam += 'id="wikEdLinkify' + wikEd.linkifyArray.length + '" title="' + linkPopup + ' ' + titleClick + '"';
var linkify = linkPopup + ' ' + titleClick;
wikEd.linkifyArray.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.UpdateTextareaCleanLink: copyclean frameand contentnormalize toarticle textareatitle
//
 
wikEd.UpdateTextareaCleanLink = function (link) {
 
// remove highlighting code
// remove dynamically inserted nodes by other scripts
link = link.replace(/<[^>]*>/g, '');
wikEd.CleanNodes(wikEd.frameDocument);
 
// 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 = wikEd.frameBody.innerHTML;
obj.html = text;
}
 
// get frame content, remove dynamically inserted nodes by other scripts
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
wikEd.Textify(obj);
obj.plain = obj.plain.replace(/&nbsp;|&#160;|\xa0/g, ' ');
Line 13,032 ⟶ 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) {
obj.plain = obj.plain.replace(/&nbsp;/g, '\xa0');
}
 
// copy to textarea
wikEd.textarea.value = obj.plain;
 
// remember frame scroll position
wikEd.frameScrollTop = wikEd.frameBody.scrollTop;
 
Line 13,043 ⟶ 16,549:
 
//
// wikEd.UpdateFrame: copy textarea content or provided html to frame
//
 
wikEd.UpdateFrame = function (html) {
 
// get textarea content
var obj = {};
if (html !== undefined) {
obj.html = wikEd.textarea.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 (wikEd.highlightSyntax === true) {
obj.whole = true;
wikEd.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 13,075 ⟶ 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 (wikEd.msie == true) {
 
}
else {
obj.sel = wikEd.GetSelection();
wikEd.RemoveAllRanges(obj.sel);
}
 
// insert content into empty frame
if ( (wikEd.frameBody.firstChild == null) || (/^<br[^>]*>\s*$/.test(wikEd.frameBody.innerHTML) == true) ) {
wikEd.frameBody.innerHTML = obj.html;
}
 
// insert content into frame, preserve history
else {
obj.sel = wikEd.GetSelection();
obj.sel.removeAllRanges();
var range = wikEd.frameDocument.createRange();
range.setStartBefore(wikEd.frameBody.firstChild);
Line 13,099 ⟶ 16,601:
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 !== '') {
wikEd.FrameExecCommandframeDocument.execCommand('inserthtml', false, obj.html);
}
else {
wikEd.FrameExecCommandframeDocument.execCommand('delete');
}
window.scroll(0, scrollOffset);
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
 
// scroll to previous position
if (wikEd.frameScrollTop !== null) {
wikEd.frameBody.scrollTop = wikEd.frameScrollTop;
}
Line 13,117 ⟶ 16,619:
wikEd.frameScrollTop = null;
 
// add event handlers and labels
if (wikEd.highlightSyntax === true) {
 
// name ref and template buttons
wikEd.HighlightNamedHideButtons();
 
// add event handlers to unhide refs and templates
wikEd.HideAddHandlers();
 
// add event handlers to make highlighted frame links ctrl-clickable
wikEd.LinkifyAddHandlersLinkifyLinks();
 
// get link infos from server (redirects, redlinks)
wikEd.LinkInfoCall();
}
return;
};
 
 
//
// wikEd.HtmlToPlain: convert html to plain text, called from wikEd.GetText
//
 
wikEd.HtmlToPlain = function (obj) {
 
obj.plain = obj.html.replace(/[\n ]{2,}/g, ' ');
obj.plain = obj.plain.replace(/<br\b[^>]*>/g, '\n');
obj.plain = obj.plain.replace(/\xa0/g, ' ');
 
return;
Line 13,139 ⟶ 16,657:
//
 
wikEd.KeyHandler = function (event) {
 
// trap enter in find/replace input elements
// event compatibility fixes
if ( (event.type == wikEd.EventWrapper'keydown') && (event,.keyCode this== 13); ) {
if (event.target.id == null'wikEdFindText') {
event.preventDefault();
return;
event.stopPropagation();
}
if (event.shiftKey === true) {
 
wikEd.EditButton(null, 'wikEdFindPrev');
if (wikEd.useWikEd == 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) {
wikEd.EditButton(null, 'wikEdFindPrev');
}
else if (event.ctrlKey == true) {
wikEd.EditButton(null, 'wikEdFindAll');
}
else {
wikEd.EditButton(null, 'wikEdFindNext');
}
}
else if (event.target.idctrlKey === 'wikEdReplaceText'true) {
wikEd.EditButton(null, 'wikEdFindAll');
event.preventDefault();
}
event.stopPropagation();
else {
if (event.shiftKey == true) {
wikEd.EditButton(null, 'wikEdReplacePrevwikEdFindNext');
}
else if (event.ctrlKey == true) {
wikEd.EditButton(null, 'wikEdReplaceAll');
}
else {
wikEd.EditButton(null, 'wikEdReplaceNext');
}
}
}
else if (event.target.id == 'wikEdReplaceText') {
 
event.preventDefault();
// detect emulated accesskeys
event.stopPropagation();
else if ( (event.shiftKey == true) && (event.ctrlKey == false) && (event.altKey == true) && (event.metaKey == false) ) {
if (event.shiftKey === true) {
 
wikEd.EditButton(null, 'wikEdReplacePrev');
// get wikEd button id from keycode
}
var buttonId = wikEd.buttonKeyCode[event.keyCode];
else if (buttonIdevent.ctrlKey !=== nulltrue) {
wikEd.EditButton(null, 'wikEdReplaceAll');
event.preventDefault();
}
event.stopPropagation();
else {
 
wikEd.EditButton(null, 'wikEdReplaceNext');
// execute the button click handler code
var obj = document.getElementById(buttonId);
objId = obj.id;
eval(wikEd.editButtonHandler[buttonId]);
}
}
}
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];
// wikEd.FrameExecCommand: wrapper for execCommand method
if (buttonId !== undefined) {
//
event.preventDefault();
event.stopPropagation();
 
// execute the button click handler code, obj required for eval
wikEd.FrameExecCommand = function(command, option) {
var obj = document.getElementById(buttonId);
 
eval(wikEd.editButtonHandler[buttonId]);
if (typeof(wikEd.frameDocument.execCommand) == 'function') {
return;
wikEd.frameDocument.execCommand(command, false, option);
}
 
// MSIE workaround, breaks the undo history
else if (command == 'inserthtml') {
wikEd.frameDocument.selection.createRange().pasteHTML(option);
}
return;
Line 13,221 ⟶ 16,712:
//
 
wikEd.FindAhead = function () {
 
if (wikEd.GetAttribute(wikEd.findAhead, .getAttribute('checked') == 'true') {
 
// get the find text
var findText = wikEd.findText.value;
if (findText === '') {
return;
}
 
// remember input field selection
var findTextSelectionStart = wikEd.findText.selectionStart;
var findTextSelectionEnd = wikEd.findText.selectionEnd;
 
// remember frame selection
var sel = wikEd.GetSelection();
var range = sel.getRangeAt(sel.rangeCount - 10).cloneRange();
var rangeClone = range.cloneRange();
var scrollTop = wikEd.frameBody.scrollTop;
 
// collapse selection to the left
wikEdsel.RemoveAllRangesremoveAllRanges(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 replaceTextregExpChecked = wikEd.inputElement[regExp.getAttribute('replacechecked'].value);
var caseSensitiveChecked = wikEd.caseSensitive.getAttribute('checked');
 
// get insensitive and regexp button states
var regExpChecked = wikEd.GetAttribute(wikEd.regExp, 'checked');
var caseSensitiveChecked = wikEd.GetAttribute(wikEd.caseSensitive, 'checked');
 
// get case sensitive setting
var caseSensitive = false;
if (caseSensitiveChecked == 'true') {
Line 13,262 ⟶ 16,750:
}
 
// get regexp setting
var useRegExp = false;
if (regExpChecked == 'true') {
Line 13,268 ⟶ 16,756:
}
 
// parameters: obj, findText, caseSensitive, backwards, wrap, useRegExp
var found = wikEd.Find(obj, findText, caseSensitive, false, true, useRegExp);
 
// restore original frame selection
if (found === false) {
wikEd.frameBody.scrollTop = scrollTop;
wikEdsel.RemoveAllRangesremoveAllRanges(sel);
sel.addRange(rangeClone);
}
else {
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// scroll to selection
wikEd.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)
wikEd.findText.select();
wikEd.findText.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;
};
 
 
//
// wikEd.GetDebugInfo: compiles debug info into string
//
 
wikEd.GetDebugInfo = function (extended) {
 
var loader = '';
var mediawiki = '';
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;
};
 
Line 13,298 ⟶ 16,916:
//
 
wikEd.MainSwitch = function (event) {
 
// ctrl-click for debug info
// disable function if browser is incompatible
if (wikEdevent.browserNotSupportedctrlKey === true) {
return;
}
 
// disable function if browser is incompatible
// enable wikEd
if (wikEd.disabledbrowserNotSupported === true) {
return;
}
 
// enable wikEd
if (wikEd.disabled === true) {
 
// check for active code editor
wikEd.CodeEditorCheck();
 
// 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);
}
Line 13,319 ⟶ 16,953:
wikEd.SetLogo();
var useWikEd = false;
if (wikEd.GetAttribute(document.getElementById('wikEdUseWikEd'), .getAttribute('checked') == 'true') {
useWikEd = true;
}
wikEd.SetEditArea(useWikEd);
wikEd.useWikEd = useWikEd;
ifwindow.wikEdUseWikEd = (wikEd.useWikEd == true) {;
if (wikEd.useWikEd === true) {
wikEd.UpdateFrame();
}
wikEd.buttonBarWrapper.style.display = 'block';
wikEd.buttonBarPreview.style.display = 'block';
if (wikEd.buttonBarJump !== null) {
wikEd.buttonBarJump.style.display = 'block';
}
 
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.onHook);
}
}
 
// disable wikEd
else {
wikEd.SetPersistent('wikEdDisabled', '1', 0, '/');
if (wikEd.turnedOn === false) {
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.disabled = true;
wikEd.SetLogo();
}
else {
 
if (wikEd.fullScreenMode == true) {
// interrupt fullscreen mode
if (wikEd.fullscreen === true) {
wikEd.FullScreen(false);
}
 
// turn classic textarea on
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
}
wikEd.SetEditArea(false);
 
// reset textarea dimensions
wikEd.textarea.style.height = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.textarea.style.width = '100%';
Line 13,368 ⟶ 17,006:
wikEd.buttonBarWrapper.style.display = 'none';
wikEd.buttonBarPreview.style.display = 'none';
 
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'none';
wikEd.localPrevWrapper.style.display = 'none';
wikEd.previewBoxlocalPrevWrapper.style.height = 'auto';
 
if (wikEd.buttonBarJump != null) {
if (wikEd.buttonBarJump !== null) {
wikEd.buttonBarJump.style.display = 'none';
}
 
wikEd.useWikEd = false;
window.wikEdUseWikEd = wikEd.useWikEd;
wikEd.disabled = true;
wikEd.SetLogo();
 
// run scheduled custom functions
wikEd.ExecuteHook(wikEd.config.offHook);
}
Line 13,390 ⟶ 17,033:
//
 
wikEd.FullScreen = function (fullscreen, notFrameupdateButton) {
 
// resize only
// hide or show elements
if (fullscreen === undefined) {
var displayStyle;
if ( fullscreen == true) {wikEd.fullscreen;
displayStyle = 'none';
}
 
else {
// no fullscreen for special edit pages
displayStyle = 'block';
if (wikEd.editArticle === false) {
fullscreen = false;
updateButton = false;
}
 
// no fullscreen for textarea view
// elements above input wrapper
if (wikEd.useWikEd === 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;
 
// divsskip belowfor inputrepeat wrappercalls
varif node(fullscreen != wikEd.inputWrapper.nextSibling;fullscreen) {
 
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
// divs below input wrapper, some levels up
if (fullscreen === true) {
var node = document.getElementById('column-one');
document.body.classList.add('wikEdFullscreen');
while (node != null) {
 
if (node.nodeName == 'DIV') {
// inactivate scroll-to buttons
node.style.display = displayStyle;
document.getElementById('wikEdScrollToPreview').className = 'wikEdButtonInactive';
document.getElementById('wikEdScrollToEdit').className = 'wikEdButtonInactive';
}
node = node.nextSibling;
}
 
// back to normal
// insert wrapper
else {
document.getElementById('wikEdInsertWrapper').style.display = displayStyle;
document.body.classList.remove('wikEdFullscreen');
 
// activate scroll-to buttons
// change styles
document.getElementById('wikEdScrollToPreview').className = 'wikEdButton';
if (fullscreen == true) {
document.getElementById('wikEdScrollToEdit').className = 'wikEdButton';
if (notFrame != true) {
wikEd.inputWrapper.className = 'wikEdInputWrapperFull';
}
wikEd.buttonBarPreview.className = 'wikEdButtonBarPreviewFull';
}
else {
if (notFrame != true) {
wikEd.inputWrapper.className = 'wikEdInputWrapper';
}
wikEd.buttonBarPreview.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
wikEd.RemoveEventListener(wikEd.frameDocument, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.RemoveEventListener(document, 'mouseup', wikEd.ResizeStopHandler, true);
wikEd.RemoveEventListener(wikEd.frameDocument, 'mousemove', wikEd.ResizeDragHandlerFrame, true);
wikEd.RemoveEventListener(document, 'mousemove', wikEd.ResizeDragHandlerDocument, true);
wikEd.resizeFrameMouseOverGrip = false;
wikEd.RemoveEventListener(wikEd.frameDocument, 'mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'auto';
wikEd.resizeFrameActive = false;
 
var consoleTop = wikEd.GetOffsetTop(wikEd.consoleWrapper);
var consoleHeight = wikEd.consoleWrapper.offsetHeight;
var frameHeight = wikEd.frame.offsetHeight;
var windowHeight = wikEd.GetWindowInnerHeight();
 
wikEd.frame.style.height = (frameHeight + (windowHeight - (consoleTop + consoleHeight) ) - 2) + 'px';
wikEd.frame.style.width = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
}
else {
if (wikEd.frameHeight == 0) {
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
}
wikEd.frame.style.height = wikEd.frameHeight;
wikEd.frame.style.width = wikEd.frameWidth;
}
 
// resize and scroll to edit-frame
wikEd.ResizeWindowHandler();
if (fullscreen == false) {
if ( (switched === true) && (fullscreen === false) ) {
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper) - 2);
}
 
// setgrey theout fullscreen button state
wikEd.Button(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
wikEd.ResizeSummary();
 
wikEd.fullScreenMode = fullscreen;
 
return;
Line 13,510 ⟶ 17,115:
//
 
wikEd.ResizeSummary = function () {
 
// check if combo field exists
if (wikEd.summarySelect === null) {
return;
}
Line 13,531 ⟶ 17,136:
 
//
// wikEd.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
//
 
wikEd.ResizeComboInput = function (field) {
 
// check if combo field exists
if (wikEd.selectElement[field] === nullundefined) {
return;
}
 
// short names
// detect browser for MS IE fixes
var input = wikEd.inputElement[field];
var standardBrowser = true;
ifvar select = (wikEd.selectElement[field].options.offsetWidth != null ) {;
standardBrowser = false;
}
 
// setsave select heightoptions and topempty select
var selectInnerHTML = select.innerHTML;
if (standardBrowser == false) {
select.innerHTML = '';
wikEd.selectElement[field].style.height = (wikEd.inputElement[field].clientHeight + 6) + 'px';
wikEd.selectElement[field].style.top = '3px';
wikEd.inputElement[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 (wikEd.selectElement[field].options.length == 0) {
testOption = 0;
wikEd.selectElement[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 < wikEd.selectElement[field].options.length; i ++) {
var selectBorder = parseInt(wikEd.GetStyle(select, 'borderTopWidth'), 10);
wikEd.selectElement[field].options[i].style.width = '0';
var buttonWidth = selectWidth - selectBorder - 8;
}
}
 
// delete measuring styles
// get input width
select.style.margin = null;
var inputBorder = (wikEd.inputElement[field].offsetWidth - wikEd.inputElement[field].clientWidth);
input.style.fontFamily = null;
var inputWidthInner = wikEd.inputElement[field].clientWidth;
select.style.fontFamily = null;
var inputWidthOuter = wikEd.inputElement[field].offsetWidth;
 
// getfor selectlong fields shorten input width
if (inputWidth + buttonWidth > 150) {
var selectWidthInner = wikEd.selectElement[field].clientWidth;
input.style.width = (inputWidth - buttonWidth) + 'px';
var selectWidthOuter = wikEd.selectElement[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(wikEd.selectElement[field].options[testOption].clientLeft) == 'undefined' ) {
optionWidthInner = wikEd.selectElement[field].options[testOption].clientWidth;
buttonWidth = selectWidthInner - optionWidthInner - 6;
}
 
// Firefox >= 3.0
else {
optionWidthInner = wikEd.selectElement[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) {
wikEd.inputElement[field].style.width = (inputWidthInner - inputBorder - buttonWidth) + 'px';
wikEd.selectElement[field].style.width = (inputWidthInner) + 'px';
}
 
// otherwise increase select width
else {
wikEd.selectElement[field]select.style.width = (inputWidthOuterinputWidth + buttonWidth) + 'px';
}
 
// restore select options
// delete dummy option
select.innerHTML = selectInnerHTML;
if (dummy == true) {
wikEd.selectElement[field].options[0] = null;
}
 
// set option widths to auto
if (standardBrowser == true) {
for (var i = 0; i < wikEd.selectElement[field].options.length; i ++) {
wikEd.selectElement[field].options[i].style.width = 'auto';
}
}
return;
};
Line 13,634 ⟶ 17,193:
//
 
wikEd.ChangeComboInput = function (field) {
 
// get selection index (-1 for unselected)
var selected = wikEd.selectElement[field].selectedIndex;
if (selected >= 0) {
wikEd.selectElement[field].selectedIndex = -1;
 
// get selected option
var option = wikEd.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 = wikEd.Find(obj, findText, true, false, true, true);
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(obj.changed.range);
 
// and scroll it into the viewport
wikEd.ScrollToSelection();
return;
}
 
// update input field
else {
 
// add a tag to the summary box
if (field == 'summary') {
wikEd.inputElement[field].value = wikEd.AppendToSummary(wikEd.inputElement[field].value, option.text);
}
 
// add case and regexp checkboxes to find / replace fields
else if (option.value == 'setcheck') {
wikEd.Button(document.getElementById('wikEdCaseSensitive'), 'wikEdCaseSensitive', null, (option.text.charAt(0) == wikEd.checkMarker[true]) );
Line 13,676 ⟶ 17,235:
}
 
// add option text
else {
wikEd.inputElement[field].value = option.text;
}
 
// find the new text
if ( (field == 'find') && (wikEd.GetAttribute(wikEd.findAhead, .getAttribute('checked') == 'true') ) {
wikEd.FindAhead();
}
Line 13,698 ⟶ 17,257:
//
 
wikEd.AppendToSummary = 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);
};
 
Line 13,726 ⟶ 17,288:
//
 
wikEd.AddToHistory = function (field) {
 
if (wikEd.inputElement[field].value !== '') {
 
// load history from saved settings
wikEd.LoadHistoryFromSettings(field);
 
// add current value to history
wikEd.fieldHist[field].unshift(wikEd.inputElement[field].value);
 
// add case and regexp checkboxes to find / replace value
if ( (field == 'find') || (field == 'replace') ) {
wikEd.fieldHist[field][0] =
wikEd.checkMarker[ (wikEd.GetAttribute(wikEd.caseSensitive, .getAttribute('checked') == 'true') ] +
wikEd.checkMarker[ (wikEd.GetAttribute(wikEd.regExp, .getAttribute('checked') == 'true') ] +
' ' + wikEd.fieldHist[field][0];
}
 
// remove paragraph names from summary
if (field == 'summary') {
wikEd.fieldHist[field][0] = wikEd.fieldHist[field][0].replace(/^\/\* .*? \*\/ *()/, '');
}
 
// remove multiple old copies from history
var i = 1;
while (i < wikEd.fieldHist[field].length) {
Line 13,760 ⟶ 17,322:
}
 
// remove new value if it is a preset value
if (wikEd.config.comboPresetOptions[field] !== nullundefined) {
var i = 0;
while (i < wikEd.config.comboPresetOptions[field].length) {
Line 13,774 ⟶ 17,336:
}
 
// cut history number to maximal history length
wikEd.fieldHist[field] = wikEd.fieldHist[field].slice(0, wikEd.config.historyLength[field]);
 
// save history to settings
if (wikEd.fieldHist[field][0] !== '') {
wikEd.SaveHistoryToSetting(field);
}
Line 13,790 ⟶ 17,352:
//
 
wikEd.SetComboOptions = function (field) {
 
// load history from saved settings
wikEd.LoadHistoryFromSettings(field);
 
Line 13,798 ⟶ 17,360:
var selectedOption = null;
 
// delete options
var options = wikEd.selectElement[field].options;
for (var i = 0; i < options.length; i ++) {
Line 13,804 ⟶ 17,366:
}
 
// delete optgroup
option = document.getElementById(field + 'Optgroup');
if (option !== null) {
wikEd.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;
wikEd.selectElement[field].options[j++] = option;
 
// add history entries
for (var i = 0; i < wikEd.fieldHist[field].length; i ++) {
if (wikEd.fieldHist[field][i] !== nullundefined) {
if (wikEd.fieldHist[field][i] == wikEd.inputElement[field].value) {
selectedOption = j;
Line 13,824 ⟶ 17,386:
option = document.createElement('option');
 
// replace spaces with nbsp to allow for multiple, leading, and trailing spaces
option.text = wikEd.fieldHist[field][i].replace(/ /g, '\xa0');
if ( (field == 'find') || (field == 'replace') ) {
Line 13,833 ⟶ 17,395:
}
 
// add preset entries
var startPreset = 0;
if (wikEd.config.comboPresetOptions[field] !== nullundefined) {
startPreset = j;
for (var i = 0; i < wikEd.config.comboPresetOptions[field].length; i ++) {
if (wikEd.config.comboPresetOptions[field][i] !== nullundefined) {
 
// replace spaces with nbsp to allow for multiple, leading, and trailing spaces
wikEd.config.comboPresetOptions[field][i] = wikEd.config.comboPresetOptions[field][i].replace(/ /g, '\xa0');
 
// select a dropdown value
if (wikEd.config.comboPresetOptions[field][i] == wikEd.inputElement[field].value) {
selectedOption = j;
Line 13,858 ⟶ 17,420:
}
 
// set the selection
wikEd.selectElement[field].selectedIndex = selectedOption;
 
// add a blank preset separator
if ( (startPreset > 1) && (startPreset < j) ) {
option = document.createElement('optgroup');
Line 13,869 ⟶ 17,431:
}
 
// add the TOC jumper to the find field
var startTOC = 0;
if (field == 'find') {
startTOC = j;
 
// get the whole plain text
var plain = wikEd.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,883 ⟶ 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];
Line 13,901 ⟶ 17,463:
}
 
// add a blank TOC separator
if ( (startTOC > 1) && (startTOC < j) ) {
option = document.createElement('optgroup');
Line 13,917 ⟶ 17,479:
//
 
wikEd.ClearHistory = function (field) {
 
wikEd.SetPersistent(wikEd.savedName[field], '', 0, '/');
wikEd.SetComboOptions(field);
Line 13,928 ⟶ 17,491:
//
 
wikEd.LoadHistoryFromSettings = function (field) {
 
var setting = wikEd.GetPersistent(wikEd.savedName[field]);
if ( (setting !== null) && (setting !== '') ) {
setting = decodeURIComponent(setting);
wikEd.fieldHist[field] = setting.split('\n');
Line 13,945 ⟶ 17,509:
//
 
wikEd.SaveHistoryToSetting = function (field) {
 
var setting = '';
Line 13,957 ⟶ 17,521:
 
//
// wikEd.GetSelection: cross-browser method to get the current iframe selection
//
 
wikEd.GetSelection = function () {
 
var sel = wikEd.frameWindow.getSelection();
// standard
var sel;
if (typeof(wikEd.frameWindow.getSelection) == 'function') {
sel = wikEd.frameWindow.getSelection();
}
 
// make sure there is at least an empty range
// MS IE compatibility
if ( (sel !== null) && (sel.rangeCount === 0) ) {
else if (typeof(wikEd.frameDocument.selection) == 'object') {
sel = wikEd.frameDocument.selection;
}
 
// make sure there is at least an empty range
if (sel.rangeCount == 0) {
sel.collapse(wikEd.frameBody, 0);
}
return sel;
 
return(sel);
};
 
 
//
// wikEd.SetRange: set a range, control for non-text nodes
// wikEd.ClearSelection: cross-browser method to clear the currently selected text
//
 
wikEd.RemoveAllRangesSetRange = function (selrange, startNode, startOffset, endNode, endOffset) {
 
if (typeof(sel.removeAllRanges) == 'function') {
sel.removeAllRanges();
}
 
// MS IE compatibility
else if (typeof(sel.empty) == 'function') {
sel.empty();
}
return;
};
 
 
//
// wikEd.SetRange: set a range, control for non-text nodes (Opera 10.50 beta bug)
//
 
wikEd.SetRange = function(range, startNode, startOffset, endNode, endOffset) {
 
wikEd.SetRangeStart(range, startNode, startOffset);
Line 14,016 ⟶ 17,552:
//
 
wikEd.SetRangeStart = function (range, startNode, startOffset) {
 
if ( (startNode.childNodes.length > 0) && (startOffset < startNode.childNodes.length) ) {
Line 14,024 ⟶ 17,560:
if (startNode.nodeName == '#text') {
range.setStart(startNode, startOffset);
}
else if (startNode.childNodes.length === 0) {
range.setStart(startNode, 0);
}
else {
Line 14,036 ⟶ 17,575:
//
 
wikEd.SetRangeEnd = function (range, endNode, endOffset) {
 
if ( (endNode.childNodes.length > 0) && (endOffset < endNode.childNodes.length) ) {
Line 14,044 ⟶ 17,583:
if (endNode.nodeName == '#text') {
range.setEnd(endNode, endOffset);
}
else if (endNode.childNodes.length === 0) {
range.setEndBefore(endNode);
}
else {
Line 14,053 ⟶ 17,595:
 
//
// wikEd.GetSavedSetting: get a wikEd setting, returns boolean
//
 
wikEd.GetSavedSetting = function (settingName, preset) {
 
var setting = wikEd.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);
};
 
Line 14,076 ⟶ 17,620:
//
 
wikEd.GetPersistent = function (name) {
 
var getStr = '';
 
// check for web storage
wikEd.DetectWebStorage();
if (wikEd.wikiGlobals.wikEdTypeofLocalStorage == 'object') {
wikEd.webStorage = true;
}
 
// get a value from web storage
if (wikEd.webStorage === true) {WED('get webStorage', name);
getStr = window.localStorage.getItem(name);
}
 
// get a Greasemonkey persistent value
else if (wikEd.greasemonkey === true) {WED('get GM', name);
getStr = GM_getValue(name, '');
}
 
// get a cookie value
else {WED('get cookie', name);
getStr = wikEd.GetCookie(name);
}
 
return(getStr);
// return string
if (typeof getStr != 'string') {
getStr = '';
}
return getStr;
};
 
Line 14,107 ⟶ 17,654:
//
 
wikEd.SetPersistent = function (name, value, expires, path, ___domain, secure) {
 
// check for web storage
wikEd.DetectWebStorage();
if (wikEd.wikiGlobals.wikEdTypeofLocalStorage == 'object') {
wikEd.webStorage = true;
}
 
// set a value in web storage
if (wikEd.webStorage === true) {WED('set webStorage', name);
if (expires == -1) {
value = '';
window.localStorage.removeItem(name, '');
}
else {
window.localStorage.setItem(name, value);
}
window.localStorage.setItem(name, value);
}
 
// set a Greasemonkey persistent value
else if (wikEd.greasemonkey === true) {WED('set GM', name);
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 {WED('set cookie', name);
wikEd.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,146 ⟶ 17,717:
//
 
wikEd.GetCookie = function (cookieName) {
 
var cookie = ' ' + document.cookie;
Line 14,164 ⟶ 17,735:
cookieValue = decodeURIComponent(cookieValue);
}
return( cookieValue);
};
 
 
//
// wikEd.SetCookie: set a cookie, deletes a cookie for expire = -1 (code copied to wikEdDiff.js)
//
 
wikEd.SetCookie = 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,185 ⟶ 17,756:
}
 
// get date from expiration preset
else if (expires === 0) {
var cookieExpire = new Date();
expires = cookieExpire.setTime(cookieExpire.getTime() + wikEd.config.cookieExpireSec * 1000);
Line 14,193 ⟶ 17,764:
cookie += '; expires=' + expires;
}
if (typeof path !== null'string') {
cookie += '; path=' + path;
}
if (typeof ___domain !== null'string') {
cookie += '; ___domain=' + ___domain;
}
if (secure !=== nulltrue) {
cookie += '; secure';
}
document.cookie = cookie;WED('cookie', cookie);WED('document.cookie', document.cookie);
return;
};
Line 14,211 ⟶ 17,782:
//
 
wikEd.GetOffsetTop = function (element) {
 
var offset = 0;
do {
offset += element.offsetTop;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
Line 14,224 ⟶ 17,796:
//
 
wikEd.GetOffsetLeft = function (element) {
 
var offset = 0;
do {
offset += element.offsetLeft;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
Line 14,237 ⟶ 17,810:
//
 
wikEd.AppendScript = function (scriptUrl, onLoadFunction) {
 
var script = document.createElement('script');
Line 14,243 ⟶ 17,816:
script.setAttribute('src', scriptUrl);
wikEd.head.appendChild(script);
if (onLoadFunction !== nullundefined) {
wikEdscript.AddEventListeneraddEventListener(script, 'load', onLoadFunction, false);
}
return script;
};
 
Line 14,254 ⟶ 17,827:
//
 
wikEd.CleanNodes = function (node) {
 
if (wikEd.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,275 ⟶ 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,296 ⟶ 17,869:
//
 
wikEd.ParseDOM = function (obj, topNode) {
 
obj.plainLength = 0;
Line 14,305 ⟶ 17,878:
 
var anchorNode = obj.sel.anchorNode;
var focusNode = obj.sel.focusNode;
var anchorOffset = obj.sel.anchorOffset;
var focusOffset = obj.sel.focusOffset;
Line 14,311 ⟶ 17,884:
wikEd.ParseDOMRecursive(obj, topNode, anchorNode, anchorOffset, focusNode, focusOffset);
obj.plain = obj.plainArray.join('');
obj.plain = obj.plain.replace(/\xa0/g, ' ');
return;
};
Line 14,319 ⟶ 17,893:
//
 
wikEd.ParseDOMRecursive = 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,334 ⟶ 17,908:
}
 
// check for selection, text nodes
if (childNode == obj.sel.anchorNode) {
obj.plainAnchor = obj.plainLength + obj.sel.anchorOffset;
Line 14,342 ⟶ 17,916:
}
 
// get text of child node
var value = null;
switch (childNode.nodeType) {
case childNode.ELEMENT_NODE:
 
// skip hidden elements
if (wikEd.GetStyle(childNode, 'display') == 'none') {
continue;
}
if ( (childNode.childNodes.length === 0) && (wikEd.leafElements[childNode.nodeName] === true) ) {
if (childNode.nodeName == 'BR') {
value = '\n';
Line 14,369 ⟶ 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,396 ⟶ 17,970:
//
 
wikEd.GetInnerHTML = 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,418 ⟶ 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) && (wikEd.leafElements[childNode.nodeName] === true) ) {
obj.html += '>';
if (childNode.nodeName == 'BR') {
Line 14,439 ⟶ 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,474 ⟶ 18,058:
//
 
wikEd.GetNextTextNode = function (obj, currentNode, currentLevel) {
 
// ascend until there is a sibling
while (currentNode != wikEd.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) ||
(wikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
obj.foundLevel = currentLevel;
Line 14,503 ⟶ 18,095:
}
 
// recurse into child nodes
if ( (currentNode.nodeType == currentNode.ELEMENT_NODE) && (/wikEd.scroll(Before|After)/.test(currentNode.className) != true) ) {
wikEd.GetNextTextNodeChilds(obj, currentNode, currentLevel - 1);
if (obj.foundNode !== nullundefined) {
return;
}
Line 14,512 ⟶ 18,104:
}
 
// no sibling, ascend to parent
else {
currentNode = currentNode.parentNode;
Line 14,522 ⟶ 18,114:
 
 
//
// wikEd.GetNextTextNodeChilds: recurse through child nodes to next text-like node for anti-highlight bleeding
//
 
wikEd.GetNextTextNodeChilds = 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) ||
(wikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
obj.foundLevel = currentLevel;
Line 14,553 ⟶ 18,155:
}
 
// recurse into child nodes
if ( (currentNode.nodeType == currentNode.ELEMENT_NODE) && (/wikEd.scroll(Before|After)/.test(currentNode.className) != true) ) {
wikEd.GetNextTextNodeChilds(obj, currentNode, currentLevel - 1);
if (obj.foundNode !== nullundefined) {
return;
}
Line 14,569 ⟶ 18,171:
//
 
wikEd.ApplyCSS = function (cssDocument, cssRules) {
 
var stylesheet = new wikEd.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( wikEd.config.image[p1]);
}
);
 
// replace {wikedText:text} in css rules with translation
ruleStyle = ruleStyle.replace(/\{wikEdText:(\w+)\}/g,
function (p, p1) {
return( wikEd.config.text[p1]);
}
);
Line 14,594 ⟶ 18,196:
}
}
stylesheet.AddRulesAddCSSRules(rules);
return;
};
Line 14,600 ⟶ 18,202:
 
//
// wikEd.StyleSheet: create a new style sheet object (code copied to wikEdDiff.js)
//
 
wikEd.StyleSheet = 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.AddRuleAddCSSRules: add oneor rulereplace atall therules time using DOM method, veryat slowonce
//
 
this.AddRuleAddCSSRules = function(selector, declaration(rules) {
 
this.styleElement.appendChild(contextObj.createTextNode(rules));
// MS IE compatibility
if (this.styleElement.AddRule != null) {
if (declaration.length > 0) {
this.styleElement.AddRule(selector, declaration);
}
}
 
// standards compliant browsers
else {
if (this.styleElement.sheet != null) {
if (this.styleElement.sheet.insertRule != null) {
this.styleElement.sheet.insertRule(selector + ' { ' + declaration + ' } ', 0);
}
}
}
};
 
 
//
// wikEd.StyleSheet.AddRules: add or replace all rules at once, much faster
//
 
this.AddRules = function(rules) {
 
// MS IE compatibility
if (this.styleElement.innerHTML == null) {
this.styleElement.cssText = rules;
}
 
// Safari, Chrome, WebKit
else if ( (wikEd.safari == true) || (wikEd.chrome == true) || (wikEd.webkit == 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,682 ⟶ 18,236:
//
 
wikEd.GetStyle = 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 = wikEd.GetStyle(element.parentNode, styleProperty);
}
}
else {
style = element.style[styleProperty];
}
}
return( style);
};
 
 
//
// wikEd.AjaxPreview: get rendered page text using an Ajax non-api POST call
//
 
wikEd.AjaxPreview = function(textValue, ResponseHandler, livePreview) {
 
// prepare the url
var requestUrl;
if ( (wikEd.uploadEdit != true) && (wikEd.watchlistEdit != 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 != null) {
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';
}
 
// make the ajax request
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', ResponseHandler);
 
return;
};
 
 
//
// wikEd.AjaxRequest: cross browser wrapper for Ajax requests (code copied to wikEdDiff.js)
//
 
wikEd.AjaxRequest = function (requestMethod, requestUrl, postFields, overrideMimeType, ResponseHandler, origin) {
 
var request;
Line 14,778 ⟶ 18,258:
var formData;
 
// prepare POST request
if (requestMethod == 'POST') {
 
// assemble string body
if (typeof( FormData) != 'function') {
 
// create boundary
var boundary = wikEd.CreateRandomString(12);
 
// POST header, charset: WebKit workaround http://aautar.digital-radiation.com/blog/?p=1645
// POST header
headers['Content-Type'] = 'multipart/form-data; charset=UTF-8; boundary=' + boundary;
 
// assemble body data
formData = '';
for (var fieldName in postFields) {
if (postFieldsObject.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';
}
}
Line 14,801 ⟶ 18,281:
}
 
// use FormData object
else {
formData = new window.FormData();
for (var fieldName in postFields) {
if (postFieldsObject.prototype.hasOwnProperty.call(postFields, fieldName) === true) {
formData.append(fieldName, postFields[fieldName]);
}
Line 14,812 ⟶ 18,292:
}
 
// send the request using Greasemonkey GM_xmlhttpRequest
if (wikEd.greasemonkey === true) {
headers['User-Agent'] = window.navigator.userAgent;
if (origin === true) {
headers['Origin'] = window.___location.origin;
}
 
// 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,
Line 14,834 ⟶ 18,317:
}
});
}, 0);
}
 
// use standard XMLHttpRequest
else {
 
// create new XMLHttpRequest object
// allow ajax request from local copy for testing
request = new window.XMLHttpRequest();
if (wikEd.config.allowLocalAjax == true) {
if (typeof(netscape) == 'object') {
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
}
 
// create new XMLHttpRequest object
if (typeof(XMLHttpRequest) == 'function') {
request = new XMLHttpRequest();
}
 
// IE
else if (typeof(ActiveXObject) == 'object') {
 
// IE 6
try {
request = new ActiveXObject('Microsoft.XMLHTTP');
}
 
// IE 5.5
catch(err) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(err) {
return;
}
}
}
if (request == null) {
return;
}
 
// open the request
request.open(requestMethod, requestUrl, true);
 
// set the headers
for (var headerName in headers) {
if (headersObject.prototype.hasOwnProperty.call(headers, headerName) === true) {
request.setRequestHeader(headerName, headers[headerName]);
}
}
 
// set the mime type
if ( (request.overrideMimeType !== nullundefined) && (typeof overrideMimeType !== null'string') ) {
request.overrideMimeType(overrideMimeType);
}
 
// send the request, catch security violations Opera 0.9.51
try {
request.send(formData);
}
catch (errexception) {
return;
}
 
// wait for the data
request.onreadystatechange = function () {
if (request.readyState != 4) {
return;
Line 14,911 ⟶ 18,363:
 
//
// wikEd.GetGlobals: copyparse global context variables into Greasemonkey context (code copied to wikEdDiff.js)
// uses Greasemonkey postMessage, head script, and JSON encoding for Greasemonkey global to GM context access
 
wikEd.GetGlobals = function (names, gotGlobalsHook) {
 
if (gotGlobalsHook (typeof(window.postMessage) !== 'undefined') || (typeof(JSON) != 'object') ) {
wikEd.gotGlobalsHook.push(gotGlobalsHook);
}
 
// code already running in global context
if (wikEd.greasemonkey !== true) {
var globalScopeCode = '';
for (var i = 0; i < names.length; i ++) {
globalScopeCode += '' +
'if (typeof ' + names[i] + ' != \'undefined\') {' +
' wikEd.wikiGlobals.' + names[i] + ' = ' + names[i] + ';' +
'}';
}
if (gotGlobalsHook !== undefined) {
globalScopeCode += 'wikEd.ExecuteHook(wikEd.gotGlobalsHook[' + (wikEd.gotGlobalsHook.length - 1) + '], true);';
}
eval(globalScopeCode);
return;
}
 
// prepare code to be executed in global context for Greasemonkey
if ( (window.postMessage === undefined) || (typeof JSON != 'object') ) {
return;
}
var globalScopeCode = 'var globalObj = {};';
if (gotGlobalsHook !== nullundefined) {
wikEd.gotGlobalsHook.push(gotGlobalsHook);
globalScopeCode += 'globalObj.hookNumber = ' + (wikEd.gotGlobalsHook.length - 1) + ';';
Line 14,929 ⟶ 18,400:
globalScopeCode += 'globalObj.wikEdGetGlobals = {};';
 
// add global scope variables
for (var i = 0; i < names.length; i ++) {
globalScopeCode += '' +
+ 'if (typeof( ' + names[i] + ') != \'undefined\') {' +
+ ' globalObj.wikEdGetGlobals[\'' + names[i] + '\'] = ' + names[i] + ';' +
+ '}';
}
globalScopeCode += 'var globalObjStr = \'wikEd:\' + JSON.stringify(globalObj);';
var origin = wikEd.pageOrigin;
if (origin == 'file://') {
Line 14,943 ⟶ 18,414:
globalScopeCode += 'window.postMessage(globalObjStr, \'' + origin + '\');';
 
// create head script to execute the code
var script = document.createElement('script');
script.id = 'wikEdGetGlobalScript' + wikEd.getGlobalsCounter;
wikEd.getGlobalsCounter ++;
if (typeof(script.innerText) !== 'undefined') {
script.innerText = globalScopeCode;
}
Line 14,954 ⟶ 18,425:
}
wikEd.head.appendChild(script);
 
return;
};
Line 14,963 ⟶ 18,433:
//
 
wikEd.GetGlobalsReceiver = function (event) {
 
if (event.source != window) {
Line 14,971 ⟶ 18,441:
return;
}
if (event.data !== '') {
 
var globalObj = JSON.parse(event.data);
// 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 (globalsObject.prototype.hasOwnProperty.call(globals, key) === true) {
wikEd.wikiGlobals[key] = globals[key];
}
}
 
// get MediaWiki file paths from wikiGlobals
// run scheduled functions only once
wikEd.GetPaths();
if (globalObj.hookNumber != null) {
 
// run scheduled functions only once
if ( (globalObj.hookNumber !== undefined) && (wikEd.gotGlobalsHook[globalObj.hookNumber] !== undefined) ) {
wikEd.ExecuteHook(wikEd.gotGlobalsHook[globalObj.hookNumber], true);
}
 
// clean up head script
var script = document.getElementById(globalObj.scriptId);
wikEd.head.removeChild(script);
var script = document.getElementById(globalObj.scriptId);
if (script !== null) {
wikEd.head.removeChild(script);
}
}
}
Line 14,997 ⟶ 18,478:
 
//
// wikEd.GetPreviousSiblingNode: getPreviousSibling, ignore non-element nodes such as comments
// wikEd.GetAttribute: MS IE compatibility wrapper for element.getAttribute()
//
 
wikEd.GetAttributeGetPreviousSiblingNode = function(element, attribName(node) {
 
while (node !== null) {
var attribValue = element.getAttribute(attribName);
node = node.previousSibling;
 
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
// MS IE compatibility for checked
break;
if (attribName == 'checked') {
if ( typeof(attribValue) == 'boolean' ) {
if (attribValue == true) {
attribValue = 'true';
}
else {
attribValue = 'false';
}
}
}
return(attribValue) node;
};
 
 
//
// wikEd.GetNextSiblingNode: getNextSibling, ignore non-element nodes such as comments
// wikEd.GetWindowInnerHeight: MS IE compatibility wrapper for window.innerHeight
//
 
wikEd.GetWindowInnerHeightGetNextSiblingNode = function (node) {
 
while (node !== null) {
var value = window.innerHeight;
node = node.nextSibling;
if (value == null) {
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
if (document.documentElement != null) {
break;
value = document.documentElement.clientHeight;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientHeight;
}
}
return(value) node;
};
 
 
//
// wikEd.GetFirstChildNode: getFirstChild, ignore non-element nodes such as comments
// wikEd.GetWindowInnerWidth: MS IE compatibility wrapper for window.innerWidth
//
 
wikEd.GetWindowInnerWidthGetFirstChildNode = function (node) {
 
if (node !== null) {
var value = window.innerWidth;
node = node.firstChild;
if (value == null) {
if (document.documentElement (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
node = wikEd.GetNextSiblingNode(node);
value = document.documentElement.clientWidth;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientWidth;
}
}
return(value) node;
};
 
 
//
// wikEd.GetLastChildNode: getLastChild, ignore non-element nodes such as comments
// wikEd.AddEventListener: wrapper for addEventListener (http://ejohn.org/projects/flexible-javascript-events/) (code copied to wikEdDiff.js)
//
 
wikEd.AddEventListenerGetLastChildNode = function (domElement, eventType, eventHandler, useCapturenode) {
 
if (domElementnode !== null) {
node = node.lastChild;
return;
if ( (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
node = wikEd.GetPreviousSiblingNode(node);
}
}
return node;
if (typeof(domElement.addEventListener) == 'function') {
domElement.addEventListener(eventType, eventHandler, useCapture);
}
else {
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] );
}
return;
};
 
 
//
// wikEd.CreateRandomString: create random string of specified length and character set (code copied to wikEdDiff.js)
// wikEd.RemoveEventListener: wrapper for removeEventListener
//
 
wikEd.RemoveEventListenerCreateRandomString = function (domElement, eventType, eventHandlerstrLength, useCapturecharSet) {
 
if (domElementcharSet === nullundefined) {
charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789';
return;
}
var str = '';
if (typeof(domElement.removeEventListener) == 'function') {
for (var i = 0; i < strLength; i ++) {
domElement.removeEventListener(eventType, eventHandler, useCapture);
str += charSet.charAt(Math.floor(Math.random() * charSet.length));
}
return str;
else {
domElement.detachEvent('on' + eventType, domElement[eventType + eventHandler]);
domElement[eventType + eventHandler] = null;
}
return;
};
 
 
//
// wikEd.EventWrapperTabifyHTML: MSindent IE and Mozilla compatibility fixhtml for event objectdebugging
//
 
wikEd.EventWrapperTabifyHTML = function(event, thisElement(html) {
 
var eventAltindent = '';
var html = html.replace(/((<(\/)?(\w+)[^>]*>)(<!--(.|\n)*?-->)?)([^<]*)/g,
if (window.event != null) {
function(p, p1, p2, p3, p4, p5, p6, p7) {
eventAlt = window.event;
var html = '';
}
var code = p1;
else if (wikEd.frameWindow != null) {
var slash = p3;
if (typeof(wikEd.frameWindow.event) != 'undefined') {
var tag = p4;
eventAlt = wikEd.frameWindow.event;
var text = p7;
}
if ( (slash == '/') && (indent === '') ) {
}
html += '\n### Missing opening tag ###';
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 (slash == 'mouseover/') && (indent.length > 0) ) {
indent = indent.substr(0, indent.length - 1);
event.relatedTarget = event.fromElement;
}
if ( (slash === '') && (tag.toLowerCase() == 'tr') ) {
}
html += '\n';
}
 
// avoid strange Mozilla security error https://bugzilla.mozilla.org/show_bug.cgi?id=101197, fixed in FF3.6
if ( (event.type == 'mouseout') || (event.type == 'mouseover') ) {
event.safeRelatedTarget = event.relatedTarget;
if (wikEd.mozilla == true) {
try {
event.safeRelatedTarget.toString();
}
html += '\n' + indent + code;
catch(error) {
if ( (slash === '') && (tag.toLowerCase() != 'br') ) {
event.safeRelatedTarget = null;
indent += '\t';
}
if (text !== '') {
}
text = text.replace(/\n(?!($))/g, '\n' + indent);
}
html += '\n' + indent + text;
return(event);
};
 
 
//
// wikEd.GetElementsByClassName: cross browser / backwards compatibility wrapper
//
 
wikEd.GetElementsByClassName = function(className, tagName, parent) {
 
if (parent == null) {
parent = document.body;
}
 
// 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 html;
}
});
return(nodeList) html;
};
 
 
//
// wikEd.GetPreviousSiblingNode: getPreviousSibling, ignore non-element nodes such as comments
//
 
wikEd.GetPreviousSiblingNode = function(node) {
 
while (node != null) {
node = node.previousSibling;
if (node == null) {
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return(node);
};
 
 
//
// wikEd.GetNextSiblingNode: getNextSibling, ignore non-element nodes such as comments
//
 
wikEd.GetNextSiblingNode = function(node) {
 
while (node != null) {
node = node.nextSibling;
if (node == null) {
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return(node);
}
 
 
//
// wikEd.GetFirstChildNode: getFirstChild, ignore non-element nodes such as comments
//
 
wikEd.GetFirstChildNode = function(node) {
 
if (node != null) {
node = node.firstChild;
wikEd.GetNextSiblingNode(node);
}
return(node);
};
 
 
//
// wikEd.GetLastChildNode: getLastChild, ignore non-element nodes such as comments
//
 
wikEd.GetLastChildNode = function(node) {
 
if (node != null) {
node = node.lastChild;
wikEd.GetPreviousSiblingNode(node);
return(node);
}
};
 
 
//
// wikEd.CreateRandomString: create random string of specified length and character set (code copied to wikEdDiff.js)
//
 
wikEd.CreateRandomString = function(strLength, charSet) {
 
if (charSet == null) {
charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789';
}
var str = '';
for (var i = 0; i < strLength; i ++) {
str += charSet.charAt(Math.floor(Math.random() * charSet.length));
}
return(str);
}
 
 
Line 15,282 ⟶ 18,602:
//
 
wikEd.Debug = 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,314 ⟶ 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,323 ⟶ 18,643:
}
 
// whole highlighting parse tree up
else if ( (typeof( object.tree) == 'object') && (typeof( object.lastOpenNode) == 'number') ) {
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,334 ⟶ 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,348 ⟶ 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,360 ⟶ 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 > wikEd.config.debugInnerHtmlLength) {
Line 15,386 ⟶ 18,706:
}
 
// default
else {
value = ': [' + object + ']';
Line 15,392 ⟶ 18,712:
}
 
// undefined
else if (typeof(object) === 'undefined') {
value = '';
}
 
// default
else {
value = ': ' + object;
}
 
// use debug textarea
var useDebug = false;
if (typeof(wikEd.debug) !== 'undefined'null) {
useDebug = true;
if (wikEd.debug != null) {
useDebug = true;
}
}
if (useDebug === true) {
if (wikEd.debugOpen === false) {
wikEd.debugWrapper.style.visibilitydisplay = 'visibleblock';
wikEd.debug.style.display = 'block';
window.scroll(0, wikEd.GetOffsetTop(wikEd.debug));
wikEd.debugOpen = true;
}
if (objectName == null) {
wikEd.debug.value = '';
}
else {
 
// resize fullscreen frame
// cut text if having reached maximum length
if (wikEd.fullscreen === true) {
value = objectName + value + '\n';
wikEd.ResizeWindowHandler();
if (wikEd.debug.value.length > wikEd.config.debugMaxLength) {
wikEd.debug.value = value + wikEd.debug.value.substr(0, wikEd.config.debugMaxLength * 2 / 3);
}
else {
wikEdwindow.debug.value = value +scroll(0, wikEd.GetOffsetTop(wikEd.debug.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(\'wikEd.Debug: ' + msg + '\')', 0);
return;
};
 
 
//
// wikEd.ConsoleLog: log message to console
// mw.log no longer works
 
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;
Line 15,462 ⟶ 18,798:
// add a new time measurement: wikEd.debugTimer.push([1234, new Date]);
 
wikEd.DebugTimer = function () {
 
var times = '';
var start = wikEd.debugTimer[0][1].getTime();
Line 15,481 ⟶ 18,818:
//
 
wikEd.InsertTags = function (openTag, closeTag, sampleText) {
 
if (wikEd.useWikEd === true) {
wikEd.EditButton(document.getElementById('wikEdInsertTags'), 'wikEdInsertTags', [openTag, closeTag, sampleText]);
}
else if (wikEd.InsertTagsOriginal !== null) {
wikEd.InsertTagsOriginal(openTag, closeTag, sampleText);
}
Line 15,497 ⟶ 18,834:
//
 
wikEd.InsertAtCursor = function (myField, myValue) {
 
if (wikEd.useWikEd === true) {
if (myField == wikEd.textarea) {
wikEd.EditButton(document.getElementById('wikEdInsertTags'), 'wikEdInsertTags', [ myValue ]);
}
}
else if (wikEd.InsertAtCursorOriginal !== null) {
wikEd.InsertAtCursorOriginal(myField, myValue);
}
Line 15,515 ⟶ 18,852:
//
 
wikEd.ExecuteHook = 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,533 ⟶ 18,873:
// see http://kmi.open.ac.uk/projects/ceryle/doc/docs/NOTE-charents.html
 
wikEd.InitUnicode = function () {
 
// define only once
if (wikEd.supportedChars !== null) {
return;
}
 
// supported chars in Mozilla and IE
wikEd.supportedChars = [
[ 'a1', 'iexcl'], // ¡
Line 15,760 ⟶ 19,100:
];
 
// reserved for internal wikEd use
wikEd.reservedChars = [
[ '26', 'amp'], // &
Line 15,768 ⟶ 19,108:
];
 
// special chars (spaces and invisible characters)
wikEd.specialChars = [
['2002', 'ensp'], //   en space
Line 15,780 ⟶ 19,120:
];
 
// unsupported chars in IE6
wikEd.problemChars = [
[ '3d1', 'thetasym'], // ϑ
Line 15,810 ⟶ 19,150:
 
 
// index to all existing 253 HTML/XHTML character entities
var allCharEntities = wikEd.supportedChars.concat(wikEd.reservedChars, wikEd.specialChars, wikEd.problemChars);
for (var i = 0; i < allCharEntities.length; i ++) {
Line 15,816 ⟶ 19,156:
}
 
// syntax highlighting of ASCII control characters and invisibles (decimal value, title)
wikEd.controlCharHighlighting = {
'0': 'null',
Line 15,855 ⟶ 19,195:
};
for (var decimalValue in wikEd.controlCharHighlighting) {
if (wikEdObject.controlCharHighlightingprototype.hasOwnProperty.call(wikEd.controlCharHighlighting, decimalValue) === true) {
wikEd.controlCharHighlightingStr += '\\' + String.fromCharCode(decimalValue);
}
}
 
// character syntax highlighting: strange spaces, hyphens, and dashes (decimal value, class = title)
wikEd.charHighlighting = {
'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 wikEd.charHighlighting) {
if (wikEdObject.charHighlightingprototype.hasOwnProperty.call(wikEd.charHighlighting, decimalValue) === true) {
wikEd.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,888 ⟶ 19,231:
wikEd.Startup();
 
// </nowiki></presyntaxhighlight>