diff --git a/README.md b/README.md
index 921e9fa..cb5f0d6 100644
--- a/README.md
+++ b/README.md
@@ -591,6 +591,22 @@ luban同时支持两种级别的分组:

+## excel 列 默认值
+
+该特性只对excel格式文件有效。当单元格为空时,该字段使用默认值。
+
+```xml
+
+
+
+
+
+
+
+```
+
+
+
### 常量别名
游戏里经常会出现一些常用的类似枚举的值,比如说 升级丹的 id,在很多地方都要填,如果直接它的道具 id,既不直观,也容易出错。 Luban 支持常量替换。对于需要常量替换的字段,添加 convert=”枚举类”。 如果填写的值是 枚举名或者别名,则替换为 相应的整数。否则 按照整数解析。
diff --git a/docs/data_excel.md b/docs/data_excel.md
index 2d967f5..d6bb91b 100644
--- a/docs/data_excel.md
+++ b/docs/data_excel.md
@@ -89,6 +89,46 @@ text的key和text字段都是string类型,因此在连续单元格或者sep产

+## datetime 类型
+
+- 时间是常用的数据类型。Luban 特地提供了支持。
+ 有两种形式,一种以纯字符串的方式填写。
+ - 以纯字符串方式填写
+ 填写格式为 以下 4 种。
+ - yyyy-mm-dd hh:mm:ss 如 1999-08-08 01:30:29
+ - yyyy-mm-dd hh:mm 如 2000-08-07 07:40
+ - yyyy-mm-dd hh 如 2001-09-05 07
+ - yyyy-mm-dd 如 2003-04-05
+ - 以 excel内置的时间格式填写
+
+- 为 Item 新增一个 失效时间字段 expire_time 。
+- [定义](images/adv/def_38.png)
+ ``` xml
+
+ ...
+
+
+ ```
+- 配置
+ 图中红框中第一个时间以 excel的时间格式填写
+ 剩下第2,3,4个时间以 纯字符串形式填写
+
+ 
+
+## 可空变量
+
+- 有时候会有一种变量,我们希望它 功能生效时填一个有效值,功能不生效里,用一个值来表示。 例如 int 类型,常常拿 0 或者-1 作无效值常量。 但有时候,0 或-1 也是有效值时,这种做法就不生效了。或者说 项目组内 有时候拿 0,有时候拿-1 作无效值标记,很不统一。我们借鉴 sql 及 c#,引入 可空值概念,用 null 表达空值。
+- 我们为 Item 添加 min_use_level 字段,类型为 int? 当填有效值时,使用时要检查等级,否则不检查。
+- [定义](images/adv/def_36.png)
+ ``` xml
+
+ ...
+
+
+ ```
+- 配置
+ 
+
## 列表类型 list,int
- 我们新增一个字段, 宝箱的随机抽取道具列表 random_item_ids。
@@ -375,45 +415,22 @@ text的key和text字段都是string类型,因此在连续单元格或者sep产
- 定义不变,但 excel 的填法有区别,数据如下:
- 
-## 可空变量
-- 有时候会有一种变量,我们希望它 功能生效时填一个有效值,功能不生效里,用一个值来表示。 例如 int 类型,常常拿 0 或者-1 作无效值常量。 但有时候,0 或-1 也是有效值时,这种做法就不生效了。或者说 项目组内 有时候拿 0,有时候拿-1 作无效值标记,很不统一。我们借鉴 sql 及 c#,引入 可空值概念,用 null 表达空值。
-- 我们为 Item 添加 min_use_level 字段,类型为 int? 当填有效值时,使用时要检查等级,否则不检查。
-- [定义](images/adv/def_36.png)
- ``` xml
-
- ...
-
-
- ```
-- 配置
- 
+## 默认值
-## datetime 类型
+该特性只对excel格式文件有效。当单元格为空时,该字段使用默认值。
-- 时间是常用的数据类型。Luban 特地提供了支持。
- 有两种形式,一种以纯字符串的方式填写。
- - 以纯字符串方式填写
- 填写格式为 以下 4 种。
- - yyyy-mm-dd hh:mm:ss 如 1999-08-08 01:30:29
- - yyyy-mm-dd hh:mm 如 2000-08-07 07:40
- - yyyy-mm-dd hh 如 2001-09-05 07
- - yyyy-mm-dd 如 2003-04-05
- - 以 excel内置的时间格式填写
-
-- 为 Item 新增一个 失效时间字段 expire_time 。
-- [定义](images/adv/def_38.png)
- ``` xml
-
- ...
-
-
- ```
-- 配置
- 图中红框中第一个时间以 excel的时间格式填写
- 剩下第2,3,4个时间以 纯字符串形式填写
+```xml
+
+
+
+
- 
+
+
+```
+
+
## convert 常量替换
diff --git a/docs/images/adv/def_50.png b/docs/images/adv/def_50.png
new file mode 100644
index 0000000..e39fc3f
Binary files /dev/null and b/docs/images/adv/def_50.png differ
diff --git a/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs b/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs
index 8d0237f..d684450 100644
--- a/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs
+++ b/src/Luban.Job.Cfg/Source/Generate/DataScatterRender.cs
@@ -14,6 +14,9 @@ namespace Luban.Job.Cfg.Generate
[Render("data_json")]
[Render("data_json2")]
[Render("data_lua")]
+ [Render("data_xml")]
+ [Render("data_yaml")]
+ [Render("data_erlang")]
class DataScatterRender : DataRenderBase
{
public override void Render(GenContext ctx)
diff --git a/src/Luban.Job.Cfg/Source/RenderExtension.cs b/src/Luban.Job.Cfg/Source/RenderExtension.cs
index fb5af5e..d78fe50 100644
--- a/src/Luban.Job.Cfg/Source/RenderExtension.cs
+++ b/src/Luban.Job.Cfg/Source/RenderExtension.cs
@@ -1,3 +1,4 @@
+using Luban.Job.Cfg.Datas;
using Luban.Job.Cfg.Defs;
using Scriban;
using System.Collections.Generic;
@@ -23,5 +24,24 @@ namespace Luban.Job.Cfg
ctx.PushGlobal(env);
return template.Render(ctx);
}
+
+ public static string RenderData(this Template template, DefTable table, List exportDatas, Dictionary extraModels = null)
+ {
+ var ctx = new TemplateContext();
+ var env = new TTypeTemplateExtends
+ {
+ ["table"] = table,
+ ["datas"] = exportDatas,
+ };
+ if (extraModels != null)
+ {
+ foreach ((var k, var v) in extraModels)
+ {
+ env[k] = v;
+ }
+ }
+ ctx.PushGlobal(env);
+ return template.Render(ctx);
+ }
}
}
diff --git a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs
index 6dcd02e..e7f5e24 100644
--- a/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs
+++ b/src/Luban.Job.Cfg/Source/Utils/DataExporterUtil.cs
@@ -5,6 +5,8 @@ using Luban.Job.Cfg.DataVisitors;
using Luban.Job.Cfg.Defs;
using Luban.Job.Cfg.l10n;
using Luban.Job.Cfg.RawDefs;
+using Luban.Job.Common.Utils;
+using Scriban;
using System;
using System.Collections.Generic;
using System.IO;
@@ -19,6 +21,11 @@ namespace Luban.Job.Cfg.Utils
{
public static object ToOutputData(DefTable table, List records, string dataType)
{
+ if (StringTemplateUtil.TryGetTemplate($"config/data/{dataType[5..]}", out Template template))
+ {
+ return template.RenderData(table, records.Select(r => r.Data).ToList());
+ }
+
switch (dataType)
{
case "data_bin":
diff --git a/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs b/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs
index 6235303..8586e11 100644
--- a/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs
+++ b/src/Luban.Job.Common/Source/Utils/StringTemplateUtil.cs
@@ -18,16 +18,27 @@ namespace Luban.Job.Common.Utils
TemplateSearchPaths.Add(path);
}
- public static string GetTemplateString(string templateName)
+ public static bool TryGetTemplateString(string templateName, out string result)
{
foreach (var searchPath in TemplateSearchPaths)
{
var fullPath = $"{searchPath}/{templateName}.tpl";
if (File.Exists(fullPath))
{
- return File.ReadAllText(fullPath, Encoding.UTF8);
+ result = File.ReadAllText(fullPath, Encoding.UTF8);
+ return true;
}
}
+ result = null;
+ return false;
+ }
+
+ public static string GetTemplateString(string templateName)
+ {
+ if (TryGetTemplateString(templateName, out var strTpl))
+ {
+ return strTpl;
+ }
throw new FileNotFoundException($"can't find {templateName}.tpl in paths:{string.Join(';', TemplateSearchPaths)}");
}
@@ -38,6 +49,21 @@ namespace Luban.Job.Common.Utils
return s_templates.GetOrAdd(templateName, tn => Template.Parse(GetTemplateString(tn)));
}
+ public static bool TryGetTemplate(string templateName, out Template template)
+ {
+ if (s_templates.TryGetValue(templateName, out template))
+ {
+ return true;
+ }
+ if (TryGetTemplateString(templateName, out var strTpm))
+ {
+ template = s_templates.GetOrAdd(templateName, tn => Template.Parse(strTpm));
+ return true;
+ }
+ template = null;
+ return false;
+ }
+
public static Template GetOrAddTemplate(string templateName, Func creator)
{
return s_templates.GetOrAdd(templateName, creator);
diff --git a/src/Luban.Server/Properties/launchSettings.json b/src/Luban.Server/Properties/launchSettings.json
index 13d062e..59ed2f6 100644
--- a/src/Luban.Server/Properties/launchSettings.json
+++ b/src/Luban.Server/Properties/launchSettings.json
@@ -2,6 +2,10 @@
"profiles": {
"Luban.Server": {
"commandName": "Project"
+ },
+ "TestTemplate": {
+ "commandName": "Project",
+ "commandLineArgs": "-t D:\\workspace\\luban_examples\\Projects\\CustomTemplates"
}
}
}
\ No newline at end of file