首页 > 其他分享 >Liquid模板引擎简单使用

Liquid模板引擎简单使用

时间:2024-02-08 22:11:55浏览次数:27  
标签:%- -% Name Liquid Add 引擎 dict 模板

最近在写一个配置表导出工具,自动生成代码那边会用到模板引擎,所以就熟悉了下Liquid的使用。

 

需要用到一个DotLiquid的库

using DotLiquid;

var lqTemplate = Template.Parse(templateContent);

var templateHash = new Hash();

// todo 逻辑部分

using (var sw = new StreamWriter("Assets/temp.txt", false, Encoding.UTF8))
{
    var rdParams = new RenderParameters();
    rdParams.LocalVariables = templateHash;
    rdParams.RethrowErrors = true;
    lqTemplate.Render(sw, rdParams);
}

 

基础变量+if判断

c#逻辑部分

templateHash["int"] = 123;
templateHash["float"] = 10.56f;
templateHash["str"] = "Hello World";

模板部分

int: {{ int }}
float: {{ float }}
str: {{ str }}

{% if int > 100 %}
大于100
{% endif %}

{% if str != 'abc' %}
不是abc
{% endif %}

{% if int > 10 and float > 10 %}
int和float都大于10
{% endif %}

模板执行结果

会看到有很多空行,因为模板表达式本身也会输出一行,有没办法去除呢?

 

去除空格,空行

就是在标签上加个减号

1) 移除到行首的所有空格

{%- %}

{{- }}

2) 移除到行尾的所有空格,或没有任何空格时移除换行符

{% -%}

{{ -}}

3) 两个也可以同时一起用

{%-  -%}

{{-  -}}

 

数组

c#逻辑部分

templateHash["StrArray"] = new string[] { "1", "2" };

模板部分

