Spec-Zone.ru › Nim 1

Фильтры исходного кода

A Source Code Filter (SCF) преобразует входной поток символов в выходной поток в памяти перед парсингом. Фильтр может использоваться для предоставления систем шаблонов или препроцессоров.

Для использования фильтра для файла исходного кода используется запись #?.

#? stdtmpl(subsChar = '$', metaChar = '#')
#proc generateXML(name, age: string): string =
#  result = ""
<xml>
  <name>$name</name>
  <age>$age</age>
</xml>

Как показывает пример, передача аргументов фильтру может осуществляться так же, как обычный вызов процедуры с именованными или позиционными аргументами. Доступные параметры зависят от вызываемого фильтра. До версии 0.12.0 языка #! использовалось вместо #?.

Подсказка: При компиляции с --hint[codeBegin]:on или --verbosity:2 (или выше) или при nim check, Nim отображает обработанный код после каждого применения фильтра.

Использование

Сначала поместите код SCF в отдельный файл с указанием фильтров в первой строке. Примечание: Вы можете назвать свой файл SCF с любым расширением, но традиционное расширение — .nimf (раньше оно было .tmpl , но это было слишком обще, например, не позволяло GitHub распознавать его как файл исходного кода Nim).

Если мы используем код generateXML , показанный выше, и назовём файл SCF xmlGen.nimf, в вашем main.nim:

include "xmlGen.nimf"

echo generateXML("John Smith","42")

Оператор конвейера

Фильтры могут комбинироваться с оператором конвейера |:

#? strip(startswith="<") | stdtmpl
#proc generateXML(name, age: string): string =
#  result = ""
<xml>
  <name>$name</name>
  <age>$age</age>
</xml>

Доступные фильтры

Фильтр замены

Фильтр замены заменяет подстроки в каждой строке.

Параметры и их значения по умолчанию:

sub: string = ""
подстрока, которая ищется
by: string = ""
строка, на которую подстрока заменяется

Фильтр удаления пробелов

Фильтр удаления пробелов просто удаляет начальные и конечные пробелы из каждой строки.

Параметры и их значения по умолчанию:

startswith: string = ""
удалять только строки, начинающиеся с startswith (игнорируя начальные пробелы). Если пусто, то удаляются все строки.
leading: bool = true
удалять начальные пробелы
trailing: bool = true
удалять конечные пробелы

Фильтр StdTmpl

Фильтр stdtmpl предоставляет простую систему шаблонов для Nim. Фильтр использует основанный на строках парсер: строки, начинающиеся с метасимвола (по умолчанию: #), содержат код Nim, другие строки — буквально. Поскольку парсинг на основе отступов не подходит для системы шаблонов, операторы управления потоком требуют end X разделителей.

Параметры и их значения по умолчанию:

metaChar: char = '#'
префикс для строки, содержащей код Nim
subsChar: char = '$'
префикс для Nim-выражения в строке шаблона
conc: string = " & "
операция конкатенации
emit: string = "result.add"
операция вывода строковой литералы
toString: string = "$"
операция, применяемая к каждому выражению

Пример:

#? stdtmpl | standard
#proc generateHTMLPage(title, currentTab, content: string,
#                      tabs: openArray[string]): string =
#  result = ""
<head><title>$title</title></head>
<body>
  <div id="menu">
    <ul>
  #for tab in items(tabs):
    #if currentTab == tab:
    <li><a id="selected"
    #else:
    <li><a
    #end if
    href="${tab}.html">$tab</a></li>
  #end for
    </ul>
  </div>
  <div id="content">
    $content
    A dollar: $$.
  </div>
</body>

Фильтр преобразует это в:

proc generateHTMLPage(title, currentTab, content: string,
                      tabs: openArray[string]): string =
  result = ""
  result.add("<head><title>" & $(title) & "</title></head>\n" &
    "<body>\n" &
    "  <div id=\"menu\">\n" &
    "    <ul>\n")
  for tab in items(tabs):
    if currentTab == tab:
      result.add("    <li><a id=\"selected\" \n")
    else:
      result.add("    <li><a\n")
    #end
    result.add("    href=\"" & $(tab) & ".html\">" & $(tab) & "</a></li>\n")
  #end
  result.add("    </ul>\n" &
    "  </div>\n" &
    "  <div id=\"content\">\n" &
    "    " & $(content) & "\n" &
    "    A dollar: $.\n" &
    "  </div>\n" &
    "</body>\n")

Каждая строка, не начинающаяся с метасимвола (игнорируя начальные пробелы), преобразуется в строковую литерал, которая добавляется к result.

Символ подстановки вводит Nim-выражение e в строковой литерал. e преобразуется в строку с помощью операции toString, которая по умолчанию равна $. Для строгой проверки типов установите toString в пустую строку. e должно соответствовать этому паттерну PEG:

e <- [a-zA-Z\128-\255][a-zA-Z0-9\128-\255_.]* / '{' x '}'
x <- '{' x+ '}' / [^}]*

Для получения одиночного символа подстановки его необходимо удвоить: $$ даёт $.

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

#? stdtmpl(emit="f.write") | standard
#proc writeHTMLPage(f: File, title, currentTab, content: string,
#                   tabs: openArray[string]) =
<head><title>$title</title></head>
<body>
  <div id="menu">
    <ul>
  #for tab in items(tabs):
    #if currentTab == tab:
    <li><a id="selected"
    #else:
    <li><a
    #end if
    href="${tab}.html" title = "$title - $tab">$tab</a></li>
  #end for
    </ul>
  </div>
  <div id="content">
    $content
    A dollar: $$.
  </div>
</body>

© 2006–2021 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/filters.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API