1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/somereason-NotSoFreeMarker

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 10:18 074c33a

NotSoFreeMarker

Данный инструмент позволяет рендерить итоговый текст на основе шаблона и данных. Шаблон поддерживает if, циклы и простые вычисления. Инструмент может быть использован для генерации сложного кода, таблиц данных и т. д., что позволяет уменьшить ручной труд.

Способ вызова

Цель инструмента — обработка файлов с данными и шаблонами. Файлы с шаблонами и данными могут использоваться повторно и комбинироваться для создания различных файлов (например, для чтения столбцов из разных таблиц и генерации кода pojo и model). Это также упрощает вызов инструмента из других языков. Кроме того, предоставляется возможность вызова на основе текстовых и словарных данных, что удобно для языка программирования Python.

import NotSoFreeMarker
processed_str = NotSoFreeMarker.process(содержание шаблона, данные [тип карты], путь к файлу [необязательно])
processed_str = NotSoFreeMarker.process_file(путь к файлу шаблона, путь к файлу с данными json)

Формат данных

Данные должны быть в формате JSON. Обратите внимание, что требования к JSON в языке Python довольно строгие. Например, имена свойств должны заключаться в кавычки.

Кроме того, корневая структура данных не должна быть массивом. Если необходимо использовать массив, его следует поместить в какое-либо свойство, например:

// Нельзя
[
    1,2,3,4
]
// Можно
{
    "array":[1,2,3,4]
}

Если данные вводятся напрямую, они должны иметь тип map. В map можно вкладывать другие map или массивы.

Шаблоны

Синтаксис шаблонов похож на Freemarker (автор сожалеет, что изначально не использовал Velocity, который кажется более простым в реализации), и поддерживает переменные, циклы, условия и простые выражения.

Здесь приведён пример данных, на котором основаны последующие примеры:

{
  "a":1,
  "b":2,
  "c":[10,20,30],
  "d":{
      "e":"abc",
      "f":"efg"
  }
}

Переменные

Переменные обозначаются как ${имя переменной}, например:

  • ${a};
  • ${c[0]};
  • ${d.e}.

Также переменные поддерживают простые выражения, диапазон которых определяется возможностями Python, например:

  • ${a+b};
  • ${c[10]+5*a};
  • ${len(d.f)} (где len — функция Python для получения длины строки).

Функции

При написании переменных поддерживаются простые функции, такие как упомянутая выше len. Однако, поскольку реализация довольно проста, поддерживаются только функции вида «имя функции (переменная)». Поэтому более сложные операции, такие как изменение содержимого на верхний регистр (${content.upper()}), невозможны, так как код не может распознать такие функции.

Чтобы решить эту проблему, автор написал несколько встроенных функций, которые инкапсулируют распространённые операции. Они начинаются с nsfm (${nsfm_upper(переменная)} может преобразовать содержимое переменной в верхний регистр).

Эти функции включают:

  • nsfm_lower — преобразование в нижний регистр;
  • nsfm_upper — преобразование в верхний регистр.

Причина поддержки только простых функций заключается в том, что написание функций довольно свободно, например, a.b.c(e.f.g), где a.b.c или e.f.g могут быть переменными или функциями (os.path.abspath). При разработке эта проблема не была тщательно продумана, поэтому есть некоторые ошибки. Для обеспечения доступности используется текущий способ реализации. Автор планирует улучшить его, когда у него будет время.

Циклы

Циклы реализуются с помощью пары тегов <#list>.

Пример использования:

<#list d as item>
    ${item}
<#/list>

Вывод: 10 20 30

Для использования индекса в цикле можно добавить переменную index:

<#list items as (item,index)>
    ${item},${index}
<#/list>

Вывод: 10,0 20,1 30,2

Условия

Условия поддерживают if, elseif, else:

<#if a>0 >
    a больше 0
<#elseif a<=0 and a>-1>
    a находится между 0 и -1
<#else>
    a меньше -1
</#if>

Обязательны теги <#if> и </#if>*, остальные два тега необязательны.

Ссылки

Шаблоны также поддерживают включение другого файла, что позволяет хранить общие части в отдельном файле.

<#include "путь к файлу">

Комментарии

Комментарии в шаблонах не отображаются в результатах.

Многострочные комментарии поддерживаются, но обратите внимание на отсутствие пробелов между символами # и -- в тегах <#-- и -->. Вложенные комментарии не поддерживаются.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/somereason-NotSoFreeMarker.git
git@api.gitlife.ru:oschina-mirror/somereason-NotSoFreeMarker.git
oschina-mirror
somereason-NotSoFreeMarker
somereason-NotSoFreeMarker
master