Spec-Zone.ru › Nim

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

Исходный код Редактировать

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–2024 Andreas Rumpf
Licensed under the MIT License.
https://nim-lang.org/docs/filters.html

Spec-Zone.ru

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