-
Notifications
You must be signed in to change notification settings - Fork 0
/
MinificadorJS.py
209 lines (177 loc) · 7 KB
/
MinificadorJS.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
"""
Minificador de JavaScript
Se debe ingresar la carpeta donde estan ubicados los archivos a minificar
si existe un archivo llamado ".min.js" en la carpeta se sobreescribe
"""
import os
import re
import sys
Acciones = ["build", "remove"]
def main():
accion = ""
ruta = ""
#validar si trae parametros
if(len(sys.argv) > 1):
accion = sys.argv[1]
if(len(sys.argv) > 2):
ruta = sys.argv[2]
if(len(sys.argv) == 1):
accion = "build"
if(len(sys.argv) > 1):
accion = sys.argv[1]
if(len(sys.argv) > 2):
ruta = sys.argv[2]
if accion not in Acciones:
accion = "build"
if os.path.isdir(ruta) is False:
jscontrollers_path = find_folder_jscontrollers(os.path.dirname(os.path.abspath(__file__)))
if(jscontrollers_path is None):
print("No se encontro la carpeta jscontrollers")
return 0
ruta = jscontrollers_path
# Navega el directorio
navegadirectorio(accion, ruta)
def navegadirectorio(accion, ruta):
"""Navega el directorio y obtiene los archivos"""
# Obtiene la lista de archivos
archivos = os.listdir(ruta)
# Recorre la lista de archivos
for archivo in archivos:
# Verifica si el archivo es un archivo .js
if archivo.endswith(".js") and accion == "build":
# Minifica el archivo
minificar(ruta + "/" + archivo)
elif archivo.endswith(".min.js") and accion == "remove":
#elimina el archivo .min.js
os.remove(ruta + "/" + archivo)
elif os.path.isdir(ruta + "/" + archivo):
# Navega el directorio
navegadirectorio(accion, ruta + "/" + archivo)
def minificar(file):
#nombre archivo
nombre = file.split(".")
#nombre archivo minificado
nombre_min = nombre[0] + ".min.js"
# """Minifica el archivo"""
# Abre el archivo para lectura
with open(file, "r", encoding="utf-8") as archivo:
# Lee el archivo
texto = archivo.read()
# Cierra el archivo
archivo.close()
# Minifica el archivo
#eliminar comentarios
texto = re.sub(r"//.*", "", texto)
texto = re.sub(r"/\*.*?\*/", "", texto, flags=re.DOTALL)
texto = re.sub(r"//.*", "", texto)
#eliminar los console.log
texto = re.sub(r"console.log\(.*?\);", "", texto, flags=re.DOTALL)
#agregar .min a archivos js dentro del archivo js
texto = re.sub(r".js(?![a-zA-Z])", ".min.js", texto, 0, re.MULTILINE)
#eliminar el doble min
texto = re.sub(r"\.min.min.js", ".min.js", texto)
#eliminar tabulaciones
texto = re.sub(r"\t", "", texto)
#eliminar saltos de linea
texto = re.sub(r"\n", "", texto)
#eliminar espacios
texto = re.sub(r"\s+", " ", texto)
#eliminar espacios antes de {
texto = re.sub(r"\s{", "{", texto)
#eliminar espacios antes de }
texto = re.sub(r"\s}", "}", texto)
#eliminar espacios antes de (
texto = re.sub(r"\s\(", "(", texto)
#eliminar espacios antes de )
texto = re.sub(r"\s\)", ")", texto)
#eliminar espacios antes de [
texto = re.sub(r"\s\[", "[", texto)
#eliminar espacios antes de ]
texto = re.sub(r"\s\]", "]", texto)
#eliminar espacios antes de +
texto = re.sub(r"\s\+", "+", texto)
#eliminar espacios antes de -
texto = re.sub(r"\s\-", "-", texto)
#eliminar espacios antes de *
texto = re.sub(r"\s\*", "*", texto)
#eliminar espacios antes de /
texto = re.sub(r"\s\/", "/", texto)
#eliminar espacios antes de =
texto = re.sub(r"\s\=", "=", texto)
#eliminar espacios antes de ;
texto = re.sub(r"\s\;", ";", texto)
#eliminar espacios antes de :
#texto = re.sub(r"\s\:", ":", texto)
#eliminar espacios antes de <
texto = re.sub(r"\s\<", "<", texto)
#eliminar espacios antes de >
texto = re.sub(r"\s\>", ">", texto)
#eliminar espacios antes de ,
texto = re.sub(r"\s\,", ",", texto)
#eliminar espacios despues de {
texto = re.sub(r"{\s", "{", texto)
#eliminar espacios despues de }
texto = re.sub(r"}\s", "}", texto)
#eliminar espacios despues de (
texto = re.sub(r"\(\s", "(", texto)
#eliminar espacios despues de )
texto = re.sub(r"\)\s", ")", texto)
#eliminar espacios despues de [
texto = re.sub(r"\[\s", "[", texto)
#eliminar espacios despues de ]
texto = re.sub(r"\]\s", "]", texto)
#eliminar espacios despues de +
texto = re.sub(r"\+\s", "+", texto)
#eliminar espacios despues de -
texto = re.sub(r"\-\s", "-", texto)
#eliminar espacios despues de *
texto = re.sub(r"\*\s", "*", texto)
#eliminar espacios despues de /
texto = re.sub(r"\/\s", "/", texto)
#eliminar espacios despues de =
texto = re.sub(r"\=\s", "=", texto)
#eliminar espacios despues de ;
texto = re.sub(r"\;\s", ";", texto)
#eliminar espacios despues de :
texto = re.sub(r"\:\s", ":", texto)
#eliminar espacios despues de >
texto = re.sub(r">\s", ">", texto)
#eliminar espacios despues de <
texto = re.sub(r"<\s", "<", texto)
#eliminar espacios despues de ,
texto = re.sub(r",\s", ",", texto)
#agrega espacio para )in
texto = re.sub(r"\)in", ") in", texto)
#agregar ; para )$(
texto = re.sub(r"\)\$", ");$", texto)
#agregar ; para )setTimeout
texto = re.sub(r"\)setTimeout", ");setTimeout", texto)
#agregar ; para )setInterval
texto = re.sub(r"\)setInterval", ");setInterval", texto)
#agregar ; para )if
texto = re.sub(r"\)if", ");if", texto)
#agregar ; para )Form
texto = re.sub(r"\)Form", ");Form", texto)
#agregar ; para )localStorage
texto = re.sub(r"\)localStorage", ");localStorage", texto)
# Eliminar archivo antes de crearlo
if os.path.exists(nombre_min):
os.remove(nombre_min)
# Abre el archivo
with open(nombre_min, "w",encoding="utf-8") as newarchivo:
# Escribe el archivo
newarchivo.write(texto)
# Cierra el archivo
newarchivo.close()
#Funcion que navega por todas las carpetas desde su primera ubicación buscando la carpeta jscontrollers,
#si no la encuentra vuelve un nivel arriva hasta llegar a la raiz
#return path de la carpeta jscontrollers
def find_folder_jscontrollers(carpeta):
for root, dirs, files in os.walk(carpeta):
for name in dirs:
if name == "jscontrollers":
return root + "/" + name
if(carpeta == "/"):
return False
return find_folder_jscontrollers(os.path.dirname(carpeta))
main()