dw如何html叠加展开编辑,仿DW8代码折叠的HTML编辑器

这是一个介绍如何开发一个支持代码折叠、智能缩进、预览等功能的HTML编辑器的博客。该编辑器专为IE5.5+浏览器设计,具备动态分析和智能折叠代码的能力,支持快捷键操作,如Ctrl+Enter强制重建,Ctrl+T替换制表符,以及回车自动缩进等。同时,文章也列出了编辑器的一些限制和未来改进方向。
摘要由CSDN通过智能技术生成

a4c26d1e5885305701be709a3d33442f.png

仿DW8代码折叠的HTML编辑器

(2006-05-05 00:50:00)

测试版(仅支持ie5.5+,且一个页面里只能放一个)

收集意见

功能:

1.动态分析,智能折叠,ctrl+Enter强制重建

2.tab键输出两个空格(若选区为多行,各行前加入两空格,同时按shift键反之),Ctrl+T替换\t为俩空格

3.回车自动缩进

4.Ctrl+W预览

限制:

1.取消了右键菜单(复制剪切粘贴可使用键盘)

2.暂不支持文本拖放

3.Ctrl+Z将撤销所有操作

4.块起止测试并不严格,且未考虑vbscript

5.运行效率有待改进

运行代码框

border:none; border:1px solid #666666; } #oTxt{ width:740px;

color:#333333; background-color:#f0f0f0; font-family:verdana;

font-size:11px; line-height:13px; margin-left:16px; overflow:auto;

border-left:none; scrollbar-arrow-color:#666666;

scrollbar-base-color:#666666; scrollbar-darkshadow-color:#f0f0f0;

scrollbar-face-color:#f0f0f0; } #oBox{ position:absolute;

width:15px; overflow-y:hidden; background-color:#e0e0e0;

padding-top:1px; margin-top:1px; padding-bottom:19px;

border-right:none; }

测试版(仅支持ie5.5+,且一个页面里只能放一个) 收集意见 功能:

1.动态分析,智能折叠,ctrl+Enter强制重建

2.tab键输出两个空格(若选区为多行,各行前加入两空格,同时按shift键反之),Ctrl+T替换\t为俩空格

3.回车自动缩进 4.Ctrl+W预览 限制:

1.取消了右键菜单(复制剪切粘贴可使用键盘) 2.暂不支持文本拖放

3.Ctrl+Z将撤销所有操作 4.块起止测试并不严格,且未考虑vbscript

5.运行效率有待改进 */ window.οnlοad=function(){

oBox.mLine="http://free.txd.cn/mozart0/img/line.gif";

oBox.mPlus="http://free.txd.cn/mozart0/img/plus.gif";

oBox.mMinus="http://free.txd.cn/mozart0/img/minus.gif";

oBox.mEnd="http://free.txd.cn/mozart0/img/end.gif";

oBox.isPlus=function(o){ return /plus\./.test(o.src); }

oBox.isMinus=function(o){ return /minus\./.test(o.src); }

oBox.isLine=function(o){ return /line\./.test(o.src); }

oBox.isEnd=function(o){ return /end\./.test(o.src); }

oBox.childrenVisible=function(index){ var t=this.children[index];

while(t.style.display=="none") t=t.nextSibling; var

x=t.offsetTop/t.height; while(x

if(t.style.display!="none") x++; } return t; }

oBox.hideBlock=function(index){ var n=1,x=1; var c=this.children;

c[index].src=this.mPlus; while(++index

t=c[index]; if(t.style.display!="none"){ x++;

t.style.display="none"; } if(this.isEnd(t)) n--; else

if(!this.isLine(t)) n++; } return x; }

oBox.showBlock=function(index,b){ var index0=index,c=oBox.children;

c[index].src=b?this.mMinus:this.mPlus;

c[index].style.display="block"; index++; if(b)

while(index

t.style.display="block"; index++; } else if(this.isEnd(t)){

t.style.display="block"; break; } else

index+=this.showBlock(index,this.isMinus(t)) } else{ var n=1;

while(index

if(this.isEnd(t)){ if(--n==0) break; } else if(!this.isLine(t))

n++; index++; } } return index-index0+1; }

oBox.refresh=function(o,str){ o.src=this.judge(str);

o.storeText=str; } oBox.judge=function(s){ var

l=/\{/.test(s),r=/\}/.test(s); if(l&&!r) return

this.mMinus; if(!l&&r) return this.mEnd;

s=s.replace(/<(\w+).*<\/\1>/g,"<$1/>");

l=/^\s*<\w+[^\/]+[>\r]/.test(s); r=/\/>/.test(s);

if(l&&!r) return this.mMinus; r=/<\/\w+>/.test(s);

if(r) return this.mEnd; return this.mLine; }

oBox.οnclick=function(){ var o=event.srcElement; if(o==this)

return; var vIndex=(o.offsetTop-1)/oTxt.lineHeight; var

index=vIndex; var t=this.children[vIndex]; while(t!=o){

t=t.nextSibling; index++; } if(this.isMinus(o))

oTxt.hideLines(vIndex,this.hideBlock(index)); else

if(this.isPlus(o))

oTxt.showLines(vIndex,this.showBlock(index,true));

oBox.scrollTop=oTxt.scrollTop; } oTxt.lineHeight=13;

oTxt.strSpecial="......"; oTxt.regSpecial=/\.{6}\r?$/;

oTxt.strTab=" "; oTxt.bFixed=false; oTxt.originalValue=oTxt.value;

oTxt.trueValue=function(){ for(var

s="",c=oBox.children,i=0;i

s+=c[i].storeText+"\n"; return s+c[i].storeText; }

oTxt.lineNumber=function(r){ var t=this.createTextRange(); return

Math.round((r.boundingTop-t.boundingTop)/this.lineHeight); }

oTxt.rngAtHome=function(r){ var t=this.createTextRange(); return

r.boundingLeft==t.boundingLeft&&r.boundingTop==t.boundingTop;

} oTxt.rngAtEnd=function(r){ var t=this.createTextRange();

t.collapse(false); return

r.boundingLeft==t.boundingLeft&&r.boundingTop==t.boundingTop;

} oTxt.hideLines=function(ifrom,n){ var a=this.value.match(/.+/mg);

for(var i=1;i

a[ifrom]=a[ifrom].replace(/\r/,this.strSpecial);

if(ifrom+n

oTxt.showLines=function(ifrom,n){ var a=this.value.match(/.+/mg);

var t=oBox.childrenVisible(ifrom).nextSibling; for(var

s="",i=0;t&&i

if(t.style.display!="none"){ if(!oBox.isPlus(t)) s+=t.storeText;

else s+=t.storeText.replace(/\r?$/,this.strSpecial+"\r"); }

a[ifrom]=a[ifrom].replace(this.regSpecial,"\r"+s);

this.value=a.join(""); } oTxt.οndrag= oTxt.οndrοp=

oTxt.οncοntextmenu=function(){ return false; }

oTxt.οnscrοll=function(){ oBox.scrollTop=this.scrollTop; }

oTxt.οnkeydοwn=function(){

if(event.keyCode>=33&&event.keyCode<=40) return true;

var r=document.selection.createRange(); var

t=oBox.childrenVisible(this.lineNumber(r)); if(!r.text){

if(oBox.isPlus(t)) return false; } else{ var

n=Math.floor(r.boundingHeight/this.lineHeight); for(var

i=0,t1=t.nextSibling;i

if(t1.style.display=="none") return false; } this.bFixed=false; var

k=event.keyCode; if(k==9){ //Tab var r1=r.duplicate();

if(r.boundingHeight>this.lineHeight){ if(!event.shiftKey){

r.text=r.text.replace(/^(.)/mg,this.strTab+"$1"); for(var

i=0,t1=t;i

t1.storeText=this.strTab+t1.storeText; } else{ var reg=new

RegExp("^"+this.strTab,"mg"); r.text=r.text.replace(reg,"");

for(var i=0,t1=t;i

t1.storeText=t1.storeText.replace(reg,""); }

r.setEndPoint("StartToStart",r1) r.select(); this.bFixed=true; }

else fix(r,this.strTab); return false } if(k==13){ //Enter

if(event.ctrlKey) build(); else{ var r1=r.duplicate(); var

x=this.createTextRange(); this.scrollLeft=0;

r1.moveToPoint(x.offsetLeft,r.offsetTop);

r1.setEndPoint("EndToStart",r);

fix(r,"\r\n"+r1.text.replace(/\S.*/,"")); } return false; }

if(k==46){ //Del if(!r.boundingWidth){ if(this.rngAtEnd(r)){

this.bfixed=true; return; } r.moveEnd("character",1); } fix(r,"");

return false; } if(k==8){ //BackSpace if(!r.boundingWidth){

if(this.rngAtHome(r)){ this.bfixed=true; return true; }

r.moveStart("character",-1); } fix(r,""); return false; }

if(k==87){ //ctrl+W if(!event.ctrlKey) return true; try{

this.win.navigate("about:blank"); } catch(e){

this.win=window.open("about:blank"); }

this.win.document.write(this.trueValue()); this.win.focus();

this.win.document.close(); return false; } if(k==84){ //Ctrl+T

if(!event.ctrlKey) return true;

this.value=this.value.replace(/\t/g,this.strTab); for(var

i=0,c=oBox.children;i

c[i].storeText=c[i].storeText.replace(/\t/g,this.strTab);

oTxt.bFixed=true; return false; } if(k==86){ //Ctrl+V

if(!event.ctrlKey) return true;

fix(r,clipboardData.getData("text")); return false; } if(k==88){

//Ctrl+X if(!event.ctrlKey||!r.boundingWidth) return true; var

s=r.text; if(!s) for(var

i=0,n=Math.floor(r.boundingHeight/this.lineHeight);i

s+="\r\n"; else{ var r1=r.duplicate(); r1.moveEnd("character",1);

if(r.text==r1.text&&r.boundingTop==r1.boundingTop)

s+="\r\n"; } clipboardData.setData("text",s); fix(r,""); return

false; } if(k==90){ //Ctrl+Z if(!event.ctrlKey) return true;

this.value=this.originalValue; build(); return false; } return

true; } oTxt.οnkeyup=function(){ if(this.bFixed) return; var

k=event.keyCode;

if(k==32||k>=48&&k<=111||k>=186&&k<=192||k>=219&&k<=222){

var n=this.lineNumber(document.selection.createRange());

oBox.refresh(oBox.childrenVisible(n),this.value.split("\n")[n]); }

} function fix(rng,str){ oTxt.bFixed=true; var

t0=oTxt.lineNumber(rng); var

t1=t0+Math.floor(rng.boundingHeight/oTxt.lineHeight); rng.text=str;

rng.select(); var t2=oTxt.lineNumber(rng)+1; var

a=oTxt.value.split("\n"); var o=oBox.childrenVisible(t0);

if(t1<=t2){ for(i=t0;i

oBox.refresh(o,a[i]); for(i=t2-1;i>=t1;i--)

oBox.refresh(o=oBox.insertBefore(new Image(),o),a[i]); } else{

for(i=t0;i

for(;i

o=next; } } while(a.length

next=o.nextSibling; oBox.removeChild(o); o=next; }

oBox.scrollTop=oTxt.scrollTop; } function build(){

oBox.innerHTML=""; if(!oTxt.value) return; var

a=oTxt.value.split("\n"); for(var i=0;i

oBox.refresh(oBox.appendChild(new Image()),a[i]); oTxt.bFixed=true;

} build(); }

fix(rng,str){ oTxt.bFixed=true; var t0=oTxt.lineNumber(rng); var

t1=t0+Math.floor(rng.boundingHeight/oTxt.lineHeight); rng.text=str;

rng.select(); var t2=oTxt.lineNumber(rng)+1; var

a=oTxt.value.split("\n"); var o=oBox.childrenVisible(t0);

if(t1<=t2){ for(i=t0;i

oBox.refresh(o,a[i]); for(i=t2-1;i>=t1;i--)

oBox.refresh(o=oBox.insertBefore(new Image(),o),a[i]); } else{

for(i=t0;i

for(;i

o=next; } } while(a.length

next=o.nextSibling; oBox.removeChild(o); o=next; }

oBox.scrollTop=oTxt.scrollTop; } function build(){

oBox.innerHTML=""; if(!oTxt.value) return; var

a=oTxt.value.split("\n"); for(var i=0;i

oBox.refresh(oBox.appendChild(new Image()),a[i]); oTxt.bFixed=true;

}

Hello world


style="text-align:right;font-size:11px;font-family:tahoma"> by

mozart0@2005.12.26 qq76239711

href="mailto:mozart0@etang.com">mozart0@etang.com

[ 可以先修改再运行 ]

更新记录

--------------

加入检验,阻止对带+号行的编辑

得hack38提醒,修正了输入汉字时的行数计算错误

分享:

a4c26d1e5885305701be709a3d33442f.png喜欢

0

a4c26d1e5885305701be709a3d33442f.png赠金笔

加载中,请稍候......

评论加载中,请稍候...

发评论

登录名: 密码: 找回密码 注册记住登录状态

昵   称:

评论并转载此博文

a4c26d1e5885305701be709a3d33442f.png

发评论

以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值