# 关于模板

# Jinja

:一种基于 Python 的文本模板语言。

  • 官方文档 (opens new window)
  • 由 Flask 的作者开发,最初是模仿 Django 的 DTL 模板语言,用于处理 HTML 文件,后来推广到处理各种类型的文本文件。

# 语法

  • 三种定界符:
    {{ }}    # 用于读取变量的值,并嵌入模板文本中
    {% %}    # 用于执行指令
    {# #}    # 用于声明单行注释
    
    • 渲染模板文件时会删除所有注释。
    • 声明多行注释的方法:
      {% comment %}
      This is a comment.
      {% endcomment %}
      

# 变量

  • 例:

    {% set a='Hello' %}   # 创建变量
    {% set b=a %}         # 将变量赋值给另一个变量
    {{ b }}               # 读取变量的值
    
    • 如果读取的变量不存在,则取值为空字符串。
  • 变量可以是 Python 中任意类型的对象,可以调用该对象的属性、方法:

    {{ name }}            # 读取变量
    {{ name.__doc__ }}    # 调用属性
    {{ name.encode() }}   # 调用方法
    {{ dict1['A'] }}      # 读取字典
    {{ list1[0] }}        # 读取列表
    

# 控制结构

  • if 语句:

    {% if a is defined %}   # 判断变量是否已定义
    AAA
    {% elif not b %}
    BBB
    {% else %}
    CCC
    {% endif %}
    
    {{ True if a else False }}
    {{ a or 'Hello' }}      # 为变量设置默认值
    
  • 迭代列表:

    <ul>
      {% for i in list1 %}
      <li>{{ i }}</li>
      {% endfor %}
    </ul>
    
  • 迭代字典:

    <dl>
      {% for k, v in dict1.items() %}
      <dt>{{ k }}</dt>
      <dd>{{ v }}</dd>
      {% endfor %}
    </dl>
    
  • 继承:

    {% extends "base.html" %}   # 继承 base.html 的内容
    
    {% block head %}            # 定义一个 block 块,如果继承的父文件中存在同名的 block ,则会覆盖它
        {{ super() }}           # 插入父文件中同名的 block 的内容
        <title>Hello</title>
    {% endblock %}
    

# import jinja2

:Python 的第三方库,提供了 Jinjia 模板引擎。

  • 安装:pip install Jinja2

  • 例:

    >>> from jinja2 import Template
    >>> text = "Hello {{a}}"
    >>> template = Template(text)   # 根据字符串创建模板
    >>> template.render(a='Word')   # 传入变量,渲染模板并返回
    'Hello Word'
    

    可以合并成一步:

    >>> Template('Hello {{a}}').render(a='Word')
    'Hello Word'
    >>> Template('Hello {{b}}').render(a='Word')      # 变量 b 不存在,因此读取到的值为空字符串
    'Hello '
    >>> Template('Hello {{a, b}}').render(a='Word')   # 这里相当于读取元组 (a, b) 的值
    "Hello ('Word', Undefined)"
    
  • 调用 render() 时可以传入关键字形式的参数,也可以传入一个字典:

    template.render(a='Word')
    template.render({'a':'World'})
    

# Markdown

:一种对文本进行简单排版的标记语言。

  • 虽然用 HTML 语法能编写 Web 网页,但语法繁琐、不方便供人编写。而 Markdown 相当于简化版的 HTML 语法。
  • 当用户用 Markdown 语法编写一个文本文件之后,可以用 Markdown 阅读器处理,渲染成 HTML 页面。

# 语法

  • Markdown 格式的文本文件的扩展名为 .md 。

  • Markdown 兼容 HTML 的语法,比如插入 <p> 标记。

  • 换行

    • 在 Markdown 文档中输入连续多个空格时,只会显示一个空格。
    • 在 Markdown 文档中输入连续多个空行时,只会显示一个空行。
    • 在行尾加上一个 \ ,可以在显示时强制换行。
  • 标题

    • 一行以井号 + 空格开头,会显示成标题,采用大写、粗体字体。
    • 行首井号的数量从 1 到 6 ,对应一级标题到六级标题,字号依次递减。
    • 例:
      # 一级标题
      ### 二级标题
      #### 三级标题
      
  • 字体:

    • 在字符串前后加上连续 n 个星号 * 或下划线 _ ,会显示成特殊字体。
    • 例:
      普通字体
      *斜体*  _斜体_
      **粗体**  __粗体__
      ***斜粗体***  ___斜粗体___
      ~~删除线~~
      
  • 无序列表

    • 连续多行以 * - + 三者之一的符号 + 空格开头,会显示成无序列表。
    • 行首可以加上空格缩进,从而显示出多个层级。
    • 例:
      * sentence
      * sentence
        - sentence
        - sentence
          + sentence
          + sentence
      
  • 有序列表

    • 连续多行以阿拉伯数字 + 小数点 + 空格开头,会显示成无序列表。
    • 例:
      1. sentence
      2. sentence
      3. sentence
      
  • 表格

    • :连续多行,每列字段用 | 作为分隔符。第一行是表头。第二行的每列内容为 - ,用于确定整个表格的总列数。
      key | Value
      -   | -
      a   | 1
      b   | 2
      c   | 3
      
  • 引用

    • 一行以大于号 > 开头,会显示成单行引用。
    • 段首以四个以上的空格开头时,会显示成一个缩进的区块。
  • 代码

    • 在字符串前后加上反引号 ` 作为定界符,会加亮显示。如下:
      请在终端输入命令 `ls -l`
      
    • 在文本前后加上三个反引号 ``` ,会显示成代码块。还可在开头加上编程语言的名称,让代码块根据语法高亮显示多种颜色。如下:
      print('hello')
      
  • 链接

    • 有多种格式:
      <https://www.baidu.com>
      [一个超链接](https://www.baidu.com)
      ![一张图片](1.png)
      ![一张图片,居中显示且限制尺寸](1.png#pic_center =60x60)
      
  • 如果要显示 Markdown 语法中的保留字符,则需要用反斜杠转义,如下:

    \<  \*  \#
    

    显示反引号时,要用两个反引号作为定界符:

    `` Hi` ``
    
  • 还有一些扩展语法,MarkDown 阅读器不一定支持:

    [TOC]         <!-- 显示目录,这会收集当前文档的各个标题 -->
    x^2^          <!-- 上标 -->
    H~2~O         <!-- 下标 -->
    ==Notice==    <!-- 高亮显示 -->
    ---           <!-- 显示一行水平分割线 -->
    

# import markdown2

:Python 的第三方库,用于将采用 Markdown 语法的文本,渲染成采用 HTML 语法的文本。

  • GitHub (opens new window)

  • 安装:pip install markdown2

  • 例:

    >>> import markdown2
    >>> markdown2.markdown('# 一级标题')
    '<h1>一级标题</h1>\n'
    
  • 可以在 shell 终端执行命令,渲染一个文件:

    python -m markdown2 test.md > test.html