parsecfg
Модуль parsecfg реализует высокопроизводительный парсер файлов конфигурации. Синтаксис файла конфигурации похож на формат Windows .ini, но намного мощнее, так как он не является парсером на основе строк. Поддерживаются строковые литералы, сырые строковые литералы и строковые литералы с тройными кавычками, как и в языке программирования Nim.
Пример того, как может выглядеть файл конфигурации:
# This is a comment. ; this too. [Common] cc=gcc # '=' and ':' are the same --foo="bar" # '--cc' and 'cc' are the same, 'bar' and '"bar"' are the same (except for '#') macrosym: "#" # Note that '#' is interpreted as a comment without the quotation --verbose [Windows] isConsoleApplication=False ; another comment [Posix] isConsoleApplication=True key1: "in this string backslash escapes are interpreted\n" key2: r"in this string not" key3: """triple quotes strings are also supported. They may span multiple lines.""" --"long option with spaces": r"c:\myfiles\test.txt"
Вот пример использования парсера файлов конфигурации:
import os, parsecfg, strutils, streams
var f = newFileStream(paramStr(1), fmRead)
if f != nil:
var p: CfgParser
open(p, f, paramStr(1))
while true:
var e = next(p)
case e.kind
of cfgEof: break
of cfgSectionStart: ## a ``[section]`` has been parsed
echo("new section: " & e.section)
of cfgKeyValuePair:
echo("key-value-pair: " & e.key & ": " & e.value)
of cfgOption:
echo("command: " & e.key & ": " & e.value)
of cfgError:
echo(e.msg)
close(p)
else:
echo("cannot open: " & paramStr(1)) Примеры
Пример файла конфигурации
charset = "utf-8" [Package] name = "hello" --threads:on [Author] name = "lihf8515" qq = "10214028" email = "lihaifeng@wxm.com"
Создание файла конфигурации
import parsecfg
var dict=newConfig()
dict.setSectionKey("","charset","utf-8")
dict.setSectionKey("Package","name","hello")
dict.setSectionKey("Package","--threads","on")
dict.setSectionKey("Author","name","lihf8515")
dict.setSectionKey("Author","qq","10214028")
dict.setSectionKey("Author","email","lihaifeng@wxm.com")
dict.writeConfig("config.ini") Чтение файла конфигурации
import parsecfg
var dict = loadConfig("config.ini")
var charset = dict.getSectionValue("","charset")
var threads = dict.getSectionValue("Package","--threads")
var pname = dict.getSectionValue("Package","name")
var name = dict.getSectionValue("Author","name")
var qq = dict.getSectionValue("Author","qq")
var email = dict.getSectionValue("Author","email")
echo pname & "\n" & name & "\n" & qq & "\n" & email Изменение файла конфигурации
import parsecfg
var dict = loadConfig("config.ini")
dict.setSectionKey("Author","name","lhf")
dict.writeConfig("config.ini") Удаление ключа секции в файле конфигурации
import parsecfg
var dict = loadConfig("config.ini")
dict.delSectionKey("Author","email")
dict.writeConfig("config.ini") Импорты
- strutils, lexbase, streams, tables
Типы
CfgEventKind = enum cfgEof, ## end of file reached cfgSectionStart, ## a ``[section]`` has been parsed cfgKeyValuePair, ## a ``key=value`` pair has been detected cfgOption, ## a ``--key=value`` command line option cfgError ## an error occurred during parsing
- перечисление всех событий, которые могут произойти при парсинге Исходный код Редактировать
CfgEvent = object of RootObj case kind*: CfgEventKind ## the kind of the event of cfgEof: nil of cfgSectionStart: section*: string ## `section` contains the name of the ## parsed section start (syntax: ``[section]``) of cfgKeyValuePair, cfgOption: key*, value*: string ## contains the (key, value) pair if an option ## of the form ``--key: value`` or an ordinary ## ``key= value`` pair has been parsed. ## ``value==""`` if it was not specified in the ## configuration file. of cfgError: ## the parser encountered an error: `msg` msg*: string ## contains the error message. No exceptions ## are thrown if a parse error occurs.- описывает событие парсинга Исходный код Редактировать
CfgParser = object of BaseLexer tok: Token filename: string
- объект парсера. Исходный код Редактировать
Config = OrderedTableRef[string, OrderedTableRef[string, string]]
- Исходный код Редактировать
Процедуры
proc open(c: var CfgParser; input: Stream; filename: string; lineOffset = 0) {...}{. gcsafe, extern: "npc$1", raises: [IOError, OSError, Exception], tags: [ReadIOEffect, RootEffect].}- инициализирует парсер входным потоком.
Filenameиспользуется только для красивых сообщений об ошибках.lineOffsetможет быть использован для влияния на информацию о номере строки в сгенерированных сообщениях об ошибках. Исходный код Редактировать proc close(c: var CfgParser) {...}{.gcsafe, extern: "npc$1", raises: [Exception, IOError, OSError], tags: [WriteIOEffect].}- закрывает парсер
cи связанный с ним входной поток. Исходный код Редактировать proc getColumn(c: CfgParser): int {...}{.gcsafe, extern: "npc$1", raises: [], tags: [].}- получить текущий столбец, до которого добрался парсер. Исходный код Редактировать
proc getLine(c: CfgParser): int {...}{.gcsafe, extern: "npc$1", raises: [], tags: [].}- получить текущую строку, до которой добрался парсер. Исходный код Редактировать
proc getFilename(c: CfgParser): string {...}{.gcsafe, extern: "npc$1", raises: [], tags: [].}- получить имя файла, обрабатываемого парсером. Исходный код Редактировать
proc errorStr(c: CfgParser; msg: string): string {...}{.gcsafe, extern: "npc$1", raises: [ValueError], tags: [].}- возвращает правильно отформатированное сообщение об ошибке, содержащее информацию о текущей строке и столбце. Исходный код Редактировать
proc warningStr(c: CfgParser; msg: string): string {...}{.gcsafe, extern: "npc$1", raises: [ValueError], tags: [].}- возвращает правильно отформатированное сообщение об ошибке, содержащее информацию о текущей строке и столбце. Исходный код Редактировать
proc ignoreMsg(c: CfgParser; e: CfgEvent): string {...}{.gcsafe, extern: "npc$1", raises: [ValueError], tags: [].}- возвращает правильно отформатированное сообщение об ошибке, указывающее, что запись проигнорирована. Исходный код Редактировать
proc next(c: var CfgParser): CfgEvent {...}{.gcsafe, extern: "npc$1", raises: [IOError, OSError, ValueError], tags: [ReadIOEffect].}- извлекает первое/следующее событие. Это управляет парсером. Исходный код Редактировать
proc newConfig(): Config {...}{.raises: [], tags: [].}- Создает новую таблицу конфигурации. Полезно, когда нужно создать файл конфигурации. Исходный код Редактировать
proc loadConfig(stream: Stream; filename: string = "[stream]"): Config {...}{. raises: [IOError, OSError, Exception, ValueError, KeyError], tags: [ReadIOEffect, RootEffect, WriteIOEffect].}- Загружает указанную конфигурацию из потока в новый экземпляр Config. Параметр
filenameиспользуется только для более приятных сообщений об ошибках. Исходный код Редактировать proc loadConfig(filename: string): Config {...}{. raises: [IOError, Exception, OSError, ValueError, KeyError], tags: [WriteIOEffect, ReadIOEffect, RootEffect].}- Загружает указанный файл конфигурации в новый экземпляр Config. Исходный код Редактировать
proc writeConfig(dict: Config; stream: Stream) {...}{.raises: [IOError, OSError], tags: [WriteIOEffect].}-
Записывает содержимое таблицы в указанный поток
Примечание: Утверждения комментариев будут проигнорированы.
Исходный код Редактировать proc `$`(dict: Config): string {...}{.raises: [Exception, IOError, OSError], tags: [WriteIOEffect].}- Записывает содержимое таблицы в строку. Примечание: Утверждения комментариев будут проигнорированы. Исходный код Редактировать
proc writeConfig(dict: Config; filename: string) {...}{.raises: [IOError, OSError], tags: [WriteIOEffect].}- Записывает содержимое таблицы в указанный файл конфигурации. Примечание: Утверждения комментариев будут проигнорированы. Исходный код Редактировать
proc getSectionValue(dict: Config; section, key: string; defaultVal = ""): string {...}{. raises: [KeyError], tags: [].}- Возвращает значение ключа указанной секции. Возвращает указанное значение по умолчанию, если указанный ключ не существует. Исходный код Редактировать
proc setSectionKey(dict: var Config; section, key, value: string) {...}{. raises: [KeyError], tags: [].}- Устанавливает значение ключа указанной секции. Исходный код Редактировать
proc delSection(dict: var Config; section: string) {...}{.raises: [], tags: [].}- Удаляет указанную секцию и все ее подключаемые ключи. Исходный код Редактировать
proc delSectionKey(dict: var Config; section, key: string) {...}{.raises: [KeyError], tags: [].}- Удаляет ключ указанной секции. Исходный код Редактировать
© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/parsecfg.html