509 lines
16 KiB
JavaScript
509 lines
16 KiB
JavaScript
/*
|
|
* HTML Parser By John Resig (ejohn.org)
|
|
* Original code by Erik Arvidsson, Mozilla Public License
|
|
* http://erik.eae.net/simplehtmlparser/simplehtmlparser.js
|
|
* @license GPL 3 or later (http://www.gnu.org/licenses/gpl.html)
|
|
*/
|
|
|
|
var HTMLParser;
|
|
var HTMLParserInstalled=true;
|
|
var HTMLParser_Elements = new Array();
|
|
(function(){
|
|
|
|
// Regular Expressions for parsing tags and attributes
|
|
var startTag = /^<(\w+)((?:\s+[\w-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,
|
|
endTag = /^<\/(\w+)[^>]*>/,
|
|
attr = /([\w-]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;
|
|
|
|
// Empty Elements - HTML 4.01
|
|
var empty = makeMap("br,col,hr,img");
|
|
// HTMLParser_Elements['empty'] = empty;
|
|
|
|
// Block Elements - HTML 4.01
|
|
var block = makeMap("blockquote,center,del,div,dl,dt,hr,iframe,ins,li,ol,p,pre,table,tbody,td,tfoot,th,thead,tr,ul");
|
|
// HTMLParser_Elements['block'] = block;
|
|
|
|
// Inline Elements - HTML 4.01
|
|
var inline = makeMap("a,abbr,acronym,b,big,br,cite,code,del,em,font,h1,h2,h3,h4,h5,h6,i,img,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var");
|
|
|
|
// Elements that you can, intentionally, leave open
|
|
// (and which close themselves)
|
|
var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");
|
|
|
|
// Attributes that have their values filled in disabled="disabled"
|
|
var fillAttrs = makeMap("checked,disabled,ismap,noresize,nowrap,readonly,selected");
|
|
|
|
// Special Elements (can contain anything)
|
|
var special = makeMap("script,style");
|
|
|
|
//define ('BROKEN_IMAGE', DOKU_URL . 'lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg?nolink&33x34');
|
|
var broken_image ='http://' + location.host + DOKU_BASE + '/lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg?nolink&33x34';
|
|
HTMLParser = this.HTMLParser = function( html, handler ) {
|
|
var index, chars, match, stack = [], last = html;
|
|
|
|
html = html.replace(/(<img.*?src="data:image\/\w+;base64,\s*)(.*?)(\/>)/gm,
|
|
function(match, p1, p2) {
|
|
var skip = false;
|
|
if(p1.match(/msword/) ) {
|
|
skip = true;
|
|
match = match.replace(/msword/,"");
|
|
}
|
|
if(p2.length > 2500000 && !skip ) {
|
|
jQuery('#dw__editform').append('<input type="hidden" id="broken_image" name="broken_image" value="' + p2.length +'" />');
|
|
return '{{' + broken_image + '}}';
|
|
}
|
|
return match;
|
|
});
|
|
html = html.replace(/~~OPEN_HTML_BLOCK~~/gm , '~~START_HTML_BLOCK~~') ;
|
|
html = html.replace(/~~END_HTML_BLOCK~~/gm , '~~CLOSE_HTML_BLOCK~~') ;
|
|
|
|
if(html.match(/~~START_HTML_BLOCK~~/gm) ){ //adopted [\s\S] from Goyvaerts, Reg. Exp. Cookbook (O'Reilly)
|
|
if(!JSINFO['htmlok']) {
|
|
html = html.replace(/~~START_HTML_BLOCK~~|~~CLOSE_HTML_BLOCK~~/gm,"");
|
|
}
|
|
|
|
html = html.replace(/(<p>)*\s*~~START_HTML_BLOCK~~\s*(<\/p>)*([\s\S]+)~~CLOSE_HTML_BLOCK~~\s*(<\/p>)*/gm, function(match,p,p1,text,p2) {
|
|
text = text.replace(/<\/?div.*?>/gm,"");
|
|
text = text.replace(/<code>/gm,"");
|
|
text = text.replace(/<\/code>/gm,"");
|
|
text = text.replace(/</gm,"<");
|
|
text = text.replace(/<\//gm,">");
|
|
return "~~START_HTML_BLOCK~~\n\n" + text + "\n\n~~CLOSE_HTML_BLOCK~~\n\n";
|
|
});
|
|
}
|
|
/* remove dwfck note superscripts from inside links */
|
|
html = html.replace(/(<sup\s+class=\"dwfcknote fckgL\d+\"\>fckgL\d+\s*\<\/sup\>)\<\/a\>/gm, function(match,sup,a) {
|
|
return( '</a>' +sup);
|
|
}
|
|
);
|
|
/* remove html5 attributes */
|
|
var pos = html.indexOf('data-');
|
|
if(pos != -1) {
|
|
html = html.replace(/(<\w+)([^>]+)>/gm,function(match,tag,atts){
|
|
atts = atts.replace(/data-[\w\-]+\s*=\s*(\"|\')\w+(\"|\')/,"");
|
|
//alert(atts);
|
|
return tag + atts+ '>';
|
|
});
|
|
}
|
|
stack.last = function(){
|
|
return this[ this.length - 1 ];
|
|
};
|
|
|
|
while ( html ) {
|
|
chars = true;
|
|
|
|
// Make sure we're not in a script or style element
|
|
if ( !stack.last() || !special[ stack.last() ] ) {
|
|
|
|
// Comment
|
|
if ( html.indexOf("<!--") == 0 ) {
|
|
index = html.indexOf("-->");
|
|
|
|
if ( index >= 0 ) {
|
|
if ( handler.comment )
|
|
handler.comment( html.substring( 4, index ) );
|
|
html = html.substring( index + 3 );
|
|
chars = false;
|
|
}
|
|
|
|
// end tag
|
|
} else if ( html.indexOf("</") == 0 ) {
|
|
match = html.match( endTag );
|
|
|
|
if ( match ) {
|
|
html = html.substring( match[0].length );
|
|
match[0].replace( endTag, parseEndTag );
|
|
chars = false;
|
|
}
|
|
|
|
// start tag
|
|
} else if ( html.indexOf("<") == 0 ) {
|
|
match = html.match( startTag );
|
|
|
|
if ( match ) {
|
|
html = html.substring( match[0].length );
|
|
match[0].replace( startTag, parseStartTag );
|
|
chars = false;
|
|
}
|
|
}
|
|
|
|
if ( chars ) {
|
|
index = html.indexOf("<");
|
|
|
|
var text = index < 0 ? html : html.substring( 0, index );
|
|
html = index < 0 ? "" : html.substring( index );
|
|
|
|
if ( handler.chars )
|
|
handler.chars( text );
|
|
}
|
|
|
|
} else {
|
|
html = html.replace(new RegExp("(.*)<\/" + stack.last() + "[^>]*>"), function(all, text){
|
|
text = text.replace(/<!--(.*?)-->/g, "$1")
|
|
.replace(/<!\[CDATA\[(.*?)]]>/g, "$1");
|
|
|
|
if ( handler.chars )
|
|
handler.chars( text );
|
|
|
|
return "";
|
|
});
|
|
|
|
parseEndTag( "", stack.last() );
|
|
}
|
|
|
|
if ( html == last )
|
|
throw "Parse Error: " + html;
|
|
last = html;
|
|
}
|
|
|
|
// Clean up any remaining tags
|
|
parseEndTag();
|
|
|
|
function parseStartTag( tag, tagName, rest, unary ) {
|
|
if ( block[ tagName ] ) {
|
|
while ( stack.last() && inline[ stack.last() ] ) {
|
|
parseEndTag( "", stack.last() );
|
|
}
|
|
}
|
|
|
|
if ( closeSelf[ tagName ] && stack.last() == tagName ) {
|
|
parseEndTag( "", tagName );
|
|
}
|
|
|
|
unary = empty[ tagName ] || !!unary;
|
|
|
|
if ( !unary )
|
|
stack.push( tagName );
|
|
|
|
if ( handler.start ) {
|
|
var attrs = [];
|
|
|
|
rest.replace(attr, function(match, name) {
|
|
var value = arguments[2] ? arguments[2] :
|
|
arguments[3] ? arguments[3] :
|
|
arguments[4] ? arguments[4] :
|
|
fillAttrs[name] ? name : "";
|
|
|
|
attrs.push({
|
|
name: name,
|
|
value: value,
|
|
escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //"
|
|
});
|
|
});
|
|
|
|
if ( handler.start )
|
|
handler.start( tagName, attrs, unary );
|
|
}
|
|
}
|
|
|
|
function parseEndTag( tag, tagName ) {
|
|
// If no tag name is provided, clean shop
|
|
if ( !tagName )
|
|
var pos = 0;
|
|
|
|
// Find the closest opened tag of the same type
|
|
else
|
|
for ( var pos = stack.length - 1; pos >= 0; pos-- )
|
|
if ( stack[ pos ] == tagName )
|
|
break;
|
|
|
|
if ( pos >= 0 ) {
|
|
// Close all the open elements, up the stack
|
|
for ( var i = stack.length - 1; i >= pos; i-- )
|
|
if ( handler.end )
|
|
handler.end( stack[ i ] );
|
|
|
|
// Remove the open elements from the stack
|
|
stack.length = pos;
|
|
}
|
|
}
|
|
};
|
|
|
|
|
|
function makeMap(str){
|
|
var obj = {}, items = str.split(",");
|
|
for ( var i = 0; i < items.length; i++ )
|
|
obj[ items[i] ] = true;
|
|
return obj;
|
|
}
|
|
})();
|
|
|
|
|
|
function HTMLParser_test_result(results) {
|
|
|
|
var test_str = "";
|
|
for ( i=0; i < results.length; i++) {
|
|
var character = results.charAt(i);
|
|
if(results.charCodeAt(i) == 10)
|
|
character ='\\n';
|
|
if(results.charCodeAt(i) == 32)
|
|
character ='SP';
|
|
var entry = character + ' ';
|
|
|
|
test_str += entry;
|
|
if(results.charCodeAt(i) == 10) {
|
|
test_str += "\n";
|
|
}
|
|
}
|
|
|
|
if(!confirm(test_str)) return false;
|
|
return true;
|
|
|
|
}
|
|
|
|
function hide_backup_msg() {
|
|
document.getElementById("backup_msg").style.display="none";
|
|
return false;
|
|
}
|
|
|
|
function show_backup_msg(msg) {
|
|
document.getElementById("backup_msg").style.display="block";
|
|
document.getElementById("backup_msg_area").innerHTML = "Backed up to: " + msg;
|
|
|
|
return false;
|
|
}
|
|
|
|
// legacy functions
|
|
function remove_draft(){
|
|
}
|
|
|
|
function dwedit_draft_delete() {
|
|
}
|
|
// legacy functions end
|
|
|
|
function setEdHeight(h) {
|
|
h = parseInt(h);
|
|
document.cookie = 'ckgEdht=' + h +';expires=0;path=' +JSINFO['doku_base'] + ';SameSite=Lax;';
|
|
}
|
|
|
|
/* enable disable image paste */
|
|
function ckgd_setImgPaste(which) {
|
|
var state = JSINFO['ckgEdPaste'] ? JSINFO['ckgEdPaste'] : "";
|
|
if(state == 'on') {
|
|
which = 'off'
|
|
}
|
|
else which = 'on';
|
|
JSINFO['ckgEdPaste'] = which;
|
|
document.cookie = 'ckgEdPaste=' + which +';expires="Thu, 18 Dec 2575 12:00:00 UTC";path=' +JSINFO['doku_base'];
|
|
alert(LANG.plugins.ckgedit.ckg_paste_restart + ' ' + LANG.plugins.ckgedit[which]);
|
|
}
|
|
|
|
function ckg_RawImgMsg() {
|
|
return LANG.plugins.ckgedit.broken_image_1 + "\n" + LANG.plugins.ckgedit.broken_image_2 ;
|
|
}
|
|
function GetE(e) {
|
|
return document.getElementById(e);
|
|
}
|
|
var dokuBase = location.host + DOKU_BASE;
|
|
|
|
if(window.getSelection != undefined) {
|
|
var doku_ckg_getSelection = window.getSelection;
|
|
window.getSelection = function(ta) {
|
|
if(!ta) ta = GetE("wiki__text");
|
|
return doku_ckg_getSelection(ta);
|
|
};
|
|
}
|
|
|
|
function ckgedit_seteditor_priority(m,client,dw_val_obj) {
|
|
var which = {'Y': 'Dokuwiki', 'N': 'CKEditor'};
|
|
|
|
if (typeof m === "undefined") { // Safari
|
|
if(dw_val_obj[0].checked) {
|
|
m= dw_val_obj[0].value;
|
|
}
|
|
else if(dw_val_obj[1].checked) {
|
|
m = dw_val_obj[1].value;
|
|
}
|
|
}
|
|
var params = "dw_val=" + m; params += '&call=cked_selector'; params += "&dwp_client=" + client;
|
|
jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params,
|
|
function (data) {
|
|
if(data == 'done') {
|
|
if(!m)
|
|
alert(LANG.plugins.ckgedit.dwp_not_sel);
|
|
else
|
|
alert(LANG.plugins.ckgedit.dwp_updated + which[m]);
|
|
}
|
|
else {
|
|
alert(LANG.plugins.ckgedit.dwp_save_err + data);
|
|
}
|
|
},
|
|
'html'
|
|
);
|
|
}
|
|
|
|
/* gets both size and filetime: "size||filetime" */
|
|
function ckged_get_unlink_size(id) {
|
|
var params = 'call=cked_deletedsize'; params += "&cked_delid=" + id;
|
|
jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params,
|
|
function (data) {
|
|
if(data) {
|
|
JSINFO['ckg_del_sz'] = data;
|
|
//console.log(data);
|
|
}
|
|
else {
|
|
// alert(LANG.plugins.ckgedit.dwp_save_err + data);
|
|
}
|
|
},
|
|
'html'
|
|
);
|
|
|
|
}
|
|
|
|
function ckged_setmedia(id,del, refresh_cb) {
|
|
|
|
var params = 'call=cked_upload'; params += "&ckedupl_id=" + id;
|
|
if(del) params += "&ckedupl_del=D&delsize="+JSINFO['ckg_del_sz'];
|
|
jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params,
|
|
function (data) {
|
|
if(data) {
|
|
if(refresh_cb) {
|
|
refresh_cb.postMessage(JSINFO['doku_url'], JSINFO['doku_url']);
|
|
}
|
|
// console.log(data);
|
|
}
|
|
else {
|
|
// alert(LANG.plugins.ckgedit.dwp_save_err + data);
|
|
}
|
|
},
|
|
'html'
|
|
);
|
|
}
|
|
|
|
jQuery(document).ready(function() {
|
|
if(JSINFO['hide_captcha_error'] =='hide') {
|
|
jQuery("div.error").hide();
|
|
}
|
|
});
|
|
|
|
|
|
jQuery(document).ready(function(){
|
|
|
|
jQuery( "#editor_height" ).keydown(function(event) {
|
|
if ( event.which == 13 ) {
|
|
event.preventDefault();
|
|
}
|
|
});
|
|
|
|
$dokuWiki = jQuery('.dokuwiki');
|
|
jQuery('.editbutton_table button').click(function() {
|
|
var f = this.form;
|
|
jQuery('<input />').attr('type','hidden').attr('name','mode').attr('value','dwiki').appendTo(jQuery(f));
|
|
jQuery('<input />').attr('type','hidden').attr('name','fck_preview_mode').attr('value','nil').appendTo(jQuery(f));
|
|
});
|
|
|
|
if(typeof(JSINFO['dbl_click_auth'] !== 'undefined') && JSINFO['dbl_click_auth'] == "") return;
|
|
if(!JSINFO['ckg_dbl_click']) return;
|
|
|
|
/**
|
|
* If one or more edit section buttons exist?
|
|
* This makes sure this feature is enabled only on the edit page and for users with page edit rights.
|
|
*/
|
|
if (jQuery('.editbutton_section', $dokuWiki).length > 0) {
|
|
|
|
// register double click event for all headings and section divs
|
|
jQuery('[class^="sectionedit"], div[class^="level"]', $dokuWiki).dblclick(function(){
|
|
// find the closest edit button form to the element double clicked (downwards) and submit the form
|
|
var f = jQuery(this).nextAll('.editbutton_section:eq(0)').children('form:eq(0)');
|
|
//alert(jQuery(f).hasClass('button'));
|
|
jQuery('<input />').attr('type','hidden').attr('name','mode').attr('value','dwiki').appendTo(jQuery(f));
|
|
jQuery('<input />').attr('type','hidden').attr('name','fck_preview_mode').attr('value','nil').appendTo(jQuery(f));
|
|
f.submit();
|
|
})
|
|
}
|
|
|
|
if(JSINFO['ckg_template'].match(/bootstrap/) && jQuery('div.editButtons').length>0) {
|
|
// var n=jQuery('div.editButtons input').length;
|
|
jQuery( "div.editButtons input").each(function( index ) {
|
|
if(jQuery(this).hasClass('btn-success')) {
|
|
jQuery(this).removeClass('btn-success')
|
|
}
|
|
if(jQuery(this).hasClass('btn-danger')) {
|
|
jQuery(this).removeClass('btn-danger');
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
});
|
|
|
|
function ckg_edit_mediaman_insert(edid, id, opts, dw_align) {
|
|
var link, width, s, align;
|
|
|
|
//parse option string
|
|
var options = opts.substring(1).split('&');
|
|
|
|
//get width and link options
|
|
link = 'detail';
|
|
for (var i in options) {
|
|
var opt = options[i];
|
|
if (typeof opt !== 'string') {
|
|
continue;
|
|
}
|
|
if (opt.match(/^\d+$/)) {
|
|
width = opt;
|
|
} else if (opt.match(/^\w+$/)) {
|
|
link = opt;
|
|
}
|
|
}
|
|
|
|
//get alignment option
|
|
switch (dw_align) {
|
|
case '2':
|
|
align = 'medialeft';
|
|
break;
|
|
case '3':
|
|
align = 'mediacenter';
|
|
break;
|
|
case '4':
|
|
align = 'mediaright';
|
|
break;
|
|
default:
|
|
align = '';
|
|
break;
|
|
}
|
|
|
|
var funcNum = CKEDITOR.instances.wiki__text._.filebrowserFn;
|
|
var fileUrl = DOKU_BASE + 'lib/exe/fetch.php?media=' + id;
|
|
CKEDITOR.tools.callFunction(funcNum, fileUrl, function() {
|
|
var dialog = this.getDialog();
|
|
if ( dialog.getName() == "image" ) {
|
|
if (align != null) {
|
|
dialog.getContentElement("info", "cmbAlign").setValue(align);
|
|
}
|
|
if (link != null) {
|
|
dialog.getContentElement("info", "cmbLinkType").setValue(link);
|
|
}
|
|
if (width != null) {
|
|
dialog.getContentElement("info", "txtWidth").setValue(width);
|
|
dialog.dontResetSize = true;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function ckg_edit_mediaman_insertlink(edid, id, opts, dw_align) {
|
|
var funcNum = CKEDITOR.instances.wiki__text._.filebrowserFn;
|
|
CKEDITOR.tools.callFunction(funcNum, id, function() {
|
|
var dialog = this.getDialog();
|
|
if (dialog.getName() == "link") {
|
|
dialog.getContentElement('info', 'media').setValue(id);
|
|
}
|
|
});
|
|
}
|
|
|
|
function getCookie(name) {
|
|
var re = new RegExp(name + "=([^;]+)");
|
|
var value = re.exec(document.cookie);
|
|
return (value != null) ? decodeURIComponent(value[1]) : null;
|
|
}
|
|
function ckg_admininfo(t){
|
|
if(t.innerHTML == LANG.plugins.ckgedit.stylesheet_cinfo)
|
|
t.innerHTML = LANG.plugins.ckgedit.stylesheet_oinfo;
|
|
else t.innerHTML = LANG.plugins.ckgedit.stylesheet_cinfo;
|
|
}
|
|
|
|
/* DOKUWIKI:include_once locktimer.js */
|
|
|