Разработка электроники,

Систем автоматики,

Программного обеспечения

8(981)186-50-82

ООО "Антех ПСБ",
Санкт-Петербург

anteh@bk.ru

antehru@gmail.com

©

AntComm

AntComm-1.0
Лицензионное соглашение
Простой пример применения
Описание примера

Freeware консольная программа. Предназначена для очистки текстов исходных кодов проекта от информации не использующейся компилятором. Это комментарии, пробелы, символы табуляции, символы перевода строки возврата каретки, учёт директив условной компиляции. При помощи Microsoft Ajax Minifier реализована функция минификации для .js .css файлов. На 01.12.2015 нет смысла использовать программу для минификации .js и .css, Microsoft.Ajax.Utilities в актуальном состоянии поддерживать не буду. Для минификации .js и .css существуют более актуальные способы.
СОЗДАЁТСЯ КОПИЯ ПРОЕКТА, НАД ЗАДАННЫМИ В КОНФИГУРАЦИОННОМ ФАЙЛЕ ФАЙЛАМИ КОПИИ ПРОЕКТА ВЫПОЛНЯЮТСЯ УКАЗАННЫЕ ПРЕОБРАЗОВАНИЯ, ЗАТЕМ ВРУЧНУЮ ВЫПОЛНЯЕМ КОМПИЛЯЦИЮ КОПИИ ПРОЕКТА С ПРЕОБРАЗОВАННЫМИ ФАЙЛАМИ.
Таким образом сохраняется весь исходный код в нужном виде и создаются минифицированные копии исходных файлов.
Помимо уменьшения размера файлов проекта, например dll контрола, содержащего встроенные ресурсы .js .css файлы, позволяет удалить разметку исходного кода с комментариями, служебными конструкциями и лишними символами. Чтобы затруднить друзьям использование ваших исходников можно хотя бы удалить из них все комментарии и лишние символы, представить содержимое исходных файлов как одну строку.
Работает под Windows, можно через mono запустить под UNIX. Под UNIX не тестировалось, но эта функциональность изначально заложена. Программа не привязана к какой-либо IDE или типам файлов, обрабатывать будет любые указанные файлы. Поэтому из обработки можно/нужно исключать файлы, не имеющие отношения к текстам исходных кодов. Параметры обработки файлов/группы файлов задаются через конфигурационный файл. Автоматически обрабатываются сразу все, указанные в конфигурационном файле, файлы проекта. ОБРАБАТЫВАЕМЫЕ ИСХОДНИКИ ОРИГИНАЛЬНОГО ПРОЕКТА НЕ МЕНЯЮТСЯ, создаётся его копия и над копией производятся заданные в конфигурационном файле преобразования. Далее вручную компилируем копию проекта. Программа создавалась ориентируясь на очистку C# и javascript текстов исходных кодов. Обфускация не выполняется. Но ничего не мешает её использовать для обработки любых текстовых файлов, содержащих какую либо разметку исходног кода.

Для C# исходного кода преобразование может выглядеть следующим образом. Только удаление лишних символов и расположение всего кода в несколько строк:
Было 3051 строки кода:1

Стало 3 строки кода без лишних символов:2

Существуют распространённые утилиты для минимизации JS-кода: JSMin, Google Closure Compiler, Packer и UglifyJS. CSS-кода: CSSTidy. Универсальные утилиты, которые сжимают и JS-код, и CSS-код: YUI Compressor и Microsoft Ajax Minifier.

В VS2008 используя Microsoft Ajax Minifier через MSBuild можно настроить автоматическое преобразование .js и .css файлов. Но только для web приложений, проекты web сайт не подходят, нет у них .proj файла, в котором устанавливаются задачи MSBuild. Утилита antcomm.exe не привязана ни к чему и может обрабатывать любые заданные файлы, причём обрабатываются только копии, оригиналы не изменяются. Сначала создаются копии всех файлов и папок директории размещения antcomm.exe, затем над указанными в конфигурационном файле файлами выполняются заданные преобразования. Подразумевается создание копии проекта, преобразование заданных файлов и последующая ручная компиляция копии проекта с обработанными/минимизированными файлами. Недостатком является необходимость настройки конфигурационного файла.

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

Первоначальная задумка была в том, чтобы по запуску утилиты создавалась копия проекта web приложения, производилось удаление комментариев и лишних символов из всех заданных файлов, затем сжатие переменных для всего проекта .js .css .cs файлы, последующая обфускация, компиляция копии проекта и копирование необходимых файлов копии проекта в локальную корневую директорию проекта web приложения. Разумеется обфускация на базе free приложения, для защиты хотя бы от неискушённых друзей. Далее оставалось бы только залить web приложение на сервер. В общем мечта ленивого. В итоге запала хватило только на реализацию очистки любого проекта/файлов от комментариев и лишних символов, + минификация .js .css файлов через свободную .dll Microsoft Ajax Minifier.

Алгоритм работы: файл antcomm.exe должен находиться в директории, содержащей обрабатываемые файлы/папки. При запуске проверяется наличие двух возможных аргументов. Первый "newlog", если присутствует, то лог файл будет всегда новым для текущего запуска. Второй/первый аргумент -полный путь и имя конфигурационного файла. Если аргумент отсутствует, то конфигурационный файл ищется в корневой директории исполняемого файла программы. В случае отсутствия конфигурационного файла создаётся дефолтный 'antcomm.conf' в директории размещения antcomm.exe. Если antcomm.exe запускается без указания конфигурационного файла, то будет использован 'antcomm.conf' находящийся в директории размещения программы.
При необходимости можно использовать несколько конфигурационных файлов и запускать обработку через .bat файл, получая копии одного и того же проекта обработанных по разному.
После запуска программа читает конфигурационный файл, создаёт в директории своего размещения новую директорию, в которую копирует всё содержимое директории своего размещения. Назовём директорию размещения копии проекта зеркальной папкой. Т.е. создаётся полная копия, всех исходных файлов и папок директории размещения antcomm.exe. Далее над копиями указанных в конфигурационном файле файлов производятся заданные преобразования. В конфигурационном файле можно указать папки и файлы запрещённые к копированию. Также можно указать файлы, которые копируются только, если их нет в зеркальной папке. Пути к папкам и файлам указываются относительно директории расположения утилиты, без каких либо предварительных символов.

Варианты запуска antcomm.exe:
>antcomm.exe
-если в директории размещения отсутствует antcomm.conf, то создаётся дефолтный, нужно редактировать. Если antcomm.conf присутствует, то производится обработка данных согласно настройкам в конфигурационном файле. Файл дублирования вывода в консоль antcomm.log дописывается.
>antcomm.exe newlog
-если в директории размещения отсутствует antcomm.conf, то создаётся дефолтный, нужно редактировать. Если antcomm.conf присутствует, то производится обработка данных согласно настройкам в конфигурационном файле. Файл дублирования вывода в консоль antcomm.log создаётся новый -лог ведётся только для текущего запуска.
>antcomm.exe newlog <путь и имя конфигурационного файла>
- Производится обработка данных согласно настройкам в конфигурационном файле. Файл дублирования вывода в консоль antcomm.log создаётся новый -лог ведётся только для текущего запуска.
>antcomm.exe <путь и имя конфигурационного файла>
- Производится обработка данных согласно настройкам в конфигурационном файле. Файл дублирования вывода в консоль antcomm.log дописывается.

Весь вывод в консоль дублируется выводом в текстовый файл antcomm.log, по умолчанию log файл дополняется новыми данными. Если первым параметром запуска будет "newlog" ">antcomm.exe newlog", то при каждом запуске будет создаваться новый log файл.

Параметры обработки проекта задаются в конфигурационном файле. Версия конфигурационного файла должна совпадать с текущей версией программы. Если не совпадает, то при запуске antcomm.exe, при отсутствии конфигурационного файла будет создан дефолтный, в него копируем настройки из старой версии. Всё, что содержится между #====… #====… маркерами в начале файла изменять нельзя.
# -символ комментария, может начинаться как с новой, так и с конца строки. Если символ # расположен внутри '' одинарных кавычек, то как начало комментария он не воспринимается. Менять содержимое заголовка и версию конфигурационного файла нельзя.

[команда]<правила> -формат записей в конфигурационном файле

Команда состоит объекта обработки и параметров/правил его обработки. Объектом обработки может быть файл или папка -все файлы папки но не вложенные папки. Для обработки вложенной папки нужно явно её указать.

Пример записей конфигурационного файла:
mirror_prefix:{'pr0_'} #префикс зеркальной папки
ext_rules:{'cs, cpp, test'}, precompile:{'#','\n'}, stroffin:{ '/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n'} #файлы с перечисленными расширениями обрабатываются учитывая возможное наличие директив прекомпиляции C# и учёт необходимости запрета обработки строковых значений внутри комментариев.
ext_rules:{' js, test2 '}, precompile :{'@','\n', '/*@','@*/'} regular:{ 'javascript'}, saved:{'/*!','*/'}, stroffin:{'/*','*/', '//','\r\n', '/*!','*/'} #Файлы *.js обрабатываются учитывая возможное наличие директив прекомпиляции javascript, учитывается наличие регулярных выражений javascript, необходимость оставлять комментарии /*!...*/ вида и запрет обработки строковых выражений внутри последовательностей байт, ограниченных маркерами: '/*','*/', '//','\r\n', '/*!','*/'.

dir:{'cssdir'}, remd:{'/*','*/'}, tabremove:{'tabremove'}, rems :{ '//' }, oneline:{'30000', ';', '}'}, space:{ '( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}

file:{'cssdir\def1.aspx.cs'}, remd :{'/*','*/'}, tabremove:{ 'tabremove' }, rems:{ '//' }, space:{'+ =','+ ='}, oneline:{'30000', ';', '}'}

block_file_copy:{'antcomm.conf'} #запрет копирования файла в зеркальную папку
block_file_copy:{'antcomm.exe'} #запрет копирования файла в зеркальную папку
block_dir_copy:{'rrr'} #запрет копирования директории и её содержимого в зеркальную папку
block_file_rewriting:{'database.bse'} #запрет копирования файла в зеркальную папку, если он там уже есть

В файле конфигурации, при описании параметров, для разделения, можно использовать любое количество пробелов. Внутри одинарных кавычек пробелы для разделения не используются. Каждое описание правил обработки файла или папки должно располагаться в одной строке. Заголовок конфигурационного файла, находящийся внутри #==== #==== маркеров, изменять нельзя. Параметры/правила команды не обязательно разделять запятыми.

mirror_prefix:{'<…>'} -команда указывается один раз в любом месте конфигурационного файла. Правил не содержит. Если команда указана несколько раз, то будет принято значение последней. Задаёт префикс в названии директории, содержащей копию проекта -зеркальная папка, параметров нет. Пример: mirror_prefix:{'pr0_'}3

antcomm.exe находится в папке Debug. Здесь pr0_Debug -зеркальная директория, в которую скопированы все файлы из Debug и директории cssdir, rrr, test со всем их содержимым. Затем указанные в конфигурационном файле копии исходных файлов обрабатываются, согласно заданным параметрам обработки.

ext_rules:{'<ext1,ext2,...,extN>'}<правила> -команда и правила обработки файлов привязанные к их расширениям. ext -расширения перечисляемые через запятую. К файлам с такими расширениями будут применяться описанные переопределяющие правила. ext_rules команда применяется к файлам, указаным в file и dir командах. Правила этой команды имеют более высокий приоритет и переопределяют/дополняют правила указанные в file и dir. Здесь можно использовать пробелы внутри одинарных кавычек для разделения. Пример:
ext_rules:{' cs, cpp, test '}, precompile:{ '#','\n'}, stroffin:{ '/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n'} #файлы с перечисленными расширениями обрабатываются учитывая возможное наличие директив прекомпиляции C#
ext_rules:{' js, test2 '}, precompile :{ '@','\n', '/*@','@*/'} regular:{ 'javascript'}, saved:{'/*@','@*/', '/*!','*/'}, stroffin:{'/*','*/', '//','\r\n', '/*!','*/', '/*@','@*/'} #Файлы *.js обрабатываются учитывая возможное наличие директив предкомпиляции javascript, учитывается наличие регулярных выражений javascript. Если используются директивы предкомпилятора, заключённые между /*@...@*/, то обязательно в saved должно быть указано saved:{'/*@','@*/'}. Stroffin -блокировка детектирования строковых выражений внутри последовательностей символов, ограниченных маркерами.

В примере приведены обязательные параметры обработки для .cs и .js файлов, которые должны присутствовать в любом конфигурационном файле для .cs и .js. Если для .cs .js файлов указано правило microsoft_ajax_minifier, то остальные правила будут проигнорированны. Сюда же, в ext_rules, можно добавить остальные правила/параметры обработки, поддерживаемые file или dir командой. Тогда в file или dir командах останется указать только обрабатываемые файлы или папки.
Например для C# исходных .cs файлов обязательными будут параметры precompile:{ '#','\n'} -обработка с учётом наличия директив предкомпилятора C# всё, что начинается с # помещается в новой строке и оканчивается переводом строки, stroffin:{ '/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n'} -запрет обработки строковых выражений внутри последовательностей символов, заключённых между заданными маркерами, связанно с особенностями работы алгоритма. Для javascript исходных .js файлов обязательным будут параметры precompile:{ '@','\n', '/*@','@*/'}, regular:{'javascript'}, saved:{'/*!','*/'}, stroffin:{'/*','*/', '//','\r\n', '/*!','*/', '/*@','@*/'}. regular:{'javascript'} -параметр запрещает удалять лишние символы внутри =/…/ регулярных выражений, это связано с особенностями работы алгоритма. precompile:{ '@','\n', '/*@','@*/'} -всё, что начинается с @ считается директивой условной компиляции и помещается в новой строке, а также, всё, что заключено между /*@...@*/ также считается директивой условной компиляции и помещается с новой строки. saved:{'/*!','*/'} -сохранение всего, что заключено между маркерами /*!...*/. stroffin:{'/*','*/', '//','\r\n', '/*!','*/'} -запрет обработки строковых выражений внутри последовательностей символов, заключённых между указанными маркерами.

Разумеется, аргументы, указанных обязательных параметров, не являются окончательными. Случаи бывают разные, всего не учесть, но механизмы для учёта если не всех, то большинства случаев реализованы. При разработке программы в основном ориентировался на .cs .js файлы. Но использовать можно с любыми исходными файлами, нужно знать правила форматирования обрабатываемого файла и соответствующим образом описать необходимые преобразования в конфигурационном файле.

Строковые значения:
По умолчанию и без возможности отключить, для всех обрабатываемых файлов, включена обработка строковых значений "…", '…' и обработка последовательностей символов инкремента декремента ++n, n++, --n, n--. Строковыми значениями считается все, что заключено или между "" или ''. В C# строковые значения обрамлены только "" и если в строке присутствуют другие символы двойных кавычек, то они предварены \ пример: "example-\"3\"" =example-"3". В javascript строковые значения могут быть обрамлены как "" так и '', пример 'example-\'3\'' =example-'3'.
Инкремент декремент:
По умолчанию и без возможности отключить алгоритм учитывает наличие инкремента декремента у переменной . И корректно обрабатывает даже следующую запись:
"i = 5- ++i + - - - -+-+ + ++i - i++ +i;" -C# до сжатия.
"i=5-++i+- - - -+-+ + ++i-i++ +i;" -та же строка после сжатия.

dir:{'dirpath'}<правила> и file:{'filepath'}<правила> -команды обработки директории и файла. Вложенные директории не обрабатываются, если нужно, то указываются явно. Для всех файлов директории должны быть заданы правила, иначе есть вероятность порчи файла без правил. dirpath filepath -путь к обрабатываемому файлу/директории относительно директории расположения утилиты 'dir1\dir2\file.ffl' antcomm.exe располагается в директории, содержащей dir1. Файлы, расположенные выше корневой директории размещения утилиты не обрабатываются. Обрабатываются любые типы указанных файлов. Если указать только путь к файлу и ext_rules будет содержать все нужные правила для файла с таким расширением, то файл с указанным расширением будет обработан с заданными правилами. Если в обрабатываемой директории будет содержаться посторонний файл, то он будет испорчен, поэтому директория должна сожержать только типы файлов, для которых описаны правила.
Для одного и того же файла папки можно указать несколько команд file dir. Обработка будет происходить последовательно, согласно расположению записей команд в несколько проходов. В file и dir указываются индивидуальные правила обработки. В ext_rules групповые, распространяющиеся на всё, что указано в file и dir в случае совпадения расширения.

Возможный набор правил для file и dir команд одинаковый:

file:{'filepath'}<...> -путь к обрабатываемому файлу относительно директории расположения antcomm.exe

dir:{'dirpath'}<...> -папка, файлы которой будут обрабатываться с указанными настройками обработки. ВЛОЖЕННЫЕ ПАПКИ НЕ ОБРАБТЫВАЮТСЯ.

Пока определено пять правил, содержащих любое количество парных параметров. Эти правила обрабатываются с предопределённым приоритетом. Правила задающего приоритеты не вводил, пока не было необходимости.
Приоритеты обработки:
1.stroffin //запрет обработки строковых значений.
2.replace //замена одной строки на другую.
3.precompile //гарантированное размещение с новой строки и окончание переводом на следующую строку. С учётом saved и remd.
4.saved //сохранение последовательности символов, заключённых между маркерами, включая сами маркеры.
5.remd //удаление последовательности символов, заключённых между маркерами, включая сами маркеры.

stroffin:{'<start1>','<stop1>',...,'<startN>','<stopN>'} начальные и конечные маркеры блоков, внутри которых отключена обработка строковых значений. Обязательный параметр, нужен для обеспечения гибкости и учёта особенностей работы алгоритма обработки. Нужно указывать, т.к. в комментариях может встретиться символ начала строкового значения без символа окончания. Для C# это stroffin:{'/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n' }. Значения указываются только парами. Т.е. внутри последовательностей байт, ограниченных указанными маркерами не производится попытка поиска строковых значений. Запись маркера разрешает использование одинарных кавычек. Но внутри '…' недопустимы последовательности "'," или "'}" или "' ," или "' }" -одинарная кавычка/фигурная закрывающая скобка, любое количество пробелов, запятая.

repl:{'<start1>','<stop1>',...,'<startN>','<stopN>'} -замена всех строк <target> на строки <replacement>. Замена производится по всему обрабатываемому файлу, включая строковые значения коментарии и регулярные выражения.

precompile:{'<start1>','<stop1>',...,'<startN>','<stopN>'} -учёт наличия директив условной компиляции в исходном коде. <start1> маркер началя директивы условной компиляции <stop1> маркер окончания директивы условной компиляции. Все директивы условной компиляции начинаются с новой строки и заканчиваются преходом на новую строку. Минимум для .cs и .js файлов это правило обязательно. Иначе, при использовании oneline правила директивы условной компиляции не будут начинаться с новой строки. Комментарии находящиеся в этой же строке удаляются, если указанно соответствующее правило удаления комментариев.
Так будут выглядеть директивы прекомпиляции:4

saved:{'<start1>','<stop1>',...,'<startN>','<stopN>'} -сохранение всего, что находится между строками маркерами <start> и <stop>, включая и сами маркеры. Например saved:{'/*!','*/'} сохранение всего, что находится между маркерами /*!...*/. Нужно например при обработке javascript исходного кода.

remd:{'<start1>','<stop1>',...,'<startN>','<stopN>'} -удаление всего, что находится между строками маркерами <start> и <stop>, включая и сами маркеры. Например remd:{'/*','*/', '//','\r\n'} удаление коментариев. Между одинарными кавычками можно заключить любые строковые выражения. '\r\n' или '\n' -выражения такого и только такого вида преобразуется в символы перевода строки возврата каретки. Если нужно удалить комментарии '//…', но оставить '///…' то нужно использовать следующую запись remd:{'//','\n'}, saved:{'///','\n'}.

space:{'<symbol before>','symbol after'} -удаление лишних пробелов до и после указанных одиночных символов. Символы указываются с разделением через пробел. Если параметр space не указывать, то лишние пробелы удаляться не будут. symbol before -перечисленные через пробел одиночные символы до которых должны отсутствовать все пробелы. symbol after -перечисленные через пробел одиночные символы, после которых должны отсутствовать все пробелы. space:{'( ) , ; - + = & { } | : > < [ ]' , '( ) , ; - #+ = & { } | : > < [ ]'}

defos:{'<type>'} -признак окончания строки выходного преобразованного файла. Если <type> ='win' то строки выходного файлов оканчиваются \r\n. Если <type> ='unix' то строки выходного файла оканчивается \n. По умолчанию <type> ='win'. На входе могут быть файлы со строками оканчивающимися как \r\n так и только \n. Правило определяет только тип окончания строки в выходном файле. Алгоритм: из входного файлового потока удаляются все символы '\r'. При формировании выходного потока, если <type> ='win' перед \n добавляется \r, если <type> ='unix' то ничего не добавляется.

oneline:{'<порог>', '<строка ключ 1>', '<строка ключ n>'} -удаление всех символов перевода строки возврата каретки из обрабатываемого файла. T.e. размещение исходного кода в одну строку. Максимальная длина строки ='<порог>' + некоторое количество символов. Затем, после первой встреченной, не в строковом и не в .js регулярном выражении, одной из заданных ключевых последовательностей <строка ключ n> вставляется перевод на новую строку. В jQuery упакованном библиотечном файле производится разбивка на строки примерно в 31000 символов. Если файл обрабатывается в несколько проходов, и на каком либо из проходов указано правило oneline, то это правило будет автоматически применено на последнем из проходов. При обработке .js .css файлов через microsoft_ajax_minifier правило не нужно соблюдать никаких дополнительных правил и условий. Через online правило можно разворачивать код, представленный в одну строку.
Пример: oneline:{'30000',';', '}', 'mark2'} -удаление всех символов перевода строки возврата каретки из обрабатываемого файла. T.e. размещение исходного кода в одну строку. Первый аргумент -максимальная длина строки, последующие маркеры, после которых будет установлен переход на новую строку при достижении заданного максимального количества символов в одной строке.

fileformat:{'UTF-8','UTF-8'} -задаёт формат входного и выходного файлов {'<in>','<out>'}. Поддерживаются: UTF-7, UTF-8, UTF-32, Unicode, ASCII. По умолчанию используется UTF-8.

tabremove:{'tabremove'} -включение функции замены одного и более символов табуляции идущих подряд на один пробел.

regular:{'javascript'} -включение обработки регулярных выражений, как строковых значений. Правило обязательно, для использования минимум в .js файлах. Правило нужно для обработки literal записи регулярных выражений, с регулярными выражениями, записанными в виде строковых выражений вопросов не возникает. Совместно с regular должны быть использованы правила удаления коментариев. Иначе, при встрече в коментарии ключевой последовательности, запускающей обработку регулярных выражений и отсутствии символа окончания обработки, исходный файл может быть обработан не правильно. Всё, что начинается с =/ :/ |/ &/ !/ (/ и заканчивается / считается регулярным выражением и изменениям не подлежит. Т.е. если встречен один из символов '= : | & ! (' не в строковом выражении и далее следует/не следует, любое количество пробелов и/или табуляций, затем '/', после любые символы регулярного выражения либо до символа '/' либо до \r\n.
Используйте строковые выражения для представления регулярных выражений javascript, тогда гарантированно не будет проблем.
Для выявления ключевых последовательностей начала регулярного выражения использовались jQuery минифицированные библиотеки:
'=/../' -понятно откуда.
"r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e." -'(/../'
"contents:{script:/(?:java|ecma)script/}," -':/../'
")<0&&/(mozilla)(?:.*? rv:([\w.]+)|)/.exec(" -'&/../'
".exec(a)||/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(" -'|/../' здесь так же видим наличие пробела в регулярном выражении, где то встречалось, что их там не должно быть, а они там естьJ.
'!/../' -не встречалось, предположил, что возможно. Метод конечно не научный, но документации на эту тему с пристрастием не искал.
Для js и css правильней использовать правило microsoft_ajax_minifier('<type>') -где <type> 'css' минификатор для css файлов или 'js' минификатор js файлов. Но это кому что нужно. Может нужно только комментарии удалить.

microsoft_ajax_minifier('<type>','[param]') -правило минификации .js и .css файлов. '<type>' -обязательный параметр = либо 'js' либо 'css'. '[param]' -необязательный параметр настраиваемые параметры обработки .js или .css файлов. '[param]' -это строка содержащая параметры обработки .js и/или .css такие же, как если бы они указывались для AjaxMin.exe в консоли. Здесь http://ajaxmin.codeplex.com/wikipage?title=Command-Line%20Switches приводятся возможные параметры обработки. Без какой то особой необходимости перенастраивать дефолтные настройки обработки не потребуется. Если у файла присутствует это правило, то другие правила для этого прохода будут проигнорированны. Если '[param]' отсутствует, то по умолчанию производятся следующие преобразования:
ДЛЯ .js ФАЙЛОВ:
1.Удаляются лишние пробелы.
2.Удаляются комментарии, кроме /*!...*/ комментариев. Используются для добавления авторских прав и информации о лицензии, обычно в начало минифицированного файла.
3.Удаляет ненужную точку с запятой ';'.
4.Удаляются фигурные скобки вокруг блока с одним оператором.
5.Переименование локальных функций и переменных.
6.Определяется, какой вариант разделителей использовать -одинарные или двойные кавычки, в зависимости от того, какой вариант будет порождать меньше экранирующих символов в строке.
7.Объединение объявлений нескольких подряд идущих переменных в одно.
8.Удаление пустых списков параметров конструкторов.
9.Удаление неиспользуемых имён для выражения имени функции.
10.Удаление неиспользуемых локальных функций.
11.Удаление участков недостижимого кода.
ДЛЯ .css ФАЙЛОВ:
1.Удаление лишних пробелов.
2.Удаление комментариев.
3.удаление ненужных сепараторов ';'.
4.Оптимизация записи цвета.
5.Уменьшение количества символов в представлении целого числа за счёт удаления начальных и конечных нулей.
6.Удаление единиц измерения из нулевых числовых значений.
7.Использование W3C предопределённых названий цветов, для сокращения количества кода.
Через ext_rules можно задать для всех файлов .js .css правило microsoft_ajax_minifier с нужными параметрами. Или при отсутствии ext_rules, для каждого файла в отдельности прописать свои параметры обработки microsoft_ajax_minifier. Но нужно учитывать, что всё, что указанно в ext_rules имеет более высокий приоритет над тем, что указано в file и dir. Т.е. если нужно для каждого или хотя бы одного .js или .css файла задать свои параметры обработки, то ext_rules не должен применяться для .js или .css. Иначе ext_rules правила переопределят правила в dir или file.
Для минификации .js .css используется свободная dll библиотека Microsoft Ajax Minifier AjaxMin.dll 4.91, распространяемая по лицензии http://ajaxmin.codeplex.com/license . По мере выхода обновлений Microsoft Ajax Minifier будет обновляться antcomm.exe

Возможно два варианта обработки каждого файла или всех файлов папки:
1.Когда, для команд file и dir, указываются все необходимые правила обработки для конкретного файла, или всех файлов папки, в одной строке. В этом случае файл/файлы обрабатываются последовательно в один проход все правила одновременно.
file:{'filedir\def1.aspx.cs'}, remd :{'/*','*/'}, tabremove:{ 'tabremove'}, rems:{'//'}, space:{'( ) =','( ) ='}, oneline:{'30000', ';', '}'}
Здесь файл def1.aspx.cs будет обработан за один проход с указанными правилами + правила указанные в ext_rules, если совпало расширение.

2.Указывается несколько одинаковых команд для file или dir c разными правилами обработки. В этом случае будет последовательно обработан файл сначала первым набором правил, потом вторым и т.д. В этом случае обработка файла будет производиться за несколько проходов. Количество проходов будет равно количеству одинаковых команд. Правила могут повторяться.
file:{'filedir\def1.aspx.cs'}, remd :{'/*','*/'}
file:{'filedir\def1.aspx.cs'}, tabremove:{ 'tabremove' }, rems:{'//'}
file:{'filedir\def1.aspx.cs'}, remd:{'/*','*/'}, space:{'( ) =','( ) ='}, oneline:{'30000', ';', '}'}
Здесь файл def1.aspx.cs будет обработан в три прохода с указанными правилами + если есть, правила указанные в ext_rules на каждый проход, если совпало расширение. Т.е. на каждом проходе будут применены повторяющиеся правила из ext_rules. Способ более медленный, чем первый, но теоретически более честный/надёжный, мало ли чего.

Примеры конфигурационных файлов:


Все обрабатываемые файлы задаются только через 2 команды file и dir. При обработке тип файла не учитывается, нужно точно указывать файлы и папки которые будут обрабатываться, если указать какие либо другие файлы, например мультимедиа, то их копии после обработки разумеется будут испорчены. Вложенные папки не обрабатываются. Через ext_rules задаются правила для конкретных типов файлов. Причём эти правила имеют более высокий приоритет над правилами, указанными в file и dir и для соответствующего типа файла будут переопределены/дополнены.
Обрабатывать .js и .css файлы для конечного проекта имеет смысл только через microsoft_ajax_minifier. Оригинальный фильтр можно использовать, например, если нужно сохранить разметку, но удалить например комментарии или выполнить какие-либо другие преобразования.

ПРИМЕР 1 можно назвать тестовым. .js файлы обрабатываются не минификатором, а через правила:
{
#Глобальные правила
mirror_prefix:{'pr0_'} #префикс зеркальной папки
ext_rules:{'cs,fff,ttt'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n'}
ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'}
ext_rules:{'js'}, stroffin:{'/*','*/', '//','\r\n', '/*!','*/', '/*@','@*/'}, precompile :{ '@','\n', '/*@','@*/'}, remd:{ '/*','*/'}, saved:{'/*!','*/', '/*@','@*/'}, regular:{ 'javascript'}, space:{ '( ) , ; - + = & { } | : > < [ ]' , '( ) , ; - #+ = & { } | : > < [ ]'}, oneline:{'30000', ';', '}'}, fileformat:{'UTF-8', 'UTF-8'}, tabremove:{'tabremove'}
#Локальные правила
dir:{ 'test'}, remd : { '/*' , '*/' , '//','\r\n' }, tabremove : { 'tabremove' }, oneline:{'30000', ';', '}'}, space : { '( ) , ; + - = & { } | : > < [ #]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{ 'UTF-8' , 'UTF-8' }
#block_dir_copy : {'test'}
block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_rewriting : { 'database.dat' }
}

ПРИМЕР 2. Пример обработки проекта с одним .cs файлом:
{
#Глобальные правила
mirror_prefix:{'pr0_'} #префикс зеркальной папки

ext_rules:{'cs, fff, ttt'}, defos : { 'win' }, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\r\n', '#region','\r\n', '///','\r\n'} #распространяется на все .cs файлы указанные в file или dir. Переопределяет или дополняет правила указаные в file или dir. "cs, fff, ttt" пример перечисления расширений.

ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'} #распространяется на все .css файлы указанные в filr или dir с .css расширением. Все правила, указанные в file и dir для .css будут проигнорированны.

ext_rules:{'js'}, microsoft_ajax_minifier:{'js',''} #распространяется на все .js файлы указанные в filr или dir с .js расширением. Все правила, указанные в file и dir для .js будут проигнорированны.

#Локальные правила
file:{'Program.cs'}, remd :{'/*','*/', '//','\r\n', '///','\r\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}

block_dir_copy : {'bin'} #запрет копирования директории и её содержимого в зеркальную папку
block_dir_copy : {'obj'}
block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_copy : { antcomm.bat' }
block_file_rewriting : { 'database.dat' } #запрет перезаписи файла в зеркальной папке, в случае его наличия в зеркальной папке
}

ПРИМЕР 3. Обработка проекта web-сайта:
{
#Глобальные правила
mirror_prefix:{'out_'} #префикс зеркальной папки
ext_rules:{'cs'}, defos:{'unix'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, remd:{'/*','*/', '//','\n', '///','\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'} #распространяется на все .cs файлы указанные в file или dir. Переопределяет или дополняет правила указаные в file или dir
ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'} #распространяется на все .css файлы указанные в file или dir с .css расширением. Все правила, указанные в file и dir для .css будут проигнорированны.
ext_rules:{'js'}, microsoft_ajax_minifier:{'js',''} #распространяется на все .js файлы указанные в file или dir с .js расширением. Все правила, указанные в file и dir для .js будут проигнорированны
#Локальные правила
file:{'Default.aspx.cs'}
file:{'EGridViewDemo.aspx.cs'}
file:{'description.css'}
file:{'demgrd.css'}
file:{'Default.aspx'}, defos:{'unix'}, tabremove:{'tabremove'}, space:{'=','='} #Удаление хотя бы лишних пробелов и на всякий табуляций
file:{'EGridViewDemo.aspx'}, defos:{'unix'}, tabremove:{'tabremove'}, space:{'=','='} #Удаление хотя бы лишних пробелов и на всякий табуляций
file:{'web.config'}, defos:{'unix'}, remd:{'<!--','-->'}, stroffin:{'<!--','-->'}, tabremove:{'tabremove'}, space:{'= < >','= < >'}, fileformat:{'UTF-8','UTF-8'}
file:{'Global.asax'}, defos:{'unix'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, remd:{'/*','*/', '//','\n', '///','\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, space:{'=','='}
block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_copy : { 'antcomm.bat' }
}

ПРИМЕР 4. Обработка проекта C#. Обрабатываются все .cs файлы расположенные в папках cs и Controls проекта:

{
#Глобальные правила
mirror_prefix:{'out_'} #префикс зеркальной папки

ext_rules:{'cs'}, defos:{'win'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, remd:{'/*','*/', '//','\n', '///','\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'} #распространяется на все .cs файлы указанные в file или dir. Переопределяет или дополняет правила указаные в file или dir

ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'} #распространяется на все .css файлы указанные в file или dir с .css расширением. Все правила, указанные в file и dir для .css будут проигнорированны.

ext_rules:{'js'}, microsoft_ajax_minifier:{'js',''} #распространяется на все .js файлы указанные в file или dir с .js расширением. Все правила, указанные в file и dir для .js будут проигнорированны

#Локальные правила
dir:{'cs'} #.cs файлы проекта
dir:{'Controls'} #.cs файлы проекта

#file:{'Default.aspx.cs'}
#file:{'EGridViewDemo.aspx.cs'}
#file:{'description.css'}
#file:{'demgrd.css'}

#file:{'Default.aspx'}, tabremove:{'tabremove'}, space:{';',';'} #Удаление хотя бы лишних пробелов и на всякий табуляций
#file:{'EGridViewDemo.aspx'}, tabremove:{'tabremove'}, space:{';',';'} #Удаление хотя бы лишних пробелов и на всякий табуляций

block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_copy : { 'antcomm.bat' }
}

Пример 5. Обрабатывается один .cs файл и папка с .cs файлами:
{
#Глобальные правила
mirror_prefix:{'pr0_'} #префикс зеркальной папки

ext_rules:{'cs, fff, ttt'}, defos : { 'win' }, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\r\n', '#','\r\n', '///','\r\n'} #распространяется на все .cs файлы указанные в file или dir. Переопределяет или дополняет правила указаные в file или dir. "cs, fff, ttt" пример перечисления расширений.

ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'} #распространяется на все .css файлы указанные в filr или dir с .css расширением. Все правила, указанные в file и dir для .css будут проигнорированны.

ext_rules:{'js'}, microsoft_ajax_minifier:{'js',''} #распространяется на все .js файлы указанные в filr или dir с .js расширением. Все правила, указанные в file и dir для .js будут проигнорированны.

#Локальные правила
#Все локальные правила можно указать и в ext_rules для конкретного типа файла. Здесь задаём индивидуальные настройки для каждого файла или файлов в папке. Вложенные папки в указанной папке не обрабатываются.

file:{'Program.cs'}, remd :{'/*','*/', '//','\r\n', '///','\r\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}
dir:{'Properties'}, remd :{'/*','*/', '//','\r\n', '///','\r\n', '#region','\n', '#endregion','\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}

block_dir_copy : {'bin'}
block_dir_copy : {'obj'}
block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_copy : { 'antcomm.bat' }
}

ПРИМЕР 6:
#Глобальные правила
mirror_prefix:{'pr0_'} #префикс зеркальной папки

ext_rules:{'cs, fff, ttt'}, defos:{'win'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\r\n', '#','\r\n', '///','\r\n'}, tabremove:{'tabremove'}, oneline:{'30000', ';', '}'} #распространяется на все .cs файлы указанные в file или dir. Переопределяет или дополняет правила указаные в file или dir. "cs, fff, ttt" пример перечисления расширений.
ext_rules:{'css'}, microsoft_ajax_minifier:{'css','-colors:hex'} #распространяется на все .css файлы указанные в filr или dir с .css расширением. Все правила, указанные в file и dir для .css будут проигнорированны.
ext_rules:{'js'}, microsoft_ajax_minifier:{'js',''} #распространяется на все .js файлы указанные в filr или dir с .js расширением. Все правила, указанные в file и dir для .js будут проигнорированны.
ext_rules:{'manifest'}, defos:{'win'}, remd:{'<!--','-->'}, stroffin:{'<!--','-->'}, tabremove:{'tabremove'}, space:{'= < >','= < >'}, fileformat:{'UTF-8','UTF-8'}

#Локальные правила
file:{'Program.cs'}, remd :{'/*','*/', '//','\n', '///','\n', '#region','\n', '#endregion','\n'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}
file:{'Properties\AssemblyInfo.cs'}, remd :{'/*','*/', '//','\r\n', '///','\r\n', '#region','\n', '#endregion','\n'}, space:{'( ) , ; + - = & { } | : > < [ ]','( ) , ; + - = & { } | : > < [ ]'}, fileformat:{'UTF-8','UTF-8'}
file:{'Properties\app.manifest'}

block_dir_copy : {'bin'}
block_dir_copy : {'obj'}
block_file_copy : { 'antcomm.conf' }
block_file_copy : { 'antcomm.log' }
block_file_copy : { 'antcomm.exe' }
block_file_copy : { 'antcomm.bat' }
}

Пример 7 Обрабатывается несколько .cs файлов разных проектов одного решения. Создаётся несколько копий решения с разными преобразованиями:
Есть решение, состоящее из трёх проектов VS2008. И нужно выполнить преобразование Default.aspx.cs из первого, ServerControl1.cs из второго и ServerControl1.cs из третьего проектов. Причём нужно создать три копии решения, в первой копии решения из указанных трёх .cs файлов нужно удалить только комментарии '//…' вида. Из второй копии решения нужно удалить только комментарии '/*…*/' вида. Из третьей копии решения нужно удалить только '///…' и вместо нескольких пробелов идущих подряд оставить только один, но не в строковых выражениях.

Пример проекта5

Шаг 16

Шаг 27

Шаг 38

Шаг 49

Шаг 510

Нужно создать три конфигурационных файла с соответствующими настройками и один .bat файл, для запуска antcomm.exe с разными конфигурационными файлами.
1.2.3.Копируем antcomm.exe в папку решения. И запускаем. По умолчанию будет создан дефолтный конфигурационный файл. И запущено копирование всего, что находится в директории с antcomm.exe в зеркальную папку. Создаётся log файл. В общем можем удалить зеркальную папку с копией решения, т.к. в дефолтном конфигурационном файле не заданы какие-либо преобразования.
4.Создаём в папке conf три конфигурационных файла, для каждой из копий проекта, с нужными настройками:
antcomm_1.conf:
{
#Глобальные правила
mirror_prefix:{'sol1_'} #префикс зеркальной папки
ext_rules:{'cs'}, defos:{'win'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, fileformat:{'UTF-8','UTF-8'}
#Локальные правила
file:{'TestServContr\ServerControl1.cs'}, remd:{'//','\n'}, saved:{'///','\n'}
file:{'TestICBEH\Default.aspx.cs'}, remd:{'//','\n'}, saved:{'///','\n'}
file:{'TestServContrGridView\ServerControl1.cs'}, remd:{'//','\n'}, saved:{'///','\n'}
block_dir_copy:{'conf'}
block_dir_copy:{'sol2_2'}
block_dir_copy:{'sol3_2'}
block_file_copy:{'antcomm.conf' }
block_file_copy :{'antcomm.log' }
block_file_copy:{'antcomm.exe' }
block_file_copy: {'antcomm.bat' }
}
antcomm_2.conf:
{
#Глобальные правила
mirror_prefix:{'sol2_'} #префикс зеркальной папки
ext_rules:{'cs'}, defos:{'win'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, fileformat:{'UTF-8','UTF-8'}
#Локальные правила
file:{'TestServContr\ServerControl1.cs'}, remd:{'/*','*/'}
file:{'TestICBEH\Default.aspx.cs'}, remd:{'/*','*/'}
file:{'TestServContrGridView\ServerControl1.cs'}, remd:{'/*','*/'}
block_dir_copy:{'conf'}
block_dir_copy:{'sol1_2'}
block_dir_copy:{'sol3_2'}
block_file_copy:{'antcomm.conf' }
block_file_copy :{'antcomm.log' }
block_file_copy:{'antcomm.exe' }
block_file_copy: {'antcomm.bat' }
}
antcomm_3.conf:
{
#Глобальные правила
mirror_prefix:{'sol3_'} #префикс зеркальной папки
ext_rules:{'cs'}, defos:{'win'}, precompile:{ '#','\n'}, stroffin:{'/*','*/', '//','\n', '#region','\n', '///','\n', '#endregion','\n'}, fileformat:{'UTF-8','UTF-8'}
#Локальные правила
file:{'TestServContr\ServerControl1.cs'}, remd:{'///','\n'}, space:{'=','='}
file:{'TestICBEH\Default.aspx.cs'}, remd:{'///','\n'}, space:{'=','='}
file:{'TestServContrGridView\ServerControl1.cs'}, remd:{'///','\n'}, space:{'=','='}
block_dir_copy:{'conf'}
block_dir_copy:{'sol1_2'}
block_dir_copy:{'sol2_2'}
block_file_copy:{'antcomm.conf' }
block_file_copy :{'antcomm.log' }
block_file_copy:{'antcomm.exe' }
block_file_copy: {'antcomm.bat' }
}
Antcomm.bat
{
@echo on
antcomm.exe newlog conf\antcomm_1.conf
antcomm.exe conf\antcomm_2.conf
antcomm.exe conf\antcomm_3.conf
}

5.Запускаем antcomm.bat и получаем 3 копии текущего решения, со своими преобразованиями. Теперь каждую копию решения можно запускать на компиляцию.
Обычно вряд ли понадобится создавать несколько копий проекта с разными преобразованиями, достаточно будет одной.

При разработке алгоритма обработки файлов, скорость обработки не стояла на первом месте. Есть что улучшать. Правда, сравнивать не с чем.
Работоспособность алгоритма проверялась, в том числе, на jQuery и jQuery UI упакованных библиотеках. Упакованные библиотеки подвергались обработке, затем через программу сравнения файлов, производилось сравнение исходного упакованного файла и обработанного.
Проверка с использованием следующих файлов:
jquery-1.6.3.min.js
jquery-1.6.4.min.js
jquery-1.8.2.min.js
jquery-1.8.3.min.js
jquery-1.9.0.min.js
jquery-1.9.1.min.js
jquery-ui-1.10.2.custom.min.js
В конечном итоге, при проверке были штатные отличия. В преобразованном файле после чуть более 30000 символов, после ';', добавлялся перевод строки возврат каретки. Разумеется тестирование производилось и на C# текстах исходных кодов.

Лучше всего делать обработку исходных файлов в два прохода. На первом через remd удаляем все комментарии, на втором долаем всё остальное. Связано с особенностями алгоритма. Например, с наличием комментариев в директивах условной компиляции, и всеми конструкциями кода, начинающимися с #. Чтобы указать несколько проходов для файла нужно указать несколько команд file или dir.
В алгоритм обработки была заложена гибкая функциональность, но чтобы ими воспользоваться, нужно разобраться с правилами написания конфигурационного файла, не получается там по-простому.

Для начала использования antcomm.exe достаточно .exe файла. Может пригодиться antcomm.bat для задания параметров запуска antcomm.exe с параметрами. По определённым соображениям Microsoft Ajax Minifier библиотека была встроена в .exe файл. Но библиотека периодически обновляется. При необходимости будут выкладываться версии antcomm.exe с последней библиотекой Microsoft Ajax Minifier.

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


КСИП-16 V1.0 КСИП-16 V2.0 КСИП-20 V1.0

Copyright ©Новиков Алексей Александрович,

2012-2017 Санкт-Петербург, 197372, ООО "Антех ПСБ",

anteh собака bk.ru