Фильтры исходного кода
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