📄 yqweditor.js
字号:
/**
* Workaround for heinous IE bug - add special YQWlength property to all strings
* This method is applied to ALL string objects automatically
*
* @return integer
*/
String.prototype.YQWlength = function()
{
return (is_ie && this.indexOf('\n') != -1) ? this.replace(/\r?\n/g, '_').length : this.length;
}
/**
* PHP Function Emulator Class
*/
function JavaEmulator()
{
}
JavaEmulator.prototype.strPad = function(text, length, padstring)
{
text = new String(text);
padstring = new String(padstring);
if (text.length < length){
padtext = new String(padstring);
while (padtext.length < (length - text.length)){
padtext += padstring;
}
text = padtext.substr(0, (length - text.length)) + text;
}
return text;
}
/**
* Trims leading whitespace
* @param string String to trim
* @return string
*/
JavaEmulator.prototype.ltrim = function(str){
return str.replace(/^\s+/g, '');
}
/**
* Trims trailing whitespace
* @param string String to trim
* @return string
*/
JavaEmulator.prototype.rtrim = function(str){
return str.replace(/(\s+)$/g, '');
}
/**
* Trims leading and trailing whitespace
* @param string String to trim
* @return string
*/
JavaEmulator.prototype.trim = function(str){
return this.ltrim(this.rtrim(str));
}
JavaEmulator.prototype.stripos = function(haystack, needle, offset){
if (typeof offset == 'undefined'){offset = 0;}
index = haystack.toLowerCase().indexOf(needle.toLowerCase(), offset);
return (index == -1 ? false : index);
}
JavaEmulator.prototype.htmlspecialchars = function(str){
//var f = new Array(/&(?!#[0-9]+;)/g, /</g, />/g, /"/g);
var f = new Array(
(is_mac && is_ie ? new RegExp('&', 'g') : new RegExp('&(?!#[0-9]+;)', 'g')),
new RegExp('<', 'g'),
new RegExp('>', 'g'),
new RegExp('"', 'g')
);
var r = new Array(
'&',
'<',
'>',
'"');
for (var i = 0; i < f.length; i++){
str = str.replace(f[i], r[i]);
}
return str;
}
JavaEmulator.prototype.ucfirst = function(str, cutoff){
if (typeof cutoff != 'undefined'){
var cutpos = str.indexOf(cutoff);
if (cutpos > 0){
str = str.substr(0, cutpos);
}
}
str = str.split(' ');
for (var i = 0; i < str.length; i++){
str[i] = str[i].substr(0, 1).toUpperCase() + str[i].substr(1);
}
return str.join(' ');
}
var JAVA = new JavaEmulator();
/**
* Strips quotes and bbcode tags from text
*
* @param string Text to manipulate
* @param boolean If true, strip <x> otherwise strip [x]
* @param boolean If true, strip all [quote]...contents...[/quote]
*
* @return string
*/
function stripcode(str, ishtml, stripquotes){
if (!is_regexp){
return str;
}
if (stripquotes){
var start_time = new Date().getTime();
while ((startindex = JAVA.stripos(str, '[quote')) !== false){
if (new Date().getTime() - start_time > 2000){
// while loop has been running for over 2 seconds and has probably gone infinite
break;
}
if ((stopindex = JAVA.stripos(str, '[/quote]')) !== false){
fragment = str.substr(startindex, stopindex - startindex + 8);
str = str.replace(fragment, '');
}else{
break;
}
str = JAVA.trim(str);
}
}
if (ishtml){
// exempt image tags -- they need to count as characters in the string
// as the do as BB codes
str = str.replace(/<img[^>]+src="([^"]+)"[^>]*>/gi, '$1');
var html1 = new RegExp("<(\\w+)[^>]*>", 'gi');
var html2 = new RegExp("<\\/\\w+>", 'gi');
str = str.replace(html1, '');
str = str.replace(html2, '');
var html3 = new RegExp('( )', 'gi');
str = str.replace(html3, ' ');
}else{
var bbcode1 = new RegExp("\\[(\\w+)[^\\]]*\\]", 'gi');
var bbcode2 = new RegExp("\\[\\/(\\w+)\\]", 'gi');
str = str.replace(bbcode1, '');
str = str.replace(bbcode2, '');
}
return str;
}
/**
* Class to handle pagenav events
*/
function YQWpagenav(){
}
/**
* Handles clicks on pagenav menu control objects
*/
YQWpagenav.prototype.controlobj_onclick = function(e){
this._onclick(e);
var inputs = getTags(this.menu.menuobj, 'input');
for (var i = 0; i < inputs.length; i++){
if (inputs[i].type == 'text'){
inputs[i].focus();
break;
}
}
};
/**
* Submits the pagenav form... sort of
*/
YQWpagenav.prototype.form_gotopage = function(e){
if ((pagenum = parseInt(c.o('pagenav_itxt').value, 10)) > 0){
window.location = this.addr + '&page=' + pagenum;
}
return false;
};
/**
* Handles clicks on the 'Go' button in pagenav popups
*/
YQWpagenav.prototype.ibtn_onclick = function(e){
return this.form.gotopage();
};
/**
* Handles keypresses in the text input of pagenav popups
*/
YQWpagenav.prototype.itxt_onkeypress = function(e){
return ((e ? e : window.event).keyCode == 13 ? this.form.gotopage() : true);
};
function YeQiangWei_init(){
// don't bother doing any exciting stuff for WebTV
if (is_webtv){
return false;
}
// finalize popup menus
if (typeof YQWmenu == 'object'){
// close all menus on document click
if (window.attachEvent && !is_saf){
document.attachEvent('onclick', YQWmenu_hide);
window.attachEvent('onresize', YQWmenu_hide);
}else if (document.addEventListener && !is_saf){
document.addEventListener('click', YQWmenu_hide, false);
window.addEventListener('resize', YQWmenu_hide, false);
}else{
window.onclick = YQWmenu_hide;
window.onresize = YQWmenu_hide;
}
YQWmenu.activate(true);
}
return true;
}
/**
* Handles the different event models of different browsers and prevents event bubbling in a lesser way than do_an_e()
*
* @param event Event object
*
* @return event
*/
function e_by_gum(eventobj)
{
if (!eventobj || is_ie)
{
window.event.cancelBubble = true;
return window.event;
}
else
{
if (eventobj.target.type == 'submit')
{
// naughty safari
eventobj.target.form.submit();
}
eventobj.stopPropagation();
return eventobj;
}
}
/**
* Pop function for browsers that don't have it built in
*
* @param array Array from which to pop
*
* @return mixed null on empty, value on success
*/
function array_pop(a)
{
if (typeof a != 'object' || !a.length)
{
return null;
}
else
{
var response = a[a.length - 1];
a.length--;
return response;
}
}
/* HTML TO UBB */
function HTMLTOUBB(str) {
str = str.replace(/\r/g,"");
str = str.replace(/on(load|click|dbclick|mouseover|mousedown|mouseup)="[^"]+"/ig,"");
str = str.replace(/<script[^>]*?>([\w\W]*?)<\/script>/ig,"");
//屏闭干扰码
str = str.replace(/<span[^>]*?display\s*?:\s*?none[^>]*?>([\w\W]*?)<\/span>/ig,"");
str = str.replace(/<span[^>]*?font\s*?-\s*?size\s*?:\s*(0px|0pt)[^>]*?>([\w\W]*?)<\/span>/ig,"");
str = str.replace(/<font([^>]+)(0px|0pt)+([^>]*)>([\w\W]*?)<\/font>/ig,"");
str=str.replace(/^[ ]*(http:\/\/|^mms:\/\/|^rtsp:\/\/|^pnm:\/\/|^ftp:\/\/|^mmst:\/\/|^mmsu:\/\/)([^\r\n]*)$/igm,"[url]$1$2[/url]");
//图片
str = str.replace(/<a[^>]+href=[" ]?([^"]+)[" ]?[^>]*>(.*?)<\/a>/ig,"[url=$1]$2[/url]");
str = str.replace(/<font([^>]+)color=([^ >]+)([^>]*)>(.*?)<\/font>/ig,"[color=$2]$4[/color]");
str = str.replace(/<font([^>]+)class=([^ >]+)([^>]*)>(.*?)<\/font>/ig,"[color=$2]$4[/color]");
str = str.replace(/<font([^>]+)size=([^ >]+)([^>]*)>(.*?)<\/font>/ig,"[size=$2]$4[/size]");
str = str.replace(/<font[^>]+face=([^ >]+)[^>]*>(.*?)<\/font>/ig,"[font=$1]$2[/font]");
str = str.replace(/<img[^>]+src=[" ]?([^"]+)[" ]?[^>]*>/ig,"[img]$1[/img]");
str = str.replace(/<object[^>]+classid=[" ]?clsid:D27CDB6E-AE6D-11cf-96B8-444553540000[" ]?[^>]*>(.*?)<param[^>]+name=[" ]?movie[" ]?[^>]+value=[" ]?([^"]+)[" ]?[^>]*>/ig,"[flash]$2[/flash]");
str = str.replace(/<object[^>]+classid=[" ]?clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA[" ]?[^>]*>.*<param[^>]+name="src"[^>]+value="([^"]+)">/ig,"[real]$1[/real]");
str = str.replace(/<([\/]?)b>/ig,"[$1b]");
str = str.replace(/<([\/]?)strong>/ig,"[$1b]");
str = str.replace(/<([\/]?)u>/ig,"[$1u]");
str = str.replace(/<([\/]?)i>/ig,"[$1i]");
str = str.replace(/<br>/ig,"\n");
str = str.replace(/<br\/>/ig,"\n");
str = str.replace(/<br \/>/ig,"\n");
str = str.replace(/<p[^>]*?>/ig,"\r\n");
str = str.replace(/<\/p[^>]*?>/ig,"\r\n");
str = str.replace(/<[^>]*?>/g,"");
str = str.replace(/ /g," ");
str = str.replace(/&/g,"&");
str = str.replace(/"/g,"\"");
str = str.replace(/</g,"<");
str = str.replace(/>/g,">");
str = str.replace(/\[url=([^\]]+)\]\n(\[img\]\1\[\/img\])\n\[\/url\]/g,"$2");
str = str.replace(/\n+/g,"\n");
str = str.replace(/\[(.*?)="(.*?)"\]/ig,"[$1=$2]");
//清除多余空行
str = str.replace(/([\s]*\r\n[\s]*){2,}/gm,"\r\n");
return str;
}
/* this menu code from vBulletin 3.6.0 */
function YQW_Popup_Handler()
{
/**
* Options:
*
* @var integer Number of steps to use in sliding menus open
* @var boolean Use opacity face in menu open?
*/
this.open_steps = 10;
this.open_fade = false;
this.active = false;
this.menus = new Array();
this.activemenu = null;
this.hidden_selects = new Array();
};
// =============================================================================
// YQW_Popup_Handler methods
/**
* Activate / Deactivate the menu system
*
* @param boolean Active state for menus
*/
YQW_Popup_Handler.prototype.activate = function(active)
{
this.active = active;
};
/**
* Register a control object as a menu control
*
* @param string ID of the control object
* @param boolean Do not add an image (true)
*
* @return YQW_Popup_Menu
*/
YQW_Popup_Handler.prototype.register = function(controlkey, noimage)
{
this.menus[controlkey] = new YQW_Popup_Menu(controlkey, noimage);
return this.menus[controlkey];
};
/**
* Hide active menu
*/
YQW_Popup_Handler.prototype.hide = function()
{
if (this.activemenu != null)
{
this.menus[this.activemenu].hide();
}
};
// #############################################################################
// initialize menu registry
var YQWmenu = new YQW_Popup_Handler();
/**
* Function to allow anything to hide all menus
*
* @param event Event object
*
* @return mixed
*/
function YQWmenu_hide(e)
{
if (e && e.button && e.button != 1 && e.type == 'click')
{
return true;
}
else
{
YQWmenu.hide();
}
};
// #############################################################################
// YQW_Popup_Menu
// #############################################################################
/**
* YQWulletin popup menu class constructor
*
* Manages a single menu and control object
* Initializes control object
*
* @param string ID of the control object
*/
function YQW_Popup_Menu(controlkey, noimage)
{
this.controlkey = controlkey;
this.menuname = this.controlkey.split('.')[0] + '_menu';
this.init_control(noimage);
if (c.o(this.menuname))
{
this.init_menu();
}
this.slide_open = (is_opera ? false : true);
this.open_steps = YQWmenu.open_steps;
};
// =============================================================================
// YQW_Popup_Menu methods
/**
* Initialize the control object
*/
YQW_Popup_Menu.prototype.init_control = function(noimage)
{
this.controlobj = c.o(this.controlkey);
this.controlobj.state = false;
if (this.controlobj.firstChild && (this.controlobj.firstChild.tagName == 'TEXTAREA' || this.controlobj.firstChild.tagName == 'INPUT')){
}else{
if (!noimage && !(is_mac && is_ie)){
var space = document.createTextNode(' ');
this.controlobj.appendChild(space);
var img = document.createElement('img');
img.src = '/club/YQWeditor/imgs/menupop.gif';
img.border = 0;
img.title = '';
img.alt = '';
this.controlobj.appendChild(img);
}
this.controlobj.unselectable = true;
if (!noimage){this.controlobj.style.cursor = pointer_cursor;}
this.controlobj.onclick = YQW_Popup_Events.prototype.controlobj_onclick;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -