Uhm...sorry, the thing I posted had a small bug with for loops that don't have
braces. Here's the fixed version.


var tabsize=2;
var keywords = ["{","}",";","if","else","for","while","case
","default","/*","*/"];
var lines;
var line;
var ln;
var li=0;
var ret;
var commentmode=false;
var ignorenext=false;
var donetab=false;

function CIndent() {
  var code;
  var select;
  var ed = newEditor();
  ed.assignActiveEditor();
  if(ed.selText()=='') {
    code = ed.Text();
    select= false;
  } else {
    select= true;
    code = ed.selText();
  }

  lines=code.split("\n");
  var tab=0;
  if (select) {
    ln=1;
    tab=lines[1].length-lines[1].replace(/^\s*/gi,"").length;
    ret=lines[0];
  } else {
    ln=0;
    ret="";
  }

  rec(tab,true,false);
  ret=ret.substr(0,ret.length-1);

  if (select)
    ed.selText(ret);
  else
    ed.text(ret);
}

function tabify(tab) {
  if (!donetab) {
    for (var j=0;j<tab;j++)
      ret+=" ";
    donetab=true;
  }
}

function rec(tab,brace,casemode) {
  do {
    if (!li) {
      lines[ln]=lines[ln].replace(/^\s*/gi,"");
      line=lines[ln].replace(/\t/gi,"
").replace(/\/\/.*$/gi,"").replace(/\s*$/gi,"");
     
line=line.replace(/".*"/gi,"").replace(/'.*'/gi,"").replace(/\(.*\)/gi,"()");
    }

    while(li<line.length && ln<lines.length) {
      var match;
      var matchi=Infinity;
      var k=0;
      if(commentmode)
        k=9;
      for (;k<keywords.length;k++) {
        ki=line.indexOf(keywords[k],li);
        if(ki!=-1 && ki<matchi) {
          match=k;
          matchi=ki;
        }
      }
      if (matchi<Infinity) {
        li=matchi+1;
        switch(match) {
          case 0:
            if (ignorenext==true) {
              brace=true;
              ignorenext=false;
              break;
            }
            tabify(tab);
            rec(tab+tabsize,true,false);
            break;
          case 1:
            if (casemode)
              li--;
            return;
            break;
          case 2:
            ignorenext=false;
            if (!brace) {
              tabify(tab);
              return;
            }
            break;
          case 3:
          case 4:
          case 5:
          case 6:
            if (!ignorenext) {
              tabify(tab);
              ignorenext=true;
              rec(tab+tabsize,false,false);
            }
            break;
          case 7:
          case 8:
            if (casemode) {
              li--;
              return donetab;
            } else {
              tabify(tab);
              rec(tab+tabsize,true,true);
            }
            break;
          case 9:
            commentmode=true;
            break;
          case 10:
            commentmode=false;
            break;
          default:
        }
      } else
        break;
    }

    tabify(tab);
    ret+=lines[ln]+"\n";
    donetab=false;
    ln++;
    li=0;
  } while (ln<lines.length);
}

function Init(){
  addMenuItem("C Reindent (K&R/1TBS)", "", "CIndent");
}



-- 
<http://forum.pspad.com/read.php?2,35711,35712>
PSPad freeware editor http://www.pspad.com

Odpovedet emailem