Пакуем css

Очень часто, сталкиваясь с вопросом ускорения работы сайта, замечаешь, что тормозит сей процесс больше всего загрузка сторонних файлов, будь то стили или скрипты.

Лучший способ это объединять выше перечисленные ресурсы в один файл (например all.css, all.js)

В этой статье рассмотрим менее радикальный метод ускорения процесса, а именно удаление \n, \t etc. из файлов стилей и возвращения их в обратный, удобоваримый, вид.

Поковырявшись немного в питоне на свет появился простенький скрипт:

#!/usr/bin/python
# -*- coding: utf8 -*-
import sys
import re
import os.path

if len(sys.argv) == 2:
	if os.path.isfile(sys.argv[1]):
		out = ""
		comment = False
		f1 = open(sys.argv[1], "r")
		while 1:
			text = f1.readline()
			if text == "":
				break
			out += re.sub('	','',text).rstrip()
		f1.close()
		os.rename(sys.argv[1], sys.argv[1] + ".bak")

		out = re.sub('{ ','{',out)
		out = re.sub(' {','{',out)
		out = re.sub('} ','}',out)
		out = re.sub(' }','}',out)
		out = re.sub(': ',':',out)
		out = re.sub(' :',':',out)
		out = re.sub('\/\*',' /* ',out)
		out = re.sub('\*\/',' */ ',out)
		while "  " in out:
			out = re.sub('  ',' ',out)

		f2 = open(sys.argv[1], "w")
		f2.write(out)
		f2.close()
else:
	if len(sys.argv) == 3 and ((sys.argv[1] == "-u" and os.path.isfile(sys.argv[2])) or (sys.argv[2] == "-u" and os.path.isfile(sys.argv[1]))):
		print "uncript"
		filePath = sys.argv[2] if os.path.isfile(sys.argv[2]) else sys.argv[1]
		f2 = open(filePath + ".temp", "w")

		f1 = open(filePath, "r")
		while 1:
			text = f1.readline()
			if text == "":
				break
			text = re.sub('{', ' {\n', text)
			text = re.sub(' \/\*', '/*', text)
			text = re.sub('\*\/ ', '*/\n', text)
			text = re.sub(';', ';\n', text)
			text = re.sub(':', ' : ', text)
			text = re.sub('}', '}\n\n', text)
			f2.write(text)
		f1.close()

		f2.close()

		os.rename(filePath, filePath + ".bak")

		f2 = open(filePath, "w")

		f1 = open(filePath + ".temp", "r")
		isStyle = False
		while 1:
			text = f1.readline()
			if text == "":
				break
			if "{" in text or "}" in text:
				if "}" in text:
					isStyle = False 

			if isStyle and text != "}":
				text = "\t" + text
				text = re.sub(',', ',\n\t', text)
			else:
				text = re.sub(',', ',\n', text)

			if "{" in text or "}" in text:
				if "{" in text:
					isStyle = True

			f2.write(text)
		f1.close()

		f2.close()

		os.remove(filePath + ".temp")
	else:
		print "CSS file compressor\nVersion: 0.1\n\nTo compress file use:\n\t./css.py \nTo uncompress file use\n\t./css.py  -u"

Скрипт работает крайне просто:

  • если задать ему параметром css файл, то он станет в одну строчку и потеряет все лишние пробелы и табуляции;
  • если задать упакованный файл и ключ «-u» то он станет удобочитаемым.

При упаковке на всякий случай создается backup исходного файла.

При распаковке тоже!

и имена у них совпадают.

А теперь пример:

При упаковке jquery-ui-1.8.9.custom.css с 32,678 байт он стал 30,549 байт.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *