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