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

Content deleted Content added
0.9.105 test
0.9.115alpha01
Line 1:
// <sourcesyntaxhighlight lang="JavaScript">
 
if (typeof(wikEd) == 'undefined') { window.wikEd = {}; }
 
// version info
wikEd.programVersion = '0.9.105115alpha01';
wikEd.programDate = 'SeptemberApril 0523, 20122013';
 
/*
Line 28:
// @author Cacycle (http://en.wikipedia.org/wiki/User:Cacycle)
// @license Released into the public ___domain
// @grant GM_getValue
// @grant GM_log
// @grant GM_xmlhttpRequest
// ==/UserScript==
 
Line 81 ⟶ 84:
'wikEdGripCustom2 title': 'Custom buttons (click to hide or show)',
'wikEdGripControl title': 'wikEd control buttons (click to hide or show)',
 
// button bar background titles
'wikEdBarFormat title': '',
'wikEdBarTextify title': '',
'wikEdBarCustom1 title': '',
'wikEdBarFind title': '',
'wikEdBarFix title': '',
'wikEdBarCustom2 title': '',
'wikEdBarControl title': 'wikEd {wikEdProgramVersion} ({wikEdProgramDate})',
'wikEdBarPreview title': '',
'wikEdBarPreview2 title': '',
'wikEdBarJump title': '',
 
// formatting buttons, top row
Line 490 ⟶ 505:
'.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;', // broken in Firefox 10.0, see Bugzilla 724241/596316
'::-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 746 ⟶ 760:
 
// combo input box
'.wikEdCombo': 'font-size: smaller; padding-left: 0.1em; padding-right: 0.1em; margin: 0 0.1em 0 0.1em; height: 1.6em; vertical-align: bottom;',
 
// wikEd button areas
Line 764 ⟶ 778:
 
// button bar inner wrapper: border (hidden: invisible)
'.wikEdButtonBarInnerWrapperVisible': 'border: 1px solid; border-color: #e0e0e0 #808080 #808080 #e0e0e0; line-height: 1em;',
'.wikEdButtonBarInnerWrapperHidden': '',
 
Line 782 ⟶ 796:
'.wikEdButtonsTextify': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsCustom1': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsFind': 'background: #d4d0cc; padding: 0px2px 2px 0 0px;',
'.wikEdButtonsFix': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
'.wikEdButtonsCustom2': 'background: #d4d0cc; padding: 2px 2px 0 0px;',
Line 813 ⟶ 827:
'.wikEdPreviewDiffError': 'padding: 0.5em; font-weight: bold; color: red; text-align: center;',
 
// find fieldand replace fields
'.wikEdFindComboInput, .wikEdReplaceComboInput': 'position: relative; paddingmargin: 0 5px; margintop: 0 0.2em-1px; white-space: nowrap; topvertical-align: bottom; padding: 0; verticalline-alignheight: bottom1.5em;',
'#wikEdFindText':, #wikEdReplaceText': 'vertical-align: 0%; font-family: monospace; paddingmargin: 0; marginposition: absolute; left: 0; positiontop: absolute0; z-index: 2; vertical-mozalign: bottom; width: 170px; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 1pxborder-box; height: 14px18px; width: 170px;',
'#wikEdFindSelect': , #wikEdReplaceSelect': 'vertical-align: 0%; font-family: monospace; paddingmargin: 0; marginposition: relative; left: 0; positiontop: relative0; z-index: 1; vertical-mozalign: bottom; width: 190px; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 0pxborder-box; height: 18px; border: none;',
 
// replace field
'.wikEdReplaceComboInput': 'position: relative; padding: 0; margin: 0 0.2em; white-space: nowrap; top: 0; vertical-align: bottom;',
'#wikEdReplaceText': 'vertical-align: 0%; font-family: monospace; padding: 0; margin: 0; position: absolute; z-index: 2; -moz-box-sizing: content-box; left: 0; top: 1px; height: 14px; width: 170px;',
'#wikEdReplaceSelect': 'vertical-align: 0%; font-family: monospace; padding: 0; margin: 0; position: relative; z-index: 1; -moz-box-sizing: content-box; left: 0; top: 0px; height: 18px; border: none; ',
 
// summary field
'.wikEdSummaryComboInput': 'position: relative; padding: 0; margin: 0 0 0 2px; top: 0.1em; white-space: nowrap; topvertical-align: bottom; padding: 0; verticalline-alignheight: text2em; -bottomwebkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; ',
'.wikEdSummaryText': 'vertical-alignpadding: 0%; paddingmargin: 0; marginposition: absolute; left: 0; positiontop: absolute0; z-index: 2; vertical-mozalign: bottom; width: auto; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 0pxborder-box; height: 18px21px; width: auto;',
'.wikEdSummarySelect': 'vertical-alignpadding: 0%; paddingmargin: 0; marginposition: relative; left: 0; positiontop: relative0; z-index: 1; vertical-mozalign: bottom; width: auto; -webkit-box-sizing: contentborder-box; left-moz-box-sizing: 0border-box; topbox-sizing: 1pxborder-box; height: 21px; border: none;',
 
// space around submit buttons
Line 833 ⟶ 842:
// 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;',
'.wikEdFrameInner': 'float: left; width: auto; background: white; border: 1px solid; border-color: #404040 #ffffff #ffffff #404040; line-height: 0;',
'.wikEdFrame': 'border: 0;',
 
Line 839 ⟶ 848:
'.wikEdSummaryWrapper': 'margin: 0 0 0.4em 0; width: 100%',
'.wikEdSummaryWrapperTop': 'margin: 0.1em 0 0.4em 0; width: 100%',
'#wpSummaryLabel': 'margin: 0 0.2em 0 0;',
'.editOptions': 'position: relative; top: 0.1em;',
'.wikEdClearSummaryForm': 'display: inline;',
'.wikEdClearSummary': 'vertical-align: middle0%; margin: 0 0.1em 0 0.5em; padding: 01px; 0height: 0.2em21px; 0width: 18px; ',
'#wikEdClearSummaryImg': 'vertical-align: 5%;',
 
// input wrapper
Line 877 ⟶ 887:
};
 
// buttons
// buttons (id, class, popup title, image src, width, height, alt text, click code)
if (typeof(wikEd.config.button) == 'undefined') { wikEd.config.button = {}; }
 
// wikEd.InitButton: define built-in buttons (id, class, popup title, image src, width, height, alt text, click handler code were obj is the button element)
wikEd.InitButton = function() {
wikEd.InitObject(wikEd.config.button, {
 
// button number: [id, class, tooltip, image url, width, height, alt text, onclick handler code were obj is the button element]
// workaround for mozilla 3.0 bug 441087: objId = obj.id; eventShiftKey = event.shiftKey;
 
// format top
1: ['wikEdUndo', 'wikEdButtonInactive', wikEd.config.text['wikEdUndo title'], wikEd.config.image['undo'], '16', '16', wikEd.config.text['wikEdUndo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
2: ['wikEdRedo', 'wikEdButtonInactive', wikEd.config.text['wikEdRedo title'], wikEd.config.image['redo'], '16', '16', wikEd.config.text['wikEdRedo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
3: ['wikEdBold', 'wikEdButton', wikEd.config.text['wikEdBold title'], wikEd.config.image['bold'], '16', '16', wikEd.config.text['wikEdBold alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
4: ['wikEdItalic', 'wikEdButton', wikEd.config.text['wikEdItalic title'], wikEd.config.image['italic'], '16', '16', wikEd.config.text['wikEdItalic alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
5: ['wikEdUnderline', 'wikEdButton', wikEd.config.text['wikEdUnderline title'], wikEd.config.image['underline'], '16', '16', wikEd.config.text['wikEdUnderline alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
6: ['wikEdStrikethrough', 'wikEdButton', wikEd.config.text['wikEdStrikethrough title'], wikEd.config.image['strikethrough'], '16', '16', wikEd.config.text['wikEdStrikethrough alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
7: ['wikEdNowiki', 'wikEdButton', wikEd.config.text['wikEdNowiki title'], wikEd.config.image['nowiki'], '16', '16', wikEd.config.text['wikEdNowiki alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
8: ['wikEdSuperscript', 'wikEdButton', wikEd.config.text['wikEdSuperscript title'], wikEd.config.image['superscript'], '16', '16', wikEd.config.text['wikEdSuperscript alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
9: ['wikEdSubscript', 'wikEdButton', wikEd.config.text['wikEdSubscript title'], wikEd.config.image['subscript'], '16', '16', wikEd.config.text['wikEdSubscript alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
10: ['wikEdRef', 'wikEdButton', wikEd.config.text['wikEdRef title'], wikEd.config.image['ref'], '16', '16', wikEd.config.text['wikEdRef alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdRef\'); } else { wikEd.EditButton(obj, \'wikEdRefNamed\'); }' ],
12: ['wikEdCase', 'wikEdButton', wikEd.config.text['wikEdCase title'], wikEd.config.image['case'], '16', '16', wikEd.config.text['wikEdCase alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
80: ['wikEdSort', 'wikEdButton', wikEd.config.text['wikEdSort title'], wikEd.config.image['sort'], '16', '16', wikEd.config.text['wikEdSort alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
25: ['wikEdRedirect', 'wikEdButton', wikEd.config.text['wikEdRedirect title'], wikEd.config.image['redirect'], '16', '16', wikEd.config.text['wikEdRedirect alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
13: ['wikEdUndoAll', 'wikEdButton', wikEd.config.text['wikEdUndoAll title'], wikEd.config.image['undoAll'], '16', '16', wikEd.config.text['wikEdUndoAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
14: ['wikEdRedoAll', 'wikEdButtonInactive', wikEd.config.text['wikEdRedoAll title'], wikEd.config.image['redoAll'], '16', '16', wikEd.config.text['wikEdRedoAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// format bottom
15: ['wikEdWikiLink', 'wikEdButton', wikEd.config.text['wikEdWikiLink title'], wikEd.config.image['wikiLink'], '16', '16', wikEd.config.text['wikEdWikiLink alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
16: ['wikEdWebLink', 'wikEdButton', wikEd.config.text['wikEdWebLink title'], wikEd.config.image['webLink'], '16', '16', wikEd.config.text['wikEdWebLink alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
17: ['wikEdHeading', 'wikEdButton', wikEd.config.text['wikEdHeading title'], wikEd.config.image['heading'], '16', '16', wikEd.config.text['wikEdHeading alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseHeading\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseHeading\'); }' ],
19: ['wikEdBulletList', 'wikEdButton', wikEd.config.text['wikEdBulletList title'], wikEd.config.image['bulletList'], '16', '16', wikEd.config.text['wikEdBulletList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseBulletList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseBulletList\'); }' ],
20: ['wikEdNumberList', 'wikEdButton', wikEd.config.text['wikEdNumberList title'], wikEd.config.image['numberList'], '16', '16', wikEd.config.text['wikEdNumberList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseNumberList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseNumberList\'); }' ],
21: ['wikEdIndentList', 'wikEdButton', wikEd.config.text['wikEdIndentList title'], wikEd.config.image['indentList'], '16', '16', wikEd.config.text['wikEdIndentList alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, \'wikEdIncreaseIndentList\'); } else { wikEd.EditButton(obj, \'wikEdDecreaseIndentList\'); }' ],
22: ['wikEdDefinitionList', 'wikEdButton', wikEd.config.text['wikEdDefinitionList title'], wikEd.config.image['definitionList'], '16', '16', wikEd.config.text['wikEdDefinitionList alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
23: ['wikEdImage', 'wikEdButton', wikEd.config.text['wikEdImage title'], wikEd.config.image['image'], '16', '16', wikEd.config.text['wikEdImage alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
24: ['wikEdTable', 'wikEdButton', wikEd.config.text['wikEdTable title'], wikEd.config.image['table'], '16', '16', wikEd.config.text['wikEdTable alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
11: ['wikEdReferences', 'wikEdButton', wikEd.config.text['wikEdReferences title'], wikEd.config.image['references'], '16', '16', wikEd.config.text['wikEdReferences alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id); } else { wikEd.EditButton(obj, \'wikEdReferencesSection\'); }' ],
 
// wikify, textify
26: ['wikEdWikify', 'wikEdButton', wikEd.config.text['wikEdWikify title'], wikEd.config.image['wikify'], '16', '16', wikEd.config.text['wikEdWikify alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
27: ['wikEdTextify', 'wikEdButton', wikEd.config.text['wikEdTextify title'], wikEd.config.image['textify'], '16', '16', wikEd.config.text['wikEdTextify alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
 
// control top
77: ['wikEdRefHide', 'wikEdButtonUnchecked', wikEd.config.text['wikEdRefHide title'], wikEd.config.image['refHide'], '16', '16', wikEd.config.text['wikEdRefHide alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
29: ['wikEdTextZoom', 'wikEdButton', wikEd.config.text['wikEdTextZoom title'], wikEd.config.image['textZoom'], '16', '16', wikEd.config.text['wikEdTextZoom alt'], 'if (!eventShiftKeyevent.shiftKey) { wikEd.Button(obj, \'wikEdTextZoomDown\'); } else { wikEd.Button(obj, \'wikEdTextZoomUp\'); }' ],
30: ['wikEdClearHistory', 'wikEdButton', wikEd.config.text['wikEdClearHistory title'], wikEd.config.image['clearHistory'], '16', '16', wikEd.config.text['wikEdClearHistory alt'], 'wikEd.Button(obj, objIdobj.id);' ],
31: ['wikEdScrollToPreview', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview title'], wikEd.config.image['scrollToPreviewDown'], '16', '16', wikEd.config.text['wikEdScrollToPreview alt'], 'wikEd.Button(obj, objIdobj.id);' ],
32: ['wikEdScrollToEdit', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit title'], wikEd.config.image['scrollToEditDown'], '16', '16', wikEd.config.text['wikEdScrollToEdit alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// control bottom
33: ['wikEdUseWikEd', 'wikEdButtonChecked', wikEd.config.text['wikEdUseWikEd title'], wikEd.config.image['useWikEd'], '16', '16', wikEd.config.text['wikEdUseWikEd alt'], 'if (!event.ctrlKey) { wikEd.Button(obj, objIdobj.id, true); } else { wikEd.DebugInfo(event); }' ],
34: ['wikEdHighlightSyntax', 'wikEdButtonUnchecked', wikEd.config.text['wikEdHighlightSyntax title'], wikEd.config.image['highlightSyntax'], '16', '16', wikEd.config.text['wikEdHighlightSyntax alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
35: ['wikEdSource', 'wikEdButton', wikEd.config.text['wikEdSource title'], wikEd.config.image['source'], '16', '16', wikEd.config.text['wikEdSource alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
75: ['wikEdCloseToolbar', 'wikEdButtonUnchecked', wikEd.config.text['wikEdCloseToolbar title'], wikEd.config.image['closeToolbar'], '16', '16', wikEd.config.text['wikEdCloseToolbar alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
36: ['wikEdUsing', 'wikEdButtonUnchecked', wikEd.config.text['wikEdUsing title'], wikEd.config.image['using'], '16', '16', wikEd.config.text['wikEdUsing alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
37: ['wikEdFullScreen', 'wikEdButtonUnchecked', wikEd.config.text['wikEdFullScreen title'], wikEd.config.image['fullScreen'], '16', '16', wikEd.config.text['wikEdFullScreen alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
79: ['wikEdTableMode', 'wikEdButtonUnchecked', wikEd.config.text['wikEdTableMode title'], wikEd.config.image['tableMode'], '16', '16', wikEd.config.text['wikEdTableMode alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
 
// find top
39: ['wikEdFindAll', 'wikEdButton', wikEd.config.text['wikEdFindAll title'], wikEd.config.image['findAll'], '16', '16', wikEd.config.text['wikEdFindAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
40: ['wikEdFindPrev', 'wikEdButton', wikEd.config.text['wikEdFindPrev title'], wikEd.config.image['findPrev'], '16', '16', wikEd.config.text['wikEdFindPrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
41: ['wikEdFindNext', 'wikEdButton', wikEd.config.text['wikEdFindNext title'], wikEd.config.image['findNext'], '16', '16', wikEd.config.text['wikEdFindNext alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
43: ['wikEdJumpPrev', 'wikEdButton', wikEd.config.text['wikEdJumpPrev title'], wikEd.config.image['jumpPrev'], '16', '16', wikEd.config.text['wikEdJumpPrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
44: ['wikEdJumpNext', 'wikEdButton', wikEd.config.text['wikEdJumpNext title'], wikEd.config.image['jumpNext'], '16', '16', wikEd.config.text['wikEdJumpNext alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// find bottom
46: ['wikEdReplaceAll', 'wikEdButton', wikEd.config.text['wikEdReplaceAll title'], wikEd.config.image['replaceAll'], '16', '16', wikEd.config.text['wikEdReplaceAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
47: ['wikEdReplacePrev', 'wikEdButton', wikEd.config.text['wikEdReplacePrev title'], wikEd.config.image['replacePrev'], '16', '16', wikEd.config.text['wikEdReplacePrev alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
48: ['wikEdReplaceNext', 'wikEdButton', wikEd.config.text['wikEdReplaceNext title'], wikEd.config.image['replaceNext'], '16', '16', wikEd.config.text['wikEdReplaceNext alt'], 'if (eventShiftKeyevent.shiftKey) { wikEd.EditButton(obj, objIdobj.id, \'shift\'); } else { wikEd.EditButton(obj, objIdobj.id); }' ],
49: ['wikEdCaseSensitive', 'wikEdButtonUnchecked', wikEd.config.text['wikEdCaseSensitive title'], wikEd.config.image['caseSensitive'], '16', '16', wikEd.config.text['wikEdCaseSensitive alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
50: ['wikEdRegExp', 'wikEdButtonUnchecked', wikEd.config.text['wikEdRegExp title'], wikEd.config.image['regExp'], '16', '16', wikEd.config.text['wikEdRegExp alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
51: ['wikEdFindAhead', 'wikEdButtonUnchecked', wikEd.config.text['wikEdFindAhead title'], wikEd.config.image['findAhead'], '16', '16', wikEd.config.text['wikEdFindAhead alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
 
// fix top
52: ['wikEdFixBasic', 'wikEdButton', wikEd.config.text['wikEdFixBasic title'], wikEd.config.image['fixBasic'], '16', '16', wikEd.config.text['wikEdFixBasic alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
53: ['wikEdFixHtml', 'wikEdButton', wikEd.config.text['wikEdFixHtml title'], wikEd.config.image['fixHtml'], '16', '16', wikEd.config.text['wikEdFixHtml alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
54: ['wikEdFixCaps', 'wikEdButton', wikEd.config.text['wikEdFixCaps title'], wikEd.config.image['fixCaps'], '16', '16', wikEd.config.text['wikEdFixCaps alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
55: ['wikEdFixUnicode', 'wikEdButton', wikEd.config.text['wikEdFixUnicode title'], wikEd.config.image['fixUnicode'], '16', '16', wikEd.config.text['wikEdFixUnicode alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
81: ['wikEdFixRedirect', 'wikEdButton', wikEd.config.text['wikEdFixRedirect title'], wikEd.config.image['fixRedirect'], '16', '16', wikEd.config.text['wikEdFixRedirect alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
56: ['wikEdFixAll', 'wikEdButton', wikEd.config.text['wikEdFixAll title'], wikEd.config.image['fixAll'], '16', '16', wikEd.config.text['wikEdFixAll alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
57: ['wikEdFixRegExTypo', 'wikEdButton', wikEd.config.text['wikEdFixRegExTypo title'], wikEd.config.image['fixRegExTypo'], '16', '16', wikEd.config.text['wikEdFixRegExTypo alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// fix bottom
58: ['wikEdFixDashes', 'wikEdButton', wikEd.config.text['wikEdFixDashes title'], wikEd.config.image['fixDash'], '16', '16', wikEd.config.text['wikEdFixDashes alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
59: ['wikEdFixPunct', 'wikEdButton', wikEd.config.text['wikEdFixPunct title'], wikEd.config.image['fixPunct'], '16', '16', wikEd.config.text['wikEdFixPunct alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
60: ['wikEdFixMath', 'wikEdButton', wikEd.config.text['wikEdFixMath title'], wikEd.config.image['fixMath'], '16', '16', wikEd.config.text['wikEdFixMath alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
61: ['wikEdFixChem', 'wikEdButton', wikEd.config.text['wikEdFixChem title'], wikEd.config.image['fixChem'], '16', '16', wikEd.config.text['wikEdFixChem alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
62: ['wikEdFixUnits', 'wikEdButton', wikEd.config.text['wikEdFixUnits title'], wikEd.config.image['fixUnits'], '16', '16', wikEd.config.text['wikEdFixUnits alt'], 'wikEd.EditButton(obj, objIdobj.id);' ],
 
// preview top
65: ['wikEdClose', 'wikEdButton', wikEd.config.text['wikEdClose title'], wikEd.config.image['close'], '16', '16', wikEd.config.text['wikEdClose alt'], 'wikEd.Button(obj, objIdobj.id);' ],
66: ['wikEdScrollToPreview2', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview2 title'], wikEd.config.image['scrollToPreviewDown'], '16', '16', wikEd.config.text['wikEdScrollToPreview2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
67: ['wikEdScrollToEdit2', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit2 title'], wikEd.config.image['scrollToEdit'], '16', '16', wikEd.config.text['wikEdScrollToEdit2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// preview bottom
70: ['wikEdClose2', 'wikEdButton', wikEd.config.text['wikEdClose2 title'], wikEd.config.image['close'], '16', '16', wikEd.config.text['wikEdClose2 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
71: ['wikEdScrollToPreview3', 'wikEdButton', wikEd.config.text['wikEdScrollToPreview3 title'], wikEd.config.image['scrollToPreview'], '16', '16', wikEd.config.text['wikEdScrollToPreview3 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
72: ['wikEdScrollToEdit3', 'wikEdButton', wikEd.config.text['wikEdScrollToEdit3 title'], wikEd.config.image['scrollToEdit'], '16', '16', wikEd.config.text['wikEdScrollToEdit3 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// jump
78: ['wikEdDiff', 'wikEdButtonUnchecked', wikEd.config.text['wikEdDiff title'], wikEd.config.image['wikEdDiff'], '16', '16', wikEd.config.text['wikEdDiff alt'], 'wikEd.Button(obj, objIdobj.id, true);' ],
74: ['wikEdScrollToEdit4', 'wikEdButtonSolo', wikEd.config.text['wikEdScrollToEdit4 title'], wikEd.config.image['scrollToEditDown'], '16', '16', wikEd.config.text['wikEdScrollToEdit4 alt'], 'wikEd.Button(obj, objIdobj.id);' ],
 
// dummy (empty placeholder)
Line 984 ⟶ 994:
 
// 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, objIdobj.id);' ],
83: ['wikEdLocalDiff', 'wikEdLocalDiff', wikEd.config.text['wikEdLocalDiff title'], wikEd.config.image['diff'], '16', '16', wikEd.config.text['wikEdLocalDiffImg alt'], 'wikEd.Button(obj, objIdobj.id);' ]
});
};
Line 992 ⟶ 1,002:
if (typeof(wikEd.config.buttonKey) == 'undefined') { wikEd.config.buttonKey = {}; }
 
// wikEd.InitButtonKey: define accesskeys for edit buttons (wikEd button number: [key string, JS key code])
wikEd.InitButtonKey = function() {
wikEd.InitObject(wikEd.config.buttonKey, {
 
// wikEd button number: [key string, JS key code]
26: ['b', 66], // wikify
27: ['o', 79], // textify
Line 1,007 ⟶ 1,019:
if (typeof(wikEd.config.buttonBar) == 'undefined') { wikEd.config.buttonBar = {}; }
 
// wikEd.InitButtonBar: define built-in button bars (id outer, class outer, id inner, class inner, height, grip title, button numbers)
wikEd.InitButtonBar = function() {
wikEd.InitObject(wikEd.config.buttonBar, {
 
'format': ['wikEdButtonBarFormat', 'wikEdButtonBarFormat', 'wikEdButtonsFormat', 'wikEdButtonsFormat', 44, wikEd.config.text['wikEdGripFormat title'], [1,2,3,4,5,6,7,8,9,10,12,13,14,'br',15,16,17,19,20,21,22,23,24,11,80,25,76] ],
// button name: [id outer, class outer, id inner, class inner, height, grip title, button numbers, bar title]
'textify': ['wikEdButtonBarTextify', 'wikEdButtonBarTextify', 'wikEdButtonsTextify', 'wikEdButtonsTextify', 44, wikEd.config.text['wikEdGripTextify title'], [26,'br',27] ],
'custom1format': ['wikEdButtonBarCustom1wikEdButtonBarFormat', 'wikEdButtonBarCustom1wikEdButtonBarFormat', 'wikEdButtonsCustom1wikEdButtonsFormat', 'wikEdButtonsCustom1wikEdButtonsFormat', 44, wikEd.config.text['wikEdGripCustom1wikEdGripFormat title'], [1,2,3,4,5,6,7,8,9,10,12,13,14,'br',15,16,17,19,20,21,22,23,24,11,80,25,76], wikEd.config.text['wikEdBarFormat title'] ],
'findtextify': ['wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonBarFindwikEdButtonBarTextify', 'wikEdButtonsFindwikEdButtonsTextify', 'wikEdButtonsFindwikEdButtonsTextify', 44, wikEd.config.text['wikEdGripFindwikEdGripTextify title'], [39,40,'find',41,76,43,4426,'br',46,4727], wikEd.config.text['replacewikEdBarTextify title',48,49,50,51] ],
'fixcustom1': ['wikEdButtonBarFixwikEdButtonBarCustom1', 'wikEdButtonBarFixwikEdButtonBarCustom1', 'wikEdButtonsFixwikEdButtonsCustom1', 'wikEdButtonsFixwikEdButtonsCustom1', 44, wikEd.config.text['wikEdGripFixwikEdGripCustom1 title'], [ ], wikEd.config.text[52,53,54,55,56,81,'brwikEdBarCustom1 title',58,59,60,61,62,57] ],
'custom2find': ['wikEdButtonBarCustom2wikEdButtonBarFind', 'wikEdButtonBarCustom2wikEdButtonBarFind', 'wikEdButtonsCustom2wikEdButtonsFind', 'wikEdButtonsCustom2wikEdButtonsFind', 44, wikEd.config.text['wikEdGripCustom2wikEdGripFind title'], [39,40,'find',41,76,43,44,'br',46,47,'replace',48,49,50,51], wikEd.config.text['wikEdBarFind title'] ],
'controlfix': ['wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonBarControlwikEdButtonBarFix', 'wikEdButtonsControlwikEdButtonsFix', 'wikEdButtonsControlwikEdButtonsFix', 44, wikEd.config.text['wikEdGripControlwikEdGripFix title'], [7752,2953,3054,3555,3156,3281,'br',3358,3459,7960,7561,3662,7857],37 wikEd.config.text['wikEdBarFix title'] ],
'custom2': ['wikEdButtonBarCustom2', 'wikEdButtonBarCustom2', 'wikEdButtonsCustom2', 'wikEdButtonsCustom2', 44, wikEd.config.text['wikEdGripCustom2 title'], [ ], wikEd.config.text['wikEdBarCustom2 title'] ],
'preview': ['wikEdButtonBarPreview', 'wikEdButtonBarPreview', 'wikEdButtonsPreview', 'wikEdButtonsPreview', 0, null, [66,67,65] ],
'control': ['wikEdButtonBarControl', 'wikEdButtonBarControl', 'wikEdButtonsControl', 'wikEdButtonsControl', 44, wikEd.config.text['wikEdGripControl title'], [77,29,30,35,31,32,'br',33,34,79,75,36,78,37], wikEd.config.text['wikEdBarControl title'] ],
'preview2': ['wikEdButtonBarPreview2', 'wikEdButtonBarPreview2', 'wikEdButtonsPreview2', 'wikEdButtonsPreview2', 0, null, [71,72,70] ],
'preview': ['wikEdButtonBarPreview', 'wikEdButtonBarPreview', 'wikEdButtonsPreview', 'wikEdButtonsPreview', 0, null, [66,67,65], wikEd.config.text['wikEdBarPreview title'] ],
'jump': ['wikEdButtonBarJump', 'wikEdButtonBarJump', 'wikEdButtonsJump', 'wikEdButtonsJump', 0, null, [74] ]
'preview2': ['wikEdButtonBarPreview2', 'wikEdButtonBarPreview2', 'wikEdButtonsPreview2', 'wikEdButtonsPreview2', 0, null, [71,72,70], wikEd.config.text['wikEdBarPreview2 title'] ],
'jump': ['wikEdButtonBarJump', 'wikEdButtonBarJump', 'wikEdButtonsJump', 'wikEdButtonsJump', 0, null, [74], wikEd.config.text['wikEdBarJump title'] ]
});
};
Line 1,140 ⟶ 1,154:
// enable local preview (Pilaf's InstaView)
if (typeof(wikEd.config.useLocalPreview) == 'undefined') { wikEd.config.useLocalPreview = true; }
 
// allow ajax requests from local copy for testing, also defined in wikEdDiff.js
if (typeof(wikEd.config.allowLocalAjax) == 'undefined') { wikEd.config.allowLocalAjax = false; }
 
// enable server preview (Ajax)
Line 1,248 ⟶ 1,259:
// debug display of DOM nodes: maximal length of innerHTML in chars
if (typeof(wikEd.config.debugInnerHtmlLength) == 'undefined') { wikEd.config.debugInnerHtmlLength = 150; }
 
// wikibase data repository url path
if (typeof(wikEd.config.wbRepoUrl) == 'undefined') { wikEd.config.wbRepoUrl = '//www.wikidata.org/wiki/'; }
 
// interlanguage name of default wiki on wikibase data repository (wikidata)
if (typeof(wikEd.config.wbInterLang) == 'undefined') { wikEd.config.wbInterLang = 'enwiki'; }
 
return;
Line 1,256 ⟶ 1,273:
// 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
Line 1,392 ⟶ 1,412:
wikEd.uploadEdit = false;
wikEd.viewDeleted = false;
wikEd.language = '';
wikEd.watchlistEdit = false;
wikEd.debugOpen = false;
wikEd.pageNamespace = null;
wikEd.wbRepoUrl = '';
wikEd.wbRepoItem = '';
wikEd.wbInterLang = '';
 
// history
Line 1,452 ⟶ 1,474:
// edit form fields
wikEd.editForm = null;
wikEd.starttime = null;
wikEd.edittime = null;
wikEd.editToken = null;
Line 1,605 ⟶ 1,627:
 
// parser variables {{variable}}
wikEd.parserVariables = 'CURRENTYEAR|CURRENTMONTH|CURRENTMONTHNAME|CURRENTMONTHNAMEGEN|CURRENTMONTHABBREV|CURRENTDAY|CURRENTDAY2|CURRENTDOW|CURRENTDAYNAME|CURRENTTIME|CURRENTHOUR|CURRENTWEEK|CURRENTTIMESTAMP|LOCALYEAR|LOCALMONTH|LOCALMONTHNAME|LOCALMONTHNAMEGEN|LOCALMONTHABBREV|LOCALDAY|LOCALDAY2|LOCALDOW|LOCALDAYNAME|LOCALTIME|LOCALHOUR|LOCALWEEK|LOCALTIMESTAMP|SITENAME|CURRENTVERSION|CONTENTLANGUAGE|REVISIONID|REVISIONDAY|REVISIONDAY2|REVISIONMONTH|REVISIONYEAR|REVISIONTIMESTAMP|SERVER|SERVERNAME|SCRIPTPATH|FULLPAGENAME|PAGENAME|BASEPAGENAME|SUBPAGENAME|SUBJECTPAGENAME|TALKPAGENAME|FULLPAGENAMEE|PAGENAMEE|BASEPAGENAMEE|SUBPAGENAMEE|SUBJECTPAGENAMEE|TALKPAGENAMEE|NAMESPACE|SUBJECTSPACE|ARTICLESPACE|TALKSPACE|NAMESPACEE|SUBJECTSPACEE|TALKSPACEE|DIRMARK|DIRECTIONMARK|PAGENAME|PAGENAMEE|ARTICLEPATH|NOEXTERNALLANGLINKS';
 
// parser variables {{variable:R}}
Line 1,614 ⟶ 1,636:
 
// parser functions {{function:param|param}}
wikEd.parserFunctions = 'localurl|localurle|fullurl|filepath|fullurle|urlencode|urldecode|anchorencode|ns|lc|lcfirst|uc|ucfirst|formatnum|padleft|padright|padright|plural|grammar|gender|int|noexternallanglinks';
 
// parser functions {{#function:param|param}}
wikEd.parserFunctionsHash = 'language|special|tag|tag|expr|if|ifeq|ifexist|ifexpr|switch|time|timel|rel2abs|titleparts|iferror|iferror|special|tag|categorytree|formatdate|property';
 
// define leaf elements for wikEd.GetInnerHTML
Line 1,650 ⟶ 1,672:
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
Line 1,870 ⟶ 1,893:
 
// 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'];
if (wikEd.greasemonkey == true) {
globalNames.push('wikEdConfig', 'wikEdText');
Line 2,014 ⟶ 2,037:
continue;
}
 
// ignore resource loader
if (scriptName == 'load.php') {
continue;
}
 
wikEd.externalScripts[scriptName] = true;
wikEd.externalScriptsString += scriptName + '\n';
Line 2,047 ⟶ 2,076:
wikEd.config.gadget = true;
}
}
 
// set installation type
if (wikEd.config.gadget == true) {
wikEd.installationType += ' G';
}
else if (wikEd.greasemonkey == true) {
wikEd.installationType += ' GM';
}
 
Line 2,152 ⟶ 2,189:
}
 
// add event listenerlisteners to logo
wikEd.AddEventListener(wikEd.logo, 'click', wikEd.MainSwitch, true);
wikEd.AddEventListener(wikEd.logo, 'click', wikEd.DebugInfo, true);
}
 
Line 2,209 ⟶ 2,247:
 
// ___location search string function: put all used images and icons on an empty page
if (window.___location.search.match(/(\?|&)wikEd=iconPage\b/i.test(window.___location.search) !== nulltrue) {
var str = wikEd.config.text.iconPage;
for (var imageKey in wikEd.config.image) {
Line 2,446 ⟶ 2,484:
if (wikEd.wikiGlobals.wgScript == null) {
wikEd.wikiGlobals.wgScript = wikEd.editForm.action.replace(/^https?:\/\/[^\/]*|\?.*$/g, '');
wikEd.wikiGlobals.wgScriptPath = wikEd.wikiGlobals.wgScript.replace(/\/index\.php/, '');
}
 
Line 2,461 ⟶ 2,499:
wikEd.pageNamespace = wikEd.pageName.substr(0, colonPos);
}
}
 
// get wikibase data repository url and item from interlanguage edit link (wikidata)
// work in progress!
var parents = wikEd.GetElementsByClassName('wbc-editpage');
if (parents.length > 0) {
var node = parents[parents.length - 1].firstChild;
if ( (node != null) && (node.nodeName == 'A') && (node.href != null) ) {
var regExpMatch = /^(.*\/)(.*?)$/.exec(node.href);
if (regExpMatch != null) {
wikEd.wbRepoUrl = regExpMatch[1];
wikEd.wbRepoItem = regExpMatch[2];
}
}
}
if (wikEd.wbRepoUrl == '') {
if (wikEd.config.wbRepoUrl != null) {
wikEd.wbRepoUrl = wikEd.config.wbRepoUrl;
}
}
 
// get interlanguage name of wiki on wikibase data repository (wikidata)
// work in progress!
var regExpMatch;
if ( (regExpMatch = /\/\/([\w-]+)\.wikipedia\.org/.exec(wikEd.wikiGlobals.wgServer)) != null) {
wikEd.wbInterLang = regExpMatch[1].replace(/-/, '_') + 'wiki';
}
else {
wikEd.wbInterLang = wikEd.config.wbInterLang;
}
 
Line 2,565 ⟶ 2,632:
 
// detect preview page
if (window.___location.search.match(/(\?|&)action=submit\b/.test(window.___location.search) !== nulltrue) {
wikEd.previewPage = true;
}
Line 2,575 ⟶ 2,642:
 
// disable wikEd for Lupin's autoedit scripts
if (window.___location.search.match(/(\?|&)autoedit=/.test(window.___location.search) !== nulltrue) {
wikEd.useWikEd = false;
}
Line 3,050 ⟶ 3,117:
html += ' onload="var doc = window.document; doc.designMode = \'on\'; ';
}
html += 'try { doc.execCommand(\'styleWithCSS\', 0, false); } catch (eerror) { ';
html += 'try { doc.execCommand(\'useCSS\', 0, true); } catch (eerror) { ';
html += 'try { doc.execCommand(\'styleWithCSS\', false, false); } catch (eerror) { } } }"';
html += '></body></html>';
 
Line 3,061 ⟶ 3,128:
wikEd.frameDocument = wikEd.frameWindow.document;
 
// set frame height and width, border divs shrink around
wikEd.frameBorderHeight = parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderBottomWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderTopWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderBottomWidth'), 10);
wikEd.frameBorderWidth = parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderRightWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderRightWidth'), 10);
 
wikEd.frameHeight = (wikEd.textareaOffsetHeightInitial - wikEd.frameBorderHeight) + 'px';
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.height = wikEd.frameHeight;
 
wikEd.frameBorderWidth = parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameOuter, 'borderRightWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderLeftWidth'), 10) + parseInt(wikEd.GetStyle(wikEd.frameInner, 'borderRightWidth'), 10);
wikEd.frameWidth = (wikEd.editorWrapper.clientWidth - wikEd.frameBorderWidth) + 'px';
wikEd.frame.style.width = wikEd.frameWidth;
 
// do not remember siesize if started in fullscreen mode
if (wikEd.fullScreenMode == true) {
wikEd.frameHeight = 0;
Line 3,079 ⟶ 3,146:
if ( (onloadWorkaround == false) && (wikEd.readOnly == false) ) {
wikEd.frameDocument.designMode = 'on';
try { wikEd.frameDocument.execCommand('styleWithCSS', 0, false); } catch (eerror) {
try { wikEd.frameDocument.execCommand('useCSS', 0, true); } catch (eerror) {
try { wikEd.frameDocument.execCommand('styleWithCSS', false, false); } catch (eerrror) {
}
}
Line 3,250 ⟶ 3,317:
wikEd.clearSummary.alt = wikEd.config.text['wikEdClearSummary alt'];
wikEd.clearSummary.title = wikEd.config.text['wikEdClearSummary title'];
wikEd.clearSummary.style.height = (wikEd.summaryText.clientHeight + 1) +'px';
clearSummaryForm.appendChild(wikEd.clearSummary);
 
Line 3,700 ⟶ 3,766:
wikEd.SetPersistent('wikEdAutoUpdate', currentDate.toUTCString(), 0, '/');
 
// make the ajax request
wikEd.AjaxRequest('GET', wikEd.config.autoUpdateUrl, null, 'text/plain', function(ajax, obj) {
 
// get response
Line 3,791 ⟶ 3,857:
regExpFind = new RegExp(regExpMatch[2], 'gm');
}
catch (errerror) {
var msg = 'Invalid RegExTypoFix rule:\nfind=' + regExpMatch[2] + '\nreplace=' + regExpMatch[3];
wikEd.ConsoleLog(msg);
Line 3,837 ⟶ 3,903:
}
 
eval(wikEd.editButtonHandler[obj.id]);
// workaround for mozilla 3.0 bug 441087
objId = obj.id;
eventShiftKey = event.shiftKey;
eval(wikEd.editButtonHandler[objId]);
return;
};
Line 3,852 ⟶ 3,915:
 
var diffWidth = wikEd.clearSummary.offsetWidth - wikEd.clearSummaryWidth;
wikEd.inputElement.summary.style.width = (wikEd.inputElement.summary.offsetWidth - diffWidth) + 'px';
 
wikEd.selectElement.summary.style.width = (wikEd.selectElement.summary.offsetWidth - diffWidth) + 'px';
// Firefox < 3.0
if ( typeof(wikEd.inputElement.summary.clientLeft) == 'undefined' ) {
wikEd.inputElement.summary.style.width = (wikEd.inputElement.summary.clientWidth - diffWidth) + 'px';
wikEd.selectElement.summary.style.width = (wikEd.selectElement.summary.clientWidth - diffWidth) + 'px';
}
 
// Firefox >= 3.0
else {
wikEd.inputElement.summary.style.width = (wikEd.inputElement.summary.clientWidth - diffWidth) + 'px';
wikEd.selectElement.summary.style.width = (wikEd.selectElement.summary.clientWidth - diffWidth + 3) + 'px';
}
wikEd.clearSummaryWidth = wikEd.clearSummary.offsetWidth;
return;
Line 3,954 ⟶ 4,007:
 
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);
}
 
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,744 ⟶ 4,833:
wikEd.SetLogo = function(state, parameter) {
 
var src = '';
var alt = '';
var title = '';
if (state == 'error') {
wikEd.logo.src = wikEd.config.image['error'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo error alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo error title'];
}
else if (state == 'browser') {
wikEd.logo.src = wikEd.config.image['browser'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo browser alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo browser title'];
}
else if (state == 'incompatible') {
wikEd.logo.src = wikEd.config.image['incompatible'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo incompatible alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo incompatible title'];
}
else {
if (wikEd.disabled == true) {
wikEd.logo.src = wikEd.config.image['disabled'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo disabled alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo disabled title'];
}
else if (wikEd.testVersion == true) {
wikEd.logo.src = wikEd.config.image['testVersion'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo testVersion alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo testVersion title'];
}
else {
wikEd.logo.src = wikEd.config.image['logo'];
wikEd.logo.alt = wikEd.config.text['wikEdLogo alt'];
wikEd.logo.title = wikEd.config.text['wikEdLogo title'];
}
}
title = title.replace(/\{wikEdParameter\}/g, parameter);
var version = wikEd.programVersion;
title = title.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
if (wikEd.config.gadget == true) {
title = title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
version += ' G';
wikEd.logo.src = src;
}
else if (wikEd.greasemonkeylogo.alt == true) {alt;
wikEd.logo.title = title;
version += ' GM';
}
wikEd.logo.title = wikEd.logo.title.replace(/\{wikEdParameter\}/g, parameter);
wikEd.logo.title = wikEd.logo.title.replace(/\{wikEdProgramVersion\}/g, version);
wikEd.logo.title = wikEd.logo.title.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
 
return;
};
Line 4,805 ⟶ 4,892:
var gripTitle = bar[5];
var buttonNumbers = bar[6];
var barTitle = bar[7];
 
// collect the buttons
Line 4,833 ⟶ 4,921:
alert('Loading error: The button "' + buttonNumbers[i] + '" is not defined.');
}
if ( (currButton[0] == 'wikEdSource') && (wikEd.config.showSourceButton != true) && (wikEd.config.debug != true) ) {
break;
}
Line 4,852 ⟶ 4,940:
div.id = barId;
div.className = barClass;
if ( (barTitle != null) && (barTitle != '') ) {
 
barTitle = barTitle.replace(/\{wikEdProgramVersion\}/g, wikEd.programVersion + wikEd.installationType);
barTitle = barTitle.replace(/\{wikEdProgramDate\}/g, wikEd.programDate);
div.title = barTitle;
}
var buttonsStyle = '';
if (barHeight > 0) {
Line 5,213 ⟶ 5,305:
wikEd.previewBox.innerHTML = wikEd.config.text.wikEdPreviewLoading;
wikEd.localPrevWrapper.style.display = 'inline';
 
// get MathJax
try {
mw.loader.using('ext.math.mathjax.enabler', function () {
WED('Loaded MathJax');
WED('wikEd.textarea.value.renderTeX()', wikEd.textarea.value.renderTeX());
wikEd.textarea.value = wikEd.textarea.value.renderTeX());
});
}
catch (error) {
}
 
// prepare ajax preview
Line 5,229 ⟶ 5,332:
bodyData = bodyData.replace(/(.+)/g,
function (p, p1) {
if (/[\#<>\[\]\|\{\}]/.test(p1) == true) {
return(p1);
}
Line 5,238 ⟶ 5,341:
// 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');
}
Line 5,266 ⟶ 5,369:
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>';
Line 5,277 ⟶ 5,380:
// 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 = /<(source|syntaxhighlight|source)\b[^>]*?lang\s*=\s*("|')(\w+)\2/gi;
while ( (regExpMatch = regExp.exec(bodyData)) != null) {
var lang = regExpMatch[3];
Line 5,534 ⟶ 5,637:
 
wikEd.EditButton = function(buttonObj, buttonId, parameters, CustomHandler) {
 
// check if iframe is enabled
if (wikEd.UseWikEd == false) {
return;
}
 
// check if button is disabled
Line 5,891 ⟶ 5,999:
var highlightSyntax = wikEd.highlightSyntax;
 
// apply selected action
// manipulate the text
var selectChanged = true;
var selectChangedText = '';
var emptyOrSpaces = /^ *$/.test(obj.changed.plain);
switch (buttonId) {
 
Line 5,923 ⟶ 6,032:
// bold
case 'wikEdBold':
 
if ( /'''([^'](.|\n)*?)'''/.test(obj.changed.plain) ) {
// remove markup
obj.changed.plain = obj.changed.plain.replace(/'''([^'](.|\n)*?)'''/g, '$1');
if (/^(\s*)'''((.|\n)*?)'''(\s*)$/.test(obj.changed.plain) ) {
obj.changed.plain = obj.changed.plain.replace(/^(\s*)'''((.|\n)*?)'''(\s*)$/g, '$1$2$4');
}
 
// add markup
else {
obj.changed.plain = '\'\'\'' + obj.changed.plain + '\'\'\'';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(''')( *)((.|\n)*?)( *)(''')/, '$2$1$3$6$5');
 
// move spaces outside markup
obj.changed.plain = obj.changed.plain.replace(/^(''')(\s*)((.|\n)*?)(\s*)(''')$/, '$2$1$3$6$5');
 
// trim to maximal number of ' (bold + italic)
obj.changed.plain = obj.changed.plain.replace(/^'{6,}((.|\n)*)'{6,}$/g, '\'\'\'\'\'$1\'\'\'\'\'');
}
}
obj.changed.plain = obj.changed.plain.replace(/'{6,}/g, '\'\'\'\'\'');
obj.changed.keepSel = true;
break;
Line 5,936 ⟶ 6,055:
// italic
case 'wikEdItalic':
 
if ( /('{3,})''([^'](.|\n)*?)''('{3,})/.test(obj.changed.plain) ) {
// remove markup
obj.changed.plain = obj.changed.plain.replace(/('{3,})''([^'](.|\n)*?)''('{3,})/g, '$1$2$4');
if (/^(\s*)''((.|\n)*?)''(\s*)$/.test(obj.changed.plain) ) {
}
else obj.changed.plain if= obj.changed.plain.replace( /(^|[^'](\s*)''([^'](.|\n)*?)''([^']|$\s*)$/.test(obj.changed.plain)g, '$1$2$4') {;
obj.changed.plain = obj.changed.plain.replace(/(^|[^'])''([^'](.|\n)*?)''([^']|$)/g, '$1$2$4');
}
 
// add markup
else {
obj.changed.plain = '\'\'' + obj.changed.plain + '\'\'';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/('')( *)((.|\n)*?)( *)('')/, '$2$1$3$6$5');
 
// move spaces outside markup
obj.changed.plain = obj.changed.plain.replace(/^('')(\s*)((.|\n)*?)(\s*)('')$/, '$2$1$3$6$5');
 
// trim to maximal number of ' (bold + italic)
obj.changed.plain = obj.changed.plain.replace(/^'{6,}((.|\n)*)'{6,}$/g, '\'\'\'\'\'$1\'\'\'\'\'');
}
}
obj.changed.plain = obj.changed.plain.replace(/'{6,}/g, '\'\'\'\'\'');
obj.changed.keepSel = true;
break;
Line 5,952 ⟶ 6,078:
// underline
case 'wikEdUnderline':
 
// remove markup
if ( /&lt;u&gt;((.|\n)*?)&lt;\/u&gt;/i.test(obj.changed.plain) ) {
obj.changed.plain = obj.changed.plain.replace(/&lt;u&gt;((.|\n)*?)&lt;\/u&gt;/gi, '$1');
}
 
// add markup
else {
obj.changed.plain = '&lt;u&gt;' + obj.changed.plain + '&lt;\/u&gt;';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;u&gt;)( *)((.|\n)*?)( *)(&lt;\/u&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;u&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/u&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 5,969 ⟶ 6,101:
else {
obj.changed.plain = '&lt;s&gt;' + obj.changed.plain + '&lt;\/s&gt;';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;s&gt;)( *)((.|\n)*?)( *)(&lt;\/s&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;s&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/s&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 5,981 ⟶ 6,115:
else {
obj.changed.plain = '&lt;nowiki&gt;' + obj.changed.plain + '&lt;\/nowiki&gt;';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;nowiki&gt;)( *)((.|\n)*?)( *)(&lt;\/nowiki&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;nowiki&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/nowiki&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 5,994 ⟶ 6,130:
else {
obj.changed.plain = '&lt;sup&gt;' + obj.changed.plain + '&lt;/sup&gt;';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;sup&gt;)( *)((.|\n)*?)( *)(&lt;\/sup&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;sup&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/sup&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 6,007 ⟶ 6,145:
else {
obj.changed.plain = '&lt;sub&gt;' + obj.changed.plain + '&lt;/sub&gt;';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;sub&gt;)( *)((.|\n)*?)( *)(&lt;\/sub&gt;)/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;sub&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/sub&gt;)$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 6,036 ⟶ 6,176:
obj.changed.plain = '&lt;ref name=""&gt;' + obj.changed.plain + '&lt;/ref&gt;';
}
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(&lt;ref( name="")?&gt;)( *)((.|\n)*?)( *)(&lt;\/ref&gt;)/, '$3$1$4$7$6');
obj.changed.plain = obj.changed.plain.replace(/^(&lt;ref( name="")?&gt;)(\s*)((.|\n)*?)(\s*)(&lt;\/ref&gt;)$/, '$3$1$4$7$6');
}
}
obj.changed.keepSel = true;
Line 6,048 ⟶ 6,190:
ref = ref.replace(/>/g, '&gt;');
var refEscaped = ref;
refEscaped = refEscaped.replace(/([^\w\s\;\&])/g, '\\$1');
refEscaped = refEscaped.replace(/^\n|\n$/g, '\\n*');
refEscaped = refEscaped.replace(/(\n)/g, '\\n');
Line 6,342 ⟶ 6,484:
 
// remove non-chars
sortKey = sortKey.replace(/[^\$\@\.\,\:\;\-\w\s'\u007f-\uffff]/g, '');
 
// join multiple spaces
Line 6,405 ⟶ 6,547:
else {
obj.changed.plain = '[[' + obj.changed.plain + ']]';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(\[\[)( *)((.|\n)*?)( *)(\]\])/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(\[\[)(\s*)((.|\n)*?)(\s*)(\]\])$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 6,417 ⟶ 6,561:
else {
obj.changed.plain = '[' + obj.changed.plain + ']';
if (emptyOrSpaces == false) {
obj.changed.plain = obj.changed.plain.replace(/(\[)( *)((.|\n)*?)( *)(\])/, '$2$1$3$6$5');
obj.changed.plain = obj.changed.plain.replace(/^(\[)(\s*)((.|\n)*?)(\s*)(\])$/, '$2$1$3$6$5');
}
}
obj.changed.keepSel = true;
Line 6,456 ⟶ 6,602:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, '*$1 ');
return(p1);
}
Line 6,467 ⟶ 6,613:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return(p1);
}
Line 6,478 ⟶ 6,624:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, '#$1 ');
return(p1);
}
Line 6,489 ⟶ 6,635:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return(p1);
}
Line 6,500 ⟶ 6,646:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([\*\#\:\;]*) *()/g, ':$1 ');
return(p1);
}
Line 6,511 ⟶ 6,657:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^[\*\#\:\;] *()/g, '');
return(p1);
}
Line 6,522 ⟶ 6,668:
obj.changed.plain = obj.changed.plain.replace(/(.+)/g,
function (p, p1) {
p1 = p1.replace(/^ *([^\s\;]+) *()/g, '; $1 : ');
return(p1);
}
Line 6,732 ⟶ 6,878:
regExpFind = new RegExp(regExpFindText, regExpFlags);
}
catch (errerror) {
return;
}
Line 6,920 ⟶ 7,066:
case 'wikEdSource':
obj.changed.plain = obj.changed.code;
obj.changed.plain = obj.changed.plain.replace(/(<(br|p)\b.[^>]*?>)/g, '$1\n\n');
obj.changed.plain = obj.changed.plain.replace(/&/g, '&amp;');
obj.changed.plain = obj.changed.plain.replace(/</g, '&lt;');
Line 7,204 ⟶ 7,350:
}
 
// clean form elements as these could interfere with the submit buttons
html = html.replace(/<\/?form\b[^>]*>/ggi, '');
html = html.replace(/(<\/?input\b[^>]*?)\bnamebtype\s*=\s*["search']?hidden["(']?[^>]*>)/ggi, '$1$2');
html = html.replace(/<input\b([^>]*)>/gi,
function (p, p1) {
p1 = p1.replace(/\bname\s*=\s*([^"'`=]+|\'[^'=]*\'|\"[^"=]*\")/gi, '');
return(p1);
}
);
 
// remove cite errors for automatic section preview refs
html = html.replace(/(<div\b[^>]*?\bclass="wikEdPreviewRefs"[^>]*>(.|\s)*$)/gi,
function (p, p1, p2) {
p1 = p1.replace(/<strong\b[^>]*?\bclass="error"[^>]*>(.|\s)*?<\/strong>/g, '');
Line 7,254 ⟶ 7,406:
html = html.replace(/&quot;/g, '"');
html = html.replace(/&apos;/g, '\'');
html = html.replace(/<\/?(br|p)\b.[^>]*?>/g, '\n');
 
// parse response into file url cache
Line 7,370 ⟶ 7,522:
plain = plain.replace(/</g, '&lt;');
 
// external links 123 3 2 14 4 5 6 65
plain = plain.replace(/\b(((https?|ftp|irc|gopher):\/\/)|news:|mailto:)([^\x00-\x20\s"\[\]\x7f\|\{\}<>]|<[^>]*>)+?(?=([\!"\(\)\.\,\:\;\‘-•]*\s|[\x00-\x20\s"\[\]\x7f\|\{\}]|$))/gi,
function (p) {
var whole = p;
Line 7,456 ⟶ 7,608:
linkified = linkified.replace(/\x00/g, '&lt;');
linkified = linkified.replace(/\x01/g, '&gt;');
 
return(linkified);
};
Line 7,479 ⟶ 7,631:
attribValue = '[^>]*?' + attrib + '\\s*=\\s*("|\\\')?' + value + '\\1';
}
var regExpStart = new RegExp('<' + tag + '\\b' + attribValue + '[^>]*?>', 'gi');
if ( (regExpMatch = regExpStart.exec(html)) != null) {
startPos = regExpMatch.index;
Line 8,171 ⟶ 8,323:
regExpFind = new RegExp(findText, regExpFlags);
}
catch (errerror) {
return(false);
}
Line 8,525 ⟶ 8,677:
// convert html to plain
obj.plain = obj.html;
 
// conserve spaces and linebreaks in <pre> tags
obj.plain = obj.plain.replace(/(<pre\b[^>]*>)((.|\n)*?)(<\/pre>)/g,
function (p, p1, p2, p3, p4) {
p2 = p2.replace(/ /g, '\x03');
p2 = p2.replace(/\n/g, '\x04');
return(p1 + p2 + p4);
}
);
 
// remove linebreaks
obj.plain = obj.plain.replace(/ \n|\n /g, ' ');
obj.plain = obj.plain.replace(/\n/g, ' ');
 
// delete content tags
obj.plain = obj.plain.replace(/<(style|script|object|applet|embed)\b[^>]*>(.|\n)*?<\/\1>/g, '');
 
// delete outlook tags
obj.plain = obj.plain.replace(/<(w:|m:)\b[^>]*>(.|\n)*?<\/\1>/g, '');
 
// newlines
Line 8,550 ⟶ 8,713:
// remove empty lines from block tags
obj.plain = obj.plain.replace(/(<(blockquote|center|div|p|pre|gallery)\b[^>]*>)[\s\x00]+/gi, '$1');
obj.plain = obj.plain.replace(/[\s\x00]+(<\/(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)>)/gi, '$1');
 
// remove highlighting pre tags
Line 8,557 ⟶ 8,720:
 
// blocks
obj.plain = obj.plain.replace(/<\/?(address|blockquote|center|div|hr|isindex|p|pre)\b.[^>]*?>/g, '\x00\x00');
 
// keep headings only if starting with a newline
obj.plain = obj.plain.replace(/[\s|\x00]*(^|\n|\x00)[\s|\x00]*<h[1-6]\b[^>]*>((.|\n)*?)<\/h[1-6]>[\s|\x00]*()/g, '\x00\x00$2\x00\x00');
 
// lists
obj.plain = obj.plain.replace(/<\/?(dir|dl|menu|ol|ul)\b.[^>]*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(dd|dt|li)>/g, '\x00');
 
// forms
obj.plain = obj.plain.replace(/<\/?(select|textarea)\b.[^>]*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(option|legend|optgroup)>/g, '\x00');
 
Line 8,574 ⟶ 8,737:
 
// override pasted table class // {{TABLE}}
obj.plain = obj.plain.replace(/(<table\b)([^>]*)(>)/gig,
function (p, p1, p2, p3) {
if (p2.match(/\bclass=/.test(p2) !== nulltrue) {
p2 = p2.replace(/\bclass\s*=\s*(['"]?)[^<>'"\n]*?\1/g, 'class="wikEdTableEdit"');
}
Line 8,587 ⟶ 8,750:
 
// 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');
 
Line 8,595 ⟶ 8,758:
// textify table
else if (wikEd.tableMode == false) {
obj.plain = obj.plain.replace(/<\/?(table|caption)\b.[^>]*?>/g, '\x00');
obj.plain = obj.plain.replace(/<\/(tr|th|td)>/g, '\x00');
}
 
// finish html to plain conversion
obj.plain = obj.plain.replace(/<.[^>]*?>/g, '');
 
// recover table html
Line 8,616 ⟶ 8,779:
obj.plain = obj.plain.replace(/\x00/g, '\n');
obj.plain = obj.plain.replace(/(<\/table>\n)\n+/g, '$1');
 
// recover spaces and linebreaks from <pre> tags
obj.plain = obj.plain.replace(/\x03/g, ' ');
obj.plain = obj.plain.replace(/\x04/g, '\n');
 
// remove empty lines and spaces from article start and end
Line 8,664 ⟶ 8,831:
// wikEd.FixBasic: fix characters, spaces, empty lines, certain headings, needed for all fixing functions
//
 
//// change: double spaces ok after dot
 
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);
}
);
 
// non-breaking space character to normal space
Line 8,676 ⟶ 8,853:
 
// remove trailing spaces
obj.plain = obj.plain.replace(/([^\n])(\t| |&nbsp;)+(?=(\n|$))/g, '\n$1');
 
// remove spaces in empty lines
obj.plain = obj.plain.replace(/\n( |&nbsp;|\t)+\n/g, '\n\n');
 
// empty line before and after headings, spaces around word (lookahead), remove bold, italics, and extra =
Line 8,697 ⟶ 8,871:
obj.plain = obj.plain.replace(regExp, '\n== ' + wikEd.config.text.References + ' ==\n');
 
// add space after * # : ; (list) andspare after #{| |- |+ | (table), spareand #REDIRECT
obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;]+|\{\||\|\-|\|\+|\|(?!REDIRECT)\})) *()b/ggi, '$1\x03$2 ');
obj.plain = obj.plain.replace(/(^|\n)# REDIRECT:+\b{\|/gig, '$1#REDIRECT');
function(p, p1) {
obj.plain = obj.plain.replace(/ +(?=\n)/g, '');
p = p.replace(/:/g, '\x04');
return(p);
}
);
obj.plain = obj.plain.replace(/(^|\n)([*#:;]+)(?![ \n*#:;\x00])/g, '$1$2 ');
obj.plain = obj.plain.replace(/\x03/g, '#');
obj.plain = obj.plain.replace(/\x04/g, ':');
 
// add space after table markup {| |- |+ |
obj.plain = obj.plain.replace(/(^|\n)([*#:;]*)(\{\||\|-|\|\+|\|(?!(\}|-|\+)))(?!( |\n|\x00|$))/g, '$1$2$3 ');
 
// empty line before and after tables
Line 8,707 ⟶ 8,891:
 
// empty line before and after lists
obj.plain = obj.plain.replace(/(^|\n)([^\*\#\:\;\n].*)(?=\n[\*\#\:\;])/g, '$1$2\n\n');
obj.plain = obj.plain.replace(/(^|\n)([\*\#\:\;].*?)(?=\n[^\*\#\:\;\n])/g, '$1$2\n\n');
 
// split into lines and change single lines, used to handle tables
var lines = obj.plain.split('\n');
obj.plain = '';
var tableflagtableFlag = false;
var preFlag = false;
 
for (var i = 0; i < lines.length; i ++) {
var line = lines[i];
 
// doline not change lines starting with a blank
if (/^ /.test(line) == false) {
preFlag = false;
 
// detect table
if (line.match(/^(\{\||\!|\|[^}])/.test(line) !== nulltrue) {
tableflagtableFlag = true;
}
else if (line.match(/^\|\}/.test(line) !== nulltrue) {
tableflagtableFlag = false;
}
 
// changes only to be done in tables
if (tableflagtableFlag == true) {
 
// add spaces around ||
Line 8,737 ⟶ 8,922:
 
// changes not to be done in tables
if (! tableflag)else {
 
// empty line before and after images
Line 8,747 ⟶ 8,932:
 
// empty line before and after includes
line = line.replace(/^(\{\{.*?\}\})$/g, '\n$1\n');
}
line = line.replace(/(\{\{.*?\}\})$/g, '$1\n');
 
}
 
// line starting with blank
else {
 
// detect preformatted blocks
if (/^ +\S/.test(line) == true) {
preFlag = true;
}
 
// add <br> to preformatted empty line
if (preFlag == true) {
line = line.replace(/^( +)$/g, '$1&lt;br&gt;');
}
}
Line 8,758 ⟶ 8,957:
}
}
 
// remove spaces in empty lines
obj.plain = obj.plain.replace(/(^|\n)( |&nbsp;|\t)+(?=(\n|$))/g, '$1');
 
// remove underscores in wikilinks
Line 8,768 ⟶ 8,970:
 
// remove spaces in wikilinks, protect [[xxx| ]]
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*?) *\| +\]\]/g, '[[$1|\x00x03]]');
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*?) *\| *([^\[\][]*?) *\]\]/g, '[[$1|$2]]');
obj.plain = obj.plain.replace(/\[\[ *([^\|\[\]]*) *\]\]/g, '[[$1]]');
obj.plain = obj.plain.replace(/\x00x03/g, ' ');
 
// remove spaces in external links
Line 8,783 ⟶ 8,985:
 
// spaces in comments
obj.plain = obj.plain.replace(/(&lt;!--) *((.|\n)*?) *(--&gt;)/g, '$1 $2 $34');
 
// empty line before and after categories
Line 8,799 ⟶ 9,001:
obj.plain = obj.plain.replace(/^\n+/, '');
obj.plain = obj.plain.replace(/\n{2,}$/, '\n');
 
// preserved markup and spaces
obj.plain = obj.plain.replace(/\x00/g, '');
obj.plain = obj.plain.replace(/\x01/g, ' ');
obj.plain = obj.plain.replace(/\x02/g, '\n');
 
return;
Line 8,836 ⟶ 9,043:
);
 
// protect punctuation in single letter abbreviations (e.g. U.S.) (language specific behaviour)
regExp = new RegExp('(^|[\\s\'"”\\[{(])([' + wikEd.letters + '][.,:;]){2,}', 'g');
obj.plain = obj.plain.replace(regExp,
function(p) {
p = p.replace(/([.,:;])/g, '\x00$1');
return(p);
}
);
 
// preserve double spaces after dot
obj.plain = obj.plain.replace(/([.!?]) {2}(?=\S)/g, '$1\x01\x01');
 
// remove spaces before punctuation
if (wikEd.config.fixPunctFrench == true) {
obj.plain = obj.plain.replace(/(«) *()/g, '$1 ');
obj.plain = obj.plain.replace(/ *(»)/g, ' $1');
 
regExp = new RegExp('([' + wikEd.letters + '_\'"”\\]})]) *([.,])(?=(['+ wikEd.letters + '\'"”\\[{(\\s\\x01]|$))', 'g');
obj.plain = obj.plain.replace(regExp, '$1$2 ');
 
Line 8,847 ⟶ 9,067:
}
else {
regExp = new RegExp('([' + wikEd.letters + '_\'"”\\]})]) *([.,:;])(?=([' + wikEd.letters + '\'"”\\[{(\\s\\x01]|$))', 'g');
obj.plain = obj.plain.replace(regExp, '$1$2 ');
}
 
obj.plain = obj.plain.replace(/\x00/g, '');
obj.plain = obj.plain.replace(/ +$/g, '');
obj.plain = obj.plain.replace(/ +\n/g, '\n');
 
// multiple spaces
obj.plain = obj.plain.replace(/ {2,}/g, ' ');
obj.plain = obj.plain.replace(/ (?=\x01)/g, '');
obj.plain = obj.plain.replace(/\x01/g, ' ');
 
return;
Line 9,361 ⟶ 9,586:
wikEd.FixBasic(obj);
 
// get html from plain, keep leading spaces, \n to <br>
// remove syntax highlighting
obj.html = obj.plain;
obj.html = obj.html.replace(/(^|\n) +/g,
function (p, p1) {
p = p.replace(/ /g, '\xa0');
return(p);
}
);
obj.html = obj.html.replace(/\n/g, '<br>');
 
// preserve double spaces after dot
obj.html = obj.html.replace(/([.!?]) {2}(?=\S)/g, '$1\xa0\xa0');
 
// remove syntax highlighting
wikEd.RemoveHighlighting(obj);
 
// keep <br> in preformatted lines
obj.html = obj.html.replace(/(^|<br>)( |\xa0).*?(?=<br>)/g,
function (p, p1, p2) {
p = p.replace(/&lt;(br\b.*?)&gt;/g, '\x00$1\x01');
return(p);
}
);
 
// keep <br> in blockquote
obj.html = obj.html.replace(/(&lt;blockquote\b.*?&gt;)([\S\s]*?)(&lt;\/blockquote&gt;)/gi,
function (p, p1, p2, p3) {
p2 = p2.replace(/&lt;(br\b.*?)&gt;<br\b.[^>]*?>/g, '\x00$1\x01\n');
return(p1 + p2 + p3);
}
Line 9,445 ⟶ 9,689:
 
// turn real html into visible html code
obj.html = obj.html.replace(/<br\b[^>]*>[\n ]s*()?\n/g, '\n');
obj.html = obj.html.replace(/<br\b[^>]*>/g, '\n');
obj.html = obj.html.replace(/</g, '&lt;');
obj.html = obj.html.replace(/>/g, '&gt;');
obj.plain = obj.html;
 
obj.plain = obj.html;
return;
};
Line 9,467 ⟶ 9,712:
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3, p4) {
if (p4.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda|$)/.test(p4) == nullfalse) {
 
// spaces cannot be added to p1 in above regExp !?
Line 9,490 ⟶ 9,735:
p3 = p3.replace(regExp,
function (p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) == nullfalse) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
Line 9,501 ⟶ 9,746:
p3 = p3.replace(regExp,
function (p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) == nullfalse) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
Line 9,512 ⟶ 9,757:
 
// uppercase headings
var regExp = new RegExp('^(=+ (&\\w+\\;|&lt;.*?&gt;|\\d|[^' + wikEd.letters + '_\\n])*)([' + wikEd.letters + '_].*? =+)$', 'gm');
obj.plain = obj.plain.replace(regExp,
function (p, p1, p2, p3) {
if (p3.match(/^(http|ftp|alpha|beta|gamma|delta|epsilon|kappa|lambda)/.test(p3) == nullfalse) {
p3 = p3.charAt(0).toUpperCase() + p3.substr(1);
}
Line 9,805 ⟶ 10,050:
// expects < > &lt; &gt; &amp; spaces instead of &nbsp; <br> (not \n)
// returns <br> (not \n)
// wikiCode == true: allow extended set of attributes for existing wikicode, keep leading spaces
 
//
// allowed and converted tags:
// br|p
Line 9,820 ⟶ 10,066:
// 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|noinclude|includeonly|onlyinclude|ref|charinsert|fundraising|fundraisinglogo
// gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references
 
wikEd.WikifyHTML = function(obj, relaxedwikiCode) {
 
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);
}
);
 
// delete tags: <style>
obj.html = obj.html.replace(/<(style)\b[^>]*>(.|\n)*?<\/\1>/gi, '');
 
// remove MediaWiki section edit spans
obj.html = obj.html.replace(/<span[^>]*class="editsection"[^>]*>(.|\n)*?<\/span>\s*()/gi, '');
 
// remove MediaWiki heading spans
obj.html = obj.html.replace(/<span\b[^>]*\bclass="mw-headline"[^>]*>((.|\n)*?)<\/span>\s*()/g, '$1');
 
// remove MediaWiki divs from article top
obj.html = obj.html.replace(/<h3\b[^>]*\bid="siteSub"[^>]*>(.|\n)*?<\/h3>\s*()/g, '');
obj.html = obj.html.replace(/<div\b[^>]*\bid="contentSub"[^>]*>(.|\n)*?<\/div>\s*()/g, '');
obj.html = obj.html.replace(/<div\b[^>]*\bid="jump-to-nav"[^>]*>(.|\n)*?<\/div>\s*()/g, '');
 
// remove MediaWiki table of contents
obj.html = obj.html.replace(/<table\b[^>]*?\bid="toc"[^>]*>(.|\n)*?<\/table>\s*()/g, '');
 
// remove MediaWiki print footer
Line 9,850 ⟶ 10,108:
 
// remove MediaWiki category list tags
while(/<div\b[^>]*\bid="catlinks"[^>]*>((.|\n)*?)<\/div>\s*()/g.test(obj.html) == true) {
obj.html = obj.html.replace(regExp, '$1');
}
while(/<p\b[^>]*?\bclass="catlinks"[^>]*>((.|\n)*?)<a\b[^>]*>[^<>]+<\/a>: ((.|\n)*?)<\/p>/g.test(obj.html) == true) {
obj.html = obj.html.replace(regExp, '$1$23');
}
 
// convert MS-Word non-standard lists: *
obj.html = obj.html.replace(/\s*<p \b[^>]*>\s*<!--\[if !supportLists\]-->(.|\n)*?<!--\[endif\]-->\s*((.|\n)*?)\s*<\/p>\s*()/g, '* $12\n');
 
// collect MS-Word footnote texts
var footnotes = {};
obj.html = obj.html.replace(/<div\b[^>]* id\bid="ftn(\d+)"[^>]*>\s*<p class="MsoFootnoteText">\s*<a(.|\n)*?<\/a>((.|\n)*?)<\/p>\s*<\/div>/g,
function(p, p1, p2, p3) {
footnotes[p1] = p3.replace(/^(\s|<br\b[^>]*>)|(\s|<br\b[^>]*>)$/g, '');
Line 9,870 ⟶ 10,128:
 
// add footnotes as <ref> tags
obj.html = obj.html.replace(/<a\b[^>]* name\bname="_ftnref(\d+)"[^>]*>(.|\n)*?<!--\[endif\]-->\s*<\/span>\s*<\/span>\s*<\/a>/g,
function(p, p1) {
var ref = '&lt;ref name="footnote_' + p1 + '"&gt;' + footnotes[p1] + '&lt;/ref&gt;';
Line 9,882 ⟶ 10,140:
// correct name for MS-Word images
// 1 2 2 3 3 4 4 1 5 5
obj.html = obj.html.replace(/(<v:imagedata\b[^>]*? src\bsrc="[^">]*?[\\\/]clip_image\d+(\.\w+)"[^>]*? o:title="([^">]*)"[^>]*>(.|\s)*?<img\b[^>]*? src="[^">]*?[\\\/])clip_image\d+\.\w+("[^>]*>)/g, '$1$3$2$5');
 
// convert <div class="poem">...</div> to <poem>...</poem>
obj.html = wikEd.RemoveTag(obj.html, 'div', /\bclass="poem"/, '<poem>', '</poem>');
 
// 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 + '>');
}
);
 
// sanitize <span> <div> <p> <font>
obj.html = obj.html.replace(/<(span|div|p|font)\b *s+(.[^>]*?) \s*(\/?)>/gi,
function (p, p1, p2, p3) {
return('<' + p1 + wikEd.SanitizeAttributes(p1, p2, relaxedwikiCode) + p3 + '>');
}
);
Line 9,904 ⟶ 10,169:
 
// remove comments
obj.html = obj.html.replace(/<!--(.|\n)*?-->/g, '');
 
// <hr> horizontal rule
Line 9,910 ⟶ 10,175:
 
// <i> <em> <dfn> <var> <cite> italic
obj.html = obj.html.replace(/<(i|em|dfn|var|cite)\b.[^>]*?>/gi, '\'\'');
obj.html = obj.html.replace(/<\/(i|em|dfn|var|cite)\b.[^>]*?>/gi, '\'\'');
 
// <b> <strong> bold
obj.html = obj.html.replace(/<(b|strong)\b.[^>]*?>/gi, '\'\'\'');
obj.html = obj.html.replace(/<\/(b|strong)\b.[^>]*?>/gi, '\'\'\'');
 
// <h1> .. <h6> headings
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h1\b[^>]*>((.|\n)*?)<\/h1>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00= $4 =\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h2\b[^>]*>((.|\n)*?)<\/h2>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00== $4 ==\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h3\b[^>]*>((.|\n)*?)<\/h3>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00=== $4 ===\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h4\b[^>]*>((.|\n)*?)<\/h4>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00==== $4 ====\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h5\b[^>]*>((.|\n)*?)<\/h5>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00===== $4 =====\x00\x00');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(^|\n|<br\b[^>]*>|\x00)(\s|<br\b[^>]*>|\x00)*<h6\b[^>]*>((.|\n)*?)<\/h6>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00\x00====== $4 ======\x00\x00');
 
obj.html = obj.html.replace(/<(h[0-6])\b[^>]*>((.|\n)*?)<\/\1>/gi, '$2');
 
// {{TABLE}}
// convert html tables to wikicode
 
if (wikEd.tableMode == false) {
 
Line 9,935 ⟶ 10,201:
 
// remove <col></col> and <colgroup></colgroup>\s
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(col)\b[^>]*>(.|\n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(colgroup)\b[^>]*>(.|\n)*?<\/\2>(|<br\b[^>]*>|\x00)*()/gi, '');
 
// line breaks to <br /> in table cells, but not in html markup
obj.html = obj.html.replace(/(<(td|th|caption)\b[^>]*>)((.|\n)*?)(<\/\2>)/gi,
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/^(\s|<br\b[^>]*>|\x00>)+/gi, '');
p3 = p3.replace(/(\s|<br\b[^>]*>|\x00>)+$/gi, '');
 
p3 = p3.replace(/<br\b[^>]*> *()/gi, '&lt;br /&gt;');
return(p1// +preserve p3<br> +in p4);tags
p3 = p3.replace(/(<(\w+)[^>]*>)((.|\n)*?)(<\/\2+>)/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);
}
);
Line 9,953 ⟶ 10,228:
// <td> table cells
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<td>(\s|<br\b[^>]*>|\x00)*()/gi, '\x00| ');
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*<(td) \s+([^>]*)>(\s|<br\b[^>]*>|\x00)*()/gi,
function (p, p1, p2, p3, p4) {
p3 = wikEd.SanitizeAttributes(p2, p3, relaxedwikiCode);
if (p3 == '') {
return('\x00| ');
Line 9,966 ⟶ 10,241:
 
// <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, relaxedwikiCode);
if (p3 == '') {
return('\x00|! ');
}
else {
return('\x00|!' + p3 + ' | ');
}
}
Line 9,981 ⟶ 10,256:
// <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, relaxedwikiCode) + '\x00');
}
);
Line 9,989 ⟶ 10,264:
// <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, relaxedwikiCode);
if (p3 == '') {
return('\x00|+ ');
Line 10,005 ⟶ 10,280:
 
// line breaks, also in table cells (continued)
obj.html = obj.html.replace(/<br\b[^>]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{|';
Line 10,016 ⟶ 10,291:
}
else {
table += wikEd.SanitizeAttributes(p1, p2, wikiCode);
}
return(table + '\x00');
}
);
obj.html = obj.html.replace(/[\s\x00]*<\/table>[\s\x00]*()/gi, '\x00|}\x00\x00');
 
}
 
Line 10,029 ⟶ 10,303:
obj.html = obj.html.replace(/(<table\b)([^>]*)(>)/gi,
function (p, p1, p2, p3) {
if (p2.match(/\bclass=/.test(p2) == true) {
p2 = p2.replace(/\bclass\s*=\s*(['"]?)[^<>'"\n]*?\1/g, 'class="wikEdTableEdit"');
}
Line 10,040 ⟶ 10,314:
 
// table block element needs only one newline
obj.html = obj.html.replace(/(\s|<br\b[^>]*>|\x00)*(<table\b.[^>]*?>)/gi, '\x00\x00$2');
obj.html = obj.html.replace(/(<\/table>)(\s|<br\b[^>]*>|\x00)*()/gi, '$1\x00');
}
Line 10,046 ⟶ 10,320:
// line breaks (continued)
if (wikEd.tableMode == true) {
obj.html = obj.html.replace(/<br\b[^>]s*\/?>[\n ]*()/gi, '\x00');
}
 
// convert links
obj.html = obj.html.replace(/<a(\b[^>]*)>((.|\n)*?)<\/a>/gi,
function (p, p1, p2) {
var linkParam = p1;
Line 10,162 ⟶ 10,436:
 
// check for wiki image
var regExpMatchImage = /^<img\b[^>]*?\bwidth="(\d+)"[^>]*?>$/.exec(linkText);
if (regExpMatchImage != null) {
imgWidth = regExpMatchImage[1];
Line 10,253 ⟶ 10,527:
var regExpMatch = /\bsrc\s*=\s*('|")([^'"]*)('|")/i.exec(p1);
if (regExpMatch != null) {
address = regExpMatch[2].replace(/^ \s+| \s+$/g, '');
}
 
Line 10,259 ⟶ 10,533:
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,271 ⟶ 10,545:
regExpMatch = /\bwidth\s*=\s*('|")([^'"]*)('|")/i.exec(p1);
if (regExpMatch != null) {
imgWidth = '|' + regExpMatch[2].replace(/^ \s+| \s+$/g, '') + 'px';
}
 
Line 10,319 ⟶ 10,593:
}
);
obj.html = obj.html.replace(/[\n|\x00]+[#\*:\;]+ \s(?=[\n|\x00])/g, '');
 
// <> remove not allowed tags
obj.html = obj.html.replace(/(<\/?)(\/?)(\w+)(.[^>]*?>)/g,
function (p, p1, p2, p3, p4) {
 
Line 10,346 ⟶ 10,620:
 
// keep allowed tags
if ( /^(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|noinclude|includeonly|onlyinclude|ref|charinsert|fundraisinggallery|fundraisinglogo|gallerysyntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references|syntaxhighlight)$/i.test(p3) == true) {
return(p);
}
Line 10,355 ⟶ 10,629:
 
// sanitize attributes in opening html tags
obj.html = obj.html.replace(/<(\w+) \s+(.[^>]*?) \s*(\/?)>/ggi,
function (p, p1, p2, p3) {
if (p3 != '') {
p3 = ' ' + p3;
}
return('<' + p1 + wikEd.SanitizeAttributes(p1, p2, relaxedwikiCode) + p3 + '>');
}
);
Line 10,371 ⟶ 10,645:
 
// fix MS Word non-style heading formatting
obj.html = obj.html.replace(/(\x00(={1,6}) \s*)(<u>|'''|'')+((.|\n)*?)(<\/u>|'''|'\')+( *\2\x00)/gi, '$1$4$67');
 
// remove empty headings
Line 10,377 ⟶ 10,651:
 
// remove space-only lines
if (wikiCode != true) {
obj.html = obj.html.replace(/([\s\x00]*\x00[\s\x00]*)/g,
obj.html = obj.html.replace(/([\s\x00]*\x00[\s\x00]*)/g,
function (p, p1) {
function (p, p1) {
return(p1.replace(/\n/g, '\x00'));
}
);
}
 
// remove trailing linebreaks from table cells
obj.html = obj.html.replace(/\x00{2,}(\||!)/g, '\x00$1');
 
// remove leading and trailing spaces
if (wikiCode == true) {
obj.html = obj.html.replace(/\x00[ \n]+</g, '\x00<');
}
else {
obj.html = obj.html.replace(/\x00\s+</g, '\x00<');
}
obj.html = obj.html.replace(/>\s+\x00/g, '>\x00');
obj.html = obj.html.replace(/\x00\s+</g, '\x00<');
 
// remove empty inline and block tag pairs
obj.html = wikEd.RemoveEmptyTags(obj.html, /( *)<(big|colgroup|code|del|font|ins|pre|s|small|span|strike|sub|sup|tt|u|rb|rp|rt|ruby|nowiki|math|noinclude|includeonly|onlyinclude|ref|charinsert|fundraising|fundraisinglogo)\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');
 
// remove empty lines from block tags
obj.html = obj.html.replace(/(<(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)\b[^>]*>[\s\x00])[\s\x00]+/gi, '$1');
obj.html = obj.html.replace(/[\s\x00]+([\s\x00]<\/(blockquote|center|div|p|pre|gallery|syntaxhighlight|source|poem|categorytree|hiero|imagemap|inputbox|timeline|references)>)/gi, '$1');
 
// blockquote
Line 10,409 ⟶ 10,690:
obj.html = obj.html.replace(/</g, '&lt;');
obj.html = obj.html.replace(/>/g, '&gt;');
 
// preserved table tags
obj.html = obj.html.replace(/\x01/g, '<');
obj.html = obj.html.replace(/\x02/g, '>');
 
// newlines to <br>
Line 10,420 ⟶ 10,697:
obj.html = obj.html.replace(/\x00/g, '\n');
obj.html = obj.html.replace(/\n/g, '<br>');
 
// preserved table and pre tags and spaces
obj.html = obj.html.replace(/\x01/g, '<');
obj.html = obj.html.replace(/\x02/g, '>');
obj.html = obj.html.replace(/\x03/g, '\xa0');
 
// table block element needs only one newline
Line 10,429 ⟶ 10,711:
obj.html = obj.html.replace(/(<br\b[^>]*>)+$/gi, '');
}
 
return;
};
Line 10,467 ⟶ 10,748:
var tagRegExp;
if (typeof(tag) == 'string') {
 
// 1 2 23 3 4 4 1
// 1 2 23 3 4 4 1
tagRegExp = new RegExp('(<(\\/?)(' + tag + ')\\b([^>]*)>)', 'g');
}
Line 10,489 ⟶ 10,771:
if (
( (attribRegExp == null) && (p4 == '') ) ||
( (attribRegExp != null) && (attribRegExp.test(p4) == true) )
) {
isRemove.push(true);
Line 10,509 ⟶ 10,791:
//
// wikEd.RelativeToAbsolutePath
//
// broken for editing article names containing "/", https://bugzilla.mozilla.org/show_bug.cgi?id=430910
 
wikEd.RelativeToAbsolutePath = function(relativePath, fullPath) {
Line 10,549 ⟶ 10,831:
//
// wikEd.SanitizeAttributes: see Sanitizer.php
// wikiCode == true: allow extended set of attributes for existing wikicode
//
 
wikEd.SanitizeAttributes = function(tag, attributes, wikiCode) {
 
wikEd.SanitizeAttributes = function(tag, attributes, relaxed) {
var common;
var tablealign;
var tablecell;
var table;
if (relaxedwikiCode == true) {
common = 'dir|style|class'; // not needed: |lang|id|title';
tablealign = '|align|char|charoff|valign';
table = '|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor';
Line 10,571 ⟶ 10,854:
var sanitized = '';
var regExpMatch;
 
var regExp = /(\w+)\s*=\s*(('|")(.*?)\3|(\w+))/g;
// 1 12 34 45 5 6 632
var regExp = /(\w+)(\s*=\s*(('|")(.*?)\4|(\w+)))?/g;
while ( (regExpMatch = regExp.exec(attributes)) != null) {
var attrib = regExpMatch[1];
var attribValue = regExpMatch[45] || regExpMatch[56] || '';
if (attribValue == '') {
continue;
}
var valid = false;
 
// empty or missing attributes as parameters for wiki markup
// relaxed, for existing text tags
var flag = false;
if (relaxed == true) {
 
if ('center|em|strong|cite|code|var|sub|supdl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby'.indexOf(tag) >= 0) {
// 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'.indexOf(tag) >= 0) {
if (common.indexOf(attrib) >= 0) { valid = true; }
}
Line 10,636 ⟶ 10,921:
if ((common + '|rbspan').indexOf(attrib) >= 0) { valid = true; }
}
else if ('dfn'.indexOf(tag) >= 0) {
if (('name|id').indexOf(attrib) >= 0) { valid = true; }
}
 
// wiki markup
else if ('ref'.indexOf(tag) >= 0) {
if (('name').indexOf(attrib) >= 0) { valid = true; }
Line 10,641 ⟶ 10,931:
else if ('references'.indexOf(tag) >= 0) {
}
else if ('syntaxhighlight|source'.indexOf(tag) >= 0) {
if ((common + '|lang|enclose|highlight|line|start').indexOf(attrib) >= 0) { valid = true; }
valid = true;
if ( ('line'.indexOf(attrib) >= 0) && (attribValue == '') ) {
flag = true;
}
}
}
else if ('poem'.indexOf(tag) >= 0) {
if ((common + '|compact').indexOf(attrib) >= 0) {
valid = true; }
if ( ('compact'.indexOf(attrib) >= 0) && (attribValue == '') ) {
flag = true;
}
}
}
else if ('categorytree'.indexOf(tag) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces').indexOf(attrib) >= 0) { valid = true; }
}
else if ('charinsertgallery'.indexOf(tag) >= 0) {
if ((common + '|perrow|widths|heights|caption').indexOf(attrib) >= 0) { valid = true; }
}
else if ('fundraisingnowiki|noinclude|includeonly|onlyinclude|inputbox|timeline|imagemap|hiero|charinsert'.indexOf(tag) >= 0) {
}
else if ('fundraisinglogomath'.indexOf(tag) >= 0) {
if ((common + '|alt').indexOf(attrib) >= 0) { valid = true; }
}
else if ('hiero'.indexOf(tag) >= 0) {
}
else if ('imagemap'.indexOf(tag) >= 0) {
}
else if ('inputbox'.indexOf(tag) >= 0) {
}
else if ('timeline'.indexOf(tag) >= 0) {
}
else if ('gallery'.indexOf(tag) >= 0) {
if ((common + '|perrow|widths|heights').indexOf(attrib) >= 0) { valid = true; }
}
}
Line 10,671 ⟶ 10,962:
// strict, for html code to be wikified from external sources (websites, Word)
else {
if ('center|em|strong|cite|code|var|sub|supdlsup|dl|dd|dt|tt|b|i|big|small|strike|s|u|rb|rp|ruby|blockquote|pre|ins|del'.indexOf(tag) >= 0) {
if (common.indexOf(attrib) >= 0) { valid = true; }
}
Line 10,716 ⟶ 11,007:
if ((common + '|rbspan').indexOf(attrib) >= 0) { valid = true; }
}
else if ('refdfn'.indexOf(tag) >= 0) {
if (('name|id').indexOf(attrib) >= 0) { valid = true; }
}
else if ('references'.indexOf(tag) >= 0) {
}
else if ('source'.indexOf(tag) >= 0) {
if (('lang').indexOf(attrib) >= 0) { valid = true; }
}
else if ('poem'.indexOf(tag) >= 0) {
if (common.indexOf(attrib) >= 0) { valid = true; }
}
else if ('categorytree'.indexOf(tag) >= 0) {
if ((common + '|mode|depth|onlyroot|hideroot|hideprefix|showcount|namespaces').indexOf(attrib) >= 0) { valid = true; }
}
else if ('charinsert'.indexOf(tag) >= 0) {
}
else if ('fundraising'.indexOf(tag) >= 0) {
}
else if ('fundraisinglogo'.indexOf(tag) >= 0) {
}
else if ('hiero'.indexOf(tag) >= 0) {
}
else if ('imagemap'.indexOf(tag) >= 0) {
}
else if ('inputbox'.indexOf(tag) >= 0) {
}
else if ('timeline'.indexOf(tag) >= 0) {
}
else if ('gallery'.indexOf(tag) >= 0) {
}
}
 
// ignore empty or missing attributes
// clean up
if (valid =(flag != true) && (attribValue == '') ) {
continue;
}
 
// cleanignore upnot defaultssupported for alignattributes
if (attribvalid =!= 'align'true) {
continue;
if ('tr|td|th'.indexOf(tag) >= 0) {
}
if (attribValue == 'left') {
 
attribValue = '';
// clean up defaults for align
}
if (attrib == 'align') {
if ('tr|td|th'.indexOf(tag) >= 0) {
if (attribValue == 'left') {
attribValue = '';
}
}
}
 
// clean up defaults for valign
else if (attrib == 'valign') {
if ('tr|td|th'.indexOf(tag) >= 0) {
if (attribValue == 'top') {
attribValue = '';
}
}
}
}
 
// clean up style
else if (attrib == 'style') {
 
// remove non-standard Mozilla styles
attribValue = attribValue.replace(/(^| \s)(-moz-[\w\-]+): \s[\w\-]+; \s*()/g, '$1');
attribValue = attribValue.replace(/(^| \s)([\w\-]+): \s[^;]*(-moz-[\w\-]+|windowtext)[^;]*; \s*()/g, '$1');
 
// remove dimensions from null values
attribValue = attribValue.replace(/\b0(%|in|cm|mm|em|ex|pt|pc|px)\b/g, '0');
 
// remove empty definitions and spaces
attribValue = attribValue.replace(/[\w\-]+ \s*\: \s*\; *()/g, '');
attribValue = attribValue.replace(/ \s*(;|:) \s*()/g, '$1 ');
attribValue = attribValue.replace(/( \s|;)+$/g, ';');
}
 
// clean up class
else if (attrib == 'class') {
 
// remove MS Word classes
attribValue = attribValue.replace(/^Ms.*$/g, '');
}
 
// add attribute
if (attribValue != '') {
if (flag == true) {
sanitized += ' ' + attrib + '="' + attribValue + '"';
sanitized += ' ' + attrib;
}
}
else if (attribValue != '') {
sanitized += ' ' + attrib + '="' + attribValue + '"';
}
}
Line 10,803 ⟶ 11,077:
//
// wikEd.RemoveHighlighting: remove syntax highlighting in obj.html; sets obj.htmlCode if text contains html code
// expects <br> instead of \n
 
wikEd.RemoveHighlighting = function(obj) {
 
// preserve tags, spaces and newlines in pre tag markup
obj.html = obj.html.replace(/(&lt;(syntaxhighlight|source|pre)\b[^\/]*?&gt;)((.|\n)*?)(&lt;\/\2&gt;)/gi,
function(p, p1, p2, p3, p4, p5) {
p3 = p3.replace(/ /g, '\xa0');
p3 = p3.replace(/\n/g, '\x00');
return(p1 + p3 + p5);
}
);
 
// 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, '');
}
 
Line 10,850 ⟶ 11,146:
// comments
obj.html = obj.html.replace(/<!--wikEd[\w\/]+-->/g, '');
 
// preserve spaces and newlines in pre tag
obj.html = obj.html.replace(/(<pre\b[^>]*>)((.|\n)*?)(<\/pre>)/g,
function(p, p1, p2, p3, p4) {
p2 = p2.replace(/ /g, '\xa0');
p2 = p2.replace(/\n/g, '\x00');
return(p1 + p2 + p4);
}
);
 
// newlines
obj.html = obj.html.replace(/[\n ]+/g, ' ');
obj.html = obj.html.replace(/\x00/g, '\n');
 
// non-breaking spaces
Line 10,858 ⟶ 11,164:
 
// check for pasted html content
if (obj.html.match(/<(?!br\b)/.test(obj.html) !== nulltrue) {
obj.htmlCode = true;
}
Line 10,864 ⟶ 11,170:
obj.htmlCode = false;
}
 
return;
};
Line 10,884 ⟶ 11,189:
 
// faster without (!?)
// ['[^\\{\\}\\[\\]\x00\x01_\\|\\!\\=\\*\\#\\:\\;"\'\\n\\\\~\\-]+', 'text', 'ignore'], // chew-up fragment to ignore plain text, triples regExp speed, check later if chewed into start of inlineLink; start-with-text tags (PMID,...) have to be tested for separately to benefit from his
 
['\x00(nowiki)\\b[^\x00\x01]*\x01(.|\\n)*?\x00/nowiki\\s*\x01', 'nowiki', 'block'], // <nowiki>...</nowiki>
Line 10,891 ⟶ 11,196:
 
['(^|\\n)([ \xa0]+)(\\S[^\\n]*)', 'preform', 'block'], // "preformatted" text line (leading space)
['(^|\\n)([\\*\\#\\:\\;]+)([^\\n]*)', 'list', 'block'], // list line
 
['\x00(br\\b)[^\x00\x01]*\x01', 'br', 'block'], // <br>
Line 10,994 ⟶ 11,299:
<tr> closes <td>
heading closes links
valid table markup: \n :{|
preformatted lines: space-only lines inside and as last allowed
*/
 
 
wikEd.HighlightSyntax = function(obj, noTimeOut) {
Line 11,058 ⟶ 11,364:
 
'secondlastOpenNodeFiltered': null,
'secondLastOpenTagFilteredsecondlastOpenTagFiltered': null,
 
'tableMode': wikEd.tableMode
Line 11,172 ⟶ 11,478:
}
 
// no wikicode in link target or, template, or parameter name, only after pipe in linkPiped, or parameterPiped
if ( (parseObj.lastOpenTag == 'link') || (parseObj.lastOpenTag == 'template') || (parseObj.lastOpenTag == 'parameter') ) {
 
Line 11,178 ⟶ 11,484:
if ( (openNode != null) && (openNode.firstChild == null) ) {
 
// allow templates and template parameters, template and link separators, and newline
if (
( (tagClass == 'open') && (tag != 'templateparamTempl') ) ||
( (tagClass == 'block') && (tag != 'newlinePipe') && (tag != 'doublePipe') && (tag != 'pipe') && (tag != 'headerSep') && (tag != 'headerParam') && (tag != 'newline') && (tag != 'preform') ) //// preform ok?
) {
Line 11,254 ⟶ 11,561:
switch(parseObj.lastOpenTagFiltered) {
case 'bold':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'italic') {
wikEd.HighlightBuildTree('bold', 'close', tagFrom, 3, parseObj);
wikEd.HighlightBuildTree('italic', 'close', tagFrom + 3, 2, parseObj);
Line 11,264 ⟶ 11,571:
break;
case 'italic':
if (parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered == 'bold') {
wikEd.HighlightBuildTree('italic', 'close', tagFrom, 2, parseObj);
wikEd.HighlightBuildTree('bold', 'close', tagFrom + 2, 3, parseObj);
Line 11,563 ⟶ 11,870:
wikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
else if (/^(table|tr|td|th|col|thead|tfoot|tbody|colgroup|caption|big|blockquote|center|code|del|div|font|ins|small|span|strike|tt|rb|rp|rt|ruby|nowiki|math|noinclude|includeonly|onlyinclude|gallery|categorytree|charinsert|hiero|imagemap|inputbox|poem|source|syntaxhighlight|source|timeline)$/.test(htmlTag) == true) {
wikEd.HighlightBuildTree(htmlTag, tagClass, tagFrom, tagLength, parseObj);
}
Line 12,007 ⟶ 12,314:
nodeNo = parseObj.tree[nodeNo].parent;
}
if ( (nodeNo != 0) && (nodeNo != null) ) {
 
// treat open tags as wrong, close tag as correct
if ( (nodeNo != 0) && (nodeNo != null) && (parseObj.tree[nodeNo].tag == tag) ) {
 
// mark remaining unmatched opening tags
var nodeNo = parseObj.lastOpenNode;
while ( (nodeNo != 0) && (nodeNo != null) ) {
var node = parseObj.tree[nodeNo];
if (node.tag == tag) {
parseObj.lastOpenNode = nodeNo;
break;
}
nodeNo = node.parent;
node.type = 'error';
node.left = wikEd.config.text.wikEdErrorNoClose;
node.parent = null;
}
nodeNo = node.parent;
wikEd.HighlightGetLevel(parseObj);
node.type = 'error';
node.left = wikEd.config.text.wikEdErrorNoClose;
node.parent = null;
}
wikEd.HighlightGetLevel(parseObj);
}
 
// treat open tags as correct, treat close tag as wrong
else {
 
// add wrong close tag error to tree
parseObj.tree.push( {
'start': tagFrom,
'tagLength': tagLength,
'type': 'error',
'left': wikEd.config.text.wikEdErrorNoOpen
} );
break;
}
}
}
Line 12,157 ⟶ 12,462:
parseObj.lastOpenTagFiltered = null;
parseObj.secondlastOpenNodeFiltered = null;
parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered = null;
 
if ( (parseObj.lastOpenNode == 0) || (parseObj.lastOpenNode == null) ) {
return;
Line 12,180 ⟶ 12,486:
if ( (node.tag != 'p') && (node.tag != 'spare') ) {
parseObj.secondlastOpenNodeFiltered = nodeNo;
parseObj.secondLastOpenTagFilteredsecondlastOpenTagFiltered = parseObj.tree[nodeNo].tag;
break;
}
Line 12,247 ⟶ 12,553:
 
// detect interlink and namespace
// 12 inter: 2 1 34 : 4 5 namespace 53 53 6template 6 7 89param 87
var regExpLink = /^\s*(([\w\- ]+)\:\s*)?((\:\s*)?([^\:\|\[\]\{\}\n\t]*\s*\:\s*))?([^\|\n]+?)\s*(\|((.|\n)*))?\s*$/gi;
regExpLink.lastIndex = 0;
Line 12,289 ⟶ 12,595:
}
}
 
article = regExpMatch[6] || '';
param = regExpMatch[8] || '';
Line 12,339 ⟶ 12,645:
else {
var file = regExpMatch[1] + ':' + regExpMatch[2];
var filePlain = regExpMatch[1] + ':' + regExpMatch[2].replace(/<.[^>]*?>/g, '');
filePlain = filePlain.replace(/ /g,'_');
 
Line 12,410 ⟶ 12,716:
// detect parser variables and functions, might slow main regexp down
var regExpMatch;
var parserVarisParserVar = false;
if ( (regExpMatch = regExpTempl.exec(innerPlain)) != null) {
 
Line 12,432 ⟶ 12,738:
template = regExpMatch[6] || '';
param = regExpMatch[8] || '';
var parserVar = ns.substr(0, ns.length - 1);
 
// {{VARIABLE}}
if (parserVarisParserVar == false) {
if ( (template != '') && (ns == '') && (param == '') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariables + '|' + wikEd.parserVariablesR + ')$', '');
if ( (regExpMatchregExpMatchParserVar = regExpParserVar.exec(template)) != null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.length, parseObj);
}
Line 12,445 ⟶ 12,752:
 
// {{VARIABLE:R}}
if (parserVarisParserVar == false) {
if ( (ns != '') && (template == 'R') ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserVariablesR + ')$', '');
if ( (regExpMatchregExpMatchParserVar = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) != null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,456 ⟶ 12,763:
 
// {{FUNCTION:param|R}}
if (parserVarisParserVar == false) {
if ( (ns != '') && ( (param == '') || (param == 'R') ) ) {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctionsR + ')$', '');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) != null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,467 ⟶ 12,774:
 
// {{function:param|param}}
if (parserVarisParserVar == false) {
if (ns != '') {
var regExpParserVar = new RegExp('^(' + wikEd.parserFunctions + ')$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) != null) {
parserVarisParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,478 ⟶ 12,785:
 
// {{#function:param|param}}
if (parserVarisParserVar == false) {
if (ns != '') {
var regExpParserVar = new RegExp('^(#(' + wikEd.parserFunctionsHash + '))$', 'i');
if ( (regExpMatch = regExpParserVar.exec(ns.substr(0, ns.length - 1)parserVar)) != null) {
 
parserVar = true;
// linkify wikibase template (wikidata)
// work in progress!
if (parserVar = '#property') {
var item = wikEd.wbRepoItem;
var regExpMatchItem;
if ( (regExpMatchItem = /(^|\|)id=([^|]+)/.exec(param)) != null) {
item = regExpMatchItem[2];
}
else if ( (regExpMatchItem = /(^|\|)of=([^|]+)/.exec(param)) != null) {
item = 'Special:ItemByTitle/' + wikEd.wbInterLang + '/' + regExpMatchItem[2];
}
if (item == '') {
var url = encodeURI(wikEd.wikiGlobals.wgTitle);
url = url.replace(/ /g, '_');
url = url.replace(/"/g, '%22');
url = url.replace(/'/g, '%27');
url = url.replace(/#/g, '%23');
item = 'Special:ItemByTitle/' + wikEd.wbInterLang + '/' + url;
}
if (item != '') {
follow = ' ' + wikEd.HighlightLinkify('', '', wikEd.wbRepoUrl + item);
}
}
isParserVar = true;
wikEd.HighlightBuildTree('templateParserFunct', 'block', tagFrom + 2, innerPlain.indexOf(':') + 1, parseObj);
}
Line 12,489 ⟶ 12,820:
 
// highlight template
if (parserVarisParserVar == false) {
 
// highlight modifier
Line 12,516 ⟶ 12,847:
}
var hideClass = 'wikEdTempl';
if ( (template != '') && (parserVarisParserVar == false) ) {
if (wikEd.refHide == true) {
 
Line 12,575 ⟶ 12,906:
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,582 ⟶ 12,914:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtml"><span class="wikEdHtmlTag">';
Line 12,626 ⟶ 12,958:
}
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);
}
Line 12,763 ⟶ 13,095:
case 'noinclude':
case 'includeonly':
case 'onlyinclude':
case 'gallery':
case 'categorytree':
Line 12,770 ⟶ 13,103:
case 'inputbox':
case 'poem':
case 'source':
case 'syntaxhighlight':
case 'source':
case 'timeline':
insertLeft = '<span class="wikEdHtmlTag">';
Line 13,270 ⟶ 13,603:
 
// remove highlighting code
linkPrefix = linkPrefix.replace(/<.[^>]*?>/g, '');
linkTitle = linkTitle.replace(/<.[^>]*?>/g, '');
 
// remove control chars
Line 13,395 ⟶ 13,728:
 
// remove leading spaces in lines
obj.html = obj.html.replace(/(<br\b[^>]*>)[\n\r]* *()/g, '$1');
 
// textify so that no html formatting is submitted
Line 13,524 ⟶ 13,857:
}
 
// trap enter in find/replace input elements
if (wikEd.useWikEd == true) {
if ( (event.type == 'keydown') && (event.keyCode == 13) ) {
 
if (event.target.id == 'wikEdFindText') {
// trap enter in find/replace input elements
event.preventDefault();
if ( (event.type == 'keydown') && (event.keyCode == 13) ) {
if (event.target.id == 'wikEdFindText'stopPropagation() {;
if (event.preventDefault(shiftKey == true); {
wikEd.EditButton(null, 'wikEdFindPrev');
event.stopPropagation();
if (event.shiftKey == true) {
wikEd.EditButton(null, 'wikEdFindPrev');
}
else if (event.ctrlKey == true) {
wikEd.EditButton(null, 'wikEdFindAll');
}
else {
wikEd.EditButton(null, 'wikEdFindNext');
}
}
else if (event.target.idctrlKey == 'wikEdReplaceText'true) {
wikEd.EditButton(null, 'wikEdFindAll');
event.preventDefault();
}
event.stopPropagation();
else {
if (event.shiftKey == true) {
wikEd.EditButton(null, 'wikEdReplacePrevwikEdFindNext');
}
else if (event.ctrlKey == true) {
wikEd.EditButton(null, 'wikEdReplaceAll');
}
else {
wikEd.EditButton(null, 'wikEdReplaceNext');
}
}
}
else if (event.target.id == 'wikEdReplaceText') {
event.preventDefault();
event.stopPropagation();
if (event.shiftKey == true) {
wikEd.EditButton(null, 'wikEdReplacePrev');
}
else if (event.ctrlKey == true) {
wikEd.EditButton(null, 'wikEdReplaceAll');
}
else {
wikEd.EditButton(null, 'wikEdReplaceNext');
}
}
}
 
// 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 != null) {
event.preventDefault();
event.stopPropagation();
 
// execute the button click handler code
var obj = document.getElementById(buttonId);
eval(wikEd.editButtonHandler[buttonId]);
objId = obj.id;
return;
eval(wikEd.editButtonHandler[buttonId]);
}
}
}
Line 13,668 ⟶ 13,998:
return;
};
 
 
//
// wikEd.DebugInfo: click handler for ctrl-click of logo buttons, pastes debug info into edit field or popup; shift-ctrl-click: extended info with resource loader modules
//
 
wikEd.DebugInfo = function(event) {
 
// event compatibility fixes
event = wikEd.EventWrapper(event, this);
if (event == null) {
return;
}
 
// ctrl-click
if (event.ctrlKey != true) {
return;
}
 
// get debug infos
var debug = wikEd.GetDebugInfo(event.shiftKey);
debug = debug.replace(/(^|\n(?=.))/g, '$1* ');
debug = '== wikEd bug report ==\n\n' + debug;
debug += '* Error console: ____ (Firefox: Tools → Web Developer → Error console; push clear and reload the page. Chrome: Control button → Tools → JavaScript console. Copy and paste error messages related to wikEd.js)\n';
debug += '* Problem description: ____ (Please be as specific as possible about what is wrong, including when it happens, what happens, what is broken, and what still works)\n';
debug += '* Steps to reproduce: ____ (Please include what happens at each step. Your problems cannot be fixed without reproducing them first!)\n';
 
// print to iframe, textarea, debug area, or alert
if (event.target == wikEd.logo) {
alert(debug);
}
else if (wikEd.useWikEd == true) {
debug = ('\n' + debug).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/\n/g, '<br>');
wikEd.FrameExecCommand('inserthtml', debug);
}
else if (wikEd.textarea != null) {
wikEd.textarea.value += '\n' + debug;
}
else {
wikEd.Debug(debug, undefined, true);
}
return;
}
 
 
//
// wikEd.GetDebugInfo: compiles debug info into string
//
 
wikEd.GetDebugInfo = function(extended) {
 
var loader = ''
var mediawiki = '';
var gadgets = '';
var scripts = '';
 
// cycle through script urls
var pageScripts = document.getElementsByTagName('script');
for (var i = 0; i < pageScripts.length; i ++) {
var src = pageScripts[i].src;
if (src != '') {
 
// resource loader modules
var regExpMatch = /load.php\?(|.*?&)modules=(.*?)(&|$)/.exec(src);
if (regExpMatch != null) {
loader += decodeURIComponent(regExpMatch[2]).replace(/\|/g, '; ') + '; ';
}
 
// mediawiki: scripts
else {
var regExpMatch = /index.php\?(|.*?&)title=(.*?)(&|$)/.exec(src);
if (regExpMatch != null) {
var script = regExpMatch[2];
if (/^MediaWiki:Gadget/.test(script) == true) {
gadgets += script.replace(/^MediaWiki:/, '') + ', ';
}
else if (/^MediaWiki:/.test(script) == true) {
mediawiki += script.replace(/^MediaWiki:/, '') + ', ';
}
else {
scripts += script + ', ';
}
}
 
// other scripts
else {
var regExpScript = new RegExp(wikEd.wikiGlobals.wgServer + '(' + wikEd.wikiGlobals.wgScriptPath + ')?');
scripts += src.replace(regExpScript, '').replace(/\?.*/, '') + ', ';
}
}
}
}
 
// get date
var date = new Date();
var time = (date.getUTCFullYear() + '-' + (date.getUTCMonth() + 1) + '-' + date.getUTCDate() + ' ' + date.getUTCHours() + ':' + date.getUTCMinutes() + ':' + date.getUTCSeconds() + ' UTC').replace(/\b(\d)\b/g, '0$1');
 
// get user js pages
var userPage = wikEd.wikiGlobals.wgServer + wikEd.wikiGlobals.wgArticlePath.replace(/\$1/, wikEd.wikiGlobals.wgFormattedNamespaces[2] + wikEd.wikiGlobals.wgUserName);
var protocol = document.___location.href.replace(/\/\/.*/, '');
if (/^\/\//.test(userPage) == true) {
userPage = protocol + userPage;
}
var skinJs = userPage + '/' + wikEd.wikiGlobals.skin + '.js';
var commonJs = userPage + '/common.js';
 
// remove trailing separators
loader = loader.replace(/; $/, '');
mediawiki = mediawiki.replace(/, $/, '');
gadgets = gadgets.replace(/, $/, '');
scripts = scripts.replace(/, $/, '');
 
var debug = '';
debug += 'Date: ' + time + '\n';
debug += 'wikEd version: ' + wikEd.programVersion + wikEd.installationType + ' (' + wikEd.programDate + ')\n';
debug += 'Browser: ' + navigator.userAgent + ' (' + navigator.platform + ')\n';
debug += 'Skin: ' + wikEd.wikiGlobals.skin + ' (detected: ' + wikEd.skin + ')\n';
debug += 'MediaWiki: ' + wikEd.wikiGlobals.wgVersion + '\n';
debug += 'Gadgets: ' + gadgets + '\n';
debug += 'MediaWiki scripts: ' + mediawiki + '\n';
debug += 'Scripts: ' + scripts + '\n';
if (extended == true) {
debug += 'Loader: ' + loader + '\n';
}
debug += 'URL: ' + window.___location.href + '\n';
debug += 'User/skin.js: ' + skinJs + '\n';
debug += 'User/common.js: ' + commonJs + '\n';
 
return(debug);
}
 
 
Line 13,674 ⟶ 14,134:
//
 
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
Line 13,907 ⟶ 14,378:
 
//
// wikEd.ResizeComboInput: set the size of theinput backgroundand select boxesfields so that only the select button is visible behind the input field
// calculates the select button width as the difference between select and option width
// adjusts widths so that only the select button is visible behind the input field
//
 
Line 13,919 ⟶ 14,388:
}
 
// short names
// detect browser for MS IE fixes
var input = wikEd.inputElement[field];
var standardBrowser = true;
ifvar select = (wikEd.selectElement[field].options.offsetWidth != null ) {;
standardBrowser = false;
}
 
// setsave select heightoptions and topempty select
var selectInnerHTML = select.innerHTML;
if (standardBrowser == false) {
select.innerHTML = '';
wikEd.selectElement[field].style.height = (wikEd.inputElement[field].clientHeight + 6) + 'px';
wikEd.selectElement[field].style.top = '3px';
wikEd.inputElement[field].style.top = '3px';
}
 
// set measuring styles
// add a dummy option if no option exists yet
select.style.fontFamily = 'sans-serif';
var dummy;
input.style.margin = '0';
var testOption = 1;
select.style.margin = '0';
if (standardBrowser == true) {
select.style.width = 'auto';
if (wikEd.selectElement[field].options.length == 0) {
testOption = 0;
wikEd.selectElement[field].options[0] = new Option('');
dummy = true;
}
}
 
// get button width from small empty select box
// set option widths to 0
var inputWidth = input.offsetWidth;
if (standardBrowser == true) {
var selectWidth = select.offsetWidth;
for (var i = 0; i < wikEd.selectElement[field].options.length; i ++) {
var selectBorder = parseInt(wikEd.GetStyle(select, 'borderTopWidth'), 10);
wikEd.selectElement[field].options[i].style.width = '0';
var buttonWidth = selectWidth - selectBorder - 8;
}
}
 
// getdelete inputmeasuring widthstyles
select.style.margin = null;
var inputBorder = (wikEd.inputElement[field].offsetWidth - wikEd.inputElement[field].clientWidth);
input.style.fontFamily = null;
var inputWidthInner = wikEd.inputElement[field].clientWidth;
select.style.fontFamily = null;
var inputWidthOuter = wikEd.inputElement[field].offsetWidth;
 
// getfor selectlong fields shorten input width
if (inputWidth + buttonWidth > 150) {
var selectWidthInner = wikEd.selectElement[field].clientWidth;
input.style.width = (inputWidth - buttonWidth) + 'px';
var selectWidthOuter = wikEd.selectElement[field].offsetWidth;
select.style.width = inputWidth + 'px';
 
// get option width and calculate button width
var optionWidthInner;
var buttonWidth;
if (standardBrowser == true) {
 
// Firefox < 3.0
if ( typeof(wikEd.selectElement[field].options[testOption].clientLeft) == 'undefined' ) {
optionWidthInner = wikEd.selectElement[field].options[testOption].clientWidth;
buttonWidth = selectWidthInner - optionWidthInner - 6;
}
 
// Firefox >= 3.0
else {
optionWidthInner = wikEd.selectElement[field].options[testOption].clientWidth;
buttonWidth = selectWidthInner - optionWidthInner;
}
}
else {
buttonWidth = selectWidthOuter - selectWidthInner - 4;
}
 
// for long fields shorten input
if (inputWidthOuter + buttonWidth > 150) {
wikEd.inputElement[field].style.width = (inputWidthInner - inputBorder - buttonWidth) + 'px';
wikEd.selectElement[field].style.width = (inputWidthInner) + 'px';
}
 
// otherwise increase select width
else {
wikEd.selectElement[field]select.style.width = (inputWidthOuterinputWidth + buttonWidth) + 'px';
}
 
// deleterestore dummyselect optionoptions
select.innerHTML = selectInnerHTML;
if (dummy == true) {
wikEd.selectElement[field].options[0] = null;
}
 
// set option widths to auto
if (standardBrowser == true) {
for (var i = 0; i < wikEd.selectElement[field].options.length; i ++) {
wikEd.selectElement[field].options[i].style.width = 'auto';
}
}
return;
};
Line 14,079 ⟶ 14,504:
summary = summary.replace(/[, ]+$/, '');
if (summary != '') {
if (summary.match(/ \*\/$/.test(summary) !== nulltrue) {
summary += ' ';
}
else if (summary.match(/[\.\;\:]$/.test(summary) !== nulltrue) {
summary += ' ';
}
else {
var regExp = new RegExp('^[' + wikEd.letters + '_()"\'+\\-]', '');
if (summaryregExp.matchtest(regExpsummary) == nullfalse) {
summary += ' ';
}
Line 14,256 ⟶ 14,681:
var plain = wikEd.frameBody.innerHTML;
plain = plain.replace(/<br\b[^>]*>/g, '\n');
plain = plain.replace(/<.[^>]*?>/g, '');
plain = plain.replace(/&nbsp;/g, '\xa0');
plain = plain.replace(/&gt;/g, '>');
Line 14,534 ⟶ 14,959:
if (wikEd.webStorage == null) {
wikEd.webStorage = false;
if (typeof(window.localStorage) == 'object') {
 
// https://bugzilla.mozilla.org/show_bug.cgi?id=748620
// web storage does not persist between local html page loads in firefox
try {
if (/^file:\/\//.test(wikEd.pageOrigin) == false) {
if (typeof(window.localStorage) == 'object') {
wikEd.webStorage = true;
 
// web storage does not persist between local html page loads in firefox
if (/^file:\/\//.test(wikEd.pageOrigin) == false) {
wikEd.webStorage = true;
}
}
}
catch(error) {
}
}
Line 14,844 ⟶ 15,275:
case childNode.TEXT_NODE:
var value = childNode.nodeValue;
 
value = value.replace(/\n/g, ' '); // important for pasted page content
// newline handling important for pasted page content
obj.plainArray.push(value); // plain array contains & < > instead of &amp; &lt; &gt;
if (currentNode.nodeName != 'PRE') {
value = value.replace(/\n/g, ' ');
}
 
// plain array contains & < > instead of &amp; &lt; &gt;
obj.plainArray.push(value);
obj.plainNode.push(childNode);
obj.plainStart.push(obj.plain.length);
Line 14,851 ⟶ 15,288:
value = value.replace(/</g, '&lt;');
value = value.replace(/>/g, '&gt;');
 
obj.html += value;
if (currentNode.nodeName == 'PRE') {
obj.html += value.replace(/\n/g, '<br>');
}
else {
obj.html += value;
}
obj.plain += value;
break;
Line 14,909 ⟶ 15,352:
 
// 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 != null) {
Line 14,959 ⟶ 15,402:
 
// 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 != null) {
Line 15,245 ⟶ 15,688:
else {
 
// allow ajax request from local copy for testing no longer working, see https://bugzilla.mozilla.org/show_bug.cgi?id=546848
if (wikEd.config.allowLocalAjax == true) {
if (typeof(netscape) == 'object') {
netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserRead');
}
}
 
// create new XMLHttpRequest object
Line 15,266 ⟶ 15,704:
 
// IE 5.5
catch(errerror) {
try {
request = new ActiveXObject('Msxml2.XMLHTTP');
}
catch(errerror) {
return;
}
Line 15,298 ⟶ 15,736:
request.send(formData);
}
catch(errerror) {
return;
}
Line 15,882 ⟶ 16,320:
//
// wikEd.ConsoleLog: log message to console
// mw.log no longer works
//
 
wikEd.ConsoleLog = function(msg) {
 
msg = msg.replace(/\n/g, '\\n');
if ( (typeof(mw) == 'object') && (typeof(mw.log) == 'function') ) {
msg = msg.replace(/([\'\"\\])/g, '\\$1');
mw.log(msg);
setTimeout('throw new Error(\'wikEd.ConsoleLog: ' + msg + '\')', 0);
}
else {
msg = msg.replace(/\n/g, '\\n');
msg = msg.replace(/([\'\"\\])/g, '\\$1');
setTimeout('throw new Error(\'wikEd.ConsoleLog: ' + msg + '\')', 0);
}
return;
};
Line 16,326 ⟶ 16,759:
return;
};
 
 
// call startup
wikEd.Startup();
 
// </sourcesyntaxhighlight>