Идеи
Эта система генератора кода состоит из трёх частей: модели данных, шаблона и соединителя. Пользователь может определить свою собственную модель данных, правила и создать собственный шаблон в соответствии с этими правилами. Я думаю, что лучший шаблон — это собственный шаблон пользователя, потому что он лучше всего знает свои требования.
Наконец, пользователь может использовать соединитель для объединения модели данных и шаблона вместе для генерации кода.
Шаблон
Грамматика Это похоже на Razor. Я прочитал исходный код Vash (https://github.com/kirbysayshi/vash), его фокус — генерация HTML-файла, поэтому он будет форматом шаблона, но для генератора кода я сосредоточусь на формате кода, поэтому я переработал новый механизм шаблонов, используя код лексера из Jade, как это сделал Vash.
@(<code>)
. Например: @(model.name)
.@{<code>}
. Пример:
@{
let pName = ng.toPascalCase(name);
}
@:<text>\n
, выходной текст не заканчивается на \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(<путь к файлу подшаблона>, <модель>)
.
Заполнитель Заполнитель генерирует текст в последний момент, он будет заменён, когда весь шаблон завершит своё создание.
@[<placeholderName>]
для установки заполнителя.@[<placeholderName>(,<tag>)]{<code>}
для определения содержимого заполнителя.
tag
в заполнителе, он добавит текст к заполнителю. Например, если существует @[p]
в шаблоне и мы определили его содержимое в двух местах шаблона:@[p]{
@:paragraph1
}
@[p]{
@:paragraph2
}
В конце концов мы получим текст paragraph1paragraph2
в позиции @[p]
. Если мы используем тег в заполнителе, один и тот же тег будет добавлен только один раз. Например:
@[p,tag1]{
@:paragraph1
}
@[p,tag1]{
@:paragraph2
}
@[p,tag2]{
@:paragraph3
}
Мы получим текст paragraph1paragraph3
в @[p]
, второй будет проигнорирован.
Обтекание и отступ
Мы можем добавить пробел к 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'
добавляет пробел перед «путем к файлу подшаблона», поэтому вывод будет:
<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"' : '') ```
<Form.Item label="Name1" {...formItemLayout}>
{getFieldDecorator('ccc', {
rules: [{required: true, message: 'Обязательно'},
{validator: this.emailValidate, message: 'Должен быть формат электронной почты'}]
})(
<Input
placeholder="Name1"
/>
)}
</Form.Item>
Это значит, что если мы добавим пробел в начале пути суб-шаблона, при переносе отступ будет установлен на часть строки пробела; Если нет, то при переносе отступ будет установлен на текстовую часть.
import {
Form@[ antd]
} from 'antd';
Определяет заполнитель как @[antd]
.
@[antd,input]{@:{,
Input@:}}
Если есть пробел, он выведет:
import {
Form,
Input
} from 'antd';
Если удалить пробел:
import {
Form@[antd]
} from 'antd';
Результат будет выглядеть так:
import {
Form,
Input
} from 'antd';
Не стесняйтесь определять пользовательскую модель данных JS, а также правила.
Имя | Тип | Описание |
---|---|---|
_path | string | путь к файлу |
_fileName | string | имя файла без расширения |
_fullFileName | string | имя файла с расширением |
_dirPaths | string[] | массив строк пути к папке относительно каталога модели данных |
_props.name | string | класс name |
Для типа объекта
_ref: если вы определили ref: '<filePath>'
(здесь <filePath>
— это относительный путь к каталогу модели данных), свойство _ref будет указывать на конкретную модель данных.
class OrderDetail{
ccc = {
display: 'Name1',
ref: 'order-manage/test.js',
rules:[{type: 'required', message: 'Must required'},{type: 'email', message: 'Must be email format'}]
}
}
module.exports = OrderDetail;
Имя | Тип | Описание |
---|---|---|
root | string | корневой каталог, если он пуст, будет использоваться process.cwd() в качестве корневого каталога |
outputDir | string | выходной каталог |
deleteOutput | bool | очищать ли папку перед генерацией кода |
modelsDir | string | каталог модели данных, система пройдёт по всем файлам в каталоге, включая подкаталоги |
templateDir | string | шаблонный каталог |
helper | object | пользователь может определить свою собственную функцию, в шаблоне мы можем использовать ng.myFunction для вызова функции здесь |
customModelProp | function | входной параметр — объект модели данных, пользователь может изменить модель здесь |
customFieldProp | function | входной параметр — поле объекта модели данных, здесь пользователь может модифицировать поле |
global | object | глобальная переменная, пользователь может использовать её в шаблоне, например: global.appName
|
mapping | function | коннектор, входной параметр — объект модели данных, пользователю необходимо вернуть массив объектов для определения модели данных и выходного пути |
Имя | Тип | Описание |
---|---|---|
scope | string | область действия ng |
seq | number | последовательность генерации шаблона, если число меньше, оно будет сгенерировано раньше |
model | object | объект модели данных |
template | string | путь шаблона относительно шаблонного каталога конфигурации |
output | string | путь выходного файла относительно выходного каталога конфигурации |
noRender | bool | если установлено значение true, шаблон не будет отображаться, а файл будет только скопирован в выходную позицию |
Область видимости scope поддерживает древовидный режим, разделяемый на .
, например, root
может содержать root.module1
и root.module1.module1_1
, если вы определили @[p]{<code>}
в шаблоне
Примечание: данный текст является переводом исходного текста запроса. сcope root.module1
, тогда в шаблоне области видимости root
можно использовать контент для плейсхолдера @[p]
.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )