Идея
Данная система генерации кода состоит из трёх частей: модели, шаблона и соединителя. Пользователь может свободно определять свои собственные модели, правила и следовать этим правилам. Шаблоны кода определяются пользователем в соответствии с этими правилами. Я считаю, что пользовательский шаблон для генерации кода является лучшим шаблоном. Соединитель связывает модель и шаблон и определяет путь к файлу результата.
Шаблон
Синтаксис похож на синтаксис 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 )