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