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

Content deleted Content added
0.9.115alpha04
Maintenance: Remove use of deprecated wgEnableAPI (always true) - mw:RL/MGU
 
(5 intermediate revisions by one other user not shown)
Line 1:
// <syntaxhighlight lang="JavaScript">
 
// 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.115alpha04';
wikEd.programDate = 'April 23, 2013';
 
// 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 symbol)
 
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 httphttps://en.wikipedia.org/wiki/User:Cacycle/wikEd
// @source httphttps://en.wikipedia.org/wiki/User:Cacycle/wikEd.js
// @author Cacycle (httphttps://en.wikipedia.org/wiki/User:Cacycle)
// @license Released into the public ___domain
// @grant GM_getValue
// @grant GM_log
// @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 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, {
 
Line 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',
Line 96:
'wikEdBarPreview2 title': '',
'wikEdBarJump title': '',
'wikEdBarPasted title': '',
 
// formatting buttons, top row
Line 149 ⟶ 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
Line 156 ⟶ 159:
'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
Line 215 ⟶ 224:
// 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 233 ⟶ 244:
// 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
Line 259 ⟶ 268:
],
'wikEdSummaryUsing': '…using [[en:User:Cacycle/wikEd|wikEd]]',
 
// toolbar
'wikEdCodeEditorButtonDisabled': ' (disabled by wikEd)',
 
// button title acceskey
Line 306 ⟶ 318:
'wikicode Image': 'Image',
'wikicode File': 'File',
'wikicode Media': 'Media',
'wikicode Category': 'Category',
'wikicode Template': 'Template',
Line 312 ⟶ 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
'hideTableStart': 'Table',
'hideTableEnd': 'Table end',
'hideTableCaption': 'Caption',
'hideTableRow': 'Row',
'hideTableHeader': 'Header',
'hideTableCell': 'Cell',
 
// shortened button texts
Line 322 ⟶ 344:
'shortenedChanges': 'Changes',
 
// follow link popup
'followLink': '(ctrl-click)',
'followLinkMac': '(cmd-click)',
'redirect': ', redirect to:',
 
'redlink': ' (page does not exist)',
// error message popups
'wikEdTableModeError': 'The table wikicode contains errors',
 
// auto updating
'wikEdGreasemonkeyAutoUpdate': 'wikEd Update:\n\nA new version of the GreaseMonkeyGreasemonkey script "wikEd" is available.\n\n\nIt will be downloadedinstalled from:\n\n{updateURL}',
'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
Line 370 ⟶ 392:
 
// ___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);
Line 379 ⟶ 404:
 
// 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 (typeof(wikEd.config.imagePathLocal) === 'undefined') { wikEd.config.imagePathLocal = 'file:///D:/wikEd/images/'; }
 
// path to wikEd images, also defined in wikEdDiff.js
if (typeof(wikEd.config.imagePath) === 'undefined') { wikEd.config.imagePath = '//upload.wikimedia.org/wikipedia/commons/'; }
 
// wikEd image filenames, also defined in wikEdDiff.js
if (typeof(wikEd.config.image) === 'undefined') { wikEd.config.image = {}; }
 
// wikEd.InitImages: define built-in image URLs
wikEd.InitImages = function () {
 
wikEd.InitImage(wikEd.config.image, {
Line 403 ⟶ 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 435 ⟶ 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',
Line 455 ⟶ 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 474 ⟶ 502:
'table': 'b/bd/WikEd_table.png',
'tableMode': 'e/ee/WikEd_table_edit.png',
'tableBG': '8/8a/WikEd_unknown.png',
'testVersion': '3/3e/WikEd_error.png',
'textify': 'c/cd/WikEd_textify.png',
Line 485 ⟶ 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 492 ⟶ 518:
 
// 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;',
'::selection': 'text-shadow: none; color: #fff; background: #006;',
'::-moz-selection': 'text-shadow: none; color: #fff; background: #006;',
'::-webkit-selection': 'text-shadow: none; color: #fff; background: #006;',
'.wikEdFrameBodyNewbie': 'height: auto; min-height: 100%; width: auto; background: transparent; margin: 0; padding: 0; padding-left: 0.25em; overflow: auto; font-family: monospace;',
 
Line 513 ⟶ 534:
 
// 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 527 ⟶ 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
Line 543 ⟶ 565:
'.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;',
'.wikEdTableTag': 'background: #ccc;',
'.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; text-shadow: none;',
'.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
Line 570 ⟶ 613:
 
// 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 593 ⟶ 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;',
Line 616 ⟶ 660:
'.wikEdFrameBodySyntax .wikEdRefContainer': 'display: block; 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;',
Line 634 ⟶ 678:
// templates
'.wikEdFrameBodySyntax .wikEdTemplContainer': 'display: block; 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
'.wikEdRedlink': 'color: #c00;',
 
// 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
Line 673 ⟶ 727:
 
// wikEdFrameBodyNewbie ref and template hiding
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRef, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTempl, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNs':
'position: fixed; left: -10000em;',
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRefShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNsShow':
 
'display: block; position: relative; color: #000; background: #f8f8f8; font-weight: normal; border: 1px solid; border-color: #444 #ccc #ccc #444; padding: 0.5em 0.25em;',
'.wikEdFrameBodyNewbie .wikEdRefContainer + .wikEdRefShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplShow, .wikEdFrameBodyNewbie .wikEdTemplContainer + .wikEdTemplNsShow':
'.wikEdFrameBodyNewbie .wikEdRefButton:before, .wikEdFrameBodyNewbie .wikEdTemplButton:before, .wikEdFrameBodyNewbie .wikEdTableButton:before, .wikEdFrameBodyNewbie .wikEdRefButtonShow:before, .wikEdFrameBodyNewbie .wikEdTemplButtonShow:before, .wikEdFrameBodyNewbie .wikEdTableButtonShow:before':
'display: block; position: relative; color: #000; background: #f8f8f8; font-weight: normal; border: 1px solid; border-color: #444 #ccc #ccc #444; padding: 1em 0.25em 1em 0.25em;',
 
'.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;',
 
'.wikEdFrameBodyNewbie .wikEdRefButton:before, .wikEdFrameBodyNewbie .wikEdRefButtonShow:before':
'content: "{wikEdText:hideRef}"',
 
'.wikEdFrameBodyNewbie .wikEdTemplButton:before, .wikEdFrameBodyNewbie .wikEdTemplButtonShow:before':
'content: "{wikEdText:hideTempl}";',
Line 694 ⟶ 743:
'.wikEdFrameBodyNewbie .wikEdCharEntity':
'position: fixed; left: -10000em;',
 
'.wikEdFrameBodyNewbie .wikEdCharEntityShow':
'display: inline; position: relative; color: #000; borderbackground: 1px solid#f8f8f8; border-color: #4441px #ccc #ccc #444solid; background: #f8f8f8; borderfont-colorweight: rgba(64, 64, 64, 0.5) rgba(255, 255, 255, 0.75) rgba(255, 255, 255, 0.75) rgba(64, 64, 64, 0.5)normal; background: rgba(192, 192, 192, 0.3); font-weightborder: normal1px inset;',
 
'.wikEdCharEntityButton:before, .wikEdCharEntityButtonShow:before':
'',
 
// wikEdFrameBodyNewbie table edithiding
'.wikEdFrameBodyNewbie .wikEdTableContainer + .wikEdTable':
'.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 .wikEdTableContainer + .wikEdTableShow':
'.wikEdTableEdit th': 'border: solid black; border-width: 0 0 1px 1px; background: lightgrey; text-shadow: none; font-weight: bold;',
'display: inline-block; position: relative; color: #000; font-weight: normal; background: rgba(255, 255, 255, 0.2); border: 1px inset;',
'.wikEdTableEdit tr': 'background: lightgrey; text-shadow: none; font-weight: bold;',
'.wikEdFrameBodyNewbie .wikEdTableButton:before, .wikEdFrameBodyNewbie .wikEdTableButtonShow:before':
'.wikEdTableEdit caption': 'background: lightgrey; text-shadow: none; font-weight: normal;',////
'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
Line 739 ⟶ 787:
 
// 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, {
 
Line 753 ⟶ 801:
 
// 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, {
 
Line 772 ⟶ 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; line-height: 1em;',
'.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: 2px 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);',
 
'.wikEdButtonsPreviewwikEdButtonsPasted:hover': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0e4e0dc;',
'.wikEdButtonsPreviewFullwikEdButtonsPasted img': 'backgroundborder-color: #d4d0cc;rgba(0, padding:0, 2px; border:0, 1px0) solid!important; borderbackground-color: #e0e0e0rgba(0, #8080800, #8080800, #e0e0e00);',
'.wikEdButtonsPreview2wikEdButtonsPasted img:hover': 'background: #d4d0cc; padding: 2px; border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0e4e0dc;',
'.wikEdButtonsJumpwikEdButtonsPreview': 'background: #d4d0cc; 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)
'.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 822 ⟶ 875:
 
// 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 and replace fields
'.wikEdFindComboInput, .wikEdReplaceComboInput': 'position: relative; margin: 0 5px; top: -1px; white-space: nowrap; vertical-align: bottom; padding: 0; line-height: 1.5em20px; font-size: 13px;',
'#wikEdFindText, #wikEdReplaceText': 'font-family: monospace; margin: 0; position: absolute; left: 0; top: 0; z-index: 2; vertical-align: bottom; width: 170px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 18px; ',
'#wikEdFindSelect, #wikEdReplaceSelect': 'font-family: monospace; margin: 0; position: relative; left: 0; top: 0; z-index: 1; vertical-align: bottom; width: 190px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 18px; ',
 
// summary field
'.wikEdSummaryComboInput': 'position: relative; margin: 0 0 0 2px; top: 0; white-space: nowrap; vertical-align: bottom; padding: 0; line-height: 2em; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; font-size: 13px;',
'.wikEdSummaryText': 'padding: 0; margin: 0; position: absolute; left: 0; top: 0; z-index: 2; vertical-align: bottom; width: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 21px; ',
'.wikEdSummarySelect': 'padding: 0; margin: 0; position: relative; left: 0; top: 0; z-index: 1; vertical-align: bottomtext-top; width: auto; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; height: 21px; ',
 
// space around submit buttons
Line 841 ⟶ 894:
 
// 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;',
'.editOptions': 'positionpadding: relative0; topborder: none; margin: 0 0.1em75em; float: left',
'.wikEdClearSummaryForm': 'display: inline;',
'.wikEdClearSummary': 'vertical-align: 0%middle; margin: 0 0 0 0.5em; padding: 1px; height: 21px19px; width: 18px; ',
'#wikEdClearSummaryImg': 'vertical-align: 510%; ',
 
// 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
if (typeof(wikEd.config.button) === 'undefined') { wikEd.config.button = {}; }
 
// wikEd.InitButton: define built-in buttons
wikEd.InitButton = function () {
wikEd.InitObject(wikEd.config.button, {
 
Line 897 ⟶ 960:
 
// format top
1: ['wikEdUndo', 'wikEdButtonInactive', wikEd.config.text['wikEdUndo title'], wikEd.config.image['undo'], '16', '16', wikEd.config.text['wikEdUndo alt'], 'wikEd.EditButton(obj, obj.id);' ],
2: ['wikEdRedo', 'wikEdButtonInactive', wikEd.config.text['wikEdRedo title'], wikEd.config.image['redo'], '16', '16', wikEd.config.text['wikEdRedo alt'], 'wikEd.EditButton(obj, obj.id);' ],
3: ['wikEdBold', 'wikEdButton', wikEd.config.text['wikEdBold title'], wikEd.config.image['bold'], '16', '16', wikEd.config.text['wikEdBold alt'], 'wikEd.EditButton(obj, obj.id);' ],
4: ['wikEdItalic', 'wikEdButton', wikEd.config.text['wikEdItalic title'], wikEd.config.image['italic'], '16', '16', wikEd.config.text['wikEdItalic alt'], 'wikEd.EditButton(obj, obj.id);' ],
5: ['wikEdUnderline', 'wikEdButton', wikEd.config.text['wikEdUnderline title'], wikEd.config.image['underline'], '16', '16', wikEd.config.text['wikEdUnderline alt'], 'wikEd.EditButton(obj, obj.id);' ],
6: ['wikEdStrikethrough', 'wikEdButton', wikEd.config.text['wikEdStrikethrough title'], wikEd.config.image['strikethrough'], '16', '16', wikEd.config.text['wikEdStrikethrough alt'], 'wikEd.EditButton(obj, obj.id);' ],
7: ['wikEdNowiki', 'wikEdButton', wikEd.config.text['wikEdNowiki title'], wikEd.config.image['nowiki'], '16', '16', wikEd.config.text['wikEdNowiki alt'], 'wikEd.EditButton(obj, obj.id);' ],
8: ['wikEdSuperscript', 'wikEdButton', wikEd.config.text['wikEdSuperscript title'], wikEd.config.image['superscript'], '16', '16', wikEd.config.text['wikEdSuperscript alt'], 'wikEd.EditButton(obj, obj.id);' ],
9: ['wikEdSubscript', 'wikEdButton', wikEd.config.text['wikEdSubscript title'], wikEd.config.image['subscript'], '16', '16', wikEd.config.text['wikEdSubscript alt'], 'wikEd.EditButton(obj, obj.id);' ],
10: ['wikEdRef', 'wikEdButton', wikEd.config.text['wikEdRef title'], wikEd.config.image['ref'], '16', '16', wikEd.config.text['wikEdRef alt'], 'if (!event.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, obj.id);' ],
Line 924 ⟶ 987:
24: ['wikEdTable', 'wikEdButton', wikEd.config.text['wikEdTable title'], wikEd.config.image['table'], '16', '16', wikEd.config.text['wikEdTable alt'], 'wikEd.EditButton(obj, obj.id);' ],
11: ['wikEdReferences', 'wikEdButton', wikEd.config.text['wikEdReferences title'], wikEd.config.image['references'], '16', '16', wikEd.config.text['wikEdReferences alt'], 'if (!event.shiftKey) { wikEd.EditButton(obj, obj.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
Line 987 ⟶ 1,051:
 
// jump
78: ['wikEdDiff', 'wikEdButtonUnchecked', wikEd.config.text['wikEdDiff title'], wikEd.config.image['wikEdDiff'], '16', '16', wikEd.config.text['wikEdDiff alt'], 'wikEd.Button(obj, obj.id, true);' ],
74: ['wikEdScrollToEdit4', 'wikEdButtonSolo', wikEd.config.text['wikEdScrollToEdit4 title'], wikEd.config.image['scrollToEditDown'], '16', '16', wikEd.config.text['wikEdScrollToEdit4 alt'], 'wikEd.Button(obj, obj.id);' ],
 
Line 995 ⟶ 1,058:
// 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.InitButtonKey = function () {
wikEd.InitObject(wikEd.config.buttonKey, {
 
Line 1,017 ⟶ 1,085:
 
// button bars (id, class, button numbers)
if (typeof(wikEd.config.buttonBar) === 'undefined') { wikEd.config.buttonBar = {}; }
 
// wikEd.InitButtonBar: define built-in button bars
wikEd.InitButtonBar = function () {
wikEd.InitObject(wikEd.config.buttonBar, {
 
// button name: [id outer, class outer, id inner, class inner, height, grip title, button numbers, bar title]
'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,7684], wikEd.config.text['wikEdBarFormat title'] ],
'textify': ['wikEdButtonBarTextify', 'wikEdButtonBarTextify', 'wikEdButtonsTextify', 'wikEdButtonsTextify', 44, wikEd.config.text['wikEdGripTextify title'], [26,'br',27], wikEd.config.text['wikEdBarTextify title'] ],
'custom1': ['wikEdButtonBarCustom1', 'wikEdButtonBarCustom1', 'wikEdButtonsCustom1', 'wikEdButtonsCustom1', 44, wikEd.config.text['wikEdGripCustom1 title'], [ ], wikEd.config.text['wikEdBarCustom1 title'] ],
Line 1,030 ⟶ 1,098:
'fix': ['wikEdButtonBarFix', 'wikEdButtonBarFix', 'wikEdButtonsFix', 'wikEdButtonsFix', 44, wikEd.config.text['wikEdGripFix title'], [52,53,54,55,56,81,'br',58,59,60,61,62,57], wikEd.config.text['wikEdBarFix title'] ],
'custom2': ['wikEdButtonBarCustom2', 'wikEdButtonBarCustom2', 'wikEdButtonsCustom2', 'wikEdButtonsCustom2', 44, wikEd.config.text['wikEdGripCustom2 title'], [ ], wikEd.config.text['wikEdBarCustom2 title'] ],
'control': ['wikEdButtonBarControl', 'wikEdButtonBarControl', 'wikEdButtonsControl', 'wikEdButtonsControl', 44, wikEd.config.text['wikEdGripControl title'], [77,29,30,35,31,32,'br',33,34,79,75,36,78,37], wikEd.config.text['wikEdBarControl title'] ],
'preview': ['wikEdButtonBarPreview', 'wikEdButtonBarPreview', 'wikEdButtonsPreview', 'wikEdButtonsPreview', 0, null, [66,67,65], wikEd.config.text['wikEdBarPreview title'] ],
'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,048 ⟶ 1,117:
 
// 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, also defined in wikEdDiff.js
if (typeof(wikEd.config.cookieExpireSec) === 'undefined') { wikEd.config.cookieExpireSec = 1 * 30 * 24 * 60 * 60; }
 
// disable wikEd preset
if (typeof(wikEd.config.disabledPreset) === 'undefined') { wikEd.config.disabledPreset = false; }
 
// find ahead as you type checkbox preset
if (typeof(wikEd.config.findAheadSelected) === 'undefined') { wikEd.config.findAheadSelected = true; }
 
// highlight syntax preset
if (typeof(wikEd.config.highlightSyntaxPreset) === 'undefined') { wikEd.config.highlightSyntaxPreset = true; }
 
// enable wikEd preset
if (typeof(wikEd.config.useWikEdPreset) === 'undefined') { wikEd.config.useWikEdPreset = true; }
 
// add '...using wikEd' to summary preset
if (typeof(wikEd.config.usingPreset) === 'undefined') { wikEd.config.usingPreset = false; }
 
// scroll to edit field on non-preview pages
if (typeof(wikEd.config.scrollToEdit) === 'undefined') { wikEd.config.scrollToEdit = true; }
 
// focus the edit field on non-preview pages
if (typeof(wikEd.config.focusEdit) === 'undefined') { wikEd.config.focusEdit = true; }
 
// wikEdDiff preset
if (typeof(wikEd.config.diffPreset) == 'undefined') { wikEd.config.diffPreset = false; }
 
// fullscreen mode preset
if (typeof(wikEd.config.fullScreenModePreset) === 'undefined') { wikEd.config.fullScreenModePreset = false; }
 
// show MediaWiki toolbar preset
if (typeof(wikEd.config.closeToolbarPreset) === 'undefined') { wikEd.config.closeToolbarPreset = false; }
 
// hide ref tags preset
if (typeof(wikEd.config.refHidePreset) === 'undefined') { wikEd.config.refHidePreset = false; }
 
// text size adjustment for edit window (percentage)
if (typeof(wikEd.config.textSizeAdjust) === 'undefined') { wikEd.config.textSizeAdjust = 100; }
 
// remove invisible syntax highlighting comments after closing tag
if (typeof(wikEd.config.removeHighlightComments) === 'undefined') { wikEd.config.removeHighlightComments = true; }
 
// show the text-to-source button for testing purposes
if (typeof(wikEd.config.showSourceButton) === 'undefined') { wikEd.config.showSourceButton = false; }
 
// show the using-wikEd button
if (typeof(wikEd.config.showUsingButton) === 'undefined') { wikEd.config.showUsingButton = false; }
 
// the wikEd help page link to be displayed after the editing help link, an empty string disables the link
if (typeof(wikEd.config.helpPageLink) === 'undefined') { wikEd.config.helpPageLink = wikEd.config.text.wikEdHelpPageLink; }
 
// enable external diff script
if (typeof(wikEd.config.loadDiffScript) === 'undefined') { wikEd.config.loadDiffScript = true; }
 
// enable external wikEdDiff script
if (typeof(wikEd.config.loadDiff) === 'undefined') { wikEd.config.loadDiff = true; }
 
// enable external InstaView script
if (typeof(wikEd.config.loadInstaView) == 'undefined') { wikEd.config.loadInstaView = true; }
 
// enable external IERange script
if (typeof(wikEd.config.loadIERange) == 'undefined') { wikEd.config.loadIERange = true; }
 
// RegExTypoFix rules page, the address must have the exact same ___domain name as the used wiki
if (typeof(wikEd.config.regExTypoFixURL) === 'undefined') { wikEd.config.regExTypoFixURL = wikEd.config.homeBaseUrl + 'w/index.php?title=Wikipedia:AutoWikiBrowser/Typos&action=raw'; }
 
// enable RegExTypoFix button (httphttps://en.wikipedia.org/wiki/User:Mboverload/RegExTypoFix)
if (typeof(wikEd.config.regExTypoFix) === 'undefined') { wikEd.config.regExTypoFix = false; }
 
// enable highlighting as links
if (typeof(wikEd.config.followHighlightedLinks) === 'undefined') { wikEd.config.followHighlightedLinks = false; }
 
// skip the browser detection to run wikEd under IE and Opera
if (typeof(wikEd.config.skipBrowserTest) === 'undefined') { wikEd.config.skipBrowserTest = false; }
 
// skip the script test that disables wikEd if certain scripts are present
if (typeof(wikEd.config.skipScriptTest) === 'undefined') { wikEd.config.skipScriptTest = false; }
 
// skip the add-on test that disables wikEd if certain add-ons are present
if (wikEd.config.skipAddonTest === undefined) { wikEd.config.skipAddonTest = 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
// 'name in error message name': 'regexp', case insensitive regExp for script file name from URL w/o .js, use '\\' for '\'
wikEd.InitIncompatibleScripts = function () {
wikEd.InitObject(wikEd.config.incompatibleScripts, {
'CKEditor': '\\bckeditor',
Line 1,148 ⟶ 1,211:
});
};
 
// disable beta toolbar CodeEditor button
if (wikEd.config.disableCodeEditorButton === undefined) { wikEd.config.disableCodeEditorButton = true; }
 
// set the button bar grip width in px
if (typeof(wikEd.config.buttonBarGripWidth) === 'undefined') { wikEd.config.buttonBarGripWidth = 87; }
 
// enable local preview (Pilaf's InstaView)
if (typeof(wikEd.config.useLocalPreview) == 'undefined') { wikEd.config.useLocalPreview = true; }
 
// enable server preview (Ajax)
if (typeof(wikEd.config.useAjaxPreview) === 'undefined') { wikEd.config.useAjaxPreview = true; }
 
// enable appending '<references/> for Ajax section previews
if (typeof(wikEd.config.SectionPreviewRefs) == 'undefined') { wikEd.config.SectionPreviewRefs = true; }
 
// enable auto update (Ajax)
if (typeof(wikEd.config.autoUpdate) === 'undefined') { wikEd.config.autoUpdate = true; }
 
// hours between update check (monobook.js)
if (typeof(wikEd.config.autoUpdateHours) === 'undefined') { wikEd.config.autoUpdateHours = 20; }
 
// hours between update check (Greasemonkey)
if (typeof(wikEd.config.autoUpdateHoursGM) === 'undefined') { wikEd.config.autoUpdateHoursGM = 40; }
 
// auto update: version url (Ajax)
if (typeof(wikEd.config.autoUpdateUrl) === 'undefined') { wikEd.config.autoUpdateUrl = wikEd.config.homeBaseUrl + 'w/index.php?title=User:Cacycle/wikEd_current_version&action=raw&maxage=0'; }
 
// auto update: script url for Greasemonkey update
if (typeof(wikEd.config.autoUpdateScriptUrl) === 'undefined') { wikEd.config.autoUpdateScriptUrl = wikEd.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)
// show complete unshortened article text for local diff, also defined in wikEdDiff.js
if (typeof(wikEd.config.fullDiff)autoUpdateScriptUrlBugfix === 'undefined') { wikEd.config.fullDiffautoUpdateScriptUrlBugfix = falsewikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Cacycle/bugfix_wikEd.user.js'; }
 
// make links ctrl-clickable
if (typeof(wikEd.config.linkify) === 'undefined') { wikEd.config.linkify = true; }
 
// absolute instead of relative linkify links, URL with "$1" as article name placeholder
if (typeof(wikEd.config.linkifyArticlePath) === 'undefined') { wikEd.config.linkifyArticlePath = null; }
 
// hide refs and templates in newbie mode
if (typeof(wikEd.config.hideContent) === 'undefined') { wikEd.config.hideContent = true; }
 
// hideunhide refs and templates in newbie mode by hover-shift instead of mouseover
if (typeof(wikEd.config.unhideShift) === 'undefined') { wikEd.config.unhideShift = false; }
 
// wikify table parameters, replaces original table parameters with this string
if (typeof(wikEd.config.wikifyTableParameters) === 'undefined') { wikEd.config.wikifyTableParameters = ''; }
 
// do not rearrange page elements
if (typeof(wikEd.config.noRearrange) === 'undefined') { wikEd.config.noRearrange = false; }
 
// use French rules for fix punctuation
if (typeof(wikEd.config.fixPunctFrench) === 'undefined') { wikEd.config.fixPunctFrench = false; }
 
// wikEd.config.setupHook, executed after wikEd has been set up, usage: wikEd.config.setupHook.push(YourFunction);
if (typeof(wikEd.config.setupHook) === 'undefined') { wikEd.config.setupHook = []; }
 
// wikEd.config.onHook, executed after wikEd has been re-enabled by logo click, usage: wikEd.config.onHook.push(YourFunction);
if (typeof(wikEd.config.onHook) === 'undefined') { wikEd.config.onHook = []; }
 
// wikEd.config.offHook, executed after wikEd has been disabled by logo click, usage: wikEd.config.offHook.push(YourFunction);
if (typeof(wikEd.config.offHook) === 'undefined') { wikEd.config.offHook = []; }
 
// wikEd.config.textareaHook, executed after classic textarea has been enabled by user, usage: wikEd.config.textareaHook.push(YourFunction);
if (typeof(wikEd.config.textareaHook) === 'undefined') { wikEd.config.textareaHook = []; }
 
// wikEd.config.frameHook, executed after wikEd edit frame has been enabled by user, usage: wikEd.config.frameHook.push(YourFunction);
if (typeof(wikEd.config.frameHook) === 'undefined') { wikEd.config.frameHook = []; }
 
// wikEd.config.previewHook, executed after the local preview has been added to the page, usage: wikEd.config.previewHook.push(YourFunction);
if (typeof(wikEd.config.previewHook) === 'undefined') { wikEd.config.previewHook = []; }
 
// wikEd.config.diffHook, executed after the local changes diff has been added to the page, usage: wikEd.config.diffHook.push(YourFunction);
if (typeof(wikEd.config.dHook) === 'undefined') { wikEd.config.diffHook = []; }
 
// custom edit form id instead of 'editform'
if (typeof(wikEd.config.customEditFormId) === 'undefined') { wikEd.config.customEditFormId = ''; }
 
// custom textarea id instead of 'wpTextbox1'
if (typeof(wikEd.config.customTextAreaId) === 'undefined') { wikEd.config.customTextAreaId = ''; }
 
// custom save button id instead of 'wpSave'
if (typeof(wikEd.config.customSaveButtonId) === 'undefined') { wikEd.config.customSaveButtonId = ''; }
 
// display tables as editable html tables (table mode)
// show table mode togle button
if (typeof(wikEd.config.showTableModeButton)tableMode === 'undefined') { wikEd.config.showTableModeButtontableMode = falsetrue; }
 
// show table mode toggle button
if (wikEd.config.showTableModeButton === undefined) { wikEd.config.showTableModeButton = false; }
 
// maximal time for syntax highlighting in ms
if (typeof(wikEd.config.maxHighlightTime) === 'undefined') { wikEd.config.maxHighlightTime = 3000; }
 
// first char of article names is case sensitive (e.g. Wiktionary)
if (typeof(wikEd.config.articlesCaseSensitive) === 'undefined') { wikEd.config.articlesCaseSensitive = false; }
 
// force immediate update if this version string is newer
if (typeof(wikEd.config.forcedUpdate) === 'undefined') { wikEd.config.forcedUpdate = ''; }
 
// display highlighting error messages in text
if (typeof(wikEd.config.highlightError) === 'undefined') { wikEd.config.highlightError = false; }
 
// display preview of files in text
if (typeof(wikEd.config.filePreview) === 'undefined') { wikEd.config.filePreview = true; }
 
// file preview image size in pixels
if (typeof(wikEd.config.filePreviewSize) === 'undefined') { wikEd.config.filePreviewSize = 75; }
 
// move cursor/caret outside syntax highlighted element
// file preview image size in pixels
if (typeof(wikEd.config.antiHighlightBleeding) === 'undefined') { wikEd.config.antiHighlightBleeding = truefalse; }
 
// debug window maximal length in chars
if (typeof(wikEd.config.debugMaxLength) === 'undefined') { wikEd.config.debugMaxLength = 50000500000; }
 
// debug display of DOM nodes: maximal length of innerHTML in chars
if (typeof(wikEd.config.debugInnerHtmlLength) === 'undefined') { wikEd.config.debugInnerHtmlLength = 150; }
 
// wikibaseWikiMedia dataCommons (or other external file repository) script url pathfor redlink detection
if (typeof(wikEd.config.wbRepoUrl)externalApiUrl === 'undefined') { wikEd.config.wbRepoUrlexternalApiUrl = '//wwwcommons.wikidatawikimedia.org/wikiw/api.php'; }
 
// origin domains allowed to call externalScriptURL API for redlink detection via Ajax cross-origin request (CORS) (comma separated list)
// interlanguage name of default wiki on wikibase data repository (wikidata)
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'; }
if (typeof(wikEd.config.wbInterLang) == 'undefined') { wikEd.config.wbInterLang = 'enwiki'; }
 
// 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,272 ⟶ 1,350:
 
// init config
if (typeof(wikEd.config) === 'undefined') { wikEd.config = {}; }
 
// debug mode
if (typeof(wikEd.config.debugging) == 'undefined') { wikEd.config.debugging = false; }
 
// wikEd code home base URL, also defined in wikEdDiff.js
if (typeof(wikEd.config.homeBaseUrl) === 'undefined') { wikEd.config.homeBaseUrl = '//en.wikipedia.org/'; }
 
// diff scriptlibrary URL, also defined in wikEdDiff.js
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',
'gl': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Toliño/wikEd_international_gl.js',
'de': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Matthias_M.PerfektesChaos/wikEd_international_de.js',
'he': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:שמוליק/wikEd_international_he.js',
'hr': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:SpeedyGonsales/wikEd_international_hr.js',
'hu': wikEd.config.homeBaseUrl + 'w/index.php?action=raw&ctype=text/javascript&title=User:Csörföly DTsch81/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,339 ⟶ 1,410:
'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',
Line 1,354 ⟶ 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
Line 1,405 ⟶ 1,476:
//
 
wikEd.InitGlobals = function () {
 
// global variables
wikEd.turnedOn = false;
wikEd.disabled = true;
wikEd.uploadEdit = false;
wikEd.viewDeleted = false;
wikEd.watchlistEdit = false;
wikEd.debugOpen = false;
wikEd.pageNamespace = null;
wikEd.wbRepoUrlframeLoaded = ''false;
 
wikEd.wbRepoItem = '';
// edit page types
wikEd.wbInterLang = '';
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
Line 1,436 ⟶ 1,518:
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,449 ⟶ 1,532:
wikEd.frameOuter = null;
wikEd.frame = null;
wikEd.frameBody = null;
wikEd.frameDocument = null;
wikEd.frameBody = null;
wikEd.frameHtml = null;
wikEd.frameWindow = null;
 
Line 1,465 ⟶ 1,549:
wikEd.buttonsWrapper = null;
wikEd.summaryWrapper = null;
wikEd.consoleTopWrapper = null;
wikEd.summaryInputWrapper = null;
wikEd.editOptionsWrapper = null;
Line 1,470 ⟶ 1,555:
wikEd.submitButtonsWrapper = null;
wikEd.localPrevWrapper = null;
wikEd.wikiPreview = null;
wikEd.catLinks = null;
wikEd.insertWrapper = null;
wikEd.textBoxTable = null;
 
// edit form fields
Line 1,477 ⟶ 1,565:
wikEd.edittime = null;
wikEd.editToken = null;
wikEd.autoSummary = null;
wikEd.textarea = null;
 
Line 1,491 ⟶ 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,506 ⟶ 1,596:
wikEd.summaryTextWidth = null;
 
wikEd.editOptions = null;
wikEd.editHelp = null;
wikEd.saveButton = null;
Line 1,538 ⟶ 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,550 ⟶ 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;
 
Line 1,559 ⟶ 1,654:
wikEd.refHide = false;
wikEd.using = false;
wikEd.useWikEd = false;
wikEd.closeToolbar = false;
wikEd.highlightSyntax = false;
Line 1,584 ⟶ 1,678:
 
// linkification and hiding
wikEd.linkifyIdNowikiLinks = 0{};
wikEd.linkifyArray = [];
wikEd.referenceArray = [];
wikEd.templateArray = [];
wikEd.charEntityArray = [];
wikEd.tableArray = [];
wikEd.scheduledUnhide = null;
 
Line 1,595 ⟶ 1,689:
wikEd.typoRulesReplace = [];
 
// store link infos (normalizations, redirects, redlinks)
// redirect fixing
wikEd.redirectsCachelinkInfo = {};
wikEd.externalLinkInfo = {};
 
// article preview: named reference definitions
wikEd.namedRefs = {};
 
// file preview
Line 1,617 ⟶ 1,715:
wikEd.scriptName = '';
wikEd.scriptURL = '';
wikEd.useExternalApi = false;
 
// pasting object
// magic words and parser functions, see http://www.mediawiki.org/wiki/Help:Magic_words
wikEd.paste = null;
 
// magic words and parser functions, see https://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';
 
Line 1,639 ⟶ 1,741:
 
// 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
Line 1,655 ⟶ 1,757:
 
// hash of loaded scripts, also defined in wikEdDiff.js
if (typeof(wikEd.externalScripts) === 'undefined') { wikEd.externalScripts = null; }
if (typeof(wikEd.externalScriptsString) === 'undefined') { wikEd.externalScriptsString = ''; }
if (typeof(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.testVersion) === 'undefined') { wikEd.testVersion = false; }
if (typeof(wikEd.platform) === 'undefined') { wikEd.platform = null; }
if (typeof(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.enableLocalPreview) === 'undefined') { wikEd.enableLocalPreview = false; }
if (typeof(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 = null; }
 
// 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; }
 
// global dom elements, also defined in wikEdDiff.js
if (typeof(wikEd.pageOrigin) === 'undefined') { wikEd.pageOrigin = ''; }
if (typeof(wikEd.head) === 'undefined') { wikEd.head = null; }
 
// also defined in wikEdDiff.js
if (typeof(wikEd.pageName) === 'undefined') { wikEd.pageName = null; }
 
 
Line 1,707 ⟶ 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,731 ⟶ 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,745 ⟶ 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]+\/()/, '');
}
Line 1,758 ⟶ 1,875:
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,769 ⟶ 1,894:
//
 
wikEd.Startup = function () {
 
// redirect WED shortcut to wikEd.Debug(objectName, object, popup)
window.WED = wikEd.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;
}
 
// check if wikEd has already started up
if (document.getElementsByName('wikEdStartupFlag')[0] !== nullundefined) {
return;
}
 
// define current window head
wikEd.head = document.getElementsByTagName('head')[0] || null;
 
// set startup flag
Line 1,794 ⟶ 1,930:
// get site of origin (window.___location.href is about:blank if Firefox during page load)
var origin = wikEd.head.baseURI;
if (origin === nullundefined) {
origin = window.___location.toString();
}
Line 1,800 ⟶ 1,936:
 
// 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;
}
Line 1,810 ⟶ 1,946:
// 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)
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,832 ⟶ 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)
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,865 ⟶ 2,011:
 
// 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;
}
Line 1,888 ⟶ 2,034:
 
// 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)
var globalNames = ['skin', 'wgServer', 'wgTitle', 'wgCanonicalNamespace', 'wgArticlePath', 'wgScript', 'wgScriptPath', 'wgUserName', 'wgCurRevisionId', 'wgContentLanguage', 'wgUserLanguage', 'wgEnableAPI', 'wgPageName', 'wgNamespaceIds', 'wgFormattedNamespaces', 'wgUseAutomaticEditSummaries', 'wgVersion', 'wgPageContentModel'];
if (wikEd.greasemonkey === true) {
globalNames.push('wikEdConfig', 'wikEdText');
}
Line 1,901 ⟶ 2,047:
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,914 ⟶ 2,060:
 
// and load translations when done
if ( (wikEd.config.loadTranslation === true) && (wikEd.loadingTranslation === false) ) {
gotGlobalsHook.push(wikEd.LoadTranslations);
}
 
// set listener for GetGlobals messaging
wikEdwindow.AddEventListeneraddEventListener(window, 'message', wikEd.GetGlobalsReceiver, false);
 
// parse globals (asynchronous)
Line 1,931 ⟶ 2,077:
// with DOMContentLoaded event wikEd does not load for first (uncached) section edit
else {
wikEdwindow.AddEventListeneraddEventListener(window, 'load', wikEd.Setup, false);
}
 
Line 1,942 ⟶ 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
Line 1,964 ⟶ 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;
};
Line 1,994 ⟶ 2,140:
//
 
wikEd.Setup = function () {
 
wikEddocument.RemoveEventListenerremoveEventListener(document, 'DOMContentLoaded', wikEd.Setup, false);
 
wikEd.RemoveEventListener(window, 'load', wikEd.Setup, false);
window.removeEventListener('load', wikEd.Setup, false);
 
// check if wikEd has already set up
if (document.getElementsByName('wikEdSetupFlag')[0] !== nullundefined) {
return;
}
Line 2,010 ⟶ 2,157:
 
// 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
Line 2,043 ⟶ 2,190:
}
 
wikEd.externalScripts[scriptName] = truepageScripts[i];
wikEd.externalScriptsString += scriptName + '\n';
}
Line 2,051 ⟶ 2,198:
 
// detect developer version
if (wikEd.externalScripts['wikEd_dev.js'] !== trueundefined) {
wikEd.testVersion = true;
}
 
// exit if executed as Greasemonkey script if wiki user script is available
if (typeof( GM_getValue) == 'function') {
if (wikEd.externalScripts['wikEd.js'] !== trueundefined) {
wikEd.greasemonkey = false;
return;
Line 2,064 ⟶ 2,211:
wikEd.greasemonkey = true;
}
}
 
// redirect Greasemonkey debugging function to wikEd.Debug if run as a wiki user script
else {
window.GM_log = wikEd.Debug;
}
 
// detect wikEd running as a gadget
if (wikEd.config.gadget === null) {
if (wikEd.externalScripts['MediaWiki:Gadget-wikEd.js'] !== trueundefined) {
wikEd.config.gadget = true;
}
Line 2,079 ⟶ 2,221:
 
// set installation type
if (wikEd.config.gadget === true) {
wikEd.installationType += ' G';
}
else if (wikEd.greasemonkey === true) {
wikEd.installationType += ' GM';
}
Line 2,088 ⟶ 2,230:
// 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.MediaWikiSkinIdsmediaWikiSkinIds[skin][4];
for (var i = 0; i < skinIds.length; i ++) {
if (document.getElementById(skinIds[i]) === null) {
break;
}
Line 2,112 ⟶ 2,254:
 
// not a MediaWiki page
if (wikEd.skin === '') {
return;
}
Line 2,123 ⟶ 2,265:
 
// do not rearrange page elements
if (wikEd.config.noRearrange !== false) {
wikEd.rearrange = false;
}
Line 2,143 ⟶ 2,285:
 
// add image path to image filename
if (wikEd.logo === null) {
 
// create logo
Line 2,151 ⟶ 2,293:
// 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,163 ⟶ 2,305:
wikEd.logoList.appendChild(wikEd.logo);
var list;
var logo;
if (logoContainer.tagName == 'UL') {
list = logoContainer;
Line 2,170 ⟶ 2,311:
list = logoContainer.getElementsByTagName('ul')[0];
}
if (list !== nullundefined) {
list.appendChild(wikEd.logoList);
wikEd.logo.className = 'wikEdLogo';
Line 2,184 ⟶ 2,325:
 
// 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';
Line 2,190 ⟶ 2,331:
 
// add event listeners to logo
wikEd.AddEventListener(wikEd.logo, .addEventListener('click', wikEd.MainSwitch, true);
wikEd.AddEventListener(wikEd.logo, .addEventListener('click', wikEd.DebugInfo, true);
}
 
Line 2,197 ⟶ 2,338:
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 = '&';
if (wikEd.config.diffScriptSrc.indexOf('?') == -1) {
sep = '?';
}
wikEd.externalScripts['diff.js'] = wikEd.AppendScript(wikEd.config.diffScriptSrc + sep + wikEd.programVersion);
}
wikEd.externalScripts['diff.js'] = true;
}
 
// load the external wikEdDiff script if not already done
if ( (wikEd.config.loadDiff === true) && (wikEd.externalScripts['wikEdDiff.js'] === nullundefined) ) {
if (typeof(wikEd.Diff) === 'undefined') {
var sep = '&';
if (wikEd.config.diffSrc.indexOf('?') == -1) {
sep = '?';
}
wikEd.externalScripts['wikEdDiff.js'] = wikEd.AppendScript(wikEd.config.diffSrc + sep + wikEd.programVersion);
}
wikEd.externalScripts['wikEdDiff.js'] = true;
}
 
// load the MS IE selection/range compatibility library IERange
if (wikEd.msie == true) {
if ( (wikEd.config.loadIERange == true) && (wikEd.externalScripts['ierange.js'] == null) ) {
if (typeof(DOMUtils) == 'undefined') {
var sep = '&';
if (wikEd.config.IERangeSrc.indexOf('?') == -1) {
sep = '?';
}
wikEd.AppendScript(wikEd.config.IERangeSrc + sep + wikEd.programVersion);
}
wikEd.externalScripts['ierange.js'] = true;
}
}
Line 2,240 ⟶ 2,365:
// 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;
Line 2,247 ⟶ 2,373:
 
// ___location search string function: put all used images and icons on an empty page
if (/(\?|&)wikEd=iconPage\b/i.test(window.___location.search) === true) {
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,272 ⟶ 2,398:
//
 
wikEd.TurnOn = function (scrollToEditFocus) {
 
// check if setup was already run
if (wikEd.turnedOn === true) {
return;
}
Line 2,281 ⟶ 2,407:
// set error logo
wikEd.SetLogo('error');
 
// check for active code editor and .js or .css page
wikEd.CodeEditorCheck();
 
// no id, no wikEd
if (window.navigator.appName === null) {
wikEd.browserNotSupported = true;
}
Line 2,308 ⟶ 2,437:
// 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;
 
Line 2,333 ⟶ 2,460:
 
// 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;
Line 2,340 ⟶ 2,468:
// 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;
}
 
Line 2,360 ⟶ 2,488:
 
// 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.editFormtextarea !== null) node;{
wikEd.editArticle = false;
}
wikEd.editWatchlist = true;
 
// get watchlist submitedit buttonform
var node = wikEd.textarea;
if (wikEd.editForm != null) {
while (node !== null) {
var submits = wikEd.editForm.getElementsByTagName('input');
node = node.parentNode;
for (i = 0; i < submits.length; i ++) {
if (submits[i]node.typetagName == 'submitFORM') {
break;
wikEd.saveButton = submits[i];
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;
}
}
}
}
}
}
 
// detect upload page
if ( (wikEd.textarea === null) || (wikEd.editForm === null) || (wikEd.saveButton === null) ) {
wikEd. var textarea = document.getElementsByName('wpUploadDescription')[0];
wikEd. var editForm = document.getElementById('mw-upload-form');
wikEd. var saveButton = document.getElementsByName('wpUpload')[0];
if ( (wikEd.textarea !== nullundefined) && (wikEd.editForm !== null) && (wikEd.saveButton !== nullundefined) ) {
wikEd.uploadEdittextarea = truetextarea;
wikEd.rearrangeeditForm = falseeditForm;
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) ) {
wikEd.textarea var forms = document.getElementsByTagName('textareaform')[0];
var i = 0;
if (wikEd.textarea != null) {
var form;
 
while ( (form = forms[i ++]) !== undefined) {
// get form
if (/\btitle=Special:Undelete\b/i.test(form.action) === true) {
var node = document.getElementsByName('preview')[0];
var textareas = document.getElementsByTagName('textarea');
while (node != null) {
node var j = node.parentNode0;
var textarea;
if (node.tagName == 'FORM') {
while ( (textarea = textareas[j ++]) !== undefined) {
break;
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;
wikEd.editForm = node;
if (wikEd.editForm != null) {
wikEd.previewButton = document.getElementsByName('preview')[0];
wikEd.viewDeleted = true;
wikEd.rearrange = false;
}
}
Line 2,452 ⟶ 2,612:
 
// set page detection error indicator
if ( (wikEd.textarea == null) || (wikEd.editForm == null) ) {
wikEd.SetLogo();
return;
}
 
// do not turn on when code editor is active
if (wikEd.useCodeEditor === true) {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', 'Code Editor');
return;
}
 
// check if the textarea is read-only
if (wikEd.config.skipReadOnlyTest === false) {
if ( (wikEd.GetAttribute(wikEd.textarea, .getAttribute('readonly') !== null) || (wikEd.saveButton === null) ) {
wikEd.readOnly = true;
}
}
 
// check for section edits
// get missing wg variables from footer link, fails on /subpages (code copied to wikEdDiff.js)
var section = document.getElementsByName('wpSection');
if (wikEd.wikiGlobals.wgArticlePath == null) {
if (
var printfooter = wikEd.GetElementsByClassName('printfooter', 'div')[0];
if (printfootersection !== null) {&&
section.length > 0
) {
wikEd.editSection = section[0].value;
}
 
// get missing wg variables from footer link (code copied to wikEdDiff.js)
if (wikEd.wikiGlobals.wgArticlePath === undefined) {
var printfooter = document.body.getElementsByClassName('printfooter')[0];
if (printfooter !== undefined) {
var articleLink = printfooter.getElementsByTagName('a')[0];
if (articleLink !== nullundefined) {
var regExpMatch = /^(https?:\/\/[^\/]*)(\/([^\/]*\/)*)([^\/]*)$/.exec(articleLink.href);
if (regExpMatch !== null) {
wikEd.wikiGlobals.wgServer = regExpMatch[1];
wikEd.wikiGlobals.wgArticlePath = regExpMatch[1] + regExpMatch[2] + '$1';
Line 2,482 ⟶ 2,658:
 
// get missing wg variables from form action url
if (wikEd.wikiGlobals.wgScript === nullundefined) {
wikEd.wikiGlobals.wgScriptvar form = wikEd.editForm.action.replace(/^https?:\/\/[^\/]*|\?.*$/g, '');
if ( form !== null && form.action.indexOf( '/Special:EditWatchlist' ) !== -1 ) {
wikEd.wikiGlobals.wgScriptPath = wikEd.wikiGlobals.wgScript.replace(/\/index\.php/, '');
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/, '');
}
}
 
Line 2,491 ⟶ 2,673:
 
// get current namespace
if (wikEd.pageName !== null) {
var colonPos = wikEd.pageName.indexOf(':');
if (colonPos == -1) {
Line 2,501 ⟶ 2,683:
}
 
// get MediaWiki file paths
// get wikibase data repository url and item from interlanguage edit link (wikidata)
wikEd.GetPaths();
// work in progress!
 
var parents = wikEd.GetElementsByClassName('wbc-editpage');
// check if we can call external API for redlink detection
if (parents.length > 0) {
var regExpDomains = new RegExp('//(.*?\\.)?(' + wikEd.config.externalApiDomains.replace(/\s*,\s*/g, '|').replace(/\./g, '\\.') + '$)', 'g');
var node = parents[parents.length - 1].firstChild;
wikEd.useExternalApi = regExpDomains.test(window.___location.origin);
if ( (node != null) && (node.nodeName == 'A') && (node.href != null) ) {
 
var regExpMatch = /^(.*\/)(.*?)$/.exec(node.href);
// get page elements
if (regExpMatch != null) {
wikEd.catLinks = document.getElementById('catlinks');
wikEd.wbRepoUrl = regExpMatch[1];
 
wikEd.wbRepoItem = regExpMatch[2];
// check if mw.loader is available
}
if ( (window.mw !== undefined) && (window.mw.loader !== undefined) && (window.mw.config !== undefined) ) {
}
wikEd.loader = true;
}
 
if (wikEd.wbRepoUrl == '') {
// get wikibase defaults for linkification
if (wikEd.config.wbRepoUrl != null) {
wikEd.wikibase.currentSite = {};
wikEd.wbRepoUrl = wikEd.config.wbRepoUrl;
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 {
// get interlanguage name of wiki on wikibase data repository (wikidata)
window.mw.loader.using('wikibase.repoAccess', function () {
// work in progress!
wikEd.wikibase.repoUrl = window.mw.config.get('wbRepoUrl');
var regExpMatch;
wikEd.wikibase.repoArticlePath = window.mw.config.get('wbRepoArticlePath');
if ( (regExpMatch = /\/\/([\w-]+)\.wikipedia\.org/.exec(wikEd.wikiGlobals.wgServer)) != null) {
});
wikEd.wbInterLang = regExpMatch[1].replace(/-/, '_') + 'wiki';
}
catch (exception) {
else {
}
wikEd.wbInterLang = wikEd.config.wbInterLang;
}
 
Line 2,540 ⟶ 2,736:
 
// 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 generalName = key;
var regExp = new RegExp(wikEd.config.incompatibleScripts[key].replace(/\.js$/g, ''), 'gim');
if (regExp.test(wikEd.externalScriptsString) === true) {
if (scriptNamesincompatible !== '') {
scriptNamesincompatible += ', ';
}
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
if (incompatible !== '') {
wikEd.disabled = true;
wikEd.SetLogo('incompatible', incompatible);
return;
}
 
Line 2,564 ⟶ 2,774:
 
// 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;
}
}
}
}
 
// load the external InstaView script
if ( (wikEd.greasemonkey == false) && (wikEd.config.loadInstaView == true) && (wikEd.externalScripts['instaview.js'] == null) ) {
if (typeof(InstaView) == 'undefined') {
var sep = '&';
if (wikEd.config.instaViewSrc.indexOf('?') == -1) {
sep = '?';
}
wikEd.AppendScript(wikEd.config.instaViewSrc + sep + wikEd.programVersion);
}
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,605 ⟶ 2,795:
wikEd.textareaHeight = (wikEd.textarea.offsetHeight - wikEd.textareaBorderHeight) + 'px';
wikEd.textareaWidth = '100%';
 
// 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;
 
// Opera 0.9.51
wikEd.origVersion = wikEd.origVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
// add stylesheet definitions
Line 2,628 ⟶ 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 (/(\?|&)action=submit\b/.test(window.___location.search) === true) {
wikEd.previewPage = true;
}
 
// no fullscreen for preview and upload pages
if ( (wikEd.uploadEdit == true) || (wikEd.previewPage == true) ) {
wikEd.fullScreenMode = false;
}
 
// disable wikEd for Lupin's autoedit scripts
if (/(\?|&)autoedit=/.test(window.___location.search) === true) {
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;
}
}
else {
wikEd.highlightSyntax = false;
}
}
 
// disable highlighting for module namespace (Scribunto/Lua templates)
if (wikEd.wikiGlobals.wgCanonicalNamespace == 'Module') {
wikEd.noSpellcheck = true;
wikEd.highlightSyntax = false;
}
 
// no spellcheck for watchlist editing
if (wikEd.watchlistEditeditWatchlist === 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,683 ⟶ 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 or custom other
 
wikEd.wikiEditor = wikEd.GetElementsByClassName('wikiEditor-ui', 'div')[0];
// inside the wikiEditor interface
if (wikEd.wikiEditor == null) {
var wikiEditor = document.body.getElementsByClassName('wikiEditor-ui')[0];
var parent = wikEd.textarea.parentNode;
if (wikiEditor !== undefined) {
if ( (parent.nodeName == 'DIV') && (parent.firstChild == wikEd.textarea) ) {
wikEd.textareaContainerwikiEditor = parentwikiEditor;
wikEd.wikiEditorFrame = wikEd.wikiEditor.getElementsByTagName('IFRAME')[0] || null;
}
wikEd.wikiEditorTop = document.body.getElementsByClassName('wikiEditor-ui-top')[0] || null;
else {
wikEd.wikiEditorLeft = document.body.getElementsByClassName('wikiEditor-ui-left')[0] || null;
wikEd.textareaContainer = wikEd.textarea;
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';
// create buttons 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);
}
wikEd.inputWrapper.appendChild(wikEd.editorWrapper);
 
// create toolbar wrapper
Line 2,738 ⟶ 2,947:
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.editorWrapper.appendChild(wikEd.toolbarWrapper);
wikEd.toolbarWrapper.appendChild(wikEd.toolbar);
}
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 debug textarea wrapper
}
wikEd.debugWrapper = document.createElement('div');
wikEd.debugWrapper.id = 'wikEdDebugWrapper';
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.textBoxTable;
if (wikEd.rearrange == true) {
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
Line 2,801 ⟶ 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,810 ⟶ 3,008:
wikEd.inputWrapper.appendChild(wikEd.consoleWrapper);
}
 
// create buttons 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
Line 2,829 ⟶ 3,016:
 
// 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);
}
Line 2,867 ⟶ 3,057:
 
// create preview wrapper for preview and diff box
if (wikEd.enableLocalPreview !== false) {
wikEd.localPrevWrapper = document.createElement('div');
wikEd.localPrevWrapper.id = 'wikEdLocalPrevWrapper';
wikEd.localPrevWrapper.className = 'wikEdLocalPrevWrapper';
wikEd.localPrevWrapper.style.display = 'none';
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);
}
Line 2,887 ⟶ 3,077:
 
// create insert wrapper for insert special chars links
if (wikEd.rearrange === true) {
wikEd.insertWrapper = document.createElement('div');
wikEd.insertWrapper.id = 'wikEdInsertWrapper';
wikEd.insertWrapper.className = 'wikEdInsertWrapper';
wikEd.inputWrapper.appendChild(wikEd.insertWrapper);
}
 
// append input wrapper to document
if ( (wikEd.rearrange == true) && (wikEd.watchlistEdit == false) ) {
wikEd.editForm.insertBefore(wikEd.inputWrapper, wikEd.editForm.firstChild);
}
 
Line 2,903 ⟶ 3,088:
// 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,923 ⟶ 3,109:
 
// hide toolbar wrapper
if (wikEd.closeToolbar === true) {
wikEd.toolbarWrapper.style.display = 'none';
}
Line 2,931 ⟶ 3,117:
 
// 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);
}
}
Line 2,941 ⟶ 3,127:
 
// dropdowns from toolbar should go over wikEd toolbar
if (wikEd.wikiEditorBar !== null) {
wikEd.wikiEditorBar.style.zIndex = '5';
}
 
// get edit options
wikEd.editOptions = wikEd.GetElementsByClassName('editCheckboxes', 'div', wikEd.editForm)[0];
 
// old MediaWiki versions
if (wikEd.editOptions == null) {
var wpSummary = document.getElementsByName('wpSummary')[0];
if (wpSummary != null) {
wikEd.editOptions = wpSummary.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;
}
}
}
}
}
 
// 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] || 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 3,053 ⟶ 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 3,069 ⟶ 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;
}
var nextNode = node.nextSibling;
if (node.tagName != 'INPUT') {
wikEd.captchaWrapper.appendChild(node);
}
node = nextNode;
}
}
else {
classFrameBody = 'wikEdFrameBodySyntax';
}
}
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;
}
 
// fillcreate theediting frame withand contentinitialize after iframe loading
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);
// disable spellchecker in iframe
if (wikEd.noSpellcheck == true) {
html += ' spellcheck="false"';
}
if (wikEd.readOnly == false) {
html += ' onload="var doc = window.document; doc.designMode = \'on\'; ';
}
html += 'try { doc.execCommand(\'styleWithCSS\', 0, false); } catch (error) { ';
html += 'try { doc.execCommand(\'useCSS\', 0, true); } catch (error) { ';
html += 'try { doc.execCommand(\'styleWithCSS\', false, false); } catch (error) { } } }"';
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 height and width, border divs shrink around
Line 3,136 ⟶ 3,329:
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.width = wikEd.frameWidth;
 
// do not remember size if started in fullscreen mode
if (wikEd.fullScreenMode == true) {
wikEd.frameHeight = 0;
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 (error) {
try { wikEd.frameDocument.execCommand('useCSS', 0, true); } catch (error) {
try { wikEd.frameDocument.execCommand('styleWithCSS', false, false); } catch (errror) {
}
}
}
}
 
// 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 = wikEd.MakeButtonBar(wikEd.config.buttonBar.format);
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarFormat);
Line 3,186 ⟶ 3,351:
wikEd.buttonBarWrapper.appendChild(wikEd.buttonBarFind);
 
// inactivate replace buttons for read-only pages
if (wikEd.readOnly == false) {
if (wikEd.readOnly === true) {
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);
Line 3,199 ⟶ 3,371:
br.style.clear = 'both';
wikEd.buttonsWrapper.appendChild(br);
 
wikEd.caseSensitive = document.getElementById('wikEdCaseSensitive');
wikEd.regExp = document.getElementById('wikEdRegExp');
Line 3,208 ⟶ 3,379:
// 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';
// add article and diff preview containers and their bottom bar to preview wrapper
wikEd.localPrevWrapper.appendChild(div);
if (wikEd.localPrevWrapper !== null) {
 
// article preview
wikEd.previewArticle = document.createElement('div');
wikEd.previewArticle.id = 'wikEdPreviewArticle';
wikEd.previewArticle.className = 'wikEdPreviewArticle';
wikEd.previewArticle.display = 'none';
wikEd.localPrevWrapper.appendChild(wikEd.previewArticle);
 
// diff preview
wikEd.previewBox = document.createElement('div');
wikEd.previewBox.idpreviewDiff = document.createElement('wikEdPreviewBoxdiv');
wikEd.previewBoxpreviewDiff.classNameid = 'wikEdPreviewBoxwikEdPreviewDiff';
wikEd.previewDiff.className = 'wikEdPreviewDiff';
div.appendChild(wikEd.previewBox);
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);
Line 3,228 ⟶ 3,414:
 
// 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);
}
}
Line 3,247 ⟶ 3,436:
 
// add local preview button next to submit button
if (wikEd.enableLocalPreview !== false) {
var previewSpan = document.createElement('span');
previewSpan.innerHTML = wikEd.MakeButtonCode(82, 'button');
if (wikEd.previewButton !== null) {
wikEd.previewButton.parentNode.insertBefore(previewSpan, wikEd.previewButton.nextSibling);
}
else if (wikEd.saveButton !== null) {
wikEd.saveButton.parentNode.insertBefore(previewSpan, wikEd.saveButton.nextSibling);
}
else {
wikEd.submitWrapper.insertBefore(previewSpan, wikEd.submitWrapper.firstChild);
}
 
// add local diff button next to submit button
if ( ( (wikEd.diffPreviewButton !== null) || (wikEd.watchlistEditeditWatchlist === 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);
}
Line 3,277 ⟶ 3,469:
 
// 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,290 ⟶ 3,481:
wikEd.Button(document.getElementById('wikEdClose2'), 'wikEdClose2', null, false, 'wikEdButton');
wikEd.Button(document.getElementById('wikEdTableMode'), 'wikEdTableMode', null, wikEd.tableMode);
 
// grey out fullscreen button
if ( (wikEd.editArticle === false) || (wikEd.useWikEd === false) ) {
document.getElementById('wikEdFullScreen').className = 'wikEdButtonInactive';
}
 
// grey out close toolbar button
if (wikEd.rearrange === false) {
document.getElementById('wikEdCloseToolbar').className = 'wikEdButtonInactive';
}
 
// 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';
}
 
// hide buttons if API is not available
if ( (wikEd.wikiGlobals.wgEnableAPI != true) && (wikEd.wikiGlobals.wgEnableAPI != 'true') ) {
var fixRedirect = document.getElementById('wikEdFixRedirect');
if (fixRedirect != null) {
fixRedirect.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,348 ⟶ 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;
}
Line 3,371 ⟶ 3,567:
wikEd.selectElement.replace.title = wikEd.config.text['wikEdReplaceSelect title'];
 
if (wikEd.summaryInputWrapper !== null) {
wikEd.fieldHist ['summary'] = [];
wikEd.savedName.summary = 'wikEdSummaryHistory';
Line 3,382 ⟶ 3,578:
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);
}
 
// display only the textarea or the iframe, dont change the frame
wikEd.SetEditArea(wikEd.useWikEd, true);
 
// copy page warnings above edit window
if ( (wikEd.config.doCloneWarnings === true) && (wikEd.editForm !== null) ) {
if ( (wikEd.clonedWarnings === false) && (wikEd.previewPage === false) && (/(.*\n){2}/.test(wikEd.origVersion) ) === true) {
var divs = document.getElementsByTagName('div');
var divWarnings = [];
Line 3,420 ⟶ 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);
}
 
// scroll to edit window and focus if it is not a preview page
if ( (scrollToEditFocus == true) && (wikEd.previewPage == false) ) {
 
// focus the input field
if ( (wikEd.config.focusEdit === true) && (wikEd.useWikEd === false) ) {
if (wikEd.useWikEdtextarea.setSelectionRange(0, == true0) {;
wikEd.frameWindowtextarea.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);
}
}
Line 3,491 ⟶ 3,679:
// 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);
}
}
Line 3,500 ⟶ 3,688:
 
// 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 frame events
wikEd.AddEventListener(wikEd.frameDocument, 'keydown', wikEd.KeyFrameHandler, 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);
 
// register document events
wikEddocument.AddEventListeneraddEventListener(document, 'keydown', wikEd.KeyHandler, true);
 
// dblclick on wrapper events
wikEd.AddEventListener(wikEd.debugWrapper, .addEventListener('dblclick', wikEd.DebugHandler, true);
wikEd.AddEventListener(wikEd.localPrevWrapper, .addEventListener('dblclick', wikEd.PrevWrapperHandler, true);
 
// register find ahead events
wikEd.AddEventListener(wikEd.findText, .addEventListener('keyup', wikEd.FindAhead, true);
 
// register submit button events
wikEd.AddEventListenerif (wikEd.saveButton, 'click',!== wikEd.SaveButtonHandler,null) true);{
wikEd.AddEventListenersaveButton.addEventListener(wikEd.previewButton, 'click', wikEd.PreviewButtonHandlerSaveButtonHandler, true);
}
wikEd.AddEventListener(wikEd.diffPreviewButton, 'click', wikEd.DiffPreviewButtonHandler, true);
if (wikEd.previewButton !== null) {
 
wikEd.previewButton.addEventListener('click', wikEd.PreviewButtonHandler, true);
// unload (leaving page) events
}
wikEd.AddEventListener(window, 'pagehide', wikEd.UnloadHandler, false);
if (wikEd.diffPreviewButton !== null) {
wikEd.diffPreviewButton.addEventListener('click', wikEd.DiffPreviewButtonHandler, true);
}
 
// set button bar grip area events
if (wikEd.buttonBarFormat !== null) {
wikEd.AddEventListener(wikEd.buttonBarFormat.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarTextify !== null) {
wikEd.AddEventListener(wikEd.buttonBarTextify.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarControl !== null) {
wikEd.AddEventListener(wikEd.buttonBarControl.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarCustom1 !== null) {
if (wikEd.buttonBarCustom1.firstChild.firstChild !== null) {
wikEd.AddEventListener(wikEd.buttonBarCustom1.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
}
if (wikEd.buttonBarFind !== null) {
wikEd.AddEventListener(wikEd.buttonBarFind.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarFix !== null) {
wikEd.AddEventListener(wikEd.buttonBarFix.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
if (wikEd.buttonBarCustom2 !== null) {
if (wikEd.buttonBarCustom2.firstChild.firstChild !== null) {
wikEd.AddEventListener(wikEd.buttonBarCustom2.firstChild.firstChild, .addEventListener('click', wikEd.ButtonBarGripHandler, false);
}
}
 
// register combo box events
wikEd.AddEventListenerif (wikEd.summarySelect, 'change',!== function(null) { wikEd.ChangeComboInput('summary'); }, false);
wikEd.AddEventListenersummarySelect.addEventListener(wikEd.summarySelect, 'focuschange', function () { wikEd.SetComboOptionsChangeComboInput('summary'); }, false);
wikEd.summarySelect.addEventListener('focus', function () { wikEd.SetComboOptions('summary'); }, false);
 
}
wikEd.AddEventListener(wikEd.selectElement.find, 'change', function() { wikEd.ChangeComboInput('find'); }, false);
wikEd.AddEventListenerif (wikEd.selectElement.find, 'focus',!== function(null) { wikEd.SetComboOptions('find'); }, false);
wikEd.selectElement.find.addEventListener('change', function () { wikEd.ChangeComboInput('find'); }, false);
 
wikEd.AddEventListener( wikEd.selectElement.replace, find.addEventListener('changefocus', function () { wikEd.ChangeComboInputSetComboOptions('replacefind'); }, false);
}
wikEd.AddEventListener(wikEd.selectElement.replace, 'focus', function() { wikEd.SetComboOptions('replace'); }, 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
wikEd.AddEventListenerif (wikEd.clearSummary, 'click',!== wikEd.ClearSummaryHandler,null) true);{
wikEd.clearSummary.addEventListener('click', wikEd.ClearSummaryHandler, false);
}
 
// register double click handler on wiki preview area
// select the text on focus for find and replace fields
if (wikEd.wikiPreview !== null) {
wikEd.AddEventListener(wikEd.findText, 'focus', wikEd.FindReplaceHandler, true);
wikEd.AddEventListenerwikiPreview.addEventListener(wikEd.replaceText, 'focusdblclick', wikEd.FindReplaceHandlerWikiPreviewHandler, truefalse);
}
 
// register special char insert select handler for fullscreen resizing
// tab / shift-tab between find and replace fields
if (wikEd.insertWrapper !== null) {
wikEd.AddEventListener(wikEd.findText, 'keydown', wikEd.FindReplaceHandler, true);
var select = wikEd.insertWrapper.getElementsByTagName('select')[0];
wikEd.AddEventListener(wikEd.replaceText, 'keydown', wikEd.FindReplaceHandler, true);
if (select !== undefined) {
select.addEventListener('change', wikEd.InsertChangeHandler, true);
}
}
 
// select the text on focus for find and replace fields, tab/shift-tab between find and replace fields
// init MediaWiki file paths for use in regexps
if (wikEd.wikiGlobals.wgServerfindText !== null) {
wikEd.server =findText.addEventListener('focus', wikEd.wikiGlobals.wgServerFindReplaceHandler, true);
wikEd.findText.addEventListener('keydown', wikEd.FindReplaceHandler, true);
}
if (wikEd.wikiGlobals.wgArticlePathreplaceText !== null) {
wikEd.articlePath =replaceText.addEventListener('focus', wikEd.wikiGlobals.wgArticlePathFindReplaceHandler, true);
wikEd.replaceText.addEventListener('keydown', wikEd.FindReplaceHandler, true);
}
if (wikEd.wikiGlobals.wgScriptPath != null) {
wikEd.scriptPath = wikEd.wikiGlobals.wgScriptPath;
}
if (wikEd.wikiGlobals.wgScript != null) {
wikEd.script = wikEd.wikiGlobals.wgScript;
}
 
wikEd.articlePath = wikEd.articlePath.replace(wikEd.server, '');
wikEd.scriptPath = wikEd.scriptPath.replace(wikEd.server, '');
wikEd.articlePath = wikEd.articlePath.replace(/\$1$/, '');
wikEd.scriptPath = wikEd.scriptPath.replace(/\/?$/, '/');
wikEd.scriptName = wikEd.script.replace(wikEd.scriptPath, '');
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');
wikEd.script = wikEd.script.replace(/(\W)/g, '\\$1');
wikEd.scriptPath = wikEd.scriptPath.replace(/(\W)/g, '\\$1');
wikEd.scriptName = wikEd.scriptName.replace(/(\W)/g, '\\$1');
 
// 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
// fullscreen mode
 
if (wikEd.fullScreenMode == true) {
// window.mw.toolbar.insertTags
wikEd.FullScreen(wikEd.fullScreenMode, true);
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;
}
 
// override thedeprecated insertTags function in wikibits.js used by the standard button toolbar and the editpage special chars
else if (typeof( window.insertTags) == 'function') {
if (wikEd.InsertTagsOriginal === null) {
wikEd.InsertTagsOriginal = window.insertTags;
}
insertTags = wikEd.InsertTags;
}
else {
window.insertTags = wikEd.InsertTags;
}
 
// hook wikEd into the enhanced new edit toolbar, not Greasemonkey compatible
if (typeof( jQuery) == 'function') {
jQuery('#wpTextbox1').bind('encapsulateSelection', function (e, before, inside, after) {
if (wikEd.useWikEd === true) {
wikEd.InsertTags(before, after, inside);
}
Line 3,639 ⟶ 3,818:
 
// update textarea before using UI LivePreview function, not Greasemonkey compatible
if ( (typeof( jQuery) == 'function') && (typeof( window.mw) == 'object') ) {
jQuery(window.mw).bind('LivePreviewPrepare', function (event) {
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
}
Line 3,648 ⟶ 3,827:
 
// 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;
}
 
Line 3,662 ⟶ 3,841:
var resizeGripImage = document.createElement('img');
resizeGripImage.id = 'wikEdResizeGrip';
wikEdresizeGripImage.AddEventListeneraddEventListener(resizeGripImage, 'load', wikEd.ResizeGripLoadHandler, true);
resizeGripImage.src = wikEd.config.image['resizeGrip'];
 
// remove accesskeys that are defined in wikEd from page elements
wikEd.deleteAccesskeysDeleteAccesskeys();
 
// disable CodeEditor button when wikEd is active
wikEd.DisableCodeEditorButton();
 
// run scheduled custom functions
Line 3,680 ⟶ 3,862:
 
//
// wikEd.GetPaths: get MediaWiki file paths from wikiGlobals if possible
// wikEd.deleteAccesskeys: remove accesskeys that are defined in wikEd from page elements
//
 
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 !== undefined) {
wikEd.articlePath = wikEd.wikiGlobals.wgArticlePath;
}
if (wikEd.wikiGlobals.wgScriptPath !== undefined) {
wikEd.scriptPath = wikEd.wikiGlobals.wgScriptPath;
}
if (wikEd.wikiGlobals.wgScript !== undefined) {
wikEd.script = wikEd.wikiGlobals.wgScript;
}
 
wikEd.articlePath = wikEd.articlePath.replace(wikEd.server, '');
wikEd.scriptPath = wikEd.scriptPath.replace(wikEd.server, '');
wikEd.articlePath = wikEd.articlePath.replace(/\$1$/, '');
wikEd.scriptPath = wikEd.scriptPath.replace(/\/?$/, '/');
wikEd.scriptName = wikEd.script.replace(wikEd.scriptPath, '');
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');
wikEd.script = wikEd.script.replace(/(\W)/g, '\\$1');
wikEd.scriptPath = wikEd.scriptPath.replace(/(\W)/g, '\\$1');
wikEd.scriptName = wikEd.scriptName.replace(/(\W)/g, '\\$1');
 
return;
};
 
 
//
// 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
try {
wikEd.frameDocument.execCommand('enableObjectResizing', false, 'false');
wikEd.frameDocument.execCommand('enableInlineTableEditing', false, 'false');
}
catch (exception) {
}
 
// display iframe, hide textarea, set fullscreen
wikEd.SetEditArea(wikEd.useWikEd, true);
 
// add frame stylesheets
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();
}
}
 
// 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();
}
 
// unload (leaving page) events
window.addEventListener('pagehide', wikEd.UnloadHandler, false);
 
return;
};
 
 
//
// 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
if ( (wikEd.jsPage === true) || (wikEd.cssPage === true) ) {
if (wikEd.wikiGlobals.wgPageContentModel === undefined) {
if (wikEd.GetCookie('wikiEditor-0-codeEditor-enabled') == 1) {
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;
}
}
}
}
return;
};
 
 
//
// wikEd.DisableCodeEditorButton: disable CodeEditor button when wikEd is active
//
 
wikEd.DisableCodeEditorButton = function () {
 
if ( (wikEd.config.disableCodeEditorButton === true) && ( (wikEd.useBetaToolbar === true) || (wikEd.wikiEditorBar !== null) ) ) {
var buttons = document.body.getElementsByClassName('tool-button');
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;
}
}
 
// poll between 0.1 and 12 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.deleteAccesskeysDeleteAccesskeys = function () {
 
var accesskeyTags = ['textarea', 'input', 'a'];
Line 3,689 ⟶ 4,114:
var accesskeyElements = document.getElementsByTagName(accesskeyTags[i]);
for (var j = 0; j < accesskeyElements.length; j ++) {
var attribute = wikEd.GetAttribute(accesskeyElements[j], .getAttribute('accesskey');
if (attribute !== null) {
if (wikEd.buttonKeyCode[ attribute.toUpperCase().charCodeAt(0) ] !== nullundefined) {
accesskeyElements[j].setAttribute('accesskey', null);
}
Line 3,705 ⟶ 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)
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
Line 3,726 ⟶ 4,165:
 
// schedule forced update check
if ( (currentVersion !== null'') && (forcedVersion !== null'') ) {
if (forcedVersion > currentVersion) {
forcedUpdate = true;
Line 3,736 ⟶ 4,175:
var regularUpdate = false;
var currentDate = new Date();
if (forcedUpdate === false) {
 
// get date of last update check
Line 3,743 ⟶ 4,182:
 
// fix missing or corrupt saved setting
if (isNaN(lastCheckDate.valueOf()) === true) {
wikEd.SetPersistent('wikEdAutoUpdate', 'January 1, 1970', 0, '/');
return;
Line 3,750 ⟶ 4,189:
// 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,761 ⟶ 4,200:
 
// perform AJAX request to get latest version number
if ( (forcedUpdate === true) || (regularUpdate === true) ) {
 
// save current update check date
Line 3,767 ⟶ 4,206:
 
// make the ajax request
wikEd.AjaxRequest('GET', wikEd.config.autoUpdateUrl, null, 'text/plain', function (ajax, obj) {
 
// get response
Line 3,777 ⟶ 4,216:
 
// check if downloaded version is newer and perform update
if ( (currentVersion !== null'') && (newVersion !== null'') ) {
if (newVersion > currentVersion) {
wikEd.DoUpdate();
Line 3,792 ⟶ 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,808 ⟶ 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;
}
Line 3,830 ⟶ 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;
}
Line 3,843 ⟶ 4,281:
}
 
wikEd.AjaxRequest('GET', wikEd.config.regExTypoFixURL + sep + wikEd.programVersion, null, 'text/plain', function (ajax) {
 
// get response
Line 3,850 ⟶ 4,288:
// parse regexp rules
var regExp = /<(?:Typo)?\s+(?:word="(.*?)"\s+)?find="(.*?)"\s+replace="(.*?)"\s*\/?>/g;
var regExpMatch;
while ( (regExpMatch = regExp.exec(rulesTxt)) !== null) {
 
// check if this is a valid regexp
Line 3,857 ⟶ 4,296:
regExpFind = new RegExp(regExpMatch[2], 'gm');
}
catch (errorexception) {
var msg = 'Invalid RegExTypoFix rule:\nfind=' + regExpMatch[2] + '\nreplace=' + regExpMatch[3];
wikEd.ConsoleLog(msg);
Line 3,870 ⟶ 4,309:
// display typo fix button
if (wikEd.typoRulesFind.length > 0) {
if (wikEd.fixRegExTypo !== null) {
wikEd.fixRegExTypo.style.display = 'inline';
}
Line 3,884 ⟶ 4,323:
//
 
wikEd.EditButtonHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// execute the button click handler code
var obj;
if (event.currentTarget != null) {
obj = event.currentTarget;
}
 
// MS IE compatibility
else {
obj = event.srcElement;
}
 
// execute the button click handler code, obj required in eval context
var obj = event.currentTarget;
eval(wikEd.editButtonHandler[obj.id]);
return;
Line 3,912 ⟶ 4,336:
//
 
wikEd.ShrinkSummaryHandler = function (event) {
 
var diffWidth = wikEd.clearSummary.offsetWidth - wikEd.clearSummaryWidth;
Line 3,923 ⟶ 4,347:
 
//
// wikEd.InsertChangeHandler: resize fullscreen after changing insert special char selection
// wikEd.ResizeWindowHandler: adjust the summary width after resizing the window
//
 
wikEd.ResizeWindowHandlerInsertChangeHandler = function (event) {
if (wikEd.fullscreen === true) {
wikEd.ResizeWindowHandler();
}
};
 
// adjust frame size
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;
 
//
// wikEd.ResizeWindowHandler: adjust fullscreen frame and summary width after resizing the window
// browser's dynamic table resizing interferes if wikEd is inserted in table (Special:Upload)
 
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';
}
 
// adjust frame size
else {
wikEd.frameWidth = (wikEd.frameWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
wikEd.frame.style.width = wikEd.frameWidth;
}
wikEd.ResizeSummary();
return;
};
 
 
//
// wikEd.WikiPreviewHandler: event handler for wiki preview: scroll to edit field on double click
//
 
wikEd.WikiPreviewHandler = function (event) {
 
// 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();
 
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
return;
};
Line 3,943 ⟶ 4,433:
//
 
wikEd.UnloadHandler = function (event) {
 
// update textarea if not already done in submit handlers
if (wikEd.useWikEd === true) {
if (wikEd.textareaUpdated !=== truefalse) {
wikEd.UpdateTextarea();
}
Line 3,959 ⟶ 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;
Line 3,970 ⟶ 4,460:
 
// 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,982 ⟶ 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,996 ⟶ 4,486:
 
// reinstate handler in case the browser back button will be used
wikEd.AddEventListener(wikEd.saveButton, .addEventListener('click', wikEd.SaveButtonHandler, true);
 
return;
Line 4,006 ⟶ 4,496:
//
 
wikEd.PreviewButtonHandler = function (event) {
 
// temporary debugging for 0.9.114
if ( (wikEd.config.debugging == true) && (event.shiftKey == true) ) {
event = wikEd.EventWrapper(event, this);
var obj = {};
wikEd.GetInnerHTML(obj, wikEd.frameBody);
var html = obj.html;
html = html.replace(/\n/g, '\\n\n');
html = html.replace(/\r/g, '\\r\n');
WED('PreviewButtonHandler wikEd.frameBody.innerHTML', html);
}
 
 
if (wikEd.useWikEd == true) {
 
// temporary debugging for 0.9.114
if ( (wikEd.config.debugging == true) && (event.shiftKey == true) ) {
var html = wikEd.textarea.value;
html = html.replace(/\n/g, '\\n\n');
html = html.replace(/\r/g, '\\r\n');
WED('PreviewButtonHandler wikEd.textarea.value before', html);
}
 
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
wikEd.textareaUpdated = true;
 
// temporary debugging for 0.9.114
if ( (wikEd.config.debugging == true) && (event.shiftKey == true) ) {
var html = wikEd.textarea.value;
html = html.replace(/\n/g, '\\n\n');
html = html.replace(/\r/g, '\\r\n');
WED('PreviewButtonHandler wikEd.textarea.value after', html);
}
}
 
// temporary debugging for 0.9.114
if ( (wikEd.config.debugging == true) && (event.shiftKey == true) ) {
WED(wikEd.GetDebugInfo(), undefined, true);
event.preventDefault();
}
 
return;
};
Line 4,056 ⟶ 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 4,074 ⟶ 4,529:
//
 
wikEd.LinkifyHandler = function (event) {
 
// 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 4,109 ⟶ 4,555:
//
 
wikEd.ButtonBarGripHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
event.stopPropagation();
Line 4,134 ⟶ 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, '/');
}
Line 4,144 ⟶ 4,584:
gripWrapper.className = 'wikEdButtonBarGripWrapperVisible';
buttonsWrapper.style.display = 'block';
wikEdgrip.RemoveEventListenerremoveEventListener(grip, 'mouseover', wikEd.ButtonBarGripHandler, false);
wikEd.SetPersistent(bar.id + 'Hidden', '0', 0, '/');
}
Line 4,152 ⟶ 4,592:
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] + 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,178 ⟶ 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,204 ⟶ 4,637:
(
( (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,225 ⟶ 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 = '';
}
Line 4,243 ⟶ 4,670:
else {
wikEd.summaryText.value = wikEd.summaryText.value.replace(/^((\/\* .*? \*\/ *)?).*()/,
function (p, p1, p2, p3) {
if (p1.length > 0) {
p1 = p1 + ' ';
}
return( p1);
}
);
Line 4,260 ⟶ 4,687:
//
 
wikEd.FindReplaceHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// tab / shift-tab between fields
Line 4,273 ⟶ 4,694:
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);
}
}
Line 4,288 ⟶ 4,709:
// 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,303 ⟶ 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) {
 
Line 4,320 ⟶ 4,790:
// 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,332 ⟶ 4,802:
 
// scroll to text input top
if (wikEd.fullScreenModefullscreen === false) {
window.scroll(0, wikEd.GetOffsetTop(wikEd.inputWrapper));
}
Line 4,344 ⟶ 4,814:
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,368 ⟶ 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.AntiHighlightBleedingPasteFrameHandler = function(obj, editButtonInsert(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;
}
 
// correctget focusNode to actual (deepest)focus 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)
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;
}
Line 4,417 ⟶ 5,518:
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;
}
 
Line 4,445 ⟶ 5,546:
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
Line 4,475 ⟶ 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,531 ⟶ 5,657:
}
}
 
return;
};
Line 4,540 ⟶ 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,558 ⟶ 5,678:
//
 
wikEd.ResizeGripHandler = function (event) {
 
// Firefox bug during startup ("WikEdEventwikEd is not defined")
if (typeof(wikEd.EventWrapper) !=== 'function' undefined) {
return;
}
 
if (wikEd.useWikEd === true) {
// 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,594 ⟶ 5,708:
 
// move out of grip
else if (wikEd.resizeFrameActive === false) {
if (
(event.clientY < wikEd.frameBody.clientHeight - wikEd.resizeGripHeight) ||
Line 4,600 ⟶ 5,714:
) {
wikEd.resizeFrameMouseOverGrip = false;
wikEd.RemoveEventListener(wikEd.frameDocument, .removeEventListener('mousedown', wikEd.ResizeStartHandler, true);
wikEd.frameBody.style.cursor = 'auto';
}
Line 4,615 ⟶ 5,729:
//
 
wikEd.ResizeStartHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
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,637 ⟶ 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,655 ⟶ 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,689 ⟶ 5,792:
//
 
wikEd.ResizeDragHandlerFrame = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
Line 4,721 ⟶ 5,818:
//
 
wikEd.ResizeDragHandlerDocument = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
if (event.type == 'mousemove') {
Line 4,753 ⟶ 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) {
Line 4,769 ⟶ 5,854:
 
// end fullscreen mode
if (wikEd.fullScreenModefullscreen === true) {
wikEd.FullScreen(false, true);
}
 
Line 4,780 ⟶ 5,865:
 
// 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,799 ⟶ 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,817 ⟶ 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,831 ⟶ 5,949:
//
 
wikEd.SetLogo = function (state, parameter) {
 
var src = '';
Line 4,852 ⟶ 5,970:
}
else {
if (wikEd.disabled === true) {
src = wikEd.config.image['disabled'];
alt = wikEd.config.text['wikEdLogo disabled alt'];
title = wikEd.config.text['wikEdLogo disabled title'];
}
else if (wikEd.testVersion === true) {
src = wikEd.config.image['testVersion'];
alt = wikEd.config.text['wikEdLogo testVersion alt'];
Line 4,868 ⟶ 5,986:
}
}
if (parameter !== undefined) {
title = title.replace(/\{wikEdParameter\}/g, parameter);
}
title = title.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
title = title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
Line 4,882 ⟶ 6,002:
//
 
wikEd.MakeButtonBar = function (bar) {
 
// id outer, class outer, id inner, class inner, alt, button numbers
Line 4,918 ⟶ 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 button html code
buttons += '<img ' + wikEd.MakeButtonCode(buttonNo) + '>';
}
}
Line 4,940 ⟶ 6,060:
div.id = barId;
div.className = barClass;
if ( (barTitle !== nullundefined) && (barTitle !== '') ) {
barTitle = barTitle.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
barTitle = barTitle.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
Line 4,952 ⟶ 6,072:
// make a grip bar
var html = '';
if (gripTitle !== null) {
var gripStyle = 'width: ' + wikEd.config.buttonBarGripWidth + 'px; ';
if (barHeight > 0) {
Line 4,980 ⟶ 6,100:
// make a standard no-grip bar
else {
html += '<div id="' + buttonsId + '" class="' + buttonsClass + '"' + buttonsStyle + '">';
html += buttons;
html += '</div>';
}
div.innerHTML = html;
return div;
 
return(div);
};
 
Line 4,994 ⟶ 6,113:
//
 
wikEd.MakeButtonCode = function (buttonNo, type) {
 
var currButton = wikEd.config.button[buttonNo];
 
// add accesskey information to button title and
var accessKey = '';
if (wikEd.config.buttonKey[buttonNo] !== nullundefined) {
accessKey = ' [' + wikEd.config.text['alt-shift'] + wikEd.config.buttonKey[buttonNo][0] + ']';
 
Line 5,013 ⟶ 6,132:
}
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] + '">';
}
 
Line 5,019 ⟶ 6,138:
wikEd.editButtonHandler[ currButton[0] ] = currButton[7];
 
return( html);
};
 
Line 5,027 ⟶ 6,146:
//
 
wikEd.ButtonBarInit = function (bar) {
 
if (wikEd.GetPersistentGetSavedSetting(bar.id + 'Hidden') === '1'true) {
var barInnerWrapper = bar.firstChild;
var gripWrapper = barInnerWrapper.firstChild;
Line 5,040 ⟶ 6,159:
wikEd.buttonsWrapperWidth[bar.id] = buttonsWrapper.offsetWidth;
buttonsWrapper.style.display = 'none';
wikEdgrip.AddEventListeneraddEventListener(grip, 'mouseover', wikEd.ButtonBarGripHandler, true);
}
return;
Line 5,050 ⟶ 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;
 
Line 5,066 ⟶ 6,185:
wikEd.textarea.style.display = 'none';
 
if (notFrame !== true) {
wikEd.frameWrapper.style.position = 'static';
wikEd.frameWrapper.style.visibility = 'visible';
Line 5,073 ⟶ 6,192:
 
// set visibility of native toolbar
if (wikEd.closeToolbar === true) {
wikEd.toolbarWrapper.style.display = 'none';
}
Line 5,080 ⟶ 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();
}
 
Line 5,107 ⟶ 6,227:
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 5,116 ⟶ 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 5,127 ⟶ 6,247:
 
// 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 5,163 ⟶ 6,282:
//
 
wikEd.Button = function (buttonObj, buttonId, toggleButton, setButton, classButton, doButton) {
if (buttonObj !== null) {
 
if (buttonObj != null) {
 
// check if the button is disabled
Line 5,176 ⟶ 6,294:
 
// 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';
}
}
}
Line 5,211 ⟶ 6,328:
// 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
Line 5,220 ⟶ 6,340:
// 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,240 ⟶ 6,360:
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;
Line 5,256 ⟶ 6,376:
case 'wikEdScrollToPreview2':
case 'wikEdScrollToPreview3':
window.scroll(0, wikEd.GetOffsetTop(wikEd.saveButtonsubmitWrapper));
focusFrame = true;
break;
Line 5,291 ⟶ 6,411:
// 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';
 
// get MathJax
if ( (typeof(mw) == 'object') && (typeof(mw.loader) == 'object') && (typeof(mw.loader.using) == 'function') ) {
WED('Load MathJax');
try {
mw.loader.using('ext.math.mathjax.enabler', function () {
WED('Loaded MathJax');
if ( (typeof(wikEd.previewBox) == 'object') && (typeof(wikEd.previewBox.renderTeX) == 'function') ) {
wikEd.previewBox.renderTeX();
WED('renderTeX');
}
});
}
catch (error) {
}
}
 
// 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[^>\/]*>(.|\n)*?<\/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
var regExp = /<(syntaxhighlight|source)\b[^>]*?lang\s*=\s*("|')(\w+)\2/gi;
while ( (regExpMatch = regExp.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;
Line 5,428 ⟶ 6,417:
// display local diff box
case 'wikEdLocalDiff':
if (typeof(WDiffString)WikEdDiff !=== 'function'undefined) {
wikEd.previewDiff.innerHTML = '<div class="wikEdPreviewDiffError">' + wikEd.config.text.diffNotLoaded + '</div>';
var diffTextLinkified = '';
wikEd.previewArticle.style.display = 'none';
wikEd.previewBox.innerHTML = '<div class="wikEdPreviewDiffError">' + wikEd.config.text.diffNotLoaded + '</div>';
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) {
// display diff, 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.previewDiff.innerHTML === '') {
wikEd.previewDiff.innerHTML = wikEd.config.text.wikEdPreviewLoading;
}
wikEd.localPrevWrapper.style.display = 'block';
wikEd.previewArticle.style.display = 'none';
wikEd.previewDiff.style.display = 'block';
 
if (wikEd.useWikEd === true) {
wikEd.UpdateTextarea();
}
Line 5,443 ⟶ 6,448:
// add trailing newline
var currentVersion = wikEd.textarea.value;
 
// Opera 0.9.51
currentVersion = currentVersion.replace(/\r\n|\n\r|\r/g, '\n');
 
// call external diff program
wikEd.previewBoxpreviewDiff.innerHTML = wikEd.DiffResponse(wikEd.origVersion, currentVersion);
 
// display diff, keep wrapper height to prevent scrolling
var previewHeight = wikEd.previewBox.offsetHeight;
if ( (wikEd.previewBox.innerHTML != '') && (previewHeight > 0) ) {
wikEd.previewBox.style.height = previewHeight + 'px';
}
wikEd.localPrevWrapper.style.display = 'block';
 
// scroll to button, textarea, or preview field
Line 5,464 ⟶ 6,459:
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;
Line 5,508 ⟶ 6,477:
 
// 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
Line 5,522 ⟶ 6,494:
// 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, '/');
 
Line 5,530 ⟶ 6,509:
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,546 ⟶ 6,529:
// hide ref tags
case 'wikEdRefHide':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.refHide = true;
wikEd.SetPersistent('wikEdRefHide', '1', 0, '/');
Line 5,554 ⟶ 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,567 ⟶ 6,555:
// close the toolbar
case 'wikEdCloseToolbar':
if (wikEdbuttonObj.GetAttributegetAttribute(buttonObj, 'checked') == 'true') {
wikEd.closeToolbar = true;
wikEd.toolbarWrapper.style.display = 'none';
Line 5,577 ⟶ 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;
Line 5,596 ⟶ 6,586:
// 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;
Line 5,623 ⟶ 6,611:
 
// 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,641 ⟶ 6,632:
//
 
wikEd.EditButton = function (buttonObj, buttonId, parameters, CustomHandler) {
 
// check if iframe is enabled
if (wikEd.UseWikEd === false) {
return;
}
 
// check if button is disabled
if (buttonObj !== null) {
if (buttonObj.className == 'wikEdButtonInactive') {
return;
Line 5,665 ⟶ 6,656:
// 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
wikEd.textareaUpdated = false;
 
// invalidate wikify/textify of recently pasted text
if ( (buttonId != 'wikEdPastedWikify') && (buttonId != 'wikEdPastedTextify') && (buttonId != 'wikEdPasting') ) {
wikEd.PastedOff();
}
 
// switch the button
Line 5,689 ⟶ 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,707 ⟶ 6,706:
case 'wikEdRefNamed':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,719 ⟶ 6,718:
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,730 ⟶ 6,741:
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,755 ⟶ 6,766:
case 'wikEdDefinitionList':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
Line 5,761 ⟶ 6,772:
else {
wikEd.GetText(obj, 'focusLine');
if (obj.focusLine.plain !== '') {
obj.changed = obj.focusLine;
}
Line 5,773 ⟶ 6,784:
case 'wikEdSort':
wikEd.GetText(obj, 'selection, cursor, selectionLine');
if (obj.selection.plain === '') {
obj.changed = obj.selectionLine;
}
else if (/\n./.test(obj.selection.plain) === false) {
obj.changed = obj.selection;
}
Line 5,787 ⟶ 6,798:
case 'wikEdImage':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionWord');
obj.changed = obj.selectionWord;
Line 5,799 ⟶ 6,810:
case 'wikEdTable':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
wikEd.GetText(obj, 'selectionLine');
obj.changed = obj.selectionLine;
Line 5,807 ⟶ 6,818:
obj.changed = obj.cursor;
}
break;
 
// wikify pasted: cursor
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;
 
Line 5,817 ⟶ 6,848:
else {
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,830 ⟶ 6,861:
case 'wikEdTextify':
wikEd.GetText(obj, 'selection', false);
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,842 ⟶ 6,873:
case 'wikEdRedirect':
wikEd.GetText(obj, 'whole, selection, cursor');
if (obj.selection.plain === '') {
wikEd.GetText(obj, 'selectionWord');
}
Line 5,857 ⟶ 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,874 ⟶ 6,905:
case 'wikEdReplaceAll':
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,892 ⟶ 6,923:
case 'wikEdFixRedirectReplace':
wikEd.GetText(obj, 'selection, cursor');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,909 ⟶ 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,926 ⟶ 6,957:
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,943 ⟶ 6,974:
case 'wikEdSource':
wikEd.GetText(obj, 'selection');
if (obj.selection.plain !== '') {
obj.changed = obj.selection;
}
Line 5,952 ⟶ 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;
 
// convert wiki tables to html
case 'wikEdTablify':
wikEd.GetText(obj, 'whole');
obj.changed = obj.whole;
break;
 
Line 5,989 ⟶ 7,008:
 
// 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 6,012 ⟶ 7,031:
// 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;
Line 6,026 ⟶ 7,045:
// 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;
Line 6,046 ⟶ 7,065:
else {
obj.changed.plain = '\'\'\'' + obj.changed.plain + '\'\'\'';
if (emptyOrSpaces === false) {
 
// move spaces outside markup
Line 6,069 ⟶ 7,088:
else {
obj.changed.plain = '\'\'' + obj.changed.plain + '\'\'';
if (emptyOrSpaces === false) {
 
// move spaces outside markup
Line 6,092 ⟶ 7,111:
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;)(\s*)((.|\n)*?)(\s*)(&lt;\/u&gt;)$/, '$2$1$3$6$5');
}
Line 6,106 ⟶ 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;)(\s*)((.|\n)*?)(\s*)(&lt;\/s&gt;)$/, '$2$1$3$6$5');
}
Line 6,120 ⟶ 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;)(\s*)((.|\n)*?)(\s*)(&lt;\/nowiki&gt;)$/, '$2$1$3$6$5');
}
Line 6,135 ⟶ 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;)(\s*)((.|\n)*?)(\s*)(&lt;\/sup&gt;)$/, '$2$1$3$6$5');
}
Line 6,150 ⟶ 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;)(\s*)((.|\n)*?)(\s*)(&lt;\/sub&gt;)$/, '$2$1$3$6$5');
}
Line 6,160 ⟶ 7,179:
case 'wikEdRef':
case 'wikEdRefNamed':
if (obj.changed.plain === '') {
if (buttonId == 'wikEdRef') {
obj.changed.plain = '&lt;ref&gt;&lt;\/ref&gt;';
Line 6,181 ⟶ 7,200:
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;)(\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;
Line 6,198 ⟶ 7,239:
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 6,219 ⟶ 7,260:
// 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,238 ⟶ 7,279:
// toggle lowercase / uppercase
case 'wikEdCase':
if (obj.changed.plain === '') {
obj.changed.plain = null;
}
Line 6,257 ⟶ 7,298:
// 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(regExp,
function (p, p1, p2, p3) {
return( p1 + p2.toUpperCase() + p3.toLowerCase());
}
);
Line 6,271 ⟶ 7,312:
 
// 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,286 ⟶ 7,325:
 
// sort a single line
if (/\n./.test(obj.changed.plain) === false) {
 
// Normalize(): normalize strings for sorting
var Normalize = function (text) {
 
// [ [ |( ) ] ]
Line 6,298 ⟶ 7,337:
 
// start with first letter
var regExp = new RegExp('^[^' + wikEd.letters + '__0-9]+', 'g');
text = text.replace(regExp, '');
 
Line 6,304 ⟶ 7,343:
text = text.replace(/0*(\d+)(\.\d*)?/g,
function(p, p1, p2) {
return( '000000000000000'.substr(p1.length) + p1 + p2);
}
);
Line 6,311 ⟶ 7,350:
text = text.toLowerCase();
 
return( text);
};
 
// SplitSortJoin(): sort list items in one line
var SplitSortJoin = function (regExp, text) {
 
var sorted = null;
Line 6,323 ⟶ 7,362:
var regExpMatch;
var lastMatch = 0;
while ( (regExpMatch = regExp.exec(text)) !== null) {
var element = text.substring(lastMatch, regExpMatch.index);
var separator = regExpMatch[0];
Line 6,331 ⟶ 7,370:
if (array.length > 0) {
var element = text.substring(lastMatch);
if (element !== '') {
array.push([element, '', Normalize(element)]);
}
Line 6,337 ⟶ 7,376:
// sort array after normalized elements
array.sort(function(a, b) {
returnif (a[2] > b[2]); {
return 1;
}
if (a[2] < b[2]) {
return -1;
}
return 0;
});
 
Line 6,343 ⟶ 7,388:
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] = '';
Line 6,350 ⟶ 7,395:
}
}
return( sorted);
};
 
 
// extract sortable text
Line 6,361 ⟶ 7,405:
// 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];
Line 6,368 ⟶ 7,412:
 
// sortable text enclosed in html
var regExpMatch = /^(<[^>]>+)(.*?)(<\/[^>]>+)$/.exec(sortable);
if (regExpMatch !== null) {
pre = pre + regExpMatch[1];
sortable = regExpMatch[2];
Line 6,377 ⟶ 7,421:
// 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;
Line 6,391 ⟶ 7,435:
 
// simple spaces
if (sorted === null) {
sorted = SplitSortJoin(/ +/g, sortable);
}
Line 6,399 ⟶ 7,443:
 
// join pre, sorted, and post
if (sorted !== null) {
sorted = sorted.replace(/ {2,}/, ' ');
sorted = sorted.replace(/ +$/, '');
Line 6,413 ⟶ 7,457:
var post = '';
var regExpMatch = /^(((\{\|.*|!.*|\|\+.*|\|\-.*|)\n)*)((.|\n)*?)(((\|\}.*|\|\-.*|)\n)*)$/.exec(obj.changed.plain);
if (regExpMatch !== null) {
pre = regExpMatch[1];
main = regExpMatch[4];
Line 6,426 ⟶ 7,470:
function(p, p1, p2, p3) {
p2 = p2.replace(/\n/g, '\x00');
return( p1 + p2);
}
);
Line 6,438 ⟶ 7,482:
 
// remove empty lines
if (line === '') {
continue;
}
Line 6,454 ⟶ 7,498:
 
// keep visible text of external links only
sortKey = sortKey.replace(/\[(https?:|ftp:|irc:|gopher):)\/\/\S+/g, '');
 
// keep visible cell content only
Line 6,469 ⟶ 7,513:
sortKey = sortKey.replace(/0*(\d+)(\.\d*)?/g,
function(p, p1, p2) {
return( '000000000000000'.substr(p1.length) + p1 + p2);
}
);
Line 6,503 ⟶ 7,547:
sortArray = sortArray.sort(
function(a, b) {
if (a[1] <=> b[1]) {
return(- 1);
}
if (a[1] < b[1]) {
return -1;
}
else {
return(1) 0;
}
}
Line 6,528 ⟶ 7,575:
// 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;
}
Line 6,552 ⟶ 7,597:
else {
obj.changed.plain = '[[' + obj.changed.plain + ']]';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/^(\[\[)(\s*)((.|\n)*?)(\s*)(\]\])$/, '$2$1$3$6$5');
}
Line 6,566 ⟶ 7,611:
else {
obj.changed.plain = '[' + obj.changed.plain + ']';
if (emptyOrSpaces === false) {
obj.changed.plain = obj.changed.plain.replace(/^(\[)(\s*)((.|\n)*?)(\s*)(\])$/, '$2$1$3$6$5');
}
Line 6,594 ⟶ 7,639:
 
// create new heading
if (/\n/.test(obj.changed.plain) === false) {
obj.changed.plain = obj.changed.plain.replace(/(^|\n)([^=\s].*?)(?=\n|$)/g, '$1== $2 ==');
}
Line 6,606 ⟶ 7,651:
case 'wikEdIncreaseBulletList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([*#:;]*) *()/g, '*$1 ');
return( p1);
}
);
Line 6,617 ⟶ 7,662:
case 'wikEdDecreaseBulletList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[*#:;] *()/g, '');
return( p1);
}
);
Line 6,628 ⟶ 7,673:
case 'wikEdIncreaseNumberList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([*#:;]*) *()/g, '#$1 ');
return( p1);
}
);
Line 6,639 ⟶ 7,684:
case 'wikEdDecreaseNumberList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[*#:;] *()/g, '');
return( p1);
}
);
Line 6,650 ⟶ 7,695:
case 'wikEdIncreaseIndentList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([*#:;]*) *()/g, ':$1 ');
return( p1);
}
);
Line 6,661 ⟶ 7,706:
case 'wikEdDecreaseIndentList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[*#:;] *()/g, '');
return( p1);
}
);
Line 6,672 ⟶ 7,717:
case 'wikEdDefinitionList':
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([^\s;]+) *()/g, '; $1 : ');
return( p1);
}
);
Line 6,681 ⟶ 7,726:
// 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,696 ⟶ 7,741:
// 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;
 
Line 6,730 ⟶ 7,860:
case 'wikEdRedirect':
var linkTarget;
if (obj.selection.plain !== '') {
linkTarget = obj.selection.plain;
}
else if (obj.selectionWord.plain !== '') {
linkTarget = obj.selectionWord.plain;
}
Line 6,753 ⟶ 7,883:
 
// 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 + ']]');
Line 6,787 ⟶ 7,917:
// 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;
Line 6,803 ⟶ 7,933:
if ( (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdJumpNext') ) {
findText = obj.changed.plain;
if (obj.selection.plain === '') {
obj.changed.keepSel = true;
obj.changed.plain = null;
Line 6,812 ⟶ 7,942:
// 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,822 ⟶ 7,952:
 
// get button status
var regExpChecked = wikEd.GetAttribute(wikEd.regExp, .getAttribute('checked');
var caseSensitiveChecked = wikEd.GetAttribute(wikEd.caseSensitive, .getAttribute('checked');
 
// get case sensitive setting
var caseSensitive = false;
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
Line 6,836 ⟶ 7,972:
// 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
Line 6,848 ⟶ 7,984:
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,873 ⟶ 8,009:
) {
var regExpFindText = findText;
if (useRegExp !== true){
regExpFindText = regExpFindText.replace(/([\\^$*+?.()\[\]{}:=!|,\-])/g, '\\$1');
}
var regExpFlags = 'gm';
if (caseSensitive !== true) {
regExpFlags += 'i';
}
Line 6,883 ⟶ 8,019:
regExpFind = new RegExp(regExpFindText, regExpFlags);
}
catch (errorexception) {
return;
}
Line 6,902 ⟶ 8,038:
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,929 ⟶ 8,066:
(buttonId == 'wikEdFindAll')
) {
if (replacedFlag === false) {
 
// get direction
Line 6,935 ⟶ 8,072:
if ( (buttonId == 'wikEdFindPrev') || (buttonId == 'wikEdJumpPrev') || (buttonId == 'wikEdReplacePrev') ) {
backwards = true;
}
 
// get case sensitive
var caseSensitive = false;
if (caseSensitiveChecked == 'true') {
caseSensitive = true;
}
 
Line 6,949 ⟶ 8,080:
 
// 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,963 ⟶ 8,094:
// 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
Line 6,974 ⟶ 8,105:
 
// 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,992 ⟶ 8,123:
 
// 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;');
}
 
Line 7,032 ⟶ 8,161:
break;
case 'wikEdFixRedirect':
wikEd.FixRedirectCallLinkInfoCall(obj.changed, function (ajax); {
wikEd.LinkInfoHandler(ajax);
wikEd.EditButton(null, 'wikEdFixRedirectReplace');
});
return;
case 'wikEdFixRedirectReplace':
Line 7,051 ⟶ 8,183:
break;
case 'wikEdFixRegExTypo':
if ( (wikEd.config.regExTypoFix === true) && (wikEd.typoRulesFind.length > 0) ) {
wikEd.FixTypos(obj.changed);
}
Line 7,072 ⟶ 8,204:
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;
Line 7,083 ⟶ 8,213:
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 = obj.cursor;
obj.changed.plain = sampleText;
}
 
// opening and closing strings
else if ( (obj.changed.plain === '') && (sampleText.length > 0) ) {
obj.changed.plain = tagOpen + sampleText + tagClose;
 
Line 7,117 ⟶ 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;
Line 7,137 ⟶ 8,248:
// custom edit functions
default:
if (CustomHandler !== nullundefined) {
CustomHandler(obj);
}
else {
window.alert('Unknown edit function \'' + buttonId + '\'');
}
break;
Line 7,149 ⟶ 8,260:
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 7,168 ⟶ 8,279:
// 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 7,193 ⟶ 8,303:
// highlight the syntax
obj.html = obj.changed.plain;
if (highlightSyntax === true) {
if (obj.changed.from == 'whole') {
obj.whole = true;
}
 
wikEd.HighlightSyntax(obj, highlightNoTimeOut);
}
Line 7,215 ⟶ 8,326:
 
// 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);
var obj.sel.removeAllRanges();
range = wikEd.frameDocument.createRange();
range.setStartBefore(wikEd.frameBody.firstChild);
range.setEndAfter(wikEd.frameBody.lastChild);
Line 7,244 ⟶ 8,367:
selectChanged = false;
 
// scheduling needed for Firefox 9.0.1but 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.setEndAfter(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();
}
}
Line 7,264 ⟶ 8,393:
// 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 7,278 ⟶ 8,407:
// 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
else if (obj.sel.rangeCount > 0) {
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';
}
 
Line 7,292 ⟶ 8,430:
 
// add event handlers to unhide refs and templates
if ( (highlightSyntax === true) && (obj.changed.plain !== null) ) {
 
// add ref and template names to hide buttons
Line 7,301 ⟶ 8,439:
 
// 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 7,317 ⟶ 8,708:
//
 
wikEd.LocalPreviewAjaxHandler = function ( ajax ) {
 
// get preview html
wikEd.previewIsAjax = true;
var html = '';
 
// getjson responseAPI reponse
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
// livepreview
if ( wikEd.loader === true && parse.modules !== undefined ) {
if (html.indexOf('<livepreview>') != -1) {
var modules = parse.modules.concat(
html = html.replace(/\s*<\/livepreview>\s*()/, '');
parse.modulescripts, parse.modulestyles, parse.modulemessages
html = html.replace(/\s*<\/preview>\s*()/, '');
);
html = html.replace(/&lt;/g, '<');
window.mw.loader.load( modules );
html = html.replace(/&gt;/g, '>');
}
html = html.replace(/&quot;/g, '"');
 
html = html.replace(/&apos;/g, '\'');
// add heading to new section
html = html.replace(/&amp;/g, '&');
if ( parse.parsedsummary !== undefined && wikEd.editSection === 'new') {
html = html.replace(/(.|\n)*<div class=("|')previewnote("|')>(.|\n)*?<\/div>/, '');
html = '<h2>' + parse.parsedsummary['*'] + '</h2>' + html;
}
}
}
 
// xml API reponse
else if ( ajax.responseText.indexOf( '<api>' ) !== -1 ) {
html = wikEd.StringGetInnerHTML( ajax.responseText, 'text', '' )
.replace( /&lt;/g, '<' )
.replace( /&gt;/g, '>' )
.replace( /&quot;/g, '"' )
.replace( /&amp;/g, '&' );
}
 
// non-API livepreview (https://www.mediawiki.org/wiki/Manual:Live_preview)
else if ( ajax.responseText.indexOf( '<livepreview>' ) != -1 ) {
html = wikEd.StringGetInnerHTML( ajax.responseText, 'preview', '' )
.replace( /&lt;/g, '<' )
.replace( /&gt;/g, '>' )
.replace( /&quot;/g, '"' )
.replace( /&apos;/g, '\'' )
.replace( /&amp;/g, '&' );
html = wikEd.RemoveTag( html, 'div', /\bclass=("|')previewnote("|')/, '\x00', '\x01' );
html = html.replace( /\x00(.|\n)*?\x01/g, '' );
}
 
// full preview page
else {
html = ajax.responseText;
 
// attach <style> stylesheet declarations to document (GeSHi<source>, <syntaxhighlight>)
var regExpMatch;
var regExp = /<()style\b[^>]*?type="text\/css">((.|\n)*?)<\/style>/gi;
while ( ( regExpMatch = regExp.exec( html ) ) !== null ) {
var css = regExpMatch[2];
var stylesheet = new wikEd.StyleSheet( document );
stylesheet.AddCSSRules( 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[^>]*>/gi, '' );
html = html.replace( /<input\b[^>]*?\btype\s*=\s*["']?hidden["']?[^>]*>/gi, '' );
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
// run MathJax
if (typeof(wikEd.previewBox.renderTeX) == 'function') {
wikEd.previewBox.renderTeX();
WED('renderTeX in main');
}
// init sortable tables (wikibits.js)
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)
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' ) );
}
 
Line 7,394 ⟶ 8,881:
 
// 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,404 ⟶ 8,986:
//
 
wikEd.FilePreviewAjaxHandler = function (ajax) {
 
// get response
Line 7,410 ⟶ 8,992:
 
// 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,428 ⟶ 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,447 ⟶ 9,029:
// 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,473 ⟶ 9,057:
//
 
wikEd.DiffResponse = function (oldVersion, newVersion) {
 
// add trailing newline
Line 7,484 ⟶ 9,068:
 
// call external diff program
var diffTextwikEdDiff = WDiffString(oldVersion,new newVersionWikEdDiff();
var diffText = wikEdDiff.diff(oldVersion, newVersion);
if (wikEd.config.fullDiff != true) {
diffText = WDiffShortenOutput(diffText);
}
 
// linkify blockwise with breaks at delete and block move tags
var diffTextLinkified = '';
var regExp = /<span\b[^>]+?\bclass="wDiffHtmlwikEdDiff(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;
 
return(diffTextLinkified);
};
 
Line 7,508 ⟶ 9,089:
//
 
wikEd.DiffLinkify = function (html) {
 
// &lt; &gt; to \x00 \x01
Line 7,517 ⟶ 9,098:
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;
}
Line 7,534 ⟶ 9,116:
 
// external links 123 3 2 14 4 5 6 65
plain = plain.replace(/\b(((https\bhttps?:|ftp\bftp:|irc\birc:|gopher)\bgopher:|)\/\/)|news\bnews:|mailto\bmailto:)([^\x00-\x20\s"\[\]\x7f\|\{\}<>]|<[^>]*>)+?(?=([!"().,:;‘-•]*\s|[\x00-\x20\s"\[\]\x7f|{}]|$))/gi,
function (p) {
var whole = p;
 
var// titleremove =tags whole;and comments
var url = whole;
title = title.replace(/\x00!--.*?--\x01/g, '');
titleurl = titleurl.replace(/.*--\x01|\x00!--.*()?--\x01/g, '');
titleurl = titleurl.replace(/<.*?>--\x01|\x00!--.*()/g, '');
titleurl = titleurl.replace(/^<.*?>|<.*$/g, '');
titleurl = titleurl.replace(/^\s+.*>|\s+<.*$/g, '');
titleurl = decodeURIurl.replace(title/^\s+|\s+$/g, '');
 
var// url =make title; as readable as possible
urlvar title = encodeURI(url);
urltitle = urltitle.replace(/ \+/g, '%20 ');
url = url.replace(/"/g, '%22');
url = url.replace(/'/g, '%27');
url = url.replace(/#/g, '%23');
 
// decodeURI breaks for invalid UTF-8 escapes
var linkTitle = title.replace(/"/g, '&quot;');
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="' + linkTitletitle + '">';
var anchorClose = '</a>';
whole = whole.replace(/(<[^>]*>)/g, anchorClose + '$1' + anchorOpen);
return( anchorOpen + whole + anchorClose);
}
);
 
// linkify links and templates
if ( (wikEd.wikiGlobals.wgServer !== nullundefined) && (wikEd.wikiGlobals.wgArticlePath !== nullundefined) ) {
 
// 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 || '';
Line 7,575 ⟶ 9,167:
// extract title
var title = articleName;
if (title === '') {
title = templateName;
}
Line 7,585 ⟶ 9,177:
 
// [[/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 = titlewikEd.replaceEncodeTitle(/\s/g, '_'title);
url = encodeURI(url);
url = url.replace(/"/g, '%22');
url = url.replace(/'/g, '%27');
url = url.replace(/#/g, '%23');
var articleTitle = title.replace(/"/g, '&quot;');
if (templateName !== '') {
if (/:/.test(title) === false) {
url = 'Template:' + url;
articleTitle = 'Template:' + articleTitle;
Line 7,608 ⟶ 9,196:
var anchorClose = '</a>';
whole = whole.replace(/(<[^>]*>)/g, anchorClose + '$1' + anchorOpen);
return( anchorOpen + whole + anchorClose);
}
);
Line 7,620 ⟶ 9,208:
linkified = linkified.replace(/\x01/g, '&gt;');
 
return( linkified);
};
 
Line 7,628 ⟶ 9,216:
//
 
wikEd.StringGetInnerHTML = function (html, tag, attrib, value, defaultToWholeHTML, getBeforeHTML, getAfterHTML) {
 
var startPos;
Line 7,635 ⟶ 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) {
var p1 = regExpMatch[1] || '';
if (p1 === '') {
level ++;
}
else {
level --;
if (level === 0) {
endPos = regExpMatch.index;
endLength = regExpMatch[0].length;
Line 7,665 ⟶ 9,253:
 
// return whole html if node does not exist
if (endPos === nullundefined) {
if (defaultToWholeHTML === true) {
string = html;
}
Line 7,672 ⟶ 9,260:
 
// 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);
}
Line 7,686 ⟶ 9,274:
}
 
return( string);
};
 
Line 7,694 ⟶ 9,282:
//
 
wikEd.ScrollToPreview = function () {
 
// reset fixed height to auto
wikEd.previewBoxlocalPrevWrapper.style.height = 'auto';
 
var scrollOffset = window.pageYOffset || document.body.scrollTop;
Line 7,703 ⟶ 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,731 ⟶ 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,758 ⟶ 9,420:
//
 
wikEd.HighlightNamedHideButtons = function () {
 
if (wikEd.refHide !== true) {
return;
}
Line 7,768 ⟶ 9,430:
// 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';
 
wikEd.referenceArray[i].added = true;
}
Line 7,782 ⟶ 9,441:
// 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';
 
wikEd.templateArray[i].added = true;
}
Line 7,796 ⟶ 9,452:
// character entities
for (var i = 0; i < wikEd.charEntityArray.length; i ++) {
if (wikEd.charEntityArray[i].added === true) {
continue;
}
Line 7,804 ⟶ 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
for (var i = 0; i < wikEd.tableArray.length; i ++) {
if (wikEd.tableArray[i].added === true) {
continue;
}
var text = wikEd.config.text.hideTable;
if (text !== '') {
text += ' ';
}
text += wikEd.tableArray[i].text;
rules += '.wikEdTableButton' + i + ' { border: 1px solid; border-color: #e8e8e8 #444 #444 #e8e8e8; background: #d8d4d0; }\n';
rules += '.wikEdTableButtonShow' + i + ' { border: 1px solid; border-color: #000 #e8e8e8 #e8e8e8 #000; background: #c8c4c0; }\n';
rules += '.wikEdTableButton' + i + ':before, .wikEdTableButtonShow' + i + ':before { content: "' + text + '"; line-height: 0.75em; font-size: 65%; color: #000; font-family: sans-serif; }\n';
wikEd.tableArray[i].added = true;
}
 
// add or replace existing css rules
if (rules !== '') {
wikEd.HighlightNamedHideButtonsStylesheet.AddCSSRules(rules);
}
Line 7,824 ⟶ 9,493:
//
 
wikEd.HideAddHandlers = function () {
 
if ( (wikEd.config.hideContent !== true) || (wikEd.refHide !== true) ) {
return;
}
Line 7,833 ⟶ 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,855 ⟶ 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 = null;
var hideInto = null;
var hideButtonClass = null;
var hideClass = null;
var hideButton = null;
var hideContainer = null;
var hidehideCell = null;
var hide = null;
 
if ( (event.type == 'mouseover') || (event.type == 'mouseout') || (event.type == 'click') ) {
hideTarget = event.currentTarget;
hideInto = event.safeRelatedTargetrelatedTarget;
 
// <container><button></button></container><hide> text </hide>
 
// target == buttontable cell
if (/^wikEd (Ref|Templ|CharEntityhideTarget.tagName == 'TD')Button && (Show)?/^wikEdTable\d*w+?$/.test(hideTarget.className) === true) ) {
hideCell = hideTarget;
hideButton = hideCell.getElementsByTagName('button')[0] || 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;
}
Line 7,890 ⟶ 9,566:
// get hide text
hide = wikEd.GetNextSiblingNode(hideContainer);
if (hide !== null) {
if (/^wikEd(Ref|Templ|TemplNs|CharEntity|Table)(Show)?$/.test(hide.className) === false) {
hide = null;
}
Line 7,899 ⟶ 9,575:
}
 
// target == hide text
else if (/^wikEd(Ref|Templ|TemplNs|CharEntity|Table)(Show)?$/.test(hideTarget.className) === true) {
 
hide = hideTarget;
hideContainer = wikEd.GetPreviousSiblingNode(hideTarget);
if (hideContainer !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Container$/.test(hideContainer.className) === false) {
hideContainer = null;
}
Line 7,912 ⟶ 9,587:
// get button
hideButton = wikEd.GetFirstChildNode(hideContainer);
if (hideButton !== null) {
if (/^wikEd(Ref|Templ|CharEntity|Table)Button(Show)?\d*$/.test(hideButton.className) === false) {
hideButton = null;
}
Line 7,921 ⟶ 9,596:
}
 
// exit if missing elements
if ( (hideContainer == null) || (hideButton == null) || (hide == null) ) {
if ( (hideContainer === null) || (hideButton === null) || (hide === null) ) {
return;
}
Line 7,932 ⟶ 9,608:
// schedule unhide on later shift or ctrl key push
if (event.type == 'mouseover') {
if (wikEd.config.unhideShift === true) {
if ( (event.type == 'mouseover') && (wikEd.config.unhideShift === true) && (event.shiftKey === false) && (event.ctrlKey === false) ) {
wikEd.scheduledUnhide = [hide, hideButton];
wikEd.AddEventListener(wikEd.frameDocument, .addEventListener('keydown', wikEd.HideShowHandler, true);
wikEdhideButton.AddEventListeneraddEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, true);
return;
}
Line 7,944 ⟶ 9,620:
// 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];
Line 7,953 ⟶ 9,629:
 
// 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
wikEd.RemoveEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
if (hideClass == 'wikEdTableShow') {
wikEd.AddEventListener(hide, 'mouseout', wikEd.HideShowHandler, true);
var node = hide;
wikEd.AddEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, true);
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);
}
}
 
// 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) {
event.stopPropagation();
 
if (hideCell !== null) {
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
wikEd.RemoveEventListener(hide, 'mouseout', wikEd.HideShowHandler, true);
window.setTimeout( function () {
wikEd.RemoveEventListener(hideButton, 'mouseout', wikEd.HideShowHandler, true);
wikEd hideButton.AddEventListeneraddEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
}, 100);
 
// move cursor out of hidden text
Line 7,997 ⟶ 9,709:
// hide on click
else if (event.type == 'click') {
if (/^wikEd(Ref|Templ|CharEntity|Table)ButtonShow\d*$/.test(hideButtonClass) === true) {
event.stopPropagation();
 
hideClass = hideClass.replace(/Show/, '');
Line 8,006 ⟶ 9,719:
hideButton.title = wikEd.config.text[hideButtonClass.replace(/\d+$/g, '') + 'Tooltip'];
 
wikEdhideButton.AddEventListeneraddEventListener(hideButton, 'mouseover', wikEd.HideShowHandler, true);
 
// move cursor out of hidden text
Line 8,013 ⟶ 9,726:
 
// open on click
else if (/^wikEd(Ref|Templ|CharEntity|Table)Button\d*$/.test(hideButtonClass) === true) {
event.stopPropagation();
hideButton.removeEventListener('mouseover', wikEd.HideShowHandler, true);
hide.removeEventListener('mouseout', wikEd.HideShowHandler, true);
 
hideClass = hideClass.replace(/Show/, '') + 'Show';
Line 8,022 ⟶ 9,738:
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.RemoveEventListener(wikEd.frameDocument, .removeEventListener('keydown', wikEd.HideShowHandler, true);
wikEd.scheduledUnhide = null;
}
Line 8,042 ⟶ 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 8,064 ⟶ 9,778:
var endHidden = false;
var node = range.endContainer;
while (node !== null) {
if (node == wikEd.frameBody) {
break;
Line 8,076 ⟶ 9,790:
 
// 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 8,095 ⟶ 9,809:
//
 
wikEd.GetText = function (obj, whichFragment, wikify) {
 
// remove dynamically inserted nodes by other scripts
Line 8,101 ⟶ 9,815:
 
// 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': ''
};
 
Line 8,120 ⟶ 9,834:
 
// 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
};
 
Line 8,139 ⟶ 9,853:
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();
 
Line 8,164 ⟶ 9,876:
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
};
 
Line 8,204 ⟶ 9,911:
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
Line 8,213 ⟶ 9,918:
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
Line 8,222 ⟶ 9,925:
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
};
 
Line 8,264 ⟶ 9,962:
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
Line 8,273 ⟶ 9,969:
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
Line 8,282 ⟶ 9,976:
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 8,295 ⟶ 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 = {};
}
Line 8,317 ⟶ 10,009:
 
// 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');
Line 8,326 ⟶ 10,018:
// create the regexp
var regExpFind;
if (useRegExp === true) {
var regExpFlags = 'gm';
if (caseSensitive !== true) {
regExpFlags += 'i';
}
Line 8,334 ⟶ 10,026:
regExpFind = new RegExp(findText, regExpFlags);
}
catch (errorexception) {
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;
Line 8,357 ⟶ 10,049:
wikEd.ParseDOM(obj, wikEd.frameBody);
}
var regExpMatch = [];
 
// find next, search to the right
if (backwards === false) {
 
// set start position for search to right
Line 8,372 ⟶ 10,064:
 
// wrap around, start at beginning
if ( (wrap === true) && (regExpMatch === null) ) {
regExpFind.lastIndex = 0;
regExpMatch = regExpFind.exec(obj.plain);
Line 8,386 ⟶ 10,078:
regExpMatch = regExpMatchNext;
regExpMatchNext = regExpFind.exec(obj.plain);
if (regExpMatchNext === null) {
break;
}
Line 8,392 ⟶ 10,084:
 
// 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 8,422 ⟶ 10,116:
}
}
return( found);
};
 
Line 8,428 ⟶ 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 8,449 ⟶ 10,142:
plainText = plainText.replace(/&gt;/g, '>');
plainText = plainText.replace(/&amp;/g, '&');
plainText = plainText.replace(/\xa0/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),
if (found === false) {
wikEd.Find(obj, range.toString(), true, true, false, false);
}
 
// reinstate original range if it starts or ends with \n or spaces
if (/^(\n| )|(\n| )$/.test(plainText) === true) {
wikEd.RemoveAllRanges(obj.sel.removeAllRanges();
obj.sel.addRange(range);
}
Line 8,471 ⟶ 10,163:
 
// select empty range using backwards built-in find for previous character
else if ( (typeof( wikEd.frameWindow.find) == 'function') && (plainText.length === 0) ) {
var backwards = true;
 
Line 8,513 ⟶ 10,205:
 
// 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 8,557 ⟶ 10,249:
// insert end node
if (endNode.nodeName == '#text') {
if (endOffset === 0) {
endNode.parentNode.insertBefore(scrollEndNode, endNode);
}
Line 8,575 ⟶ 10,267:
// insert start node
if (startNode.nodeName == '#text') {
if (startOffset === 0) {
startNode.parentNode.insertBefore(scrollStartNode, startNode);
}
Line 8,583 ⟶ 10,275:
else {
 
// collapse as a Firefox bug work around; httphttps://stackoverflow.com/questions/665676
rangeStart.collapse(true);
rangeStart.insertNode(scrollStartNode);
Line 8,598 ⟶ 10,290:
range.setStartBefore(scrollStartNode);
range.setEndAfter(scrollEndNode);
obj.sel.removeAllRanges();
wikEd.RemoveAllRanges(sel);
obj.sel.addRange(range);
}
 
Line 8,610 ⟶ 10,302:
//
 
wikEd.ScrollToNodes = function (scrollStartNode, scrollEndNode) {
 
// absolute span for line height detection (Opera and Chrome do not vertically align empty span at bottom)
Line 8,617 ⟶ 10,309:
lineHeightNode.className = 'wikEdScrollLineHeight';
scrollEndNode.appendChild(lineHeightNode);
var lineHeight = lineHeightNode.clientHeight;
lineHeightNode.innerHTML = '';
scrollEndNode.removeChild(lineHeightNode);
Line 8,670 ⟶ 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,684 ⟶ 10,386:
//
 
wikEd.Textify = function (obj) {
 
// convert html to plain
Line 8,691 ⟶ 10,393:
// 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);
}
);
Line 8,703 ⟶ 10,405:
 
// delete content tags
obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>(.|\n)*?<\/\1>/g, '');
 
// delete outlookMS-Office tags
obj.plain = obj.plain.replace(/<((w:|m:)(\bw+))[^>]*>(.|\n)*?<\/\1>/g, '');
 
// remove tablemode highlighting code
obj.plain = wikEd.RemoveTableModeHighlighting(obj.plain);
 
// convert <div>...</div> to <br> for Safari, Chrome, and WebKit
if ( (wikEd.safari === true) || (wikEd.chrome === true) || (wikEd.webkit === true) ) {
obj.plain = wikEd.DivToBr(obj.plain);
}
 
// newlines
obj.plain = obj.plain.replace(/[\n ]*<br\b[^>]*>[\n ]*()/g, '\n');
 
// <div>...</div> to <br> for Safari, Chrome, WebKit
if ( (wikEd.safari == true) || (wikEd.chrome == true) || (wikEd.webkit == true) ) {
obj.plain = wikEd.RemoveTag(obj.plain, 'div', null, '\x00', '\x00');
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');
}
 
// remove empty lines from block tags
Line 8,727 ⟶ 10,426:
 
// remove highlighting pre tags
var isRemove = [];
obj.plain = wikEd.RemoveTag(obj.plain, 'pre', /\bclass="wikEd[\w\/]+"/);
 
Line 8,745 ⟶ 10,443:
 
// 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');
 
// override pasted table class // {{TABLE}}
obj.plain = obj.plain.replace(/(<table\b)([^>]*)(>)/g,
function (p, p1, p2, p3) {
if (/\bclass=/.test(p2) == true) {
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
Line 8,787 ⟶ 10,460:
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');
Line 8,808 ⟶ 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,821 ⟶ 10,503:
 
// redo
if (wikEd.frameDocument.queryCommandEnabled('redo') === true ) {
document.getElementById('wikEdRedo').className = 'wikEdButton';
}
Line 8,829 ⟶ 10,511:
 
// redo all
if (wikEd.lastVersion !== null) {
document.getElementById('wikEdRedoAll').className = 'wikEdButton';
}
Line 8,843 ⟶ 10,525:
//
 
wikEd.FixBasic = function (obj) {
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
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);
}
);
Line 8,870 ⟶ 10,552:
function(p, p1, p2, p3, p4) {
p3 = p3.replace(/'{2,}/g, '');
return( '\n\n' + p2 + ' ' + p3 + ' ' + p2 + '\n\n');
}
);
Line 8,887 ⟶ 10,569:
function(p, p1) {
p = p.replace(/:/g, '\x04');
return( p);
}
);
Line 8,914 ⟶ 10,596:
 
// line not starting with a blank
if (/^ /.test(line) === false) {
preFlag = false;
 
// detect table
if (/^(\{\||\!|\|[^}])/.test(line) === true) {
tableFlag = true;
}
else if (/^\|\}/.test(line) === true) {
tableFlag = false;
}
 
// changes only to be done in tables
if (tableFlag === true) {
 
// add spaces around ||
Line 8,935 ⟶ 10,617:
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,952 ⟶ 10,634:
 
// 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;');
}
Line 8,974 ⟶ 10,656:
// remove underscores in wikilinks
obj.plain = obj.plain.replace(/\[\[(.*?)((\|.*?)|)\]\]/g,
function (p, p1, p2, p3) {
p1 = p1.replace(/_/g, ' ');
return( '[[' + p1 + p2 + ']]');
}
);
Line 9,026 ⟶ 10,708:
//
 
wikEd.FixPunct = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,034 ⟶ 10,716:
 
// protect punctuation in URLs
var regExp = new RegExp('((\\b(httpbhttps?://|https\\bftp://|ftp\\birc://|irc\\bgopher://|gopher\\bnews://|news\\bmailto:|mailto\\bfile://|file://)[!#%&()+,\\-./:;=?@~' + wikEd.letters + '__0-9]*)', 'g');
obj.plain = obj.plain.replace(regExp,
function(p, p1, p2) {
p = p.replace(/([.,:;?!](?!$))/g, '\x00$1');
return( p);
}
);
 
// protect punctuation in filenames
regExp = new RegExp('([' + wikEd.letters + '__0-9\\-])([.,:;?!])(?=([a-zA-Z]{2,4})([\\s:;?!.,()\\[\\]{}|]|$))', 'g');
obj.plain = obj.plain.replace(regExp, '$1\x00$2');
 
Line 9,050 ⟶ 10,732:
function(p, p1, p2) {
p = p.replace(/([.,:;?!])/g, '\x00$1');
return( p);
}
);
Line 9,059 ⟶ 10,741:
function(p) {
p = p.replace(/([.,:;])/g, '\x00$1');
return( p);
}
);
Line 9,067 ⟶ 10,749:
 
// remove spaces before punctuation
if (wikEd.config.fixPunctFrench === true) {
obj.plain = obj.plain.replace(/(«) *()/g, '$1 ');
obj.plain = obj.plain.replace(/ *(»)/g, ' $1');
 
regExp = new RegExp('([' + wikEd.letters + '__0-9\'"”\\]})]) *([.,])(?=(['+ wikEd.letters + '_0-9\'"”\\[{(\\s\\x01]|$))', 'g');
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(regExp, '$1$2 ');
}
Line 9,099 ⟶ 10,781:
//
 
wikEd.FixUnicode = function (obj) {
 
obj.plain = obj.plain.replace(/&amp;#0*160;|&amp;#x0*a0;/gi, '&amp;nbsp;');
Line 9,179 ⟶ 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;
}
 
// resetset redirectsdefault objecthandlers
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;
}
 
// prepare link request
var requestUrl = wikEd.scriptURL + 'api.php';
if (links !== '') {
postFields['titles'] = links;
var requestUrl = wikEd.scriptURL + 'api.php';
 
// make the ajax request
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', function(ajaxhandler) {;
}
 
// prepare external file request to Commons
// get response
if ( (externalHandler !== null) && (externalLinks !== '') && (wikEd.useExternalApi === true) && (wikEd.config.externalApiUrl !== '') ) {
var txt = ajax.responseText;
postFields['titles'] = externalLinks;
if ( (regExpMatch = txt.match(/<redirects>((.|\s)*?)<\/redirects>/)) != null) {
var redirectsrequestUrl = regExpMatch[1]wikEd.config.externalApiUrl;
 
// make the ajax request
if ( (regExpMatch = txt.match(/<normalized>((.|\s)*?)<\/normalized>/)) != null) {
wikEd.AjaxRequest('POST', requestUrl, postFields, 'text/plain', externalHandler, true);
redirects = regExpMatch[1] + redirects;
}
 
return;
// parse redirects
};
var i = 0;
wikEd.redirectsCache.from = [];
wikEd.redirectsCache.to = [];
wikEd.redirectsCache.allFrom = '';
 
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.ExternalLinkInfoHandler: parse external file link infos from AJAX call for redirect fixing and redlinking
wikEd.redirectsCache.toIndex = [];
//
for (var i = 0; i < wikEd.redirectsCache.to.length; i ++) {
wikEd.redirectsCache.toIndex[i] = wikEd.ResolveRedirects(i);
}
 
wikEd.ExternalLinkInfoHandler = function (ajax) {
}
 
wikEd.LinkInfoHandler(ajax, true);
// replace links
return;
wikEd.EditButton(null, 'wikEdFixRedirectReplace');
};
 
 
//
// 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 9,271 ⟶ 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 || '';
 
// useget normalized targettitle
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 = '';
}
Line 9,328 ⟶ 11,216:
 
// 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 9,355 ⟶ 11,242:
//
 
wikEd.FixMath = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,361 ⟶ 11,248:
// 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
Line 9,369 ⟶ 11,256:
 
// convert dash next to a number into a minus sign character
var regExp = new RegExp('([^' + wikEd.letters + '__0-9,{])-(\\d)', 'g');
p1 = p1.replace(regExp, '$1\u2212$2');
 
Line 9,379 ⟶ 11,266:
 
// change x^3 to x<sup>3</sup>
var regExp = new RegExp('([' + wikEd.letters + '__0-9])\\^(\\u2212?\\d+\\.?\\d*) ', 'g');
p1 = p1.replace(regExp, '$1&lt;sup&gt;$2&lt;/sup&gt;');
 
Line 9,390 ⟶ 11,277:
p1 = p1.replace(/(\xb3|&sup3;)/g, '&lt;sup&gt;3&lt;/sup&gt;');
 
return( p1 + p2);
}
);
Line 9,401 ⟶ 11,288:
//
 
wikEd.FixChem = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,416 ⟶ 11,303:
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);
}
);
Line 9,430 ⟶ 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;');
}
);
Line 9,449 ⟶ 11,336:
 
// &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(regExp, '$1 \u2212 $3');
 
Line 9,464 ⟶ 11,351:
//
 
wikEd.FixUnits = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,474 ⟶ 11,361:
 
// add space before units, remove space around /, and use abreviations
var regExp = new 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)(?=[^' + wikEd.letters + '__0-9]|$)', 'g');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
 
p1 = p1.replace(/ *\/ *()/g, '/');
Line 9,529 ⟶ 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(regExp, ' k$1$2');
 
var regExp = new RegExp(' m(bit/s|B/s)([^' + wikEd.letters + '__0-9]|$)', 'g');
obj.plain = obj.plain.replace(regExp, ' M$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');
 
Line 9,557 ⟶ 11,444:
//
 
wikEd.FixDashes = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,567 ⟶ 11,454:
 
// remove spaces around em dashes
var regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]})])( |&amp;nbsp;)*—( |&amp;nbsp;)*([' + wikEd.letters + '_0-9\'"“\\[{(])', 'g');
obj.plain = obj.plain.replace(regExp, '$1—$4');
 
// convert -- to em dashes
var regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]})])( |&amp;nbsp;)*--( |&amp;nbsp;)*([' + wikEd.letters + '_0-9\'"“\\[{(])', 'g');
obj.plain = obj.plain.replace(regExp, '$1—$4');
 
// convert hyphen next to lone number into a minus sign character
var regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]>] ) *(\\u2212|–)(\\d)', 'g');
obj.plain = obj.plain.replace(regExp, '$1\u2212$3');
 
// convert minus or en dashes to dashes with spaces
var regExp = new RegExp('([' + wikEd.letters + '_0-9\'"”\\]}])( |&amp;nbsp;)*(\\u2212|–)( |&amp;nbsp;)*([' + wikEd.letters + '_0-9\'"“\\[{])', 'g');
obj.plain = obj.plain.replace(regExp, '$1 – $5');
 
Line 9,593 ⟶ 11,480:
//
 
wikEd.FixHTML = function (obj) {
 
wikEd.FixBasic(obj);
Line 9,600 ⟶ 11,487:
obj.html = obj.plain;
obj.html = obj.html.replace(/(^|\n) +/g,
function (p, p1) {
p = p.replace(/ /g, '\xa0');
return( p);
}
);
Line 9,615 ⟶ 11,502:
// keep <br> in preformatted lines
obj.html = obj.html.replace(/(^|<br>)( |\xa0).*?(?=<br>)/g,
function (p, p1, p2) {
p = p.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01');
return( p);
}
);
Line 9,623 ⟶ 11,510:
// 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);
}
);
Line 9,631 ⟶ 11,518:
// 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);
}
);
Line 9,640 ⟶ 11,527:
var depth = 0;
obj.html = obj.html.replace(/((\{\{)|\}\})/g,
function (p, p1, p2) {
p2 = p2 || '';
if (p2 !== '') {
depth ++;
if (depth == 1) {
return( '<!--wikEdOuterTemplateStart-->' + p1);
}
return( p1);
}
depth --;
if (depth === 0) {
return( p1 + '<!--wikEdOuterTemplateEnd-->');
}
return( p1);
}
);
Line 9,659 ⟶ 11,546:
// 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'));
}
);
Line 9,667 ⟶ 11,554:
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);
}
);
Line 9,685 ⟶ 11,572:
// 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'));
}
);
Line 9,714 ⟶ 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)
var regExp = new RegExp('^((\\||[*#:;]+)[ \\s\'"]*(\'+|&amp;\\w+;|&lt;.*?&gt;|\\{\\{.*?\\}\\}.*|\\d|[^' + wikEd.letters + '_\\n_0-9])*)([^' + wikEd.letters + '_\\d\\n].*?)?$', 'gm');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3, p4) {
p4 = p4 || '';
if (/^(httphttps?|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);
}
);
Line 9,740 ⟶ 11,628:
// 12table list2 13 34 4
obj.plain = obj.plain.replace(/^((\||[*#:;]+)[ '"]*\[\[)(.*?)(\]\])/gm,
function (p, p1, p2, p3, p4) {
 
// uppercase link
var regExp = new RegExp('^((&amp;\\w+;|[^' + wikEd&lt;.letters + '_]*?&gt;|\\ds)*)([' + wikEd.letters + '_].*)$', '');
p3 = p3.replace(regExp,
function (p, p1, p2, p3) {
if (/^(httphttps?|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(regExp,
function (p, p1, p2, p3) {
if (/^(httphttps?|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 + '_\\n_0-9])*)([' + wikEd.letters + '_].*? =+)$', 'gm');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
if (/^(httphttps?|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'] + '):([' + 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,796 ⟶ 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 = /{{\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,831 ⟶ 11,720:
//
 
wikEd.FixAll = function (obj) {
wikEd.FixBasic(obj);
wikEd.FixUnicode(obj);
Line 9,844 ⟶ 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,861 ⟶ 11,750:
//
 
wikEd.FindBoundaries = function (word, line, para, whole, selection) {
 
if (whole.plain === '') {
return;
}
Line 9,875 ⟶ 11,764:
var endOffset = selection.range.endOffset;
 
if (startNode.childNodes !== null) {
if (startNode.childNodes.length > 0) {
startNode = startNode.childNodes.item(startOffset);
Line 9,881 ⟶ 11,770:
}
}
if (endNode.childNodes !== null) {
if (endNode.childNodes.length > 0) {
endNode = endNode.childNodes.item(endOffset);
Line 9,905 ⟶ 11,794:
var foundLine = false;
var foundPara = false;
var regExp = new RegExp('.*[^' + wikEd.letters + '__0-9]', 'g');
var plainPrev = '';
 
Line 9,926 ⟶ 11,815:
// 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,937 ⟶ 11,826:
 
// 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,950 ⟶ 11,839:
 
// 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');
foundWord = false;
foundLine = false;
Line 9,984 ⟶ 11,873:
// 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,995 ⟶ 11,884:
 
// check text node for a word boundary
else if (foundWord === false) {
if (i == endNodeIndex) {
regExp.lastIndex = endOffset;
Line 10,003 ⟶ 11,892:
}
var regExpArray = regExp.exec(plain);
if (regExpArray !== null) {
wikEd.SetRangeEnd(word.range, whole.plainNode[i], regExp.lastIndex - 1);
foundWord = true;
Line 10,011 ⟶ 11,900:
 
// 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 10,026 ⟶ 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 \x00...\x00 to mark block borders
html = wikEd.RemoveTag(html, 'div', null, '\x00', '\x00');
 
// remove div block borders after <br>
html = html.replace(/<br>\x00+/g, '<br>');
 
// remove leading and trailing div block borders
html = html.replace(/^\x00+|\x00+$/g, '');
 
// combine div block borders into single <br>
html = html.replace(/\x00+/g, '<br>');
 
return html;
};
 
 
//
// wikEd.RemoveHighlightingWikify: remove syntax highlighting and wikify
//
 
wikEd.RemoveHighlightingWikify = function (obj, wikify) {
 
if ( (obj.html !== '') || (wikify === true) ) {
 
// convert <div>...</div> to <br> for Safari, Chrome, and WebKit
if ( (wikEd.safari === true) || (wikEd.chrome === true) || (wikEd.webkit === true) ) {
obj.html = wikEd.RemoveTagDivToBr(obj.html, 'div', null, '\x00', '\x00');
obj.html = obj.html.replace(/\x00\s*<br>\s*\x01/g, '\x01');
obj.html = obj.html.replace(/\x01\s*<br>/g, '\x01');
obj.html = obj.html.replace(/<br>\s*\x00/g, '\x00');
obj.html = obj.html.replace(/\x01\s*\x00/g, '\x01');
obj.html = obj.html.replace(/^\x00|\x01$/g, '');
obj.html = obj.html.replace(/[\x00\x01]/g, '<br>');
}
 
Line 10,048 ⟶ 11,960:
 
// wikify, don't allow many attributes
if ( (obj.htmlCode === true) && (wikify !== false) ) {
wikEd.WikifyHTML(obj, false);
}
Line 10,061 ⟶ 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:
Line 10,075 ⟶ 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
// gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references
 
wikEd.WikifyHTML = function (obj, wikiCode) {
 
var regExpStr;
var regExp;
var regExpMatch;
 
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
obj.html = obj.html.replace(/(<(syntaxhighlight|source|pre|nowiki)\b[^\/>]*>)((.|\n)*?)(<\/\2>)/gi,
function (p, p1, p2, p3, p4, p5) {
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);
}
);
Line 10,119 ⟶ 12,027:
 
// 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$3');
regExp.lastIndex = 0;
}
 
Line 10,134 ⟶ 12,046:
function(p, p1, p2, p3) {
footnotes[p1] = p3.replace(/^(\s|<br\b[^>]*>)|(\s|<br\b[^>]*>)$/g, '');
return( '');
}
);
Line 10,142 ⟶ 12,054:
function(p, p1) {
var ref = '&lt;ref name="footnote_' + p1 + '"&gt;' + footnotes[p1] + '&lt;/ref&gt;';
return( ref);
}
);
Line 10,151 ⟶ 12,063:
// correct name for MS-Word images
// 1 2 2 3 3 4 4 1 5 5
obj.html = obj.html.replace(/(<v:imagedata\b[^>]*?\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>
Line 10,158 ⟶ 12,070:
// sanitize <br style="clear: both;"/>
obj.html = obj.html.replace(/<(br)\s+([^>]*?)\s*(\/)>/gi,
function (p, p1, p2, p3) {
return( '<' + p1 + wikEd.SanitizeAttributes(p1, p2, wikiCode) + p3 + '>');
}
);
Line 10,165 ⟶ 12,077:
// sanitize <span> <div> <p> <font>
obj.html = obj.html.replace(/<(span|div|p|font)\s+([^>]*?)\s*(\/?)>/gi,
function (p, p1, p2, p3) {
return( '<' + p1 + wikEd.SanitizeAttributes(p1, p2, wikiCode) + p3 + '>');
}
);
Line 10,203 ⟶ 12,115:
obj.html = obj.html.replace(/<(h[0-6])\b[^>]*>((.|\n)*?)<\/\1>/gi, '$2');
 
// convert html tables to wikicode
// {{TABLE}}
// convert html tables to wikicode
 
// remove <thead> <tbody> <tfoot>
if (wikEd.tableMode == false) {
obj.html = obj.html.replace(/(\s|\x00|<br\b[^>]*>)<\/?(thead|tbody|tfoot)\b[^>]*>(\s|\x00|<br\b[^>]*>)*()/gi, '$1');
 
// remove <theadcol> <tbody/col> and <tfootcolgroup></colgroup>\s
obj.html = obj.html.replace(/(\s|\x00|<br\b[^>]*>|\x00)*<\/?(thead|tbody|tfootcol)\b[^>]*>(\s.|\x00n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '$1');
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
// remove <col></col> and <colgroup></colgroup>\s
obj.html = obj.html.replace(/(\s|<br\b[^>]*>(td|\x00)*<(colth|caption)\b[^>]*>)((.|\n)*?)(<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
function(p, p1, p2, p3, p4, p5) {
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(colgroup)\b[^>]*>(.|\n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
p3 = p3.replace(/^(\s|<br\b[^>]*>|\x00>)+/gi, '');
p3 = p3.replace(/(\s|<br\b[^>]*>|\x00>)+$/gi, '');
 
// line breaks topreserve <br /> in table cells, but not in html markuptags
obj.html p3 = obj.htmlp3.replace(/(<(td|th|caption\w+)\b[^>]*>)((.|\n)*?)(<\/\2+>)/gi,
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/^(\s|<br\b[^>]*>|\x00>s*()+/gi, '\x04');
return p1 + p3 + p5;
p3 = p3.replace(/(\s|<br\b[^>]*>|\x00>)+$/gi, '');
}
);
p3 = p3.replace(/<br\b[^>]*>\s*()/gi, '&lt;br /&gt;');
p3 = p3.replace(/\x04/g, '<br>');
return p1 + p3 + p5;
}
);
 
// preserveremove <br>table inclosing tags
p3 obj.html = p3obj.html.replace(/(\s|<(br\w+)b[^>]*>)((.|\nx00)*?)(<\/(tr|thead|tbody|tfoot)>(\2+s|<br\b[^>]*>|\x00)*()/gi, '');
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/<br\b[^>]*>\s*()/gi, '\x04');
return(p1 + p3 + p5);
}
);
p3 = p3.replace(/<br\b[^>]*>\s*()/gi, '&lt;br /&gt;');
p3 = p3.replace(/\x04/g, '<br>');
return(p1 + p3 + p5);
}
);
 
// remove<td> table closing tagscells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<\/(tr|thead|tbody|tfoot)td>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(td)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
 
function(p, p1, p2, p3, p4) {
// <td> table cells
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<td>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
if (p3 === '') {
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(td)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
return '\x00| ';
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
if (p3 == '') {
return('\x00| ');
}
else {
return('\x00|' + p3 + ' | ');
}
}
); else {
return '\x00|' + p3 + ' | ';
}
}
);
 
// <th> table cells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<th>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00! ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(th)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
if (p3 === '') {
return( '\x00! ');
}
else {
return( '\x00!' + p3 + ' | ');
}
}
);}
);
 
// <tr> table rows
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\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');
}
);
 
// <caption> table caption
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<caption>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00|+ ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(caption)\s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, wikiCode);
if (p3 === '') {
return( '\x00|+ ');
}
else {
return('\x00|+' + p3 + ' | ');
}
}
); else {
return '\x00|+' + p3 + ' | ';
}
}
);
 
// remove closing tags
obj.html = obj.html.replace(/\s*<\/(td|th|caption)>\s*()/gi, '');
 
// line breaks, also in table cells (continued)
obj.html = obj.html.replace(/<br\s*\/?>[\n ]*()/gi, '\x00');
 
// <table>
obj.html = obj.html.replace(/[\s\x00]*<table>[\s\x00]*(\|-(?=[\n\x00]))?/gi, '\x00\x00{|\x00');
obj.html = obj.html.replace(/[\s\x00]*<(table)\s+([^>]*)>[\s\x00]*(\|-(?=[\n\x00]))?/gi,
function (p, p1, p2, p3) {
var table = '\x00\x00{|';
if (wikEd.config.wikifyTableParameters !== '') {
table += ' ' + wikEd.config.wikifyTableParameters;
}
else {
table += wikEd.SanitizeAttributes(p1, p2, wikiCode);
}
return(table + '\x00');
}
); else {
table += wikEd.SanitizeAttributes(p1, p2, wikiCode);
obj.html = obj.html.replace(/[\s\x00]*<\/table>[\s\x00]*()/gi, '\x00|}\x00\x00');
}
 
// for table mode override pasted table class // {{TABLE}}
else if (wikEd.tableMode == true) {
obj.html = obj.html.replace(/(<table\b)([^>]*)(>)/gi,
function (p, p1, p2, p3) {
if (/\bclass=/.test(p2) == true) {
p2 = p2.replace(/\bclass\s*=\s*(['"]?)[^<>'"\n]*?\1/g, 'class="wikEdTableEdit"');
}
else {
p2 = ' class="wikEdTableEdit"';
}
return(p1 + p2 + p3);
}
return table + '\x00';
);
}
 
);
// table block element needs only one newline
obj.html = obj.html.replace(/([\s|<br\b[^>x00]*<\/table>|[\s\x00)]*(<table\b[^>]*>)/gi, '\x00|}\x00\x00$2');
obj.html = obj.html.replace(/(<\/table>)(\s|<br\b[^>]*>|\x00)*()/gi, '$1\x00');
}
 
// line breaks (continued)
if (wikEd.tableMode == true) {
obj.html = obj.html.replace(/<br\s*\/?>[\n ]*()/gi, '\x00');
}
 
// convert links
obj.html = obj.html.replace(/<a(\b[^>]*)>((.|\n)*?)<\/a>/gi,
function (p, p1, p2) {
var linkParam = p1;
var linkText = p2;
Line 10,354 ⟶ 12,238:
var hrefValue;
var regExpMatchLink = linkParam.match(/\bhref="([^">]*)"/);
if (regExpMatchLink !== null) {
hrefValue = regExpMatchLink[1];
 
Line 10,364 ⟶ 12,248:
var regExpArticle = new RegExp(wikEd.server + '(' + wikEd.articlePath + '([^"\\?#]+)|' + wikEd.script + '\\?([^"#]*))(#[^"]*)?');
var regExpMatchArticle = regExpArticle.exec(hrefValue);
if (regExpMatchArticle !== null) {
 
// article name from url path <a href="../wiki/ hrefUrlArticle ">
Line 10,374 ⟶ 12,258:
// link anchor <a href="link #anchor">
linkArticleAnchor = regExpMatchArticle[4] || '';
if (linkArticleAnchor !== '') {
linkArticleAnchor = linkArticleAnchor.replace(/\.([0-9A-F]{2})/g, '%$1');
linkArticleAnchor = decodeURIComponent(linkArticleAnchor);
Line 10,381 ⟶ 12,265:
 
// parse hrefUrlParam and check for special parameters
if (hrefUrlParam !== null) {
var regExpMatchHref;
var regExpHref = /(^|&amp;)(\w+)=([^"\&]+)/g;
while ( (regExpMatchHref = regExpHref.exec(hrefUrlParam)) !== null) {
var param = regExpMatchHref[2];
var value = regExpMatchHref[3];
Line 10,402 ⟶ 12,286:
hrefParamSpecial = true;
}
if (hrefParamAction !== null) {
break;
}
Line 10,409 ⟶ 12,293:
 
// ISBN links
if (hrefParamAction === null) {
if ( (hrefParamISBN !== null) && (hrefParamSpecial !== true) ) {
var isbn = hrefParamISBN;
var regExpMatchISBN = /((\d\-?){13}|(\d\-?){10})/.exec(linkText);
if (regExpMatchISBN !== null) {
isbn = regExpMatchISBN[1];
}
return( 'ISBN ' + isbn);
}
 
// get article from href parameters
else if ( (hrefParamTitle !== null) && (hrefParamSpecial !== true) ) {
linkArticle = hrefParamTitle;
linkArticle = linkArticle.replace(/_/g, ' ');
Line 10,427 ⟶ 12,311:
 
// get article name from url path
else if (hrefUrlArticle !== null) {
linkArticle = hrefUrlArticle;
linkArticle = linkArticle.replace(/_/g, ' ');
Line 10,436 ⟶ 12,320:
else {
var regExpMatchTitle = /\btitle="([^">]+)"/.exec(linkParam);
if (regExpMatchTitle !== null) {
linkArticle = regExpMatchTitle[1];
}
Line 10,444 ⟶ 12,328:
 
// format wiki link
if (linkArticle !== '') {
 
// check for wiki image
var regExpMatchImage = /^<img\b[^>]*?\bwidth="(\d+)"[^>]*>$/.exec(linkText);
if (regExpMatchImage !== null) {
imgWidth = regExpMatchImage[1];
imgWidth = '|' + imgWidth + 'px';
if ( (linkTitle !== '') && (linkTitle != 'Enlarge') ) {
linkTitle = '|' + linkTitle;
return( '[[' + linkArticle + imgWidth + linkTitle + ']]');
}
else {
return( '[[' + linkArticle + imgWidth + ']]');
}
}
Line 10,463 ⟶ 12,347:
var regExpCat = new RegExp('^(Category|' + wikEd.config.text['wikicode Category'] + ')\\s*:(.*)', 'i');
var regExpMatchCat = regExpCat.exec(linkArticle);
if (regExpMatchregExpMatchCat !== null) {
return( '[[' + wikEd.config.text['wikicode Category'] + ':' + regExpMatchCat[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)
var regExpMatchDate = /^(January|February|March|April|May|June|July|August|September|October|November|December) (\d{1,2})$/.exec(linkArticle);
if (regExpMatchDate !== null) {
var month = regExpMatchDate[1];
var day = regExpMatchDate[2];
if (linkText == (day + ' ' + month) ) {
return( '[[' + linkArticle + linkArticleAnchor + ']]');
}
}
Line 10,490 ⟶ 12,374:
 
// suffix links
var regExpStrSuffix = new RegExp('^' + linkArticle.replace(/(\W)/g, '\\$1') + '([' + wikEd.letters + '__0-9]+)$');
var regExpMatchSuffix = regExpStrSuffix.exec(linkText);
if (regExpMatchSuffix !== null) {
return( '[[' + linkArticle + linkArticleAnchor + ']]' + regExpMatchSuffix[1]);
}
return( '[[' + linkArticle + linkArticleAnchor + '|' + linkText + ']]');
}
 
// external link
if (hrefValue !== '') {
 
// PubMed link
var regExpMatchPubMed = /^http(https?:)?\/\/www\.ncbi\.nlm\.nih\.gov\/entrez\/query\.fcgi\?cmd=Retrieve&amp;db=pubmed&amp;.*?&amp;list_uids=(\d+)/.exec(hrefValue);
if (regExpMatchPubMed !== null) {
return( 'PMID ' + regExpMatchPubMed[12]);
}
 
// DOI link
var regExpMatchDOI;
regExpMatchDOI = /^http(https?:)?\/\/dx\.doi\.org\/(.*)/.exec(hrefValue);
if (regExpMatchDOI !== null) {
return( '{{doi|' + regExpMatchDOI[12] + '}}');
}
 
// other external link
return( '[' + hrefValue + ' ' + linkText + ']');
}
}
 
// return unchanged text
return( p1);
}
);
Line 10,532 ⟶ 12,417:
// 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, '');
}
Line 10,543 ⟶ 12,428:
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 10,555 ⟶ 12,440:
var imgWidth = '';
regExpMatch = /\bwidth\s*=\s*('|")([^'"]*)('|")/i.exec(p1);
if (regExpMatch !== null) {
imgWidth = '|' + regExpMatch[2].replace(/^\s+|\s+$/g, '') + 'px';
}
Line 10,561 ⟶ 12,446:
var imgLink = '';
regExpMatch = /([^\/]+)$/.exec(address);
if (regExpMatch !== null) {
imgLink = regExpMatch[1];
if (imgLink !== '') {
return( '[[' + wikEd.config.text['wikicode ImageFile'] + ':' + imgLink + imgWidth + imgAlt + ']]');
}
}
return( '');
}
);
Line 10,575 ⟶ 12,460:
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( '');
}
);
Line 10,608 ⟶ 12,493:
// <> remove not allowed tags
obj.html = obj.html.replace(/(<\/?)(\/?)(\w+)([^>]*>)/g,
function (p, p1, p2, p3, p4) {
 
// keep table tags if in table mode
if (wikEd.tableMode == true) {
if (/^(table|tr|td|th|thead|tbody|tfoot|col|colgroup|caption)$/i.test(p3) == true) {
p = p.replace(/</g, '\x01');
p = p.replace(/>/g, '\x02');
return(p);
}
}
 
// keep html elements with name, id, or class starting with wikEdKeep
if (wikEd.keepFormatting === true) {
if ( /^(div|span|ins|del)$/i.test(p3) === true) {
if ( /\b(name|id|class)="wikEdKeep/.test(p4) === true) {
p = p.replace(/</g, '\x01');
p = p.replace(/>/g, '\x02');
return( p);
}
}
Line 10,631 ⟶ 12,507:
 
// keep allowed tags
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) {
return( p);
}
 
return( '');
}
);
Line 10,641 ⟶ 12,517:
// sanitize attributes in opening html tags
obj.html = obj.html.replace(/<(\w+)\s+([^>]*?)\s*(\/?)>/gi,
function (p, p1, p2, p3) {
if (p3 !== '') {
p3 = ' ' + p3;
}
return( '<' + p1 + wikEd.SanitizeAttributes(p1, p2, wikiCode) + p3 + '>');
}
);
Line 10,651 ⟶ 12,527:
// 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
Line 10,662 ⟶ 12,538:
 
// remove space-only lines
if (wikiCode !== true) {
obj.html = obj.html.replace(/([\s\x00]*\x00[\s\x00]*)/g,
function (p, p1) {
return( p1.replace(/\n/g, '\x00'));
}
);
Line 10,674 ⟶ 12,550:
 
// remove leading and trailing spaces
if (wikiCode === true) {
obj.html = obj.html.replace(/\x00[ \n]+</g, '\x00<');
}
Line 10,683 ⟶ 12,559:
 
// remove empty inline and block tag pairs
obj.html = wikEd.RemoveEmptyTags(obj.html, /( *)<(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)\b[^>]*><\/\1> *()/gi, '$1');
obj.html = wikEd.RemoveEmptyTags(obj.html, /[\s\x00]*<(blockquote|center|div|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)\b[^>]*><\/\1>[\s\x00]*()/gi, '\x00\x00');
 
Line 10,692 ⟶ 12,568:
// 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);
}
);
Line 10,727 ⟶ 12,603:
 
//
// wikEd.RemoveEmptyTag: recursively remove empty html tag pairs
//
 
wikEd.RemoveEmptyTags = function (html, tag, replace) {
 
var tagRegExp;
if (typeof( tag) == 'string') {
tagRegExp = new RegExp('<(' + tag + ')\\b[^>]*><\/\\1>', 'gi');
}
Line 10,739 ⟶ 12,615:
tagRegExp = tag;
}
if (replace === undefined) {
 
if (replace == null) {
replace = '';
}
 
while (tagRegExp.test(html) === true) {
html = html.replace(tagRegExp, replace);
tagRegExp.lastIndex = 0;
}
return( html);
};
 
 
Line 10,755 ⟶ 12,631:
//
 
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
Line 10,765 ⟶ 12,645:
else {
tagRegExp = tag;
}
if (replaceOpen == null) {
replaceOpen = '';
}
 
if (replaceClose == null) {
replaceClose = '';
}
 
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,804 ⟶ 12,769:
//
 
wikEd.RelativeToAbsolutePath = function (relativePath, fullPath) {
 
var absolutePath = '';
 
// get current url
if (fullPath === nullundefined) {
fullPath = window.___location.href;
fullPath = fullPath.replace(/#.*()/, '');
Line 10,816 ⟶ 12,781:
 
// ./index.php
if (/^\.\/()/.test(relativePath) === true) {
relativePath = relativePath.replace(/^\.\/()/, '');
fullPath = fullPath.replace(/\/[^\/]*$/, '');
Line 10,823 ⟶ 12,788:
 
// ../../index.php
else if (/^\.\.\/()/.test(relativePath) === true) {
var regExp = /^\.\.\/()/;
while (regExp.test(relativePath) === true) {
relativePath = relativePath.replace(/^\.\.\/()/, '');
fullPath = fullPath.replace(/\/[^\/]*$/, '');
Line 10,836 ⟶ 12,801:
absolutePath = relativePath;
}
return( absolutePath);
};
 
Line 10,842 ⟶ 12,807:
//
// wikEd.SanitizeAttributes: see Sanitizer.php
// wikiCode === true: allow extended set of attributes for existing wikicode
 
wikEd.SanitizeAttributes = function (tag, attributes, wikiCode, errors) {
 
attributes = attributes || '';
var common;
var tablealign;
var tablecell;
var table;
if (wikiCode === true) {
common = '|dir|style|class|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();
Line 10,866 ⟶ 12,832:
var regExpMatch;
 
// 1 12 34 45 5 6 632
var regExp = /\s*(\w+)(\s*=\s*(('|")(.*?)\4|(\w+)))?\s*/g;
var junk = attributes.replace(regExp, '\x00');
while ( (regExpMatch = regExp.exec(attributes)) != null) {
junk = junk.replace(/^\x00+|\x00\x00+|\x00+$/g, '');
var attrib = regExpMatch[1];
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
Line 10,877 ⟶ 12,867:
 
// include non-html wiki markup and extended set of attributes for existing wikicode
if (wikiCode === true) {
if ('|center|em|strong|cite|code|var|sub|sup|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 ('dfn|rt|'.indexOf(tagtagCheck) >= 0) {
if ((common + 'name|idrbspan|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|dfn|'.indexOf(tagCheck) >= 0) {
if (('|name|id|').indexOf(attribCheck) >= 0) { valid = true; }
}
 
// wiki markup
else if ('|ref|'.indexOf(tagtagCheck) >= 0) {
if (('|name|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|references|'.indexOf(tagtagCheck) >= 0) {
}
else if ('|syntaxhighlight|source|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|lang|enclose|highlight|line|start|').indexOf(attribattribCheck) >= 0) {
valid = true;
if ( ('|line|'.indexOf(attribattribCheck) >= 0) && (attribValue === '') ) {
flag = true;
}
}
}
else if ('|poem|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|compact|').indexOf(attribattribCheck) >= 0) {
valid = true;
if ( ('|compact|'.indexOf(attribattribCheck) >= 0) && (attribValue === '') ) {
flag = true;
}
}
}
else if ('|categorytree|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|gallery|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|perrow|widths|heights|caption|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|nowiki|noinclude|includeonly|onlyinclude|inputbox|timeline|imagemap|hiero|charinsert|'.indexOf(tagtagCheck) >= 0) {
}
else if ('|math|'.indexOf(tagtagCheck) >= 0) {
if ((common + '|alt|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|score|'.indexOf(tagCheck) >= 0) {
if ((common + '|lang|midi|override_midi|override_ogg|raw vorbis|').indexOf(attribCheck) >= 0) { valid = true; }
}
}
Line 10,973 ⟶ 12,969:
// strict, for html code to be wikified from external sources (websites, Word)
else {
if ('|center|em|strong|cite|code|var|sub|sup|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 ('dfn|rt|'.indexOf(tagtagCheck) >= 0) {
if ((common + 'name|idrbspan|').indexOf(attribattribCheck) >= 0) { valid = true; }
}
else if ('|dfn|'.indexOf(tagCheck) >= 0) {
if (('|name|id|').indexOf(attribCheck) >= 0) { valid = true; }
}
}
 
// ignore empty or missing attributes
if ( (flag !== true) && (attribValue === '') ) {
error += 'Empty attribute. ';
continue;
}
 
// ignore not supported attributes
if (valid !=== truefalse) {
error += 'Not supported attribute ' + attrib + '. ';
}
 
// 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;
}
Line 11,035 ⟶ 13,048:
// clean up defaults for align
if (attrib == 'align') {
if ('|tr|td|th|'.indexOf(tagtagCheck) >= 0) {
if (attribValue == 'left') {
attribValue = '';
Line 11,044 ⟶ 13,057:
// clean up defaults for valign
else if (attrib == 'valign') {
if ('|tr|td|th|'.indexOf(tagtagCheck) >= 0) {
if (attribValue == 'top') {
attribValue = '';
Line 11,075 ⟶ 13,088:
 
// add attribute
if (flag === true) {
sanitized += ' ' + attrib;
}
else if (attribValue !== '') {
sanitized += ' ' + attrib + '="' + attribValue + '"';
}
}
return( sanitized);
};
 
Line 11,090 ⟶ 13,103:
// expects <br> instead of \n
 
wikEd.RemoveHighlighting = function (obj) {
 
// preserve tags, spaces and newlines in pre tag markup
Line 11,097 ⟶ 13,110:
p3 = p3.replace(/ /g, '\xa0');
p3 = p3.replace(/\n/g, '\x00');
return( p1 + p3 + p5);
}
);
Line 11,103 ⟶ 13,116:
// preserve spaces and content in pre, syntaxhighlight, source, and nowiki
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);
}
);
 
 
// remove highlighting error messages
if (wikEd.config.highlightError === true) {
obj.html = obj.html.replace(/<span\b[^>]*?\bclass="wikEdHighlightError"[^>]*>(.|\n)*?<\/span><!--wikEdHighlightError-->/g, '');
}
 
// remove tablemode highlighting code
obj.html = wikEd.RemoveTableModeHighlighting(obj.html);
 
// remove highlighting and atttribute-free span tags
Line 11,124 ⟶ 13,139:
// remove highlighting div tags
obj.html = wikEd.RemoveTag(obj.html, 'div', /\bclass="wikEd[\w\/]+"/, '\x00', '\x00');
 
// comments
obj.html = obj.html.replace(/<!--wikEd[\w\/]+-->/g, '');
 
// remove span and font tags from WebKit https://bugs.webkit.org/show_bug.cgi?id=13490
Line 11,134 ⟶ 13,152:
// 12 2 3 3 4 4 5 5 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, '');
 
// comments
obj.html = obj.html.replace(/<!--wikEd[\w\/]+-->/g, '');
 
// preserve spaces and newlines in pre tag
Line 11,163 ⟶ 13,178:
p2 = p2.replace(/ /g, '\xa0');
p2 = p2.replace(/\n/g, '\x00');
 
return(p1 + p2 + p4);
return p1 + p2 + p4;
}
);
Line 11,175 ⟶ 13,191:
 
// check for pasted html content
if (/<(?!br\b)/.test(obj.html) === true) {
obj.htmlCode = true;
}
Line 11,189 ⟶ 13,205:
//
 
wikEd.HighlightSyntaxInit = function () {
 
wikEd.parseObj.matchToTag = [''];
Line 11,197 ⟶ 13,213:
// [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
// faster without (!?)
// ['[^{}\\[\\]\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', 'block'], // list line
 
['\x00(br|wbr)\\b)[^\x00\x01]*\x01', 'brvoid', 'block'], // <br>, <wbr>
['\x00(\\w+)[^\x00\x01]*?\\/\x01', 'htmlEmpty', 'block'], // <html />
 
Line 11,219 ⟶ 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 11,235 ⟶ 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 11,266 ⟶ 13,282:
// detect if a fragment starts with (^|\\n) to handle the leading newlines
var tagStart = false;
if (/^\(\^\|\\n\)/.test(regExpSub) === true) {
tagStart = true;
}
Line 11,295 ⟶ 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 11,307 ⟶ 13,323:
//
/* TO DO:
<table> closes <td>, <tr>
<tr> closes <td>
heading closes links
valid table markup: \n :{|
Line 11,314 ⟶ 13,328:
*/
 
wikEd.HighlightSyntax = function (obj, noTimeOut, keepComments, noBlocks) {
 
// start timer to cancel after wikEd.config.maxHighlightTime ms
Line 11,320 ⟶ 13,334:
 
// linkify raw watchlist
if (wikEd.watchlistEditeditWatchlist === true) {
obj.html = obj.html.replace(/(.*)/gm,
function (p, p1) {
var ns = '';
var article = p1;
var regExp = /^((.*?):)(.*)$/;
var regExpMatch = regExp.exec(article);
if (regExpMatch !== null) {
ns = regExpMatch[21];
article = regExpMatch[32];
}
var html = '<span class="wikEdWatchlistLink" ' + wikEd.HighlightLinkify(ns, article) + '>' + p + '</span>';
return( html);
}
);
Line 11,351 ⟶ 13,365:
 
// 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': [],
 
Line 11,376 ⟶ 13,390:
'secondlastOpenNodeFiltered': null,
'secondlastOpenTagFiltered': null,
 
'tableMode': wikEd.tableMode
};
 
Line 11,384 ⟶ 13,396:
 
// clear array of link addresses and preview image ids
if (obj.whole === true) {
parseObj.whole = true;
wikEd.linkifyArraywikiLinks = [];
wikEd.referenceArray = [];
wikEd.templateArray = [];
Line 11,401 ⟶ 13,413:
var regExpMatch;
var regExpComments = /(\x00!--(.|\n)*?--\x01)|(<[^>]*>)/g;
while ( (regExpMatch = regExpComments.exec(obj.html)) !== null) {
var tag;
var p1 = regExpMatch[1] || '';
var p2 = regExpMatch[2] || '';
if (p1 !== '') {
tag = 'comment';
}
else if (p2 !== '') {
tag = 'keep';
}
Line 11,428 ⟶ 13,440:
// 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 11,442 ⟶ 13,454:
var tagLength = tagMatch.length;
var tagTo = tagFrom + tagLength;
var tagProperties = [];
 
var tagMatchParenth = 0;
 
Line 11,450 ⟶ 13,462:
var tagStart = '';
for (var i = 1; i < wikEd.parseObj.matchToTag.length; i ++) {
if (typeof( parseObj.regExpMatch[i]) != 'undefined') {
 
// get tag information
Line 11,467 ⟶ 13,479:
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 11,474 ⟶ 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
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]);
}
}
 
Line 11,492 ⟶ 13,519:
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 != 'paramTempl') ) ||
( (tagClass == 'block') && (tag != 'newlinePipe') && (tag != 'doublePipe') && (tag != 'pipe') && (tag != 'headerSep') && (tag != 'headerParam') && (tag != 'newline') && (tag != 'preform') ) //// preform ok?
) {
 
Line 11,525 ⟶ 13,551:
case 'pre':
case 'math':
case 'brscore':
case 'tablevoid':
case 'file':
case 'heading':
Line 11,595 ⟶ 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 11,638 ⟶ 13,664:
 
// 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;
Line 11,671 ⟶ 13,696:
var redefinedLength;
var nodeNo = openNode.parent;
while ( (nodeNo !== 0) && (nodeNo !== null) && (nodeNo !== undefined) ) {
var node = parseObj.tree[nodeNo];
if (node.tag != 'paramTempl') {
Line 11,683 ⟶ 13,708:
 
// ignore spare paramTempl opening tags like p tags
if (redefinedLength === 0) {
redefinedTag = 'spare';
}
Line 11,714 ⟶ 13,739:
if (redefinedLength <= 3) {
redefinedTag = 'spare';
redefinedLength = 0;
}
 
Line 11,771 ⟶ 13,796:
} );
}
}
break;
 
// 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;
Line 11,797 ⟶ 13,811:
if (tag == 'inlineURL') {
var regExpMatch;
if (/\(/.test(tagMatch) === true) {
regExpMatch = /^(.*?)([.,:;\\!?)]+)$/.exec(tagMatch);
}
Line 11,803 ⟶ 13,817:
regExpMatch = /^(.*?)([.,:;\\!?]+)$/.exec(tagMatch);
}
if (regExpMatch !== null) {
wikEd.parseObj.regExpTags.lastIndex = tagFrom + regExpMatch[1].length;
tagMatch = regExpMatch[1];
Line 11,814 ⟶ 13,828:
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,831 ⟶ 13,845:
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,856 ⟶ 13,870:
else {
var node = parseObj.tree[parseObj.lastOpenNode];
while ( (node !== null) && (node !== undefined) ) {
if (node.tag == tag) {
break;
Line 11,862 ⟶ 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,878 ⟶ 13,892:
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|syntaxhighlight|source|timeline)$/.test(htmlTag) === true) {
wikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
Line 11,891 ⟶ 13,905:
// <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,902 ⟶ 13,916:
// |}}: 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;
Line 11,925 ⟶ 14,051:
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,937 ⟶ 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
case 'header':
switch (parseObj.lastOpenTagFiltered) {
case 'table':
wikEd.HighlightBuildTree('row', 'open', tagFrom, 0, 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;
 
Line 11,943 ⟶ 14,158:
case 'doublePipe':
switch (parseObj.lastOpenTagFiltered) {
case 'tableheader':
wikEd.HighlightBuildTree('cellSepheader', tagClass'close', tagFrom, tagLength0, 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,961 ⟶ 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,974 ⟶ 14,305:
break;
case 'template':
case 'paramTempl':/ //// check later for parameterPiped
wikEd.HighlightBuildTree('templateParam', tagClass, tagFrom, tagLength, parseObj);
break;
Line 11,988 ⟶ 14,319:
// 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':
 
Line 12,000 ⟶ 14,333:
 
// move text pointer after tag
wikEd.parseObj.regExpTags.lastIndex = tagFrom + tagLengthtagTo - parseObj.regExpMatch[tagMatchParenth + 3].length;
break;
 
Line 12,014 ⟶ 14,347:
 
// quit after reaching $ 'newline'
if (tagMatch === '') {
break;
}
Line 12,020 ⟶ 14,353:
 
// 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
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 = '';
Line 12,107 ⟶ 14,443:
obj.html = obj.html.replace(/\x00/g, '&lt;');
obj.html = obj.html.replace(/\x01/g, '&gt;');
 
// remove linebreaks in tablemode tables
if (wikEd.tableMode === true) {
obj.html = obj.html.replace(/\n(<(caption|tr|th|td|br)\b[^>]*?\bclass="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 12,121 ⟶ 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 12,142 ⟶ 14,485:
// connectivity info: parent, firstChild, nextSibling, paired opening/closing (all array indexes)
 
wikEd.HighlightBuildTree = function (tag, tagClass, tagFrom, tagLength, parseObj, tagProperties) {
 
// show parameters:
Line 12,148 ⟶ 14,491:
 
// single-element tags (block)
var pushNode;
if (tagClass == 'block') {
var previousSibling = null;
if ( (parseObj.lastOpenNode !== 0) && (parseObj.lastOpenNode !== null) ) {
var redefinedParentTag;
 
Line 12,163 ⟶ 14,508:
 
// redefine parent tag
if (redefinedParentTag !== nullundefined) {
parseObj.tree[parseObj.lastOpenNode].tag = redefinedParentTag;
parseObj.lastOpenTagFiltered = redefinedParentTag;
Line 12,170 ⟶ 14,515:
// 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;
}
Line 12,181 ⟶ 14,525:
previousSibling = parseObj.tree[parseObj.lastOpenNode].lastChild;
var previousSiblingNode = parseObj.tree[previousSibling];
if (previousSiblingNode !== nullundefined) {
previousSiblingNode.nextSibling = newNode;
}
Line 12,189 ⟶ 14,533:
 
// add new block to tree
pushNode = {
parseObj.tree.push( {
'tag': tag,
'start': tagFrom,
Line 12,196 ⟶ 14,540:
'parent': parseObj.lastOpenNode,
'previousSibling': previousSibling
} );
parseObj.tree.push(pushNode);
}
 
Line 12,203 ⟶ 14,548:
 
// push new open element onto tree
var openNodepushNode = {
'tag': tag,
'start': tagFrom,
Line 12,210 ⟶ 14,555:
'parent': parseObj.lastOpenNode
};
parseObj.lastOpenNode = parseObj.tree.push(openNodepushNode) - 1;
 
// get new top and second-to-top nodes, ignoring unpaired p tags
Line 12,223 ⟶ 14,568:
 
// no opening tag on stack
if (parseObj.lastOpenNode === 0) {
 
// ignore unmatched =
Line 12,234 ⟶ 14,579:
 
// 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;
}
}
Line 12,261 ⟶ 14,609:
// 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 12,268 ⟶ 14,616:
}
 
// newline brakesbreaks heading or external link, remove corresponding opening tag from stack
if (tag == 'newline') {
 
Line 12,274 ⟶ 14,622:
var nodeNo = parseObj.lastOpenNode;
var node = null;
while ( (nodeNo !== 0) && (nodeNo !== undefined) && (nodeNo !== null) ) {
node = parseObj.tree[nodeNo];
if (
Line 12,319 ⟶ 14,667:
// 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 12,327 ⟶ 14,675:
 
// 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) {
Line 12,349 ⟶ 14,697:
 
// 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;
}
Line 12,365 ⟶ 14,714:
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 12,379 ⟶ 14,728:
 
// clean out opening heading
if (ignoreHeading === true) {
 
// add headings in template errors to tree
Line 12,385 ⟶ 14,734:
// 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;
}
Line 12,399 ⟶ 14,748:
 
// 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;
}
Line 12,423 ⟶ 14,775:
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 12,431 ⟶ 14,791:
//
 
wikEd.HighlightMarkLastOpenNode = function (errorText, parseObj) {
 
var lastOpenNode = parseObj.lastOpenNode;
Line 12,439 ⟶ 14,799:
 
// 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 12,450 ⟶ 14,810:
}
}
 
// mark child nodes of error nodes with lower priority (table elements)
wikEd.HighlightMarkNestedErrors(lastOpenNode, errorText, parseObj);
 
// mark unmatched opening tags
Line 12,458 ⟶ 14,821:
'left': errorText
};
}
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 12,467 ⟶ 14,861:
//
 
wikEd.HighlightGetLevel = function (parseObj) {
 
parseObj.lastOpenTag = null;
Line 12,475 ⟶ 14,869:
parseObj.secondlastOpenTagFiltered = null;
 
if ( (parseObj.lastOpenNode === 0) || (parseObj.lastOpenNode === null) ) {
return;
}
Line 12,481 ⟶ 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 12,491 ⟶ 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') ) {
Line 12,512 ⟶ 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 12,523 ⟶ 14,919:
var tagLength = node.tagLength;
var tagType = node.type;
var pairedTagPospairedPos = node.pairedTagPospairedPos;
var tagTo = tagFrom + tagLength;
var tagMatch = '';
Line 12,536 ⟶ 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 12,554 ⟶ 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: 23 12 3445 : 4 5 6 namespace 5364 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 p1pre = regExpMatch[1] || '';
ifvar (p1inter != regExpMatch[2] || '') {;
intervar ns = p1regExpMatch[4] || '';
var article = regExpMatch[7] || '';
var param = regExpMatch[9] || '';
 
if (inter !== '') {
interClean = inter;
interClean = interClean.replace(/\s/g, ' ');
Line 12,580 ⟶ 15,048:
interClean = interClean.replace(/^ $/, '');
}
var interStart = tagTo + regExpMatch.index + pre.length;
 
varif p3(ns !== regExpMatch[3] || '';) {
if (p3 != '') {
ns = p3;
nsClean = ns;
nsClean = nsClean.replace(/\s/g, ' ');
Line 12,589 ⟶ 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';
}
}
 
article = regExpMatch[6] || '';
param = regExpMatch[8] || '';
 
// highlight interwiki and namespace
if (article !== '') {
 
// highlight interwiki
if (inter !== '') {
wikEd.HighlightBuildTree('linkInter', 'block', tagFrom + 2interStart, inter.length, parseObj);
}
 
// highlight namespace
if (ns !== '') {
wikEd.HighlightBuildTree('linkNamespace', 'block', tagFrom + 2 + inter.lengthnsStart, ns.length, parseObj);
}
 
Line 12,632 ⟶ 15,098:
}
}
 
if (nsClean.toLowerCase() == wikEd.config.text['wikicode Category'].toLowerCase() + ':') {
insertLeft = '<span class="wikEdCat"' + follow + '><span class="wikEdLinkTag">';
Line 12,647 ⟶ 15,114:
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">';
}
Line 12,655 ⟶ 15,122:
// linkify and preview
else {
var filefileTag = regExpMatch[1] + ':' + regExpMatch[2];
var filePlainfileName = regExpMatch[1] + ':' + regExpMatch[2].replace(/<[^>]*>/g, '');
filePlain = filePlain.replace(/ /g,'_');
 
// add file preview box
var filePlain = fileTag + ':' + fileName.replace(/<[^>]*>/g, '');
if (wikEd.config.filePreview == true) {
filePlain = filePlain.replace(/ /g,'_');
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 12,675 ⟶ 15,143:
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 12,690 ⟶ 15,158:
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;
}
Line 12,703 ⟶ 15,175:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(innerPlain)) !== null) {
url = regExpMatch[0];
}
Line 12,728 ⟶ 15,200:
var regExpMatch;
var isParserVar = false;
if ( (regExpMatch = regExpTempl.exec(innerPlain)) !== null) {
 
// get modifier, namespace, template, paramters
var p1 = regExpMatch[1] || '';
if (p1 !== '') {
mod = p1;
interClean = mod.replace(/\s+$/g, '');
Line 12,739 ⟶ 15,211:
 
var p3 = regExpMatch[3] || '';
if (p3 !== '') {
ns = p3;
nsClean = ns.replace(/^\s+|\s+$/g, '');
Line 12,752 ⟶ 15,224:
 
// {{VARIABLE}}
if (isParserVar === false) {
if ( (template !== '') && (ns === '') && (param === '') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariables + '|' + wikEd.parserVariablesR + ')$', '');
var regExpMatchParserVar;
if ( (regExpMatchParserVar = regExpParserVar.exec(template)) !== null) {
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.length, parseObj);
Line 12,763 ⟶ 15,236:
 
// {{VARIABLE:R}}
if (isParserVar === false) {
if ( (ns !== '') && (template == 'R') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariablesR + ')$', '');
var regExpMatchParserVar;
if ( (regExpMatchParserVar = regExpParserVar.exec(parserVar)) !== null) {
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
Line 12,774 ⟶ 15,248:
 
// {{FUNCTION:param|R}}
if (isParserVar === false) {
if ( (ns !== '') && ( (param === '') || (param == 'R') ) ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctionsR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(parserVar)) !== null) {
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
Line 12,785 ⟶ 15,259:
 
// {{function:param|param}}
if (isParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctions + ')$', 'i');
if ( (regExpMatch = regExpParserVar.exec(parserVar)) !== null) {
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
Line 12,796 ⟶ 15,270:
 
// {{#function:param|param}}
if (isParserVar === false) {
if (ns !== '') {
var regExpParserVar = new RegExp('^(#(' + wikEd.parserFunctionsHash + '))$', 'i');
if ( (regExpMatch = regExpParserVar.exec(parserVar)) !== null) {
 
// #property: linkify wikibase template (wikidata)
//if work(parserVar in== progress!'#property') {
 
if (parserVar = '#property') {
var// item =id wikEd.wbRepoItem;from parameter
var item = '';
var regExpMatchItem;
if ( (regExpMatchItem = /(^|\|)id=([^|]+)/.exec(param)) !== null) {
item = regExpMatchItem[2];
}
 
else if ( (regExpMatchItem = /(^|\|)of=([^|]+)/.exec(param)) != null) {
// item name from parameter
item = 'Special:ItemByTitle/' + wikEd.wbInterLang + '/' + regExpMatchItem[2];
else if ( (regExpMatchItem = /(^|\|)of=([^|]+)/.exec(param)) !== null) {
item = wikEd.EncodeTitle(regExpMatchItem[2]);
item = 'Special:ItemByTitle/' + wikEd.wikibase.currentSite.globalSiteId + '/' + item;
}
 
if (item == '') {
var// urlget =item encodeURI(wikEd.wikiGlobals.wgTitle);name from article name
urlelse = url.replace(/ /g, '_');{
urlitem = urlwikEd.replaceEncodeTitle(/"/g, '%22');
item = 'Special:ItemByTitle/' + wikEd.wikibase.currentSite.globalSiteId + '/' + item ;
url = url.replace(/'/g, '%27');
url = url.replace(/#/g, '%23');
item = 'Special:ItemByTitle/' + wikEd.wbInterLang + '/' + url;
}
if (item != '') {
follow = ' ' + wikEd.HighlightLinkify('', '', wikEd.wbRepoUrl + 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,831 ⟶ 15,313:
 
// highlight template
if (isParserVar === 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);
}
Line 12,847 ⟶ 15,329:
ns = '';
}
else if (ns === '') {
 
// no Template: addition for subpage linking
if (template.indexOf('/') !== 0) {
ns = wikEd.config.text['wikicode Template'] + ':';
}
Line 12,858 ⟶ 15,340:
}
var hideClass = 'wikEdTempl';
if ( (template !== '') && (isParserVar === false) ) {
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"';
}
}
}
}
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} );
}
Line 12,896 ⟶ 15,376:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 12,915 ⟶ 15,395:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
Line 12,956 ⟶ 15,437:
 
// ref no hide
if (node.noHide === true) {
insertLeft = '<span class="wikEdRef">';
}
Line 12,964 ⟶ 15,445:
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} );
Line 12,998 ⟶ 15,479:
}
break;
case 'table':/// \n| = </td><td>, \n|- = </t></tr><tr> not blocks but td, th, tr
if (parseObj.tableMode == true) {
 
// wikitabletable open
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 13,085 ⟶ 15,684:
case 'tbody':
case 'colgroup':
case 'captionabbr':
case 'big':
case 'blockquote':
Line 13,104 ⟶ 15,703:
case 'nowiki':
case 'math':
case 'score':
case 'noinclude':
case 'includeonly':
Line 13,151 ⟶ 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 13,178 ⟶ 15,915:
var url = '';
var regExpMatch;
if ( (regExpMatch = /\w\S+/.exec(tagMatch)) !== null) {
url = regExpMatch[0];
}
Line 13,203 ⟶ 15,940:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d+/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0];
}
Line 13,212 ⟶ 15,949:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d[\s\d\-]+x?/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0].replace(/\D/g, '');
}
Line 13,221 ⟶ 15,958:
var idNumber = '';
var regExpMatch;
if ( (regExpMatch = /\d[\s\d\-]+x?/.exec(tagMatch)) !== null) {
idNumber = regExpMatch[0].replace(/\D/g, '');
}
Line 13,248 ⟶ 15,985:
// 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 13,272 ⟶ 16,009:
insertRight = '</span><!--wikEdTemplTag--><span class="wikEdParamDefault">';
break;
case 'brvoid'://inlineTag class
case 'html':
case 'htmlEmpty':
Line 13,285 ⟶ 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} );
Line 13,316 ⟶ 16,053:
insertLeft = '<span class="wikEdMath">';
pushRight = '</span><!--wikEdMath-->';
break;
case 'score':
insertLeft = '<span class="wikEdScore">';
pushRight = '</span><!--wikEdScore-->';
break;
case 'nowiki':
Line 13,340 ⟶ 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 13,447 ⟶ 16,148:
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 13,458 ⟶ 16,159:
}
break;
 
// tag type: various
case 'comment':
insertLeft = '<span class="wikEdComment">' + node.left + '</span><!--wikEdComment-->';
Line 13,466 ⟶ 16,169:
case 'error':
insertLeft = '<span class="wikEdError" title="' + node.left + '">';
if (wikEd.config.highlightError === true) {
insertLeft += '<span class="wikEdHighlightError">' + node.left + '</span><!--wikEdHighlightError-->';
}
Line 13,475 ⟶ 16,178:
break;
case 'root':
break;
case undefined:
break;
}
 
// add left html into existing entry
if (insertLeft !== '') {
node.left = insertLeft;
node.index = i;
Line 13,485 ⟶ 16,190:
 
// 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;
Line 13,496 ⟶ 16,201:
 
// 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 } );
}
Line 13,515 ⟶ 16,220:
//
 
wikEd.HighlightMergeHtml = function (parseObj, obj) {
 
if (parseObj.tree.length <= 1) {
Line 13,527 ⟶ 16,232:
// 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);
}
);
Line 13,559 ⟶ 16,264:
 
// ignore root
if (tagFrom === nullundefined) {
continue;
}
Line 13,567 ⟶ 16,272:
 
// 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 13,594 ⟶ 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( '');
}
 
// removeclean highlightingprefix codeand title
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 13,651 ⟶ 16,339:
xString = xString.replace(/(x)x/gi, '$1');
}
return( accentChar + xString);
}
);
Line 13,657 ⟶ 16,345:
 
// [[/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 13,668 ⟶ 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,
};
}
}
Line 13,685 ⟶ 16,395:
// url provided
else {
 
// test for illegal characters
if (/[<>]/.test(linkUrl) === true) {
return '';
}
 
// test for templates
if (/\{|\}/.test(linkUrl) === true) {
return( '');
}
linkName = wikEd.EncodeTitle(linkUrl);
linkUrl = encodeURI(linkUrl);
linkUrl = linkUrl.replace(/%25(\d\d)/g, '%$1');
linkUrl = linkUrl.replace(/'/g, '%27');
}
 
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') {
Line 13,711 ⟶ 16,425:
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.CleanLink: clean and normalize article title
//
 
wikEd.CleanLink = function (link) {
 
// remove highlighting code
link = link.replace(/<[^>]*>/g, '');
 
// 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;
};
 
 
 
Line 13,722 ⟶ 16,507:
//
 
wikEd.UpdateTextarea = function (text) {
 
var obj = {};
if (text !== nullundefined) {
obj.html = text;
}
Line 13,747 ⟶ 16,532:
obj.plain = obj.plain.replace(/&gt;/g, '>');
obj.plain = obj.plain.replace(/&amp;/g, '&');
 
// convert all &nbsp; char entitities to actual characters (customization option only)
if (wikEd.config.nbspToChar === true) {
obj.plain = obj.plain.replace(/&nbsp;/g, '\xa0');
}
 
// copy to textarea
Line 13,762 ⟶ 16,552:
//
 
wikEd.UpdateFrame = function (html) {
 
// get textarea content
var obj = {};
if (html !== nullundefined) {
obj.html = html;
}
else {
obj.html = wikEd.textarea.value;
obj.html = wikEd.EscapeHtml(obj.html.replace(/&/g, '&amp;');
obj.html = obj.html.replace(/>/g, '&gt;');
obj.html = obj.html.replace(/</g, '&lt;');
}
 
// 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);
Line 13,798 ⟶ 16,586:
// newlines to <br>
obj.html = obj.html.replace(/\n/g, '<br>');
 
// select the whole text after replacing the whole text and scroll to same height
if (wikEd.msie == true) {
 
}
else {
obj.sel = wikEd.GetSelection();
wikEd.RemoveAllRanges(obj.sel);
}
 
// insert content into empty frame
if ( (wikEd.readOnly === true) || (wikEd.frameBody.firstChild === null) || (/^<br[^>]*>\s*$/.test(wikEd.frameBody.innerHTML) === true) ) {
wikEd.frameBody.innerHTML = obj.html;
}
Line 13,815 ⟶ 16,594:
// 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,822 ⟶ 16,603:
// 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,839 ⟶ 16,620:
 
// add event handlers and labels
if (wikEd.highlightSyntax === true) {
 
// name ref and template buttons
Line 13,848 ⟶ 16,629:
 
// 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,860 ⟶ 16,657:
//
 
wikEd.KeyHandler = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// trap enter in find/replace input elements
Line 13,873 ⟶ 16,664:
event.preventDefault();
event.stopPropagation();
if (event.shiftKey === true) {
wikEd.EditButton(null, 'wikEdFindPrev');
}
else if (event.ctrlKey === true) {
wikEd.EditButton(null, 'wikEdFindAll');
}
Line 13,886 ⟶ 16,677:
event.preventDefault();
event.stopPropagation();
if (event.shiftKey === true) {
wikEd.EditButton(null, 'wikEdReplacePrev');
}
else if (event.ctrlKey === true) {
wikEd.EditButton(null, 'wikEdReplaceAll');
}
Line 13,899 ⟶ 16,690:
 
// 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];
if (buttonId !== nullundefined) {
event.preventDefault();
event.stopPropagation();
 
// execute the button click handler code, obj required for eval
var obj = document.getElementById(buttonId);
eval(wikEd.editButtonHandler[buttonId]);
return;
}
}
return;
};
 
 
//
// wikEd.FrameExecCommand: wrapper for execCommand method
//
 
wikEd.FrameExecCommand = function(command, option) {
 
if (typeof(wikEd.frameDocument.execCommand) == 'function') {
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,939 ⟶ 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;
}
Line 13,955 ⟶ 16,728:
// 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);
Line 13,966 ⟶ 16,739:
// create obj for regexp search
var obj = {};
 
// get the replace text
var replaceText = wikEd.inputElement.replace.value;
 
// get insensitive and regexp button states
var regExpChecked = wikEd.GetAttribute(wikEd.regExp, .getAttribute('checked');
var caseSensitiveChecked = wikEd.GetAttribute(wikEd.caseSensitive, .getAttribute('checked');
 
// get case sensitive setting
Line 13,987 ⟶ 16,757:
 
// 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);
 
Line 14,015 ⟶ 16,785:
//
 
wikEd.DebugInfo = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// ctrl-click
if (event.ctrlKey !== true) {
return;
}
Line 14,031 ⟶ 16,795:
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 → ErrorBrowser 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';
Line 14,038 ⟶ 16,802:
// 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(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br>');
wikEd.FrameExecCommandframeDocument.execCommand('inserthtml', false, debug);
}
else if (wikEd.textarea !== null) {
wikEd.textarea.value += '\n' + debug;
}
Line 14,051 ⟶ 16,815:
}
return;
};
 
 
Line 14,058 ⟶ 16,822:
//
 
wikEd.GetDebugInfo = function (extended) {
 
var loader = '';
var mediawiki = '';
var gadgets = '';
Line 14,069 ⟶ 16,833:
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, '; ') + '; ';
}
Line 14,080 ⟶ 16,844:
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:/, '') + ', ';
}
Line 14,106 ⟶ 16,870:
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 js pagessubpages
var userPage = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, wikEd.wikiGlobals.wgFormattedNamespaces[2] + wikEd.wikiGlobals.wgUserName);
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(userPage) == true) {
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;
}
Line 14,124 ⟶ 16,894:
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';
Line 14,130 ⟶ 16,900:
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 14,145 ⟶ 16,916:
//
 
wikEd.MainSwitch = function (event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// ctrl-click for debug info
if (event.ctrlKey === true) {
return;
}
 
// disable function if browser is incompatible
if (wikEd.browserNotSupported === 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
Line 14,177 ⟶ 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';
}
Line 14,199 ⟶ 16,976:
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();
}
Line 14,226 ⟶ 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();
Line 14,248 ⟶ 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 14,368 ⟶ 17,115:
//
 
wikEd.ResizeSummary = function () {
 
// check if combo field exists
if (wikEd.summarySelect === null) {
return;
}
Line 14,392 ⟶ 17,139:
//
 
wikEd.ResizeComboInput = function (field) {
 
// check if combo field exists
if (wikEd.selectElement[field] === nullundefined) {
return;
}
Line 14,446 ⟶ 17,193:
//
 
wikEd.ChangeComboInput = function (field) {
 
// get selection index (-1 for unselected)
Line 14,455 ⟶ 17,202:
// 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');
Line 14,464 ⟶ 17,211:
 
// 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);
 
Line 14,494 ⟶ 17,241:
 
// find the new text
if ( (field == 'find') && (wikEd.GetAttribute(wikEd.findAhead, .getAttribute('checked') == 'true') ) {
wikEd.FindAhead();
}
Line 14,510 ⟶ 17,257:
//
 
wikEd.AppendToSummary = function (summary, append) {
 
summary = summary.replace(/^[, ]+/, '');
summary = summary.replace(/[, ]+$/, '');
if (summary !== '') {
if (/ \*\/$/.test(summary) === true) {
summary += ' ';
}
else if (/[.;:]$/.test(summary) === true) {
summary += ' ';
}
else {
var regExp = new RegExp('^[' + wikEd.letters + '__0-9()"\'+\\-]', '');
if (regExp.test(summary) === false) {
summary += ' ';
}
Line 14,533 ⟶ 17,280:
summary += append;
 
return( summary);
};
 
Line 14,541 ⟶ 17,288:
//
 
wikEd.AddToHistory = function (field) {
 
if (wikEd.inputElement[field].value !== '') {
 
// load history from saved settings
Line 14,554 ⟶ 17,301:
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];
}
Line 14,576 ⟶ 17,323:
 
// 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 14,593 ⟶ 17,340:
 
// save history to settings
if (wikEd.fieldHist[field][0] !== '') {
wikEd.SaveHistoryToSetting(field);
}
Line 14,605 ⟶ 17,352:
//
 
wikEd.SetComboOptions = function (field) {
 
// load history from saved settings
Line 14,621 ⟶ 17,368:
// delete optgroup
option = document.getElementById(field + 'Optgroup');
if (option !== null) {
wikEd.selectElement[field].removeChild(option);
}
Line 14,628 ⟶ 17,375:
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 14,650 ⟶ 17,397:
// 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
Line 14,699 ⟶ 17,446:
 
// 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, '');
Line 14,732 ⟶ 17,479:
//
 
wikEd.ClearHistory = function (field) {
 
wikEd.SetPersistent(wikEd.savedName[field], '', 0, '/');
Line 14,744 ⟶ 17,491:
//
 
wikEd.LoadHistoryFromSettings = function (field) {
 
var setting = wikEd.GetPersistent(wikEd.savedName[field]);
if ( (setting !== ''null) && (setting !== null'') ) {
setting = decodeURIComponent(setting);
wikEd.fieldHist[field] = setting.split('\n');
Line 14,762 ⟶ 17,509:
//
 
wikEd.SaveHistoryToSetting = function (field) {
 
var setting = '';
Line 14,774 ⟶ 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();
}
 
// MS IE compatibility
else if (typeof(wikEd.frameDocument.selection) == 'object') {
sel = wikEd.frameDocument.selection;
}
 
// make sure there is at least an empty range
if ( (sel !== null) && (sel.rangeCount === 0) ) {
sel.collapse(wikEd.frameBody, 0);
}
return sel;
 
return(sel);
};
 
 
//
// wikEd.ClearSelection: cross-browser method to clear the currently selected text
//
 
wikEd.RemoveAllRanges = function(sel) {
 
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,833 ⟶ 17,552:
//
 
wikEd.SetRangeStart = function (range, startNode, startOffset) {
 
if ( (startNode.childNodes.length > 0) && (startOffset < startNode.childNodes.length) ) {
Line 14,842 ⟶ 17,561:
range.setStart(startNode, startOffset);
}
else if (startNode.childNodes.length === 0) {
range.setStart(startNode, 0);
}
Line 14,856 ⟶ 17,575:
//
 
wikEd.SetRangeEnd = function (range, endNode, endOffset) {
 
if ( (endNode.childNodes.length > 0) && (endOffset < endNode.childNodes.length) ) {
Line 14,865 ⟶ 17,584:
range.setEnd(endNode, endOffset);
}
else if (endNode.childNodes.length === 0) {
///// range.setEndBefore(endNode);
range.setEnd(endNode, 0);
}
else {
Line 14,877 ⟶ 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,900 ⟶ 17,620:
//
 
wikEd.GetPersistent = function (name) {
 
var getStr = '';
 
// check for web storage
Line 14,908 ⟶ 17,628:
 
// get a value from web storage
if (wikEd.webStorage === true) {
getStr = window.localStorage.getItem(name);
}
 
// get a Greasemonkey persistent value
else if (wikEd.greasemonkey === true) {
getStr = GM_getValue(name, '');
}
Line 14,921 ⟶ 17,641:
getStr = wikEd.GetCookie(name);
}
 
return(getStr);
// return string
if (typeof getStr != 'string') {
getStr = '';
}
return getStr;
};
 
Line 14,929 ⟶ 17,654:
//
 
wikEd.SetPersistent = function (name, value, expires, path, ___domain, secure) {
 
// check for web storage
Line 14,935 ⟶ 17,660:
 
// set a value in web storage
if (wikEd.webStorage === true) {
if (expires == -1) {
value = '';
Line 14,943 ⟶ 17,668:
 
// set a Greasemonkey persistent value
else if (wikEd.greasemonkey === true) {
if (expires == -1) {
value = '';
Line 14,949 ⟶ 17,674:
 
// see http://wiki.greasespot.net/Greasemonkey_access_violation
window.setTimeout(function() {
GM_setValue(name, value);
}, 0);
Line 14,966 ⟶ 17,691:
//
 
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 (errorexception) {
}
}
Line 14,992 ⟶ 17,717:
//
 
wikEd.GetCookie = function (cookieName) {
 
var cookie = ' ' + document.cookie;
Line 15,010 ⟶ 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
Line 15,032 ⟶ 17,757:
 
// get date from expiration preset
else if (expires === 0) {
var cookieExpire = new Date();
expires = cookieExpire.setTime(cookieExpire.getTime() + wikEd.config.cookieExpireSec * 1000);
Line 15,039 ⟶ 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';
}
Line 15,057 ⟶ 17,782:
//
 
wikEd.GetOffsetTop = function (element) {
 
var offset = 0;
do {
offset += element.offsetTop;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
Line 15,070 ⟶ 17,796:
//
 
wikEd.GetOffsetLeft = function (element) {
 
var offset = 0;
do {
offset += element.offsetLeft;
} while ( (element = element.offsetParent) !== null );
return( offset);
};
 
Line 15,083 ⟶ 17,810:
//
 
wikEd.AppendScript = function (scriptUrl, onLoadFunction) {
 
var script = document.createElement('script');
Line 15,089 ⟶ 17,816:
script.setAttribute('src', scriptUrl);
wikEd.head.appendChild(script);
if (onLoadFunction !== nullundefined) {
wikEdscript.AddEventListeneraddEventListener(script, 'load', onLoadFunction, false);
}
return script;
};
 
Line 15,100 ⟶ 17,827:
//
 
wikEd.CleanNodes = function (node) {
 
if (wikEd.cleanNodes === false) {
return;
}
Line 15,113 ⟶ 17,840:
// 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 15,125 ⟶ 17,852:
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 15,142 ⟶ 17,869:
//
 
wikEd.ParseDOM = function (obj, topNode) {
 
obj.plainLength = 0;
Line 15,151 ⟶ 17,878:
 
var anchorNode = obj.sel.anchorNode;
var focusNode = obj.sel.focusNode;
var anchorOffset = obj.sel.anchorOffset;
var focusOffset = obj.sel.focusOffset;
Line 15,166 ⟶ 17,893:
//
 
wikEd.ParseDOMRecursive = function (obj, currentNode, anchorNode, anchorOffset, focusNode, focusOffset) {
 
// cycle through the child nodes of currentNode
Line 15,198 ⟶ 17,925:
continue;
}
if ( (childNode.childNodes.length === 0) && (wikEd.leafElements[childNode.nodeName] === true) ) {
if (childNode.nodeName == 'BR') {
value = '\n';
Line 15,217 ⟶ 17,944:
 
// add text to text object
if (value !== null) {
 
// array of text fragments
Line 15,243 ⟶ 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 15,265 ⟶ 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 15,289 ⟶ 18,016:
// newline handling important for pasted page content
if (currentNode.nodeName != 'PRE') {
value = value.replace(/[ \r]*\n[ \r\n]*/g, ' ');
}
 
Line 15,296 ⟶ 18,023:
obj.plainNode.push(childNode);
obj.plainStart.push(obj.plain.length);
value = valuewikEd.replaceEscapeHtml(/&/g, '&amp;'value);
value = value.replace(/</g, '&lt;');
value = value.replace(/>/g, '&gt;');
 
if (currentNode.nodeName == 'PRE') {
Line 15,333 ⟶ 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
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
Line 15,355 ⟶ 18,088:
(currentNode.nodeName == '#text') ||
(currentNode.nodeType == currentNode.ENTITY_REFERENCE_NODE) ||
(wikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
Line 15,363 ⟶ 18,096:
 
// 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 15,381 ⟶ 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;
Line 15,398 ⟶ 18,133:
 
// 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
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
Line 15,405 ⟶ 18,148:
(currentNode.nodeName == '#text') ||
(currentNode.nodeType == currentNode.ENTITY_REFERENCE_NODE) ||
(wikEd.leafElements[currentNode.nodeName] === true)
) {
obj.foundNode = currentNode;
Line 15,412 ⟶ 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 15,428 ⟶ 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]);
}
);
Line 15,445 ⟶ 18,188:
// replace {wikedText:text} in css rules with translation
ruleStyle = ruleStyle.replace(/\{wikEdText:(\w+)\}/g,
function (p, p1) {
return( wikEd.config.text[p1]);
}
);
Line 15,459 ⟶ 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.AddCSSRuleAddCSSRules: add oneor rulereplace atall therules time using DOM method, veryat slowonce
//
 
this.AddCSSRuleAddCSSRules = 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.AddCSSRules: add or replace all rules at once, much faster
//
 
this.AddCSSRules = 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 15,541 ⟶ 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 15,641 ⟶ 18,262:
 
// assemble string body
if (typeof( FormData) != 'function') {
 
// create boundary
Line 15,652 ⟶ 18,273:
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 15,662 ⟶ 18,283:
// 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 15,672 ⟶ 18,293:
 
// 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 15,698 ⟶ 18,322:
// use standard XMLHttpRequest
else {
 
// allow ajax request from local copy for testing no longer working, see https://bugzilla.mozilla.org/show_bug.cgi?id=546848
 
// create new XMLHttpRequest object
request = new window.XMLHttpRequest();
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(error) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(error) {
return;
}
}
}
if (request == null) {
return;
}
 
// open the request
Line 15,733 ⟶ 18,331:
// set the headers
for (var headerName in headers) {
if (headersObject.prototype.hasOwnProperty.call(headers, headerName) === true) {
request.setRequestHeader(headerName, headers[headerName]);
}
Line 15,739 ⟶ 18,337:
 
// set the mime type
if ( (request.overrideMimeType !== nullundefined) && (typeof overrideMimeType !== null'string') ) {
request.overrideMimeType(overrideMimeType);
}
Line 15,747 ⟶ 18,345:
request.send(formData);
}
catch (errorexception) {
return;
}
 
// wait for the data
request.onreadystatechange = function () {
if (request.readyState != 4) {
return;
Line 15,768 ⟶ 18,366:
// uses postMessage, head script, and JSON encoding for Greasemonkey global to GM context access
 
wikEd.GetGlobals = function (names, gotGlobalsHook) {
 
if (gotGlobalsHook !== nullundefined) {
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 !== nullundefined) {
globalScopeCode += 'wikEd.ExecuteHook(wikEd.gotGlobalsHook[' + (wikEd.gotGlobalsHook.length - 1) + '], true);';
}
Line 15,791 ⟶ 18,389:
 
// prepare code to be executed in global context for Greasemonkey
if ( (typeof(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 15,804 ⟶ 18,402:
// 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 15,820 ⟶ 18,418:
script.id = 'wikEdGetGlobalScript' + wikEd.getGlobalsCounter;
wikEd.getGlobalsCounter ++;
if (typeof(script.innerText) !== 'undefined') {
script.innerText = globalScopeCode;
}
Line 15,827 ⟶ 18,425:
}
wikEd.head.appendChild(script);
 
return;
};
Line 15,836 ⟶ 18,433:
//
 
wikEd.GetGlobalsReceiver = function (event) {
 
if (event.source != window) {
Line 15,844 ⟶ 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
wikEd.GetPaths();
 
// run scheduled functions only once
if ( (globalObj.hookNumber !== undefined) && (wikEd.gotGlobalsHook[globalObj.hookNumber] !== undefined) null) {
wikEd.ExecuteHook(wikEd.gotGlobalsHook[globalObj.hookNumber], true);
}
Line 15,861 ⟶ 18,468:
// clean up head script
var script = document.getElementById(globalObj.scriptId);
wikEd.head.removeChildif (script !== null); {
wikEd.head.removeChild(script);
}
}
return;
};
 
 
//
// wikEd.GetAttribute: MS IE compatibility wrapper for element.getAttribute()
//
 
wikEd.GetAttribute = function(element, attribName) {
 
var attribValue = element.getAttribute(attribName);
 
// MS IE compatibility for checked
if (attribName == 'checked') {
if ( typeof(attribValue) == 'boolean' ) {
if (attribValue == true) {
attribValue = 'true';
}
else {
attribValue = 'false';
}
}
}
return(attribValue);
};
 
 
//
// wikEd.GetWindowInnerHeight: MS IE compatibility wrapper for window.innerHeight
//
 
wikEd.GetWindowInnerHeight = function() {
 
var value = window.innerHeight;
if (value == null) {
if (document.documentElement != null) {
value = document.documentElement.clientHeight;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientHeight;
}
}
return(value);
};
 
 
//
// wikEd.GetWindowInnerWidth: MS IE compatibility wrapper for window.innerWidth
//
 
wikEd.GetWindowInnerWidth = function() {
 
var value = window.innerWidth;
if (value == null) {
if (document.documentElement != null) {
value = document.documentElement.clientWidth;
}
if ( (value == null) || (value == 0) ) {
value = document.body.clientWidth;
}
}
return(value);
};
 
 
//
// wikEd.AddEventListener: wrapper for addEventListener (http://ejohn.org/projects/flexible-javascript-events/) (code copied to wikEdDiff.js)
//
 
wikEd.AddEventListener = function(domElement, eventType, eventHandler, useCapture) {
 
if (domElement == null) {
return;
}
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.RemoveEventListener: wrapper for removeEventListener
//
 
wikEd.RemoveEventListener = function(domElement, eventType, eventHandler, useCapture) {
 
if (domElement == null) {
return;
}
if (typeof(domElement.removeEventListener) == 'function') {
domElement.removeEventListener(eventType, eventHandler, useCapture);
}
else {
domElement.detachEvent('on' + eventType, domElement[eventType + eventHandler]);
domElement[eventType + eventHandler] = null;
}
return;
};
 
 
//
// wikEd.EventWrapper: MS IE and Mozilla compatibility fix for event object
//
 
wikEd.EventWrapper = function(event, thisElement) {
 
var eventAlt;
if (window.event != null) {
eventAlt = window.event;
}
else if (wikEd.frameWindow != null) {
if (typeof(wikEd.frameWindow.event) != 'undefined') {
eventAlt = wikEd.frameWindow.event;
}
}
if (eventAlt != null) {
event = eventAlt;
event.stopPropagation = function() {
event.cancelBubble = true;
};
event.preventDefault = function() {
event.returnValue = false;
};
if (event.target == null) {
event.target = event.srcElement;
}
if (event.currentTarget == null) {
event.currentTarget = thisElement;
}
if (event.relatedTarget == null) {
if (event.type == 'mouseout') {
event.relatedTarget = event.toElement;
}
else if (event.type == 'mouseover') {
event.relatedTarget = event.fromElement;
}
}
}
 
// 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();
}
catch(error) {
event.safeRelatedTarget = null;
}
}
}
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(nodeList);
};
 
Line 16,069 ⟶ 18,481:
//
 
wikEd.GetPreviousSiblingNode = function (node) {
 
while (node !== null) {
node = node.previousSibling;
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return( node);
};
 
Line 16,088 ⟶ 18,497:
//
 
wikEd.GetNextSiblingNode = function (node) {
 
while (node !== null) {
node = node.nextSibling;
if ( (node === null) || (node.nodeType == node.ELEMENT_NODE) ) {
break;
}
if (node.nodeType == node.ELEMENT_NODE) {
break;
}
}
return( node);
};
 
Line 16,107 ⟶ 18,513:
//
 
wikEd.GetFirstChildNode = function (node) {
 
if (node !== null) {
node = node.firstChild;
if ( (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
wikEd.GetNextSiblingNode(node);
node = wikEd.GetNextSiblingNode(node);
}
}
return( node);
};
 
Line 16,121 ⟶ 18,529:
//
 
wikEd.GetLastChildNode = function (node) {
 
if (node !== null) {
node = node.lastChild;
if ( (node !== null) && (node.nodeType != node.ELEMENT_NODE) ) {
wikEd.GetPreviousSiblingNode(node);
node = wikEd.GetPreviousSiblingNode(node);
return(node);
}
}
return node;
};
 
Line 16,135 ⟶ 18,545:
//
 
wikEd.CreateRandomString = function (strLength, charSet) {
 
if (charSet === nullundefined) {
charSet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_0123456789';
}
Line 16,144 ⟶ 18,554:
str += charSet.charAt(Math.floor(Math.random() * charSet.length));
}
return( str);
};
 
 
//
// wikEd.TabifyHTML: indent html for debugging
//
 
wikEd.TabifyHTML = function (html) {
 
var indent = '';
var html = html.replace(/((<(\/)?(\w+)[^>]*>)(<!--(.|\n)*?-->)?)([^<]*)/g,
function(p, p1, p2, p3, p4, p5, p6, p7) {
var html = '';
var code = p1;
var slash = p3;
var tag = p4;
var text = p7;
if ( (slash == '/') && (indent === '') ) {
html += '\n### Missing opening tag ###';
}
if ( (slash == '/') && (indent.length > 0) ) {
indent = indent.substr(0, indent.length - 1);
}
if ( (slash === '') && (tag.toLowerCase() == 'tr') ) {
html += '\n';
}
html += '\n' + indent + code;
if ( (slash === '') && (tag.toLowerCase() != 'br') ) {
indent += '\t';
}
if (text !== '') {
text = text.replace(/\n(?!($))/g, '\n' + indent);
html += '\n' + indent + text;
}
return html;
}
);
return html;
};
 
Line 16,154 ⟶ 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 16,186 ⟶ 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 16,195 ⟶ 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 16,206 ⟶ 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 16,220 ⟶ 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 16,233 ⟶ 18,681:
 
// 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 16,265 ⟶ 18,713:
 
// undefined
else if (typeof(object) === 'undefined') {
value = '';
}
Line 16,276 ⟶ 18,724:
// 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);
}
}
Line 16,317 ⟶ 18,764:
else {
var msg;
if (object === null) {
msg = objectName + '';
}
else {
msg = objectName + ': ' + value;
}
wikEd.ConsoleLog(msg);
Line 16,333 ⟶ 18,780:
// mw.log no longer works
 
wikEd.ConsoleLog = function (msg) {
 
if ( (typeof console == 'object') && (typeof console.error == 'function') ) {
msg = msg.replace(/\n/g, '\\n');
console.error('[wikEd debug]', msg);
msg = msg.replace(/([\'\"\\])/g, '\\$1');
}
setTimeout('throw new Error(\'wikEd.ConsoleLog: ' + msg + '\')', 0);
else {
msg = msg.replace(/\n/g, '\\n');
msg = msg.replace(/([\'\"\\])/g, '\\$1');
window.setTimeout('throw new Error(\'[wikEd debug] ' + msg + '\')', 0);
}
return;
};
Line 16,346 ⟶ 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 16,365 ⟶ 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 16,381 ⟶ 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 16,399 ⟶ 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 16,417 ⟶ 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;
}
Line 16,739 ⟶ 19,195:
};
for (var decimalValue in wikEd.controlCharHighlighting) {
if (wikEdObject.controlCharHighlightingprototype.hasOwnProperty.call(wikEd.controlCharHighlighting, decimalValue) === true) {
wikEd.controlCharHighlightingStr += '\\' + String.fromCharCode(decimalValue);
}
Line 16,760 ⟶ 19,216:
};
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/pluginsaddons/unicode/xregexp-unicode-base.js and /xregexp-unicode-categoriesv1.js0.0
wikEd.letters = '0041-005A0061-007A00AA00B500BA00C0-00D600D8-00F600F8-02C102C6-02D102E0-02E402EC02EE0370-037403760377037A-037D03860388-038A038C038E-03A103A3-03F503F7-0481048A-0525053105270531-055605590561-058705D0-05EA05F0-05F2062105F20620-064A066E066F0671-06D306D506E506E606EE06EF06FA-06FC06FF07100712-072F074D-07A507B107CA-07EA07F407F507FA0800-0815081A0824082809040815081A082408280840-085808A008A2-08AC0904-0939093D09500958-096109710972097909610971-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-0CB90CBD0CDE0CE00CE10D050CB90CBD0CDE0CE00CE10CF10CF20D05-0D0C0D0E-0D100D12-0D280D2A-0D390D3D0D600D610D7A0D3A0D3D0D4E0D600D610D7A-0D7F0D85-0D960D9A-0DB10DB3-0DBB0DBD0DC0-0DC60E01-0E300E320E330E40-0E460E810E820E840E870E880E8A0E8D0E94-0E970E99-0E9F0EA1-0EA30EA50EA70EAA0EAB0EAD-0EB00EB20EB30EBD0EC0-0EC40EC60EDC0EDD0F000F400EC40EC60EDC-0EDF0F000F40-0F470F49-0F6C0F88-0F8B10000F8C1000-102A103F1050-1055105A-105D106110651066106E-10701075-1081108E10A0-10C510D010C510C710CD10D0-10FA10FC110010FA10FC-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-1BA01BAE1BAF1C001BA01BAE1BAF1BBA-1BE51C00-1C231C4D-1C4F1C5A-1C7D1CE9-1CEC1CEE-1CF11D001CF11CF51CF61D00-1DBF1E00-1F151F18-1F1D1F20-1F451F48-1F4D1F50-1F571F591F5B1F5D1F5F-1F7D1F80-1FB41FB6-1FBC1FBE1FC2-1FC41FC6-1FCC1FD0-1FD31FD6-1FDB1FE0-1FEC1FF2-1FF41FF6-1FFC2071207F2090-209421022107210A209C21022107210A-211321152119-211D212421262128212A-212D212F-2139213C-213F2145-2149214E218321842C00-2C2E2C30-2C5E2C60-2CE42CEB-2CEE2D002CEE2CF22CF32D00-2D252D302D252D272D2D2D30-2D652D6F2D802D672D6F2D80-2D962DA0-2DA62DA8-2DAE2DB0-2DB62DB8-2DBE2DC0-2DC62DC8-2DCE2DD0-2DD62DD8-2DDE2E2F300530063031-3035303B303C3041-3096309D-309F30A1-30FA30FC-30FF3105-312D3131-318E31A0-31B731F031BA31F0-31FF3400-4DB54E00-9FCBA0009FCCA000-A48CA4D0-A4FDA500-A60CA610-A61FA62AA62BA640-A65FA662-A66EA67F-A697A6A0-A6E5A717-A71FA722-A788A78BA78CA7FBA788A78B-A78EA790-A793A7A0-A7AAA7F8-A801A803-A805A807-A80AA80C-A822A840-A873A882-A8B3A8F2-A8F7A8FBA90A-A925A930-A946A960-A97CA984-A9B2A9CFAA00-AA28AA40-AA42AA44-AA4BAA60-AA76AA7AAA80-AAAFAAB1AAB5AAB6AAB9-AABDAAC0AAC2AADB-AADDABC0AADDAAE0-AAEAAAF2-AAF4AB01-AB06AB09-AB0EAB11-AB16AB20-AB26AB28-AB2EABC0-ABE2AC00-D7A3D7B0-D7C6D7CB-D7FBF900-FA2DFA30-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;