数据基础类型
不同的数据有不同的类型,可能是整数、字符串、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
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
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 时区名字(不存在时区时为空)
%% 代表转义的"%"字符