数据基础类型

不同的数据有不同的类型,可能是整数、字符串、datetime、数据对象、dict .etc,不同的数据类型,有不同的属性对应。

all

all 表示不管是什么类型的数据,都可以调用的属性。

属性

属性名 说明
json 如果可能,转为 json 结构的结果
from_json 如有可能,将字符串类型转为数据类型,比如dict或者list
int 如果是字符串、float 等可转为整数的数据,转为 int
float 作用类似 `int`
get 针对 dict 或者具体的数据对象,可以获得对应的属性,其它类型的返回 None 值
type 返回一个字符串,表示当前变量的数据类型,结果为 int、float、bool、str、list、tuple 其中之一
md5 变量转为md5后的值
sha1 变量转为sha1后的值
auto_value 对数据进行自动的格式匹配
is_int 当前值是否是整数
is_str 当前值是否是字符串
is_array 当前值是否是list/tuple类型的列表
is_list 当前值是否是list类型
is_tuple 当前是否是tuple类型
is_dict 当前值是否是dict类型
is_number 是否为 int or float
is_float 是否为 float 类型
is_email 当前**字符串**是否是email地址
is_image 当前**字符串**是否为图片的 URL

函数

函数名 接受参数 说明
compute_vars_token *args, **kwargs 可以根据参数,配合数据对象本身,生成一个校验符
check_vars_token token, *args, **kwargs 跟 compute_vars_token 配合使用,校验token 是否正确

str

str 表示是字符串类型的数据

属性

属性名 说明
date 如果能自动判定为一个日期的,转为日期(Date)类型
plain_html 将 html 类型 转为 text,再重新转为 html,去除额外的信息
plain_text / plain 将 html 类型转为 text
escaped 将字符串中包含HTML代码的,进行安全转义。
to_html 将普通的text转为 HTML 格式,主要是 `\n` 替换为 `<br />` 类似的逻辑
to_html_with_images 接近 `to_html` 的作用,但是会解析 `!()[xxxx.jpg]` 这样的 Markdown 插入图片的语法。
image 如果是一个对应的图片路径并且能获得具体数据的,转为 Image 对象;反之返回一个空对象
length 字符长度, 但不同于 utf8 编码, 这是 unicode 编码的计数,一个中文字或者一个字母,都计数为 1
words 字数长度, 英文的单词计数为1, 中日韩文一个字计数为1 (误差率 2% 左右)

函数

limit

作用: 可以将文本或HTML源码根据指定的长度进行输出
接受参数: length=None, mark='......', keep_images=True, words=None

  • length: 最终保留的长度,需为一整数。
  • words: 跟length相似,但是计算的是单词数(英文一单词计数为1,中文一字计数为1);如果length & words都没有对应到,则返回原始的数据。
  • mark: 表示超出裁断后末尾的文字提示
  • kee_images: 是否保留文章内的图片格式(特别是Markdow格式的)

resize

这是一个函数;如果 image 可以获得对象,resize 相当于后续继续调用 image.resize 这个函数; 如果不能获得image的对象,则返回原始的str值。

has

has(to_check, just_in=False): 如果 to_check 是一个 list,其中一项在当前字符串中即返回 True,如to_check 是一个字符串,则 to_check 本身是否包汉于当前字符串中。如果 just_in=False 的情况,则不是“包含”,而是完全等价。

dict

dict 表示字典类型的数据

函数名 参数 说明
set set(key, value) 更新某个 key、value
get get(key) 获得某个key对应的value

array

array 表示类型为 list、tuple 的数据

简单函数

  • all_has(key, check_value=None, opt="=="): list 内的每个元素都是 dict,并且都有指定的 key,并且都等于(opt) check_value, 则返回 True。opt 除了 ==外,也可以是>=, <=, >, <这四种类型。
  • join: 传入一个连接字符,将整个 list 拼接成长字符串,比如 list.join("\n").
  • length: 返回当前列表的元素数 (长度)

sort

对数组进行重新的排序,仅接受一个参数attr(根据某个属性排序),如果attr前面以-开头,则表示结果倒序。

posts.sort('position')  # 按照自定义的位置排序
posts.sort('-position') # 按照自定义的位置倒序
posts.sort('date.year')# 按照日志的发表年份排序

group

对列表进行重新归档,仅接受一个参数attr(根据某个属性排序),如果attr前面以-开头,则表示结果倒序。
如果是多个子属性的混合,可以使用attr:sub_att1+sub_attr2, 比如posts.group('date:year+month');如果子属性是一个列表型的值,则会对列表里的每个值进行归档,比如posts.group('tags')
归档的返回值也是一个列表,每个元素的形式为:[group_key, [item1, item2, item3, .etc]]。


代码示例,(默认模板中)我们可以对一个日志列表按照年份进行归档。

posts = d.get_data(type='post', limit=300, sort='desc')
entries = posts.group( 'date:year')

最终获得的entries形如:

[
    (2013, [<post1>, <post2>, <post3>]),
    (2012, [<post1>, <post2>]),
]

通过以下方式进行页面的呈现:

ul: for year, posts in entries
    li= year
    ul: for post in posts
        li= post.title

注意:归档的倒序,只是组与组之间的,比如2013年这个组可以排在2012年之前,但是组内的元素次序,仍然是原来的次序。

filter

用来过滤一个列表性质的数据。接受两个参数,一个为attr, 一个为attr_value, 判断的依据是数据对象的属性(attr)完全等于指定值(attr_value);如果attr_value是一个列表,那么对象的属性值在这个列表内的讲作为判断依据。
比如objects = [{value:1}, {value:2}, {value:1}]
那么objects.filter('value', 2) 将会返回[{value:2}]。
接收参数:
attr: 字符串,表示具体的属性名
attr_value: 属性名对应的值
opt: 默认值为None(相当于等于),也可以是>= > <= < 这四个其中之一
return_one: 返回结果的第一个值,如果不存在,则返回None

insert

insert(obj, position=-1), 可以往列表中添加一个对象,默认的position=-1表示于最后的位置添加。
insert这个命令会尽可能避免新元素(如果是一个数据对象)与旧列表的冲突。如下例子:

posts = [<p1>, <p2>, <p3>]
new_post = <p2>
+posts.insert(new_post, 0)
最终的posts = [<p2>, <p1>, <p3>]

split

接受参数: <per=3>
作用: 将一个list分割成多个子list组成的list元素,每个子list的长度为per(默认为3)

Text

Text 是一个特别的字段,一般是针对 Markdown 文档类型的content这个属性,才会将 content 本身转为Text字段。如果一个属性本身是字符串,那么请求_field,那么也会自动转化为 Text 字段,比如post.title 是一个字符串,而post._title则是一个 Text 字段。

属性

属性名 说明
plain 输出仅有换行格式的平文本。但如果原文有HTML标签,并不会转义
plain_html 对 `plain` 这个获得的值,在转为 HTML 格式,这会去除原始 HTML 内多数的格式、样式
escaped 进行HTML的安全转义后的结果,避免不必要的或者非安全的HTML源码混入页面
opening 如果`content`中有 <!--more--> (单独一行)的话,则会返回被它分割后的第一部分。如果在写日志是,特别进行了这个标注,则需要调用`post.content.opening`;’如果没有,则返回空文本。

limit (函数)

参考basic.limit,使用方法一样。

参考代码:

content = post.content.limit(100, '...')
div= content
if content.more
    a(href="#") Read More

注意: content.limit(100) 等价于 content(100)

Date

只有是 datetime 类型的数据,在属性调用的时候,自动转为 Date 格式, 比如 post.date

format

指定TimeFormat(参见文章末尾),进而格式化日期的函数

代码示例:

+post.date.format('%Y-%m-%d')
+post.date('%Y-%m-%d')
// 两个函数命令是等价的, post.date 即是属性,也是一个可调用的函数
// 最终格式为 2012-12-22

before

接受一个整数参数,表示?秒之前的时间,返回一个新的Date对象。

after

同before,表示?秒之后的时间。

TimeFormat (附)

%a 本地的星期缩写
%A 本地的星期全称
%b 本地的月份缩写
%B 本地的月份全称
%c 本地的合适的日期和时间表示形式
%d 月份中的第几天,类型为decimal number(10进制数字),范围[01,31]
%f 微秒,类型为decimal number,范围[0,999999],Python 2.6新增
%H 小时(24进制),类型为decimal number,范围[00,23]
%I 小时(12进制),类型为decimal number,范围[01,12]
%j 一年中的第几天,类型为decimal number,范围[001,366]
%m 月份,类型为decimal number,范围[01,12]
%M 分钟,类型为decimal number,范围[00,59]
%p 本地的上午或下午的表示(AM或PM),只当设置为%I(12进制)时才有效
%S 秒钟,类型为decimal number,范围[00,61](60和61是为了处理闰秒)
%U 一年中的第几周(以星期日为一周的开始),类型为decimal number,范围[00,53]
%w 星期,类型为decimal number,范围[0,6],0为星期日
%W 一年中的第几周(以星期一为一周的开始),类型为decimal number,范围[00,53]
%x 本地的合适的日期表示形式
%X 本地的合适的时间表示形式
%y 去掉世纪的年份数,类型为decimal number,范围[00,99]
%Y 带有世纪的年份数,类型为decimal number
%Z 时区名字(不存在时区时为空)
%% 代表转义的"%"字符