将蛇形大小写转换为 pascal/camel 大小写的 Scriban 函数

Scriban function to convert snake case to pascal/camel case

我正在尝试使用 Scriban 模板生成一些 C# 代码。我使用的数据库是 postgresql,所以我的表和属性都在 snake_case 中。我设法制作了一个将蛇形大小写转换为帕斯卡大小写的函数:

{{ for word in EntityName | string.split "_" -}} {{~word | string.capitalize}} {{-end}}

这会将 entity_name 转换为所需的 EntityName.

驼峰式:

{{func split(en)
    ret en | string.split "_"
end}}

{{for index in 0..@split(EntityName).size -}} 
    {{-if index == 0}} {{~@split(EntityName)[index]-}} {{-else-}} {{-@split(EntityName)[index] | string.capitalize-}} {{-end-}}
{{-end}}

但是,我需要在我的模板中多次使用这个函数,因此我想制作一个我可以在整个模板中使用的函数,就像我用于驼峰式大小写转换的 split(en) 函数一样。所以我可以在任何需要的地方做这样的事情:

{{ @convert(EntityName) }}

这可能吗?如果可以,怎么做?

如有任何帮助,我们将不胜感激!

我找到了解决问题的另一种方法。我没有在模板本身中创建函数,而是创建了一个 ScriptObject。

public class ScribanHelper : ScriptObject
{
    public static string ConvertToPascalCase(string word)
    {
        if (string.IsNullOrEmpty(word))
            return string.Empty;

        return string.Join("", word.Split('_')
                     .Select(w => w.Trim())
                     .Where(w => w.Length > 0)
                     .Select(w => w.Substring(0, 1).ToUpper() + w.Substring(1).ToLower()));
    }
}

然后我将其推送到 scriban 上下文以在模板中使用它。

var context = new TemplateContext { MemberRenamer = member => member.Name };

var scriptObject = new ScribanHelper();
context.PushGlobal(scriptObject);

var templateString = File.ReadAllText(templateSetting.Name);
var template = Template.Parse(templateString);

var entityScriptObject = new ScriptObject();
entityScriptObject.Import(entity, renamer: member => member.Name);
context.PushGlobal(entityScriptObject);

var result = template.Render(context);

然后我可以很容易地在模板中使用它。

{{-func pc(name)
    ret convert_to_pascal_case name
end}}

{{@pc(EntityName)}}