?? fancycoder.js
字號:
/***********************************************
* 幻碼JS版 - FancyCoder for JavaScript
* version 1.0 beta
***********************************************/
//檢查語法加亮規(guī)則定義,并做相應調整
//FCCheckSyntaxDef函數參數: 可為0個或多個語言ID,分別表示各個需要檢查的語言,如果不寫則表示檢查所有
function FCCheckSyntaxDef() {
//設定語言列表
if (arguments.length > 0) {
var langList = {};
for (var i = arguments.length - 1; i >= 0; i--) {
if (FCSyntaxDef[arguments[i]] != null)
langList[arguments[i]] = true;
}
} else {
var langList = FCSyntaxDef;
}
//依次檢查各組語言
for (var lang in langList) {
var syntax = FCSyntaxDef[lang];
//檢查普通文本設置
if (syntax.color == null) syntax.color = "#000000";
if (syntax.style == null) syntax.style = "";
else syntax.sytle = syntax.style.toLowerCase();
//檢查詞定界符設置
var delim = syntax.delimiters;
if (delim == null) {
syntax.delimiters = "~!@%^&*()-+=|\\/{}[]:;\"'<>,.? \t";
} else if (delim.indexOf(" \t") < 0) {
syntax.delimiters += " \t";
}
//檢查注釋設置
if (syntax.comments != null) {
if (typeof(syntax.comments) == "string") syntax.comments = syntax.comments.split(" ");
if (syntax.cmtcolor == null) syntax.cmtcolor = "#00ff00";
if (syntax.cmtstyle == null) syntax.cmtstyle = "";
else syntax.cmtsytle = syntax.cmtstyle.toLowerCase();
} else {
syntax.comments = [];
}
//檢查塊設置
var blocks = syntax.blocks;
for (var classid in blocks) {
var block = blocks[classid];
if (block.color == null) block.color = "#00ffff";
if (block.style == null) block.style = "";
else block.style = block.style.toLowerCase();
block.lines = block.lines == true;
}
//檢查關鍵字設置
var keywords = syntax.keywords;
for (var classid in keywords) {
var group = keywords[classid];
if (group.color == null) group.color = "#0000ff";
if (group.style == null) group.style = "";
else group.style = group.style.toLowerCase();
group.list = (" " + (group.list instanceof Array ? group.list.join(" ")
: group.list) + " ").replace(/ +/g, " ");
}
}
}
//--------------------------------------------------------------
//創(chuàng)建CSS樣式段
//classid: CSS樣式段ID
//font: 字體
//size: 字體大小
//color: 字體顏色
//style: 字體風格
function FCMakeCSSClass(classid, color, style, font, size) {
return "." + classid + " {\r\n\tcolor: " + color + ";\r\n"
+ (style.indexOf("b") < 0 ? "" : "\tfont-weight: bold;\r\n")
+ (style.indexOf("i") < 0 ? "" : "\tfont-style: italic;\r\n")
+ (style.indexOf("u") < 0 ? "" : "\ttext-decoration: underline;\r\n")
+ (font == null ? "" : "\tfont-family: " + font + ";\r\n")
+ (size == null ? "" : "\tfont-size: " + size + ";\r\n")
+ "}\r\n";
}
//--------------------------------------------------------------
//創(chuàng)建指定語言的CSS樣式,返回轉換好的CSS代碼,如果語言不存在則返回null
//lang: 語法加亮規(guī)則的語言ID
//font: 所用字體,如果為對象,就用每個對象成員對應相應的classid
//size: 所用字體的大小,如果為對象,就用每個對象成員對應相應的classid
function FCMakeCSS(lang, font, size) {
var syntax = FCSyntaxDef[lang];
if (syntax == null) return null;
var fontList = font instanceof Object;
var sizeList = size instanceof Object;
//定義普通文本樣式
var css = FCMakeCSSClass(lang + "_Default", syntax.color, syntax.style,
fontList ? font.comment : font, sizeList ? size.comment : size);
//定義注釋樣式
if (syntax.comments.length > 0) {
css += FCMakeCSSClass(lang + "_Comments", syntax.cmtcolor, syntax.cmtstyle,
fontList ? font.comment : font, sizeList ? size.comment : size);
}
//定義塊樣式
for (var classid in syntax.blocks) {
var block = syntax.blocks[classid];
css += FCMakeCSSClass(lang + "_" + classid, block.color, block.style,
fontList ? font[classid] : font, sizeList ? size[classid] : size);
}
//定義關鍵詞樣式
for (var classid in syntax.keywords) {
var group = syntax.keywords[classid];
css += FCMakeCSSClass(lang + "_" + classid, group.color, group.style,
fontList ? font[classid] : font, sizeList ? size[classid] : size);
}
return css;
}
//--------------------------------------------------------------
//創(chuàng)建詞綴,返回詞綴定義{prefix:前綴,suffix:后綴}
//mode: 轉換模式(0:<font>模式,1:<span>模式,2:<span>模式帶css,3:[UBB]模式,默認0)
//classid: 加亮類別ID
//color: 加亮顏色
//style: 字體風格
function FCMakeAffix(mode, classid, color, style) {
if (mode == 1 || mode == 2) {
return {
prefix : "<SPAN class='" + classid + "'>",
suffix : "</SPAN>"
};
} else if (mode == 3) {
var nb = style.indexOf("b") >= 0;
var ni = style.indexOf("i") >= 0;
var nu = style.indexOf("u") >= 0;
return {
prefix : "[color=" + color + "]" + (nb?"[b]":"") + (ni?"[i]":"") + (nu?"[u]":""),
suffix : (nu?"[/u]":"") + (ni?"[/i]":"") + (nb?"[/b]":"") + "[/color]"
};
} else {
var nb = style.indexOf("b") >= 0;
var ni = style.indexOf("i") >= 0;
var nu = style.indexOf("u") >= 0;
return {
prefix : "<FONT color='" + color + "'>" + (nb?"<B>":"") + (ni?"<I>":"") + (nu?"<U>":""),
suffix : (nu?"</U>":"") + (ni?"</I>":"") + (nb?"</B>":"") + "</FONT>"
};
}
}
//--------------------------------------------------------------
//對給定字符串進行HTML編碼
//str: 要被編碼的字符串
function FCHtmlEncode(str) {
return str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
}
//--------------------------------------------------------------
//對給定字符串進行UBB編碼
//str: 要被編碼的字符串
function FCUbbEncode(str) {
return str.replace(/\[/g, "[").replace(/\]/g, "]");
}
//--------------------------------------------------------------
//轉換源代碼到HTML加亮代碼,返回轉換后代碼,如果語言不存在則返回null
//srcCode: 需要被轉換的源代碼
//lang: 轉換所用的語法加亮規(guī)則的語言ID
//mode: 轉換模式(默認0)
function FCTranslate(srcCode, lang, mode) {
var syntax = FCSyntaxDef[lang];
if (syntax == null) return null;
var src = srcCode.split("\r\n");
var encode = mode == 3 ? FCUbbEncode : FCHtmlEncode;
//定義普通文本加亮詞綴
var affix = FCMakeAffix(mode, lang + "_Default", syntax.color, syntax.style);
var defPref = affix.prefix, defSuff = affix.suffix;
//定義注釋加亮詞綴
var comments = syntax.comments;
if (comments.length > 0) {
var affix = FCMakeAffix(mode, lang + "_Comments", syntax.cmtcolor, syntax.cmtstyle);
var cmtPref = affix.prefix, cmtSuff = affix.suffix;
}
//定義塊加亮詞綴
var blkBegin = [], blkEnd = [], blkEsc = [], blkLines = [], blkPref = [], blkSuff = [];
for (var classid in syntax.blocks) {
var block = syntax.blocks[classid];
blkBegin.push(block.begin);
blkEnd.push(block.end);
blkEsc.push(block.escape);
blkLines.push(block.lines);
var affix = FCMakeAffix(mode, lang + "_" + classid, block.color, block.style);
blkPref.push(affix.prefix);
blkSuff.push(affix.suffix);
}
//定義關鍵詞加亮詞綴表
var keywords = [], kwPref = [], kwSuff = [];
for (var classid in syntax.keywords) {
var group = syntax.keywords[classid];
keywords.push(group.list);
var affix = FCMakeAffix(mode, lang + "_" + classid, group.color, group.style);
kwPref.push(affix.prefix);
kwSuff.push(affix.suffix);
}
//斷詞轉換
var delim = syntax.delimiters;
for (var index = 0, index2 = 0; index < src.length; index++, index2++) {
var code = src[index];
var htmlCode = "";
for (var pos1 = 0, pos2 = 0, ch = null, flag = 0; ch != ""; pos2++) {
ch = code.substr(pos2, 1);
if (ch != "" && flag == 0 && delim.indexOf(ch) < 0) continue;
//如果為持續(xù)文本則繼續(xù),否則截斷(flag:0文本,1空格,2標點)
if (pos2 <= pos1) {
flag = ch.match(/s/g) ? 1 : 2;
continue;
}
var word = code.substr(pos1, pos2 - pos1); //截取詞
if (flag == 1) { //空格
htmlCode += word;
} else {
if (flag == 2) { //標點
//判別注釋
for (var i in comments) {
if (code.substr(pos1, comments[i].length) != comments[i]) continue;
htmlCode += cmtPref + encode(code.substr(pos1)) + cmtSuff;
word = "";
break;
}
if (word == "") break;
//判別塊
for (var i in blkBegin) {
if (code.substr(pos1, blkBegin[i].length) != blkBegin[i]) continue;
var end = blkEnd[i], esc = blkEsc[i];
for (pos2 = pos1 + blkBegin[i].length; pos2 = code.indexOf(end, pos2);) {
if (pos2 < 0) {
if (blkLines[i] && index < src.length - 1) {
pos2 = code.length + 2;
code += "\r\n" + src[++index];
continue;
}
htmlCode += blkPref[i] + encode(code.substr(pos1)) + blkSuff[i];
word = "";
break;
} else if (esc == null || code.substr(pos2 - esc.length, esc.length) != esc) {
pos2 += end.length;
break;
}
pos2 += end.length;
}
if (pos2 >= 0) {
htmlCode += blkPref[i] + encode(code.substr(pos1, pos2 - pos1)) + blkSuff[i];
flag = 0;
pos1 = pos2;
pos2--;
word = "0";
}
break;
}
if (word == "") break;
else if (word == "0") continue;
}
//關鍵字加亮
var w = encode(word);
for (var i in keywords) {
if (keywords[i].indexOf(" " + word + " ") < 0) continue;
htmlCode += kwPref[i] + w + kwSuff[i];
word = "";
break;
}
if (word != "") htmlCode += w;
}
flag = delim.indexOf(ch) < 0 ? 0 : ch.match(/s/g) ? 1 : 2;
pos1 = pos2;
}
src[index2] = htmlCode;
}
src.splice(index2, src.length);
var values = "<TABLE style=\"FONT-SIZE: 12px;BORDER-RIGHT: #cccccc 1px dotted; TABLE-LAYOUT: fixed; BORDER-TOP: #cccccc 1px dotted; BORDER-LEFT: #cccccc 1px dotted; BORDER-BOTTOM: #cccccc 1px dotted\" cellSpacing=0 cellPadding=6 width=\"95%\" align=center border=0>";
values += "<TR><TD style=\"WORD-WRAP: break-word\" bgColor=#fdfddf>";
values += "<PRE>" + defPref + src.join("\r\n") + defSuff + "<PRE>";
values += "</TD></TR></TABLE>"
return values;
}
//--------------------------------------------------------------
//還原HTML加亮代碼到源代碼,返回還原后的代碼
//htmlCode: 需要被還原的HTML代碼
function FCRevert(htmlCode) {
}
//--------------------------------------------------------------
//生成預覽窗口并居中屏幕顯示
//title: 窗口標題
//content: 預覽的HTML文本內容
//wndWidth: 窗口寬度(默認640)
//wndHeight: 窗口高度(默認480)
function FCPreview(title, content, wndWidth, wndHeight) {
if (!(wndWidth > 0)) wndWidth = 640;
if (!(wndHeight > 0)) wndHeight = 480;
var left = (screen.width - wndWidth) / 2;
var top = (screen.height - wndHeight) / 2;
var previewWnd = window.open("", "FCPreviewWnd", "scrollbars=yes,resizable=yes,menubar=yes,"
+ "width=" + wndWidth + ",height=" + wndHeight + ",left=" + left + ",top=" + top
+ ",screenX=" + left + ",screenY=" + top);
previewWnd.document.write("<HTML><HEAD><TITLE>" + title + "</TITLE></HEAD>\r\n<BODY leftmargin='0'"
+ " topmargin='0' marginwidth='0' marginheight='0'><TABLE width='200'><TR><TD><PRE>\r\n"
+ content + "\r\n</PRE></TD></TR></TABLE></BODY></HTML>");
}
//--------------------------------------------------------------
//生成語法加亮規(guī)則的選項列表
//selectLang: 默認選中的語言ID(默認選中第一項)
function FCSyntaxOptions(selectLang) {
for (var i in FCSyntaxDef) {
if (selectLang == null) selectLang == i;
document.write('<OPTION value="' + i + '"' + (selectLang == i ? ' selected' : '')
+ '>' + FCSyntaxDef[i].name + '</OPTION>');
}
}
//--------------------------------------------------------------
//檢測語法加亮規(guī)則定義集合
if (typeof(FCSyntaxDef) == "undefined") {
FCSyntaxDef = {};
} else {
FCCheckSyntaxDef();
}
//--------------------------------------------------------------
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -