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

OSCHINA-MIRROR/nickppa-NG

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.cn.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