# TG
**Repository Path**: MXuDong/TG
## Basic Information
- **Project Name**: TG
- **Description**: The TG
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2020-11-11
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# TG

TG : Template Generator
根据模版,生成文件。
特点:
- 支持插件开发
- 支持表达式运算
- 支持内部流程替换
- 扩展性极高
# 使用及开发扩展
## 流程定义
1. 主程序启动
2. 检测基本参数 插件模式是否开启、目录文件、输出文件
3. 预加载流程启动
1. 加载内部API
2. 加载外部插件、API
3. 预加载流程结束-同时处理开始调用插件能力
4. 解析基本参数指令
5. 主功能引擎启动
6. 扫描参数指定的目录树
1. 扫描所有文件
2. 注册所有配置文件env.yaml
3. 注册所有模版文件*.temp
7. 执行模版生成
1. 搜索目标文件内的所有模版变量
2. 执行模版变量生成
3. 输出文件
## 内部数据说明
### 共享参数列表
| 参数名称 | 类 | 所在阶段 | 说明 |
| :--- | :--- | :---: | :--- |
| input_options | Options | init | 程序启动参数 |
| tg_exit_code | String | 任意时间 | 程序终止参数 |
### 内部 API 列表及说明
可以通过插件复写API方式替换内部API,此API列表为默认API集合,插件可以进行完全替换,需要插件方法标注ExternalApi注解。
所有的内部API均被称为`Active`,每一个内部API均可以被外部Plugin使用ExternalApi注解覆盖。
| API 名称 | Api 参数说明 | Api简介 |
| :--- | :--- | :---: |
| parseTemplateValue | - String templateValue 模版内容 | 将会解析模版内容(此方法不会根据模版内容生成数据,仅将模版内容转换为可识别的数据结构:Option) |
| start | - | 程序启动API,引导程序工作 |
| generatorFile | - TempFile tf 目标模版文件的包装对象 | 生成对应的模版文件的内容 |
| searchTemplateValue | - String fileValue 模版文件的内容 | 所有文本内容中所有的模版数据, 识别所有 `{{}}`并记录 |
| createTempFile | - File targetFile 目标模版文件 | 生成模版文件的包装类 |
| createTemplateValue | - String templateValue 模版数据
- int startIndex 起始位置
int endIndex 模版数据结束位置| 根据指定内容生成模版数据包装类 |
| generatorTemplateValue | T- emplateValue tv 目标模版数据
- Map valueMap 变量 | 根据模版数据内容生成数据 |
| writeTemplate | - File targetFile 模版文件
- String value 期望输出数据 | 根据程序启动参数指定的输入输出位置,将目标模版文件的所在位置映射到输出文件位置,并输出期望输出数据 |
| readFile | - File targetFile 目标模版文件 | 读取目标模版文件 |
| registryEnvFile | - File envFile 变量文件 | 读取变量文件,并将内容转换为内部数据结构 |
| getValueMap | - String basePath 目标模版的路径 | 从根目录依次获取所有的变量文件,并且,子两文件将会覆盖父变量文件中已经存在的数据 |
| scanFiles | - | 扫描所有的模版文件(.tmpl后缀的文件),从程序启动参数中获取根路径 |
| scanEnvs | - | 扫描所有的变量文件(env.yaml),从程序启动参数重获取跟根路径|
| DebugOutPut | - String outputValue 被输出内容 | 将数据打印到控制台中(`DEBUG`级别)需要启动时添加-d参数) |
| InfoOutPut | - String infoValue 被输出内容 | 将数据打印到控制台中(`INFO`级别) |
| setArgument | - String[] inputArgs 程序启动参数传入
- Options options 程序解析参数的Option| 设置所有程序参数 |
| stopTG | - | 停止程序运行,当出现`tg_exit_code`时,该方法将会被调用 |
| createBaseContext | - Options options 命令行解析工具 | 创建一个无父级别的程序上下文 |
| loadInnerApi | - | 扫描所有内部API |
| loadPlugins | - | 扫描并将所有的插件添加到程序中,只关注插件中的 `PluginApi` 和 `ExternalApi` 方法|
## 模版行为控制
模版的变量支持参数控制,类似于控制台参数设置方式。
部分参数冲突,将会选取优先级最高的参数进行设置
### 输出模版内容
自上而下按照参数优先级从高到低排序
| 参数名称 | 参数类型 | 参数样例 | 参数说明 |
| :--- | :---: | :--- | :--- |
| -V | String | -V true
-V false | 表达式为真时,进行输出, 默认true |
| -n | String | -n className | 如果数据不存在,返回空字符串,配置 -pr -po指令, 如果数据为数组,则将会为数组中的每个数据进行处理 |
| -pr | String | -pr "import " | 参数为-n状态下,将会将pr参数添加到结果头,多用于数据状态 |
| -po | String | -po "; \n " | 参数为-n状态下,将会将po参数添加到结果尾,多用于数组状态 |
| -v | String | -v test
-v " test " | 将会直接输出后面的数据,不做任何替换 |
## 插件
本应用支持插件化开发。
### 外部插件API开发
对于任意声明为`public static`的方法,并且使用`PluginApi`标注的方法均可以被认为是插件API方法。
插件方法必须声明被调用点以及前置、后置时机。
#### 注入目标Active
用`PluginApi`注解的`actives`属性进行声明,默认为所有`Active`。
使用示例:
```java
public class PluginTest{
// 在 start active(actives = "start") 运行 前(point = PluginApiInfo.PRE_ACTIVE) 进行调用
@PluginApi(actives = "start", point = PluginApiInfo.PRE_ACTIVE)
public static void OutputInnerApis(Context ctx) {
return;
}
}
```
#### 调用时机
用`PluginApi`注解的`point`属性进行声明,默认`PluginApiInfo.NO_ACTIVE`。
支持四个调用时机,使用`io.github.a_donga.tg.api.apis.PluginApiInfo`的静态变量标示。
| 调用时机属性名 | 调用时机 |
| ---: | :--- |
| NO_ACTIVE | 不调用该API |
| PRE_ACTIVE | 目标`Active`前调用 |
| POST_ACTIVE | 目标`Active`后调用 |
| BOTH_PRE_POS_ACTIVE | 目标`Active`前后均调用 |