Code Splitter (para javascript)

Los ultimos meses la he pasado trabajando en un par de proyectos y ademas como apoyo en el área informática de una institución educativa, esto a veces en tiempos sobre puestos (algo no muy recomendable si quieres dormir bien tus horas) por ello, he dejado el blog sin nuevas entradas por bastante tiempo, pero es hora de retomar.

Resulta que dentro de las cosas que he estado haciendo me tope con una situación de tener modificar un script en javascript para poder adecuar un metodo de una pagina web, dicho script es una distribución con licencia de software libre y al ser JS viene en modo comprimido, ya saben, los JS que encontramos todo supe simplificado, sin saltos de linea, sin espacios, con nombres de variables cortos (una letra), etc... En pocas palabras un JS ofuscado ilegible e incompresible que para poder meterle mano o simplemente comprenderlo hay que formatearlo, metiendoles saltos de linea y dandole una identación adecuada.



Para poder hacer la modificación necesitaba primero leer el código, encontrar el metodo que hace el proceso que yo necesitaba modificar, y encontrar dentro del metodo el lugar preciso y la instrucción precisa para modificar y, claro que sí, revisar que no fuera a afectar nada mas. Pero para hacer lo anterior es dificil viendo un bloque de codigo ilegible de dos lineas largisimas sin distincion de donde comienzan y terminan los metodos, declaraciones etc...

Me encontré en la necesidad de primero dar un formato legible al código, poner saltos de linea, poner identación de acuerdo a las funciones y sentencias de control, comenze con ello en forma manual pero resultaba muy tedioso y tomaba demasiado tiempo, busque en google si existia algun programa o herramienta que pudiera hacer eso, pero no lo encontre (bueno tampoco busque en forma exahustiva).

Así que me dijé, y si programo una pequeña clase en java que reciba el texto original y me lo devuelva ya formateado como código legible. Y cree el code splitter. No es muy elaborado pero hace lo que debe hacer y me fue sumamente útil, como era algo rapido no hice uso de grandes herramientas ni hice un gran análisis, solo agregar saltos en cada fin de linea marcado por el punto y coma [;], en cada apertura o cierre de llaves {} (marcan metodos y sentencias de control) y darle una identación adecuada.

Sin mas chachara aca esta un par de capturas de la ejecución del code splitter. A la izquierda se ve una caja de texto con el código ofuscado y a la derecha con el código 'spliteado', el antes y despues: 



Como se ve en las capturas use una JFrame para darle interfaz al programa, si lo quieres descargar completo descargarlo desde aca: bajar Code Splitter y aca pongo sólo el código fuente que hace el proceso que nos interesa:



01package codesplitter;
02
03public class CodeSplitter{
04
05    private int indentLen;
06    private String indent;
07
08    public CodeSplitter(){ }
09
10    // este es el metodo al que hay que llamar, se le pasa el codigo original (ofuscado)
11    // y regresado una String con el codigo formateado
12    public String splitCode(String code){
13        String splitted="";
14        int idxl=0;
15        int idx[]=nextNewLineIdx(code,idxl);
16        while(idx[0]>-1){
17            splitted+=code.substring(idxl, idx[0]);
18            if(idx[1]==1 || idx[1]==3){ splitted+=code.charAt(idx[0])+"\n"+indent; }
19            else if(idx[1]==2){ splitted+="\n"+indent+code.charAt(idx[0])+"\n"+indent; }
20            idxl=idx[0]+1;
21            idx=nextNewLineIdx(code,idxl);
22        }
23        splitted+=code.substring(idxl);
24        return splitted;
25    }
26     
27    private int[] nextNewLineIdx(String src, int from){
28        int[] nnli=new int[2];
29        nnli[0]=-1;
30        nnli[1]=-1;
31        int openb=src.indexOf("{",from);
32        int closeb=src.indexOf("}",from);
33        int semic=src.indexOf(";",from);
34        int sfor;
35        int efor;
36        boolean inFor;
37        if(openb!=-1){ nnli[0]=openb; nnli[1]=1; }
38        if(closeb!=-1 && (nnli[0]==-1 || closeb<nnli[0])){ nnli[0]=closeb; nnli[1]=2; }
39        if(semic!=-1){
40            sfor=src.indexOf("for(",from);
41            if(sfor!=-1){
42                efor=src.indexOf(")",sfor);
43                inFor=(semic>sfor && semic<efor);
44            }else{ inFor=false; }
45            if(!inFor && (nnli[0]==-1 || semic<nnli[0])){ nnli[0]=semic; nnli[1]=3; }
46        }
47        if(nnli[1]==1){ updateIndent(true); }
48        if(nnli[1]==2){ updateIndent(false); }
49        return nnli;
50    }
51     
52    private void updateIndent(boolean increment){
53        String tb="\t";
54        if(increment){ indentLen++; indent=indent.concat(tb); }
55        else{ indentLen--; indent="";
56          for(int g=0;g<indentLen;g++){ indent=indent.concat(tb); }
57        }
58    }
59     
60}

Comentarios

Entradas populares