直转是高亮版,IE+FF+Cr测试通过:
代码:
程序代
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
「 http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd 」
<html xmlns=" http://www.w3.org/1999/xhtml ">
<頭>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>プレ(アル)</title>
<style type="text/css">
pre.preh{font-family:Consolas,"Lucida Console",等幅;}
pre.preh ol{ボーダー:1px ソリッド #ddd;マージン:0;パディング:0 0 0 4em;カラー:グレー;}
pre.preh ol li{line-height:1.75em;border-bottom:1pxソリッド#ddd;border-left:1pxソリッド#ddd;}
pre.preh ol li span{color:black;white-space:pre;}
pre.preh ol li spapanspan.regexp{背景:緑;色:白}
pre.preh ol li span em{color:blue;font-style:normal;}
pre.preh ol li span var.object{color:red}
pre.preh ol li span var.method_property{color:orange}
pre.preh ol lispan.comments{color:#aaa}
pre.preh li var{color:blue;font-style:normal;}
pre.preh li q{color:green;}
q:before{コンテンツ:なし;表示:なし;}
</スタイル>
<!--[IE の場合]> <style>pre.preh{font-family:fixedsys,monospace}</style> <![endif]-->
<スクリプト>
//キーワード
var キーワード = {js:{},html:{},css:{}};
キーワード.js.keys="アブストラクト ブレーク バイト ケース キャッチ char クラス const 継続 デフォルト 削除 do double else extends false 最終的に関数 goto の float if 実装する場合、instanceof int インターフェイスでインポート ロング ネイティブ null パッケージ プライベート 保護 パブリック リセット リターン ショート 静的 スーパー スイッチ 同期これは一時的な true try var void while with" をスローします。
キーワード.js.objects="アンカー アプレット領域 引数 配列 ブール値 ボタン チェックボックス コレクション 暗号化日付辞書 ドキュメント ドライブ ドライブ 要素列挙子 イベント ファイル FileObject FileSystemObject FileUpload フォルダー フォルダー フォーム フレーム関数 グローバル非表示履歴 HTMLElement 画像 Infinity 入力 JavaArray JavaClass JavaObject JavaPackage JSObject Layer Link Math MimeTypeナビゲータ番号 オブジェクト オプション パッケージ パスワード プラグイン PrivilegeManager ランダム RegExp 画面 文字列の選択 テキストの送信 テキストエリア URL VBArray ウィンドウ WScript";
キーワード.js.properties="abs acos アクションの activeElement アラート alinkColor すべて altKey アンカー アンカー appCodeName アプレット apply appName appVersion 引数 arity asin assign atan atan2 atob availHeight availLeft availTop availWidth ActiveXObject の背景の下の bgColor 大きな点滅ぼかし太字境界線 borderWidths 下部の btoa ボタン呼び出し先caller cancelBubble CaptureEvents ceil charAt charCodeAt charset チェック済みの子クラス className Clear ClearInterval clearTimeout click clientInformation clientX clientY close close colorDepth コンパイル完了 concat verify コンストラクタにコンテキスト Cookie が含まれている cos crypto ctrlKey 現在のデータ defaultCharset defaultCheckeddefaultSelecteddefaultStatusdefaultValue description disableExternalCapture disablePrivilege ドキュメント ドメイン E Echo 要素要素の埋め込み有効Plugin EnableExternalCapture EnablePrivilege エンコーディング Eval イベント exec exp Expando FromPoint fgColor fileName 固定フロア フォーカスの検索 fontColor fontSize フォーム フォーム フォワード フレーム fromCharCode fromElement getAttribute getClass getDate getDay getFull Year getHours getMember getMilli Seconds getMinutes getMonth getSeconds getSelection getSlot getTime getTimezoneOffset getUTCDate getUTCDay getUTCFull Year getUTCHours getUTCMilli Second s getUTCMinutes getUTCMonth getUTCSeconds getWindow get Year global go HandleEvent Height ハッシュ 非表示履歴 ホーム ホスト hostName href hspace id idsignore ケース画像のインデックスindexOf inner innerHTML innerText innerWidth insertAdjacentHTML insertAdjacentText isFinite isNAN italics java javaEnabled join keyCode Links LN10 LN2 LOG10E LOG2E lang language lastIndex lastIndexOf lastMatch lastModified lastParen レイヤー LayerX LayerY left leftContext length link linkColor ロード位置 locationBar log lowsrc MAX_VALUE MIN_VALUE margins match max menubar method mimeTypes min modifiers moveAbove moveBelow moveBy moveTo moveToAbsolute multiline NaN NEGATIVE_INFINITY name navigate navigator netscape nextnumber offscreenBuffering offset offsetHeight offsetLeft offsetParent offsetTop offsetWidth offsetX offsetY onabort onchange onclick ondblclick ondragdrop onerror onfocus onHelpキーを押すと下へonkeyup onload onmousedown onmousemove onmouseout onmouseover onmouseup onmove onreset onresize onsubmit onunload open opener options innerHeight innerHTML innerText innerWidth POSITIVE_INFINITY PI パディング pageX pageXOffset pageY pageYOffsetparentparentElementparentLayerparentWindowparseparseFloatparseIntpathnamepersonalbarpixelDepthプラットフォームプラグインpopportpowpreferencepreviousprintpromptprototypepushrandom準備完了状態理由リファラー更新 releaseEvents リロード RemoveAttribute RemoveMember replacesizeBysizeTo returnValue reverse right rightcontextround SQRT1_2 SQRT2 screenX screenY スクロール スクロールバーscrollByscrollIntoViewscrollTo search select selectedselectedIndex self setAttribute setDay setFull Year setHotkeys setInterval setMember setMilli Seconds setMonth setResizable setSeconds setSlot setTimeout setUTCD食べた setUTCFull Year setUTCHours setUTCMillseconds setUTCMins setUTCMonth setUTCSeconds setyear setZOptions shftshiftKey siblingAbovesiblingBelowsignText sin スライス smallsort ソース ソースインデックス スプライス スプリット sqrt src srcElement srcFilter ステータス ステータスバー ストップ ストライク スタイル サブ サブミット サブストリング サブストリング サフィックス サン sup システム言語 TYPE タグ名 タグ テイント taintEnabled Tan ターゲット テスト テキスト タイトル toElement toGMTString toLocaleString toLowerCase ツールバーtoString to大文字toUTCString type typeOf UTC unescape unshift untaint unwatch userAgent userLanguage value valueOf Visibility vlinkColor vspace watch どの幅のウィンドウが writeln zIndex";
関数 htmlEncode(strS){
return strS.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">");
}
関数htmlEncodef(c){
return c=="&"?'&':(c=="<"?'<':(c=='>'?'>':c));
}
関数htmlEncodefl(c){
return c=="&"?5:(c=="<"||c=='>'?4:1);
}
関数html2txt(strS){
return strS.replace(/</g,"<").replace(/>/g,">").replace(/ /g," ").replace(/<br/?>/g," rn").replace(/&/g,"&").replace(/<.+?>/g,"");
}
var レクサー = {}
lexers.js = {
regKW:new RegExp("^("+keywords.js.keys.replace(/ /g,"|")+")$","g"),
regObj:new RegExp("^("+keywords.js.objects.replace(/ /g,"|")+")$","g"),
regMP:new RegExp("^("+keywords.js.properties.replace(/ /g,"|")+")$","g"),
clKW: '<em>$1</em>',
clObj:'<var class="object">$1</var>',
clMP:'<var class="method_property">$1</var>',
lex:関数{
var str=" ", c="",word='',lastState="", seq, intNextQuote, intTemp, intCount, intWordStart,glbStr=s,i;
glbStr=glbStr.replace(/r|n/g,'rn');
glbStr=glbStr.replace(/rnrn/g,'rn');
for(i=0;i<glbStr.length;i++){
c=glbStr.charAt(i);
スイッチ(c){
場合 """:
str+=htmlEncodef(c);
intNextQuote=i;
while(intNextQuote!=-1&&intNextQuote<glbStr.length){
intNextQuote=glbStr.indexOf(""",intNextQuote+1);
if(intNextQuote==-1||glbStr.charAt(intNextQuote-1)!=" \")break ;
intCount=0; intTemp=intNextQuote;
while(glbStr.charAt(--intTemp)==" \")intCount ++;
if(intCount%2==0)break;
}
if(intNextQuote==-1)break;
str+="<q>"+htmlEncode(glbStr.substring(i+1,intNextQuote))+"</q>"";
i=intNextQuote;
lastState="";
壊す;
場合 "'":
str+=htmlEncodef(c);
intNextQuote=i;
while(intNextQuote!=-1&&intNextQuote<glbStr.length){
intNextQuote=glbStr.indexOf("'",intNextQuote+1);
if(intNextQuote==-1||glbStr.charAt(intNextQuote-1)!=" \")break ;
intCount=0; intTemp=intNextQuote;
while(glbStr.charAt(--intTemp)==" \")intCount ++;
if(intCount%2==0)break;
}
if(intNextQuote==-1)break;
str+="<q>"+htmlEncode(glbStr.substring(i+1,intNextQuote))+"</q>'";
i=intNextQuote;
lastState="";
壊す;
場合 "/":
str+=htmlEncodef(c);
if(glbStr.charAt(i+1)=="/"){
intNextQuote=i;
intNextQuote=glbStr.indexOf('rn',intNextQuote+1);
if(intNextQuote==-1)intNextQuote=glbStr.length;
str=str.substring(0,str.length-1);
str+="<span class="comments">/"+htmlEncode(glbStr.substring(i+1,intNextQuote))+"</span>";
i=intNextQuote;
}else if(glbStr.charAt(i+1)=="*"){
intNextQuote=i;
intNextQuote=glbStr.indexOf("*/",intNextQuote+1);
if(intNextQuote==-1)return;
str=str.substring(0,str.length-1);
str+="<span class="comments">/"+htmlEncode(glbStr.substring(i+1,intNextQuote))+"*/</span>";
i=intNextQuote+1;
}else if(str.match(/(?:(?:[!=(]|</var>|[|,|n|:)[ t]*/$)|^ n?[t ]*/$/)){
intNextQuote=i;
while(intNextQuote!=-1&&intNextQuote<glbStr.length){
intNextQuote=glbStr.indexOf("/",intNextQuote+1);
if(intNextQuote==-1||glbStr.charAt(intNextQuote-1)!=" \")break ;
intCount=0;intTemp=intNextQuote;
while(glbStr.charAt(--intTemp)==" \")intCount ++;
if(intCount%2==0)break;
}
if(intNextQuote==-1)break;
str+="<span class="regexp">"+htmlEncode(glbStr.substring(i+1,intNextQuote))+"</span>/";
i=intNextQuote;
lastState="";
}
lastState="";
壊す;
デフォルト:
if(c.match(/w/))word+=c; //一言で言えば
if(c.match(/W/)){
if(単語!='')
str+=word.replace(this.regKW,this.clKW).replace(this.regObj,this.clObj).replace(this.regMP,this.clMP) + htmlEncodef(c)
else str+=htmlEncodef(c);
単語 = '';
}
lastState="";
壊す;
}
}
return str.replace(/(s*r?n)+$/,'');
}
};
関数 str2styled(x,言語){
var _A = lexers[言語].lex(html2txt(x)).split(/n/);
for(i=0;i<_A.length;i++){_A[i] = '<li><span>'+_A[i].replace(/r/g,'').replace(/ t/g,' ').replace(/ /g,' ')+'</span></li>';}
return '<ol>'+_A.join('')+'</ol>';
}
var $ = function(e){return document.getElementById(e)};
window.onload = function(){
var pres = document.getElementsByTagName('pre');
for(k=0;k<pres.length;k++)if(pres[k].className.match(/bprehb/))
pres[k].innerHTML = str2styled(pres[k].innerHTML,'js')
}
</script>
</head>
<本文>
<pre id="test" class="preh js">
var point = function(){
this.x = 1;
this.y = 2;
this.valueOf = function(){return 'Point:('+x+','+y+')'};
}
if(c<2)f()
var P = 新しいポイント();
アラート(P.valueOf());
var rex_factory = function(){return {x:/re/g,y:/rere/g,z:[/re/,/rere/,/rerere/]}};
</pre>
<pre id="test2" class="preh js">
another = 'これは別の例です'
</pre>
</body>
</html>