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

OSCHINA-MIRROR/nickppa-NG

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

Идея

Данная система генерации кода состоит из трёх частей: модели, шаблона и соединителя. Пользователь может свободно определять свою модель, правила и следовать этим правилам. Шаблон кода генерируется в соответствии с определёнными пользователем правилами. Я считаю, что шаблон, определённый самим пользователем, является лучшим шаблоном. Соединитель связывает модель и шаблон и определяет путь к файлу результата.

Шаблон

Синтаксис

Синтаксис похож на синтаксис Razor и вдохновлён Vash. Он ориентирован на генерацию кода и уделяет внимание форматированию кода, включая отступы и переносы строк. Поэтому был разработан собственный синтаксис шаблонов, использующий лексический анализатор, подобный тому, который используется в Jade.

  1. Вывод типа кода с использованием @(<code>). Пример: @(model.name).
  2. Логические блоки кода с использованием @{<code>}. Пример:
    @{
        let pName = ng.toPascalCase(name);
    }
  3. Строчный текст с использованием @:<text>\n. Выведенный текст не будет заканчиваться символом новой строки.
  4. Текстовые блоки с использованием @:{<text>@:}.
  5. Экранирование с помощью @@, представляющего @.
  6. Разделитель @!. Если необходимо вывести {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>, <модель>).

Заполнитель

Заполнитель задерживает вывод до тех пор, пока весь шаблон не будет сгенерирован, после чего содержимое заменяется.

  1. Используйте @[<placeHolderName>] для размещения заполнителя.
  2. Используйте @[<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 )

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

1
https://api.gitlife.ru/oschina-mirror/nickppa-NG.git
git@api.gitlife.ru:oschina-mirror/nickppa-NG.git
oschina-mirror
nickppa-NG
nickppa-NG
master