Идея
Данная система генерации кода состоит из трёх частей: модели, шаблона и соединителя. Пользователь может свободно определять свою модель, правила и следовать этим правилам. Шаблон кода генерируется в соответствии с определёнными пользователем правилами. Я считаю, что шаблон, определённый самим пользователем, является лучшим шаблоном. Соединитель связывает модель и шаблон и определяет путь к файлу результата.
Шаблон
Синтаксис похож на синтаксис Razor и вдохновлён Vash. Он ориентирован на генерацию кода и уделяет внимание форматированию кода, включая отступы и переносы строк. Поэтому был разработан собственный синтаксис шаблонов, использующий лексический анализатор, подобный тому, который используется в Jade.
@(<code>)
. Пример: @(model.name)
.@{<code>}
. Пример:
@{
let pName = ng.toPascalCase(name);
}
@:<text>\n
. Выведенный текст не будет заканчиваться символом новой строки.@:{<text>@:}
.@@
, представляющего @.@!
. Если необходимо вывести {xxx} в однострочном текстовом формате, можно использовать @:{xxx}
, но это конфликтует с обозначением логического блока кода. Можно добавить разделитель @:@!{xxx}
для вывода {xxx}.Дополнительные примеры:
Шаблон для цикла for:
@{
if(model && model.arr && model.arr.length){
for(let i in model.arr){
let item = model.arr[i];
let split = i == 0 ? '' : (model.split || '');
@(split)@(ng.include(model.template, item))
}
}
}
На данный момент не включена концепция мастер-шаблона, поскольку в этом нет необходимости.
Подшаблоны используются с помощью команды ng.include(<подшаблонFilePath>, <модель>)
.
Заполнитель задерживает вывод до тех пор, пока весь шаблон не будет сгенерирован, после чего содержимое заменяется.
@[<placeHolderName>]
для размещения заполнителя.@[<placeHolderName>(,<tag>)]{<code>}
для определения содержимого заполнителя.Роль тега в заполнителе:
Обычно при определении содержимого заполнителя без указания тега содержимое добавляется в заполнитель по умолчанию. Например, существует @[p]
. В двух местах шаблона определено содержимое этого заполнителя.
@[p]{
@:paragraph1
}
@[p]{
@:paragraph2
}
В результате в позиции @[p]
выводится текст paragraph1paragraph2
. Если добавлен тег, то содержимое с одинаковым тегом добавляется только один раз.
@[p,tag1]{
@:paragraph1
}
@[p,tag1]{
@:paragraph2
}
@[p,tag2]{
@:paragraph3
}
Тогда в результате в позиции @[p]
будет выведено paragraph1paragraph3
, а вторая часть будет проигнорирована.
Можно добавить пробелы для переноса строк и изменения режима отступов в командах ng.include
и @[<placeHolderName>]
. Вот конкретные шаги:
Пример использования ng.include: Пример:
<Form.Item label="@(model.display)" {...formItemLayout}>
{getFieldDecorator('@(model.name)', {
rules: [@(ng.include(' for', {arr: model.rules, template: 'frontend/create/rule', split: ',\n'}))]
})(
<Input @(model.isPassword ? ' type="password"' : '')
placeholder="@(model.display)"
/>
)}
</Form.Item>
Здесь в коде ng.include('for'
перед «подшаблономFilePath» добавлены пробелы, поэтому при выводе будет такой эффект:
<Form.Item label="Name1" {...formItemLayout}>
{getFieldDecorator('ccc', {
rules: [{required: true, message: 'Must required'},
{validator: this.emailValidate, message: 'Must be email format'}]
})(
<Input
placeholder="Name1"
/>
)}
</Form.Item>
Если убрать пробелы:
<Form.Item label="@(model.display)" {...formItemLayout}>
{getFieldDecorator('@(model.name)', {
rules: [@(ng.include('for', {arr: model.rules, template: 'frontend/create/rule', split: ',\n'}))]
})(
<Input @(model.isPassword ? ' type="password"' : '')
placeholder="@(model.display)"
/>
)}
</Form.Item>
Результат будет таким:
<Form.Item label="Name1" {...formItemLayout}>
{getFieldDecorator('ccc', {
rules: [{required: true, message: 'Must required'},
{validator: this.emailValidate, message: 'Must be email format'}]
})(
<Input
placeholder="Name1"
/>
)}
</Form.Item>
То есть, если перед строкой добавлены пробелы, отступ при переносе строк будет соответствовать пробелам; если пробелы не добавлены, отступ будет соответствовать тексту.
Использование @[] Пример заполнителя:
import {
Form@[ antd]
} from 'antd';
Определение содержимого заполнителя:
@[antd,input]{@:{,
Input@:}}
С пробелами результат будет следующим:
import {
Form,
Input
} from 'antd';
Без пробелов:
import {
Form@[antd]
} from 'antd';
Результатом будет:
import {
Form,
Input
} from 'antd';
Модель
Пользователь может свободно определить JS-модель с различными правилами.
Имя | Тип | Описание |
---|---|---|
_path | строка | путь к файлу |
_fileName | строка | имя файла без расширения |
_fullFileName | строка | полное имя файла с расширением |
_dirPaths | массив строк | пути к папкам относительно корневого каталога модели |
Для членов объекта:
_ref: если определено ref: '<filePath>'
(где <filePath>
— это относительный путь к файлу модели относительно конфигурации модели), _ref будет указывать на соответствующую модель.
module.exports = {
ccc: {
display: 'Name1',
ref: 'order-manage/test.js',
rules:[{type: 'required', message: 'Must required'},{type: 'email', message: 'Must be email format'}]
}
};
Имя | Тип | Описание |
---|---|---|
root | строка | корневой каталог, если он пуст, будет использоваться process.cwd() в качестве корневого каталога |
outputDir | строка | выходной каталог |
deleteOutput | логическое значение | удалять ли содержимое выходного каталога при генерации кода |
modelsDir | строка | каталог моделей, система будет перебирать все файлы моделей в каталоге моделей и подкаталогах |
templateDir | Строка | |
--- | --- | |
helper | Объект | Пользовательские функции, которые можно использовать в шаблоне с помощью ng.自定义函数 для вызова пользовательских функций здесь |
customModelProp | Функция | Входные параметры — это объект модели. Пользователи могут изменять модель, созданную системой, в этой функции. Можно добавлять или удалять атрибуты |
customFieldProp | Функция | Входной параметр — член объекта модели. Пользователь может изменить тип члена объекта модели, созданный системой, в этой функции. Можно добавить атрибут |
global | Объект | Глобальные переменные. Пользователи могут напрямую вызывать глобальные переменные, определённые здесь, в шаблонах, например, global.appName |
mapping | Функция | «Соединитель». Входные параметры — объект модели. Пользователю необходимо вернуть массив объектов, чтобы указать модель и путь вывода |
Имя | Тип | Описание |
---|---|---|
scope | Строка | Область действия ng |
seq | Число | Последовательность генерации. Чем меньше число, тем раньше генерация |
model | Объект | Объект модели |
template | Строка | Путь шаблона относительно пути шаблона конфигурации |
output | Строка | Выходной путь относительно пути выходного каталога конфигурации |
noRender | Логическое значение | Если поле равно true, шаблонный движок не будет использоваться для рендеринга, файл будет скопирован непосредственно в целевую позицию |
Область действия поддерживает древовидную структуру, разделённую .
, например, root
может содержать root.module1
, root.module1.module1_1
. Если вы определили @[p]{<code>}
в шаблоне области действия root.module1
, вы можете использовать содержимое @[p]
в шаблоне, определённом в области действия root
.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )