1

Тема: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Недавно я создал достаточно многословную тему JScript: модуль обработки INI файлов и утилита работы с INI файлами. Сейчас в работе с ней я столкнулся с небольшой проблемой, которую хотел бы обсудить и получить советы, как поступить лучше. Я намеренно перенес язык в конец названия темы дабы акцентировать внимание не на языке, а на алгоритме. Также приветствуется любая критика и конструктивные предложения по улучшению как программы так и самого модуля.

Для поиска ключей-параметров используется регулярное выражение, которое ищет все строки, вида название = значение. При этом, строки начинающиеся с символов ; (точка с запятой) и # (решетка) отфильтровываются, так как рассматриваются как комментарии. Допустимы любые пробельные символы в начале строки и вокруг символа = (знак равенства). Мне часто попадается конфигурация, которая содержит один ведущий символ пробела в значении параметра.

То есть, при разборе входного файла все ведущие пробелы в поле "значение" "съедаются", и в результате исходный и конечный файлы отличаются.

Вопрос следующий. Сейчас используется такое регулярное выражение.


/^\s*([^;#\s][^=]*?)\s*=\s*([^\r\n]*?)\s*$/

Имеет ли смысл это выражение "смягчить", так чтобы оно сохраняло все символы после знака равенства?


/^\s*([^;#\s][^=]*?)\s*=([^\r\n]*?)$/
( 2 * b ) || ! ( 2 * b )

2

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Пробел(ы) в начале значения лучше, наверное, сохранить: пару раз сталкивался с локализациями в формате ini, где без одного-двух пробелов в начале текст "прилипал" к контролу или рамке. В конце - не знаю. Теоретически, возможны такие же косяки при выравнивании вправо, но лично не встречал.

3

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Для эстетики лучше, конечно, убирать пробелы, а для сравнения - оставлять. Можно параметр (опцию) добавить.

Rumata пишет:

В сети существует бинарный аналог INITOOL (http://www.optimumx.com/downloads.html#iniTool), который не смог обработать конфигурационный файл размером более 2МБ

Я вот этим пользуюсь. Ещё есть многофункциональный аналог (развивается). Попробуйте.

4

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Serge Yolkin пишет:

Пробел(ы) в начале значения лучше, наверное, сохранить

Flasher пишет:

Для эстетики лучше, конечно, убирать пробелы, а для сравнения - оставлят

Я тоже ради эстетики первоначально удалял. Но, "истина дороже" - любые пробелы в строке могут быть значащими. 2000 лет назад ради эстетики из биографии одного плотника вычеркнули полжизни.

Flasher пишет:

Можно параметр (опцию) добавить

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

( 2 * b ) || ! ( 2 * b )

5

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Посмотрел кучу INI файлов у себя на винте. В подавляющем большинстве пробелов нет.

"NAME=xxx"

Иногда в таких файлах встречаются строки:

"NAME= xxx"

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

"NAME             = xxx"
"PARAMETER    = xxx"

причем не только пробелами, а так же ТАБами.
Так же встретил значения с комментариями в конце

"PARAMETER    = xxx" ; Параметр

встретил с параметром содержащим пробел

"NAME PARAMETER    = xxx"

и прочел в википедии, что бывают многострочные  значения и для объявления следующей строки используется "\"

"NAME=xxx\
yyy"
Нас невозможно сбить с пути, нам пофигу куда идти.

6

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Я в своей жизни встречал такие файлы

1. на текущей работе, самый простой случай

имя1=значение

2. а также параметры, допускающие множественные значения

имя2=значение
имя2=значение

3. так выглядит php.ini

имя3=значение ; комментарий

4. встречал всего один раз, это было как-то связано с Perl

имя4=значение\
значение

5. примерно так выглядят простые параметры файла реестра в текстовом представлении

"имя5"="значение"

6. примерно так выглядят "сложные" параметры файла реестра в текстовом представлении

"имя6"=значение
    значение

Мой модуль полностью "понимает" варианты 1 и 2 (простая строка и массив строк, соответственно). В варианте 3 считается, что вся строка после знака равенства - значение. Можно было бы искать до первого символа комментария. Однако для php.ini это будет верно, а другом случае это может оказаться неверным. Частично - вариант 5, но кавычки попадают и в имя, и в значение.

Количество пробелов в имени значения не имеет, то есть может быть и такая ситуация

сложное имя=значение
( 2 * b ) || ! ( 2 * b )

7

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Думается мне, что лучше конечно сделать модуль с настройками. Ибо всем не угодить.

Нас невозможно сбить с пути, нам пофигу куда идти.

8

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

Ссылки по теме разговора
pl : Config::IniFiles
py : ConfigObj
js : NodeJS-ориентированный аналог

( 2 * b ) || ! ( 2 * b )

9

Re: WSH: Обсуждение модуля и утилиты работы с INI файлами (JScript)

на мсдн-е была тема о алгоритмах работы с ини, ссылку не дам ибо не помню

Я конечно далек от мысли... (с)