现在的位置: 首页 > 综合 > 正文

Javascript N层对称标记算法的实现 By shawl.qiu

2013年09月03日 ⁄ 综合 ⁄ 共 10833字 ⁄ 字号 评论关闭

Javascript N层对称标记算法的实现 By shawl.qiu

说明:
本算法是鄙人在弄一个叫 Styler 的类时弄的, 不过后来发现, 可以使用在许多地方...

主要就是以特定规律标记各层的成对出现.
比如 {{}}
可以标记为 brace1begin brace2begin brace2end brace1end

现在主要是使用在鄙人的 Styler(v.1.3尚未发布) 类 和 Highlights类(尚未发布)

shawl.qiu
2007-08-22
http://blog.csdn.net/btbtd

内容:

<!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">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>shawl.qiu template</title>
<style type="text/css">
/* <![CDATA[ */

/* ]]> */
</style>
<script type="text/javascript">
/*<![CDATA[*/
 if (navigator.appName=="Microsoft Internet Explorer") 
 {
  //最大化窗口
  self.moveTo(-5,-5)
  self.resizeTo(screen.availWidth +8,screen.availHeight+8)
  //这个脚本定义的宽度其实比原窗口还要大那么一点.
 }
/*]]*/
</script>
</head>
<body>
<script type="text/javascript">
/*<![CDATA[*/
var Nodes =
 [
 ,"SQSTRUCTURE0/n"
 ,"<html>/n"
 ,"SQCONTENT0/n"
 ,"<head><div><div><div></div></div></div>/n"
 ,"SQCONTENT1/n"
 ,"<title>/n"
 ,"SQCONTENT2/n"
 ,"<//title><a><a></a></a>/n"
 ,"SQCONTENT3/n"
 ,"<//head>/n"
 ,"SQCONTENT4/n"
 ,"<body>/n"
 ,"SQCONTENT5/n"
 ,"<table>/n"
 ,"SQCONTENT6/n"
 ,"<tr>/n"
 ,"SQCONTENT7/n"
 ,"<td>/n"
 ,"SQCONTENT8/n"
 ,"<a>/n"
 ,"SQCONTENT9/n"
 ,"<//a>/n"
 ,"SQCONTENT10/n"
 ,"<a>/n"
 ,"SQCONTENT11/n"
 ,"<//a>/n"
 ,"SQCONTENT12/n"
 ,"<a>/n"
 ,"SQCONTENT13/n"
 ,"<//a>/n"
 ,"SQCONTENT14/n"
 ,"<a>/n"
 ,"SQCONTENT15/n"
 ,"<//a>/n"
 ,"SQCONTENT16/n"
 ,"<//td>/n"
 ,"SQCONTENT17/n"
 ,"<td>/n"
 ,"SQCONTENT18/n"
 ,"<a>/n"
 ,"SQCONTENT19/n"
 ,"<//a>/n"
 ,"SQCONTENT20/n"
 ,"<//td>/n"
 ,"SQCONTENT21/n"
 ,"<//tr>/n"
 ,"SQCONTENT22/n"
 ,"<tr>/n"
 ,"SQCONTENT23/n"
 ,"<td>/n"
 ,"SQCONTENT24/n"
 ,"<div>/n"
 ,"SQCONTENT25/n"
 ,"<A>/n"
 ,"SQCONTENT26/n"
 ,"<//A>/n"
 ,"SQCONTENT27/n"
 ,"<//div>/n"
 ,"SQCONTENT28/n"
 ,"<//td>/n"
 ,"SQCONTENT29/n"
 ,"<//tr>/n"
 ,"SQCONTENT30/n"
 ,"<tr>/n"
 ,"SQCONTENT31/n"
 ,"<td>/n"
 ,"SQCONTENT32/n"
 ,"<div>/n"
 ,"SQCONTENT33/n"
 ,"<form>/n"
 ,"SQCONTENT34/n"
 ,"<//form>/n"
 ,"SQCONTENT35/n"
 ,"<form>/n"
 ,"SQCONTENT36/n"
 ,"<//form>/n"
 ,"SQCONTENT37/n"
 ,"<//div>/n"
 ,"SQCONTENT38/n"
 ,"<//td>/n"
 ,"SQCONTENT39/n"
 ,"<//tr>/n"
 ,"SQCONTENT40/n"
 ,"<tr>/n"
 ,"SQCONTENT41/n"
 ,"<td>/n"
 ,"SQCONTENT42/n"
 ,"<div>/n"
 ,"SQCONTENT43/n"
 ,"<//div>/n"
 ,"SQCONTENT44/n"
 ,"<//td>/n"
 ,"SQCONTENT45/n"
 ,"<//tr>/n"
 ,"SQCONTENT46/n"
 ,"<//table>/n"
 ,"SQCONTENT47/n"
 ,"<table>/n"
 ,"SQCONTENT48/n"
 ,"<tr>/n"
 ,"SQCONTENT49/n"
 ,"<td>/n"
 ,"SQCONTENT50/n"
 ,"<div>/n"
 ,"SQCONTENT51/n"
 ,"<div>/n"
 ,"SQCONTENT52/n"
 ,"<label>/n"
 ,"SQCONTENT53/n"
 ,"<//label>/n"
 ,"SQCONTENT54/n"
 ,"<ul>/n"
 ,"SQCONTENT55/n"
 ,"<li>/n"
 ,"SQCONTENT56/n"
 ,"<//li>/n"
 ,"SQCONTENT57/n"
 ,"<li>/n"
 ,"SQCONTENT58/n"
 ,"<//li>/n"
 ,"SQCONTENT59/n"
 ,"<li>/n"
 ,"SQCONTENT60/n"
 ,"<//li>/n"
 ,"SQCONTENT61/n"
 ,"<li>/n"
 ,"SQCONTENT62/n"
 ,"<//li>/n"
 ,"SQCONTENT63/n"
 ,"<li>/n"
 ,"SQCONTENT64/n"
 ,"<//li>/n"
 ,"SQCONTENT65/n"
 ,"<li>/n"
 ,"SQCONTENT66/n"
 ,"<//li>/n"
 ,"SQCONTENT67/n"
 ,"<li>/n"
 ,"SQCONTENT68/n"
 ,"<//li>/n"
 ,"SQCONTENT69/n"
 ,"<li>/n"
 ,"SQCONTENT70/n"
 ,"<//li>/n"
 ,"SQCONTENT71/n"
 ,"<li>/n"
 ,"SQCONTENT72/n"
 ,"<//li>/n"
 ,"SQCONTENT73/n"
 ,"<//ul>/n"
 ,"SQCONTENT74/n"
 ,"<//div>/n"
 ,"SQCONTENT75/n"
 ,"<div>/n"
 ,"SQCONTENT76/n"
 ,"<a>/n"
 ,"SQCONTENT77/n"
 ,"<//a>/n"
 ,"SQCONTENT78/n"
 ,"<//div>/n"
 ,"SQCONTENT79/n"
 ,"<//div>/n"
 ,"SQCONTENT80/n"
 ,"<//td>/n"
 ,"SQCONTENT81/n"
 ,"<td>/n"
 ,"SQCONTENT82/n"
 ,"<form>/n"
 ,"SQCONTENT83/n"
 ,"<//form>/n"
 ,"SQCONTENT84/n"
 ,"<//td>/n"
 ,"SQCONTENT85/n"
 ,"<//tr>/n"
 ,"SQCONTENT86/n"
 ,"<tr>/n"
 ,"SQCONTENT87/n"
 ,"<td>/n"
 ,"SQCONTENT88/n"
 ,"<div>/n"
 ,"SQCONTENT89/n"
 ,"<div>/n"
 ,"SQCONTENT90/n"
 ,"<div>/n"
 ,"SQCONTENT91/n"
 ,"<span>/n"
 ,"SQCONTENT92/n"
 ,"<//span>/n"
 ,"SQCONTENT93/n"
 ,"<span>/n"
 ,"SQCONTENT94/n"
 ,"<//span>/n"
 ,"SQCONTENT95/n"
 ,"<span>/n"
 ,"SQCONTENT96/n"
 ,"<//span>/n"
 ,"SQCONTENT97/n"
 ,"<span>/n"
 ,"SQCONTENT98/n"
 ,"<//span>/n"
 ,"SQCONTENT99/n"
 ,"<a>/n"
 ,"SQCONTENT100/n"
 ,"<//a>/n"
 ,"SQCONTENT101/n"
 ,"<a>/n"
 ,"SQCONTENT102/n"
 ,"<//a>/n"
 ,"SQCONTENT103/n"
 ,"<a>/n"
 ,"SQCONTENT104/n"
 ,"<//a>/n"
 ,"SQCONTENT105/n"
 ,"<a>/n"
 ,"SQCONTENT106/n"
 ,"<//a>/n"
 ,"SQCONTENT107/n"
 ,"<a>/n"
 ,"SQCONTENT108/n"
 ,"<//a>/n"
 ,"SQCONTENT109/n"
 ,"<a>/n"
 ,"SQCONTENT110/n"
 ,"<//a>/n"
 ,"SQCONTENT111/n"
 ,"<a>/n"
 ,"SQCONTENT112/n"
 ,"<//a>/n"
 ,"SQCONTENT113/n"
 ,"<a>/n"
 ,"SQCONTENT114/n"
 ,"<//a>/n"
 ,"SQCONTENT115/n"
 ,"<a>/n"
 ,"SQCONTENT116/n"
 ,"<//a>/n"
 ,"SQCONTENT117/n"
 ,"<a>/n"
 ,"SQCONTENT118/n"
 ,"<//a>/n"
 ,"SQCONTENT119/n"
 ,"<a>/n"
 ,"SQCONTENT120/n"
 ,"<//a>/n"
 ,"SQCONTENT121/n"
 ,"<a>/n"
 ,"SQCONTENT122/n"
 ,"<//a>/n"
 ,"SQCONTENT123/n"
 ,"<//div>/n"
 ,"SQCONTENT124/n"
 ,"<div>/n"
 ,"SQCONTENT125/n"
 ,"<//div>/n"
 ,"SQCONTENT126/n"
 ,"<//div>/n"
 ,"SQCONTENT127/n"
 ,"<//div>/n"
 ,"SQCONTENT128/n"
 ,"<//td>/n"
 ,"SQCONTENT129/n"
 ,"<//tr>/n"
 ,"SQCONTENT130/n"
 ,"<tr>/n"
 ,"SQCONTENT131/n"
 ,"<td>/n"
 ,"SQCONTENT132/n"
 ,"<table>/n"
 ,"SQCONTENT133/n"
 ,"<tr>/n"
 ,"SQCONTENT134/n"
 ,"<td>/n"
 ,"SQCONTENT135/n"
 ,"<a>/n"
 ,"SQCONTENT136/n"
 ,"<//a>/n"
 ,"SQCONTENT137/n"
 ,"<//td>/n"
 ,"SQCONTENT138/n"
 ,"<td>/n"
 ,"SQCONTENT139/n"
 ,"<a>/n"
 ,"SQCONTENT140/n"
 ,"<//a>/n"
 ,"SQCONTENT141/n"
 ,"<//td>/n"
 ,"SQCONTENT142/n"
 ,"<td>/n"
 ,"SQCONTENT143/n"
 ,"<a>/n"
 ,"SQCONTENT144/n"
 ,"<//a>/n"
 ,"SQCONTENT145/n"
 ,"<//td>/n"
 ,"SQCONTENT146/n"
 ,"<td>/n"
 ,"SQCONTENT147/n"
 ,"<a>/n"
 ,"SQCONTENT148/n"
 ,"<//a>/n"
 ,"SQCONTENT149/n"
 ,"<//td>/n"
 ,"SQCONTENT150/n"
 ,"<//tr>/n"
 ,"SQCONTENT151/n"
 ,"<tr>/n"
 ,"SQCONTENT152/n"
 ,"<td>/n"
 ,"SQCONTENT153/n"
 ,"<a>/n"
 ,"SQCONTENT154/n"
 ,"<//a>/n"
 ,"SQCONTENT155/n"
 ,"<//td>/n"
 ,"SQCONTENT156/n"
 ,"<td>/n"
 ,"SQCONTENT157/n"
 ,"<a>/n"
 ,"SQCONTENT158/n"
 ,"<//a>/n"
 ,"SQCONTENT159/n"
 ,"<//td>/n"
 ,"SQCONTENT160/n"
 ,"<td>/n"
 ,"SQCONTENT161/n"
 ,"<a>/n"
 ,"SQCONTENT162/n"
 ,"<//a>/n"
 ,"SQCONTENT163/n"
 ,"<//td>/n"
 ,"SQCONTENT164/n"
 ,"<td>/n"
 ,"SQCONTENT165/n"
 ,"<a>/n"
 ,"SQCONTENT166/n"
 ,"<//a>/n"
 ,"SQCONTENT167/n"
 ,"<//td>/n"
 ,"SQCONTENT168/n"
 ,"<//tr>/n"
 ,"SQCONTENT169/n"
 ,"<tr>/n"
 ,"SQCONTENT170/n"
 ,"<td>/n"
 ,"SQCONTENT171/n"
 ,"<a>/n"
 ,"SQCONTENT172/n"
 ,"<//a>/n"
 ,"SQCONTENT173/n"
 ,"<//td>/n"
 ,"SQCONTENT174/n"
 ,"<td>/n"
 ,"SQCONTENT175/n"
 ,"<a>/n"
 ,"SQCONTENT176/n"
 ,"<//a>/n"
 ,"SQCONTENT177/n"
 ,"<//td>/n"
 ,"SQCONTENT178/n"
 ,"<td>/n"
 ,"SQCONTENT179/n"
 ,"<a>/n"
 ,"SQCONTENT180/n"
 ,"<//a>/n"
 ,"SQCONTENT181/n"
 ,"<//td>/n"
 ,"SQCONTENT182/n"
 ,"<td>/n"
 ,"SQCONTENT183/n"
 ,"<a>/n"
 ,"SQCONTENT184/n"
 ,"<//a>/n"
 ,"SQCONTENT185/n"
 ,"<//td>/n"
 ,"SQCONTENT186/n"
 ,"<//tr>/n"
 ,"SQCONTENT187/n"
 ,"<tr>/n"
 ,"SQCONTENT188/n"
 ,"<td>/n"
 ,"SQCONTENT189/n"
 ,"<a>/n"
 ,"SQCONTENT190/n"
 ,"<//a>/n"
 ,"SQCONTENT191/n"
 ,"<//td>/n"
 ,"SQCONTENT192/n"
 ,"<td>/n"
 ,"SQCONTENT193/n"
 ,"<a>/n"
 ,"SQCONTENT194/n"
 ,"<//a>/n"
 ,"SQCONTENT195/n"
 ,"<//td>/n"
 ,"SQCONTENT196/n"
 ,"<td>/n"
 ,"SQCONTENT197/n"
 ,"<a>/n"
 ,"SQCONTENT198/n"
 ,"<//a>/n"
 ,"SQCONTENT199/n"
 ,"<//td>/n"
 ,"SQCONTENT200/n"
 ,"<td>/n"
 ,"SQCONTENT201/n"
 ,"<a>/n"
 ,"SQCONTENT202/n"
 ,"<//a>/n"
 ,"SQCONTENT203/n"
 ,"<//td>/n"
 ,"SQCONTENT204/n"
 ,"<//tr>/n"
 ,"SQCONTENT205/n"
 ,"<tr>/n"
 ,"SQCONTENT206/n"
 ,"<td>/n"
 ,"SQCONTENT207/n"
 ,"<a>/n"
 ,"SQCONTENT208/n"
 ,"<//a>/n"
 ,"SQCONTENT209/n"
 ,"<//td>/n"
 ,"SQCONTENT210/n"
 ,"<td>/n"
 ,"SQCONTENT211/n"
 ,"<a>/n"
 ,"SQCONTENT212/n"
 ,"<//a>/n"
 ,"SQCONTENT213/n"
 ,"<//td>/n"
 ,"SQCONTENT214/n"
 ,"<td>/n"
 ,"SQCONTENT215/n"
 ,"<a>/n"
 ,"SQCONTENT216/n"
 ,"<//a>/n"
 ,"SQCONTENT217/n"
 ,"<//td>/n"
 ,"SQCONTENT218/n"
 ,"<td>/n"
 ,"SQCONTENT219/n"
 ,"<a>/n"
 ,"SQCONTENT220/n"
 ,"<//a>/n"
 ,"SQCONTENT221/n"
 ,"<//td>/n"
 ,"SQCONTENT222/n"
 ,"<//tr>/n"
 ,"SQCONTENT223/n"
 ,"<//table>/n"
 ,"SQCONTENT224/n"
 ,"<//td>/n"
 ,"SQCONTENT225/n"
 ,"<//tr>/n"
 ,"SQCONTENT226/n"
 ,"<//table>/n"
 ,"SQCONTENT227/n"
 ,"<div>/n"
 ,"SQCONTENT228/n"
 ,"<a>/n"
 ,"SQCONTENT229/n"
 ,"<//a>/n"
 ,"SQCONTENT230/n"
 ,"<a>/n"
 ,"SQCONTENT231/n"
 ,"<//a>/n"
 ,"SQCONTENT232/n"
 ,"<div>/n"
 ,"SQCONTENT233/n"
 ,"<//div>/n"
 ,"SQCONTENT234/n"
 ,"<//div>/n"
 ,"SQCONTENT235/n"
 ,"<//body>/n"
 ,"SQCONTENT236/n"
 ,"<//html>/n"
 ].join("")
 ;
 
 Nodes = [Nodes];
 
 document.write("<xmp>Nodes: /n"Nodes"</xmp><hr/>");
 
 var Re = new RegExp("(<([a-zA-Z][^<>]*?)>[//s//S]*?</////2>)");
 
 var TagAr = [];
 
 while(Re.test(Nodes[0]))
 {
  Nodes[0].replace
  (
   Re,
   function($0$1$2)
   {
    var LevelAr = [0];
    
    var sBegin = ["SQTAG"$2"BEGIN"].join("");
    var sEnd = ["SQTAG"$2"END"].join("");
    var sOpenTag = ["<"$2">"].join("");
    var sCloseTag = ["</"$2">"].join("");
    
    fMakeMarker
    (
     Nodes
     , sBegin
     , sEnd
     , LevelAr
     , "x"
     , sOpenTag
     , sCloseTag
     , false
     , false
    );
    
    TagAr.push([$2LevelAr[0]sBeginsEndsOpenTagsCloseTag]);
   }
  );
 } // end while
 