arr.ToString(): {{ #StrArray }}
size: {{ StrArray.size }}

arr[0]: {{ StrArray[0] }}
arr[1]: {{ StrArray[1] }}

arr loop:
{%- for item in StrArray -%}
index_{{ forloop.index }} : {{ item }}
{%- endfor -%}

执行结果

 

List

c#逻辑部分

var intList = new List<int>();
intList.Add(1);
intList.Add(2);
intList.Add(3);
templateHash["intList"] = intList;

模板部分

intList: {{ intList.size }}
list[0]: {{ intList[0] }}
list[1]: {{ intList[1] }}

{%- for item in intList -%}
    index_{{ forloop.index }} : {{ item }}
{%- endfor -%}

执行结果

 

Dictionary

c#逻辑部分

var dict = new Dictionary<string, object>();
dict.Add("a", 1);
dict.Add("b", 2);
dict.Add("c", 3);
templateHash["dict"] = dict;

模板部分

a: {{ dict.a }}
b: {{ dict.b }}
c: {{ dict.c }}

{%- for entry in dict -%}
index_{{ forloop.index}} : {{ #entry }}, k:{{ entry.Key }}, v:{{ entry.Value }}
{%- endfor -%}

执行结果

无法访问到KeyValuePair的Key和Value属性,也不知道原因。

 

2)

c#逻辑部分

var dict2 = new Dictionary<int, string>();
dict2.Add(1, "a");
dict2.Add(2, "b");
dict2.Add(3, "c");
templateHash["dict2"] = dict2;

模板部分

dict[1]: {{ dict2[1] }}
dict[2]: {{ dict2[2] }}
dict[3]: {{ dict2[3] }}

{%- for entry in dict2 -%}
index_{{ forloop.index}} : {{ #entry }}, k:{{ entry.Key }}, v:{{ entry.Value }}
{%- endfor -%}

执行结果

 执行到遍历的那里会报错,不支持KeyValuePair<int, string>类型

 

对象

c#逻辑部分

public class Student
{
    public int Age { get; set; }

    public string m_Name;

    public string Name
    {
        get { return m_Name; }
    }
}


var stu = new Student();
stu.Age = 20;
stu.m_Name = "ZhangSan";
templateHash["obj"] = Hash.FromAnonymousObject(stu); //不用Hash包装的话会报错

模板部分

age: {{ obj.Age }}
name: {{ obj.Name }}
name: {{ obj.m_Name }}

执行结果

注意:模板中不支持变量访问,支持属性访问

不用Hash包装stu对象,会出现下面的错误

 

Dictionary当作对象使用

c#逻辑部分

var dictObj = new Dictionary<string, object>();
dictObj.Add("Age", 20);
dictObj.Add("Name", "ZhangSan");
dictObj.Add("m_Name", "ZhangSan");
templateHash["dictObj"] = dictObj;

模板部分

age: {{ dictObj.Age }}
name: {{ dictObj.Name }}
name: {{ dictObj.m_Name }}

执行结果

tips:模板内不支持函数调用

 

对象列表

c#逻辑部分

var stuList = new List<Student>();
for (int i = 0; i < 3; ++i)
{
        var stu2 = new Student();
        stu2.m_Name = $"Stu_{i}";
        stu2.Age = 20 + i;
        stuList.Add(stu2);
}
templateHash["stuList"] = stuList;

模板部分

{%- for item in list -%}
index_{{ forloop.index}} : {{ item.Name }}
{%- endfor -%}

执行会报错

要改成下面这样

var stuList = new List<Hash>();
for (int i = 0; i < 3; ++i)
{
    var stu2 = new Student();
    stu2.m_Name = $"Stu_{i}";
    stu2.Age = 20 + i;
    stuList.Add(Hash.FromAnonymousObject(stu2));
}
templateHash["stuList"] = stuList;

执行结果

就是自定义类型得用Hash包装一下,liquid才能识别。 

 

模板内定义变量

1) 等号右边为常量时,这样定义变量:{% assign name = 'ZhangSan' %}

{%- assign name = 'ZhangSan' -%}
{%- if name == 'ZhangSan' -%}
名字叫张三
{%- endif -%}

 

2) 等号右边为变量时,这样定义变量:{% capture name %}{{ stu.Name }}{% endcapture %}

{%- capture name %}{{ obj.Name }}{% endcapture -%}
{%- if name == 'ZhangSan' -%}
名字叫张三
{%- endif -%}

 

执行结果

 

 

参考

Liquid template language (shopify.github.io)

liquid用法笔记_liquid 数组处理-CSDN博客

Liquid 语法说明 - Cloudhan - 博客园 (cnblogs.com)

Jekyll With Liquid_liquid定义数组-CSDN博客

Liquid for Designers · Shopify/liquid Wiki (github.com)

 

标签:%-,-%,Name,Liquid,Add,引擎,dict,模板
From: https://www.cnblogs.com/sailJs/p/18011790

相关文章

  • 设计模式-模板方法模式(Template Method Pattern)
    #模板方法模式(TemplateMethodPattern)-记忆关键字:模板方法-定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤-类型:行为型-![UML类图](./design-pattern.png)##1.涉及的角色1)Abstr......
  • P4721 【模板】分治 FFT
    最具经济性的写法:\(\mathcalO(n^2)\)暴力拿下\(80\)分,遂跑路。一题多解了,分两部分:分治和多项式求逆。分治考虑cdq分治,每次把\(f_{l\dotsmid}\)和\(g_{1\dotsn-1}\)卷起来,贡献直接加到\(f_{mid+1\dotsr}\)里,要注意一下顺序,先递归左区间,再算当前区间,最......
  • TitanIDE v2.8.0正式发布,模板市场来袭!
    TitanIDEv2.8.0版本正式发布,模板市场中内置40+模版!什么是TitanIDETitanIDE,云端IDE,作为数字化时代研发体系不可或缺的一环,和企业建设好的云服务具有很高的互操作性。秉承“安全、高效、体验”的原则,连接研发体系的各个信息孤岛。Jira、GitLab、Jetbrains全家桶、AndroidStudio、V......
  • 浅蓝色小清新说说文章类个人网站模板代码
    浅蓝色小清新说说文章类织梦dedecms个人博客模板采用DIV+CSS自适应语言制作的文章信息网站模板。整个网站版面宽度为1000px宽度,页面主色调为蓝色,整体大气简洁。浅蓝色小清新说说文章博客模板适用于经典说说、伤感说说、个性说说、搞笑说说、爱情说说等各种QQ说说心情短......
  • 浅蓝色小清新说说文章类个人网站模板代码
    浅蓝色小清新说说文章类织梦dedecms个人博客模板采用DIV+CSS自适应语言制作的文章信息网站模板。整个网站版面宽度为1000px宽度,页面主色调为蓝色,整体大气简洁。浅蓝色小清新说说文章博客模板适用于经典说说、伤感说说、个性说说、搞笑说说、爱情说说等各种QQ说说心情短语......
  • C++编程练习||1.类模板2.整数集合类3.复数集合类,模板结合
    1.类模板 类模板的作用  使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。  类模板的声明  类模板template<模板参数表>class类名{类成员声明};  ......
  • 蒟蒻的模板
    蒟蒻Rainbow_Automaton的模板\(\text{2023-10}\)备战\(\text{csp-s}\)只是目前会的然而目前啥也不会...代码注意事项不要使用usingnamespacestd;min和max都可以直接std::minstd::max吧关同步#definefastreadstd::ios_sync_with_stdio(false);cin.ti......
  • MySQL存储引擎-InnoDB数据页
    MySQL存储引擎-InnoDB数据页MySQL一个数据页默认16kb,MySQL为了不同目的涉及了很多类型的数据页,如undo页、ChangeBuffer页等等。我们这里只关心存放数据的页,即索引(INDEX)页。一个数据页的存储空间大致被划分为7部分,分别为:1、FIleHeader 文件头 38字节2、PageHeader页面......
  • C++编程练习||1.排序函数模板2.函数模板3.重载printArray函数模板
    1.排序函数模板已知主函数如程序后缀代码所示,请为其编写适当的模板函数,使主函数的bubbleSort函数可以对一个整型数组和一个浮点数数组进行输入、排序、输出操作。#include<iostream>#include<iomanip>usingnamespacestd;template<typenameT>voidbubbleSort(T*arr,......
  • 实现流程化办公,可详细了解流程引擎表单!
    随着社会竞争越来越激烈,实现高效率的流程化办公已经成为众多职场人的办公心愿。那么,什么样的软件和平台可以助力实现流程化办公?专业研发低代码技术平台的流辰信息可以为广大客户提供流程引擎表单等整套产品技术方案,助力企业创造高效率流程化办公。流程引擎表单可以通过各种配置化......