// alert(TagAr.join("/n"));
  
 document.write("<xmp>Final Nodes: /n"Nodes"</xmp><hr/>");
  
  function fMakeMarker
  (
   Nodes
   , PATTERNBEGIN
   , PATTERNEND
   , LevelAr
   , sIdPostfix
   , sLeft
   , sRight
   , bDebug
   , bNoRecursive
  )
  { // shawl.qiu code : return string
   if(Nodes[0].indexOf(sLeft)<0||Nodes[0].indexOf(sRight)<0) return Nodes[0];
   
   var Debug = bDebug;
   var Pos = [];
   var iStart = 0;
   var iOver = Nodes[0].length;
   
   var TempPostfix = LevelAr[0]+sIdPostfix;
   
   var TEMPPATTERNBEGIN = PATTERNBEGIN+TempPostfix;
   var TEMPPATTERNEND = PATTERNEND+TempPostfix;
   
   if(Debug)
   {
    document.write("<xmp>");
    document.write("Nodes: "Nodes"/n/n");
    document.write
    (
     "Nodes[0].indexOf(sLeft, iStart): "
     , Nodes[0].indexOf(sLeftiStart)
     , "/n"
    );
    document.write("</xmp>");
    document.write("<hr/>");
   }
   
   while(iStart<iOver)
   {
    var LeftPos = Nodes[0].indexOf(sLeftiStart);
    if(LeftPos<0) break;
    
    var RightPos = Nodes[0].indexOf(sRightLeftPos);
    if(RightPos<0) break;
    
    var TempStr = Nodes[0].substring(LeftPosRightPos+sRight.length);
    
    
    var iLeftOccur = fStringGetTimes(TempStrsLefttrue);
    var iRightOccur = fStringGetTimes(TempStrsRighttrue);
    
    //alert(RightPos)
    
    if(iLeftOccur-iRightOccur!==0)
    {
     var Times = iLeftOccur - iRightOccur;
     
     RightPos = fGetNextPos(NodesTimesLeftPosRightPossLeftsRight);
    }
    
   // alert(RightPos)
    //document.write("<xmp>", TempStr, "</xmp>");
    
    
  //  return;
    
    if(RightPos<0) break;
    
    var TempNodes = [];
     TempNodes.push(Nodes[0].substring(0LeftPos));
     TempNodes.push(TEMPPATTERNBEGIN);
     
     
     TempNodes.push(Nodes[0].substring(LeftPos+sLeft.lengthRightPos));
     TempNodes.push(TEMPPATTERNEND);
     
     
     TempNodes.push(Nodes[0].slice(RightPos+sRight.length));
     //alert(TempNodes)
     
     Nodes[0] = TempNodes.join("");

    var Span = TEMPPATTERNEND.length + TEMPPATTERNBEGIN.length - sLeft.length;
     
    iOver+=Span;

    RightPos += Span;
    
    TempStr = Nodes[0].slice
    (
     LeftPos
     , RightPos
    );
    
    iLeftOccur = fStringGetTimes(TempStrsLefttrue);
    iRightOccur = fStringGetTimes(TempStrsRighttrue);
     
    if(Debug)
    {
     document.write("<xmp>");
     document.write("TempNodes: "TempNodes"/n");
     document.write("LeftPos: "LeftPos"/n");
     document.write(

抱歉!评论已关闭.