django 自带的模板过滤器truncatewords和truncatewords_html 都是不支持中文的,前者是截取不带html标签的内容,后者截取带html标签的内容。为了达到截取中文的目的,按照truncatewords和思路重新编写了字符截取工具
这个新的truncatewords函数是从带html标签的内容或不带html内容中截取字符的,中英文皆可,截取之后会去掉原有的标签,只保留内容
##################################################################################
#截取字符工具,不保留html
##################################################################################
def truncatewords(s,num,end_text='...'):
re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
s = force_unicode(s)
length=int(num)
if length<=0:
return u''
pos = 0
words=0
data=[]
out=''
current_word = ''
while words <= length:
if words==length:
break
#查找第一个标签结束的>
m= re_tag.search(s,pos)
if not m:
break
pos = m.end()
#开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<,说明匹配到了html标签了,则跳出去,否则开始检查下一个标签的>
while words <= length:
if words==length:
break
m = re_words.search(s,pos)
if not m:
break
current_word = m.group()
if current_word=='<':
break
else:
if not m.group(1):
words+=1
data.append(str(m.group()))
pos+=1
else:
words+=1
data.append(str(m.group()))
pos=m.end()
out = ''.join(data)
out+=end_text
return out
truncatewords_html 也是截取内容,但其保留了html标签
##################################################################################
#截取字符工具,保留html
##################################################################################
def truncatewords_html(s,num,end_text='...'):
html4_singlets = ('br', 'col', 'link', 'base', 'img', 'param', 'area', 'hr', 'input')
re_tag= re.compile(r'<(/)?([^ ]+?)(?: (/)| .*?)?>')
re_words = re.compile(u'(&.*?;)|[\u4e00-\u9fa5]{1}|[^\u4e00-\u9fa5]{1}',re.UNICODE)
s = force_unicode(s)
length=int(num)
if length<=0:
return u''
pos = 0
words=0
current_word = ''
open_tags=[]
while words <= length:
if words==length:
break
#查找第一个标签结束的>
m= re_tag.search(s,pos)
if not m:
break
pos = m.end()
closing_tag,tagname,self_closing=m.groups()
#自关闭标签不处理,或者是单标签
if self_closing or tagname in html4_singlets:
pass
elif closing_tag:
# Check for match in open tags list
try:
i = open_tags.index(tagname)
except ValueError:
pass
else:
#移除该标签,说明该标签已经闭合
open_tags.remove(tagname)
else:
#把标签加入到仍然打开的标签中
open_tags.insert(0, tagname)
#开始从这个位置向后搜索字符,匹配到第一个字符,停止,检查,如果字符是<则跳出去,否则开始检查下一个标签的>
while words <= length:
if words==length:
break
m = re_words.search(s,pos)
if not m:
break
current_word = m.group()
if current_word=='<':
break
else:
if not m.group(1):
words+=1
pos+=1
else:
words+=1
pos=m.end()
#如果本身的大小就不够,则不加结尾
if pos==len(s):
return s
out = s[:pos]
if end_text:
out += ' ' + end_text
# Close any tags still open
for tag in open_tags:
out += '</%s>' % tag
# Return string
return out
分享到:
相关推荐
下面将详细介绍一些常见的Django过滤器以及如何创建自定义过滤器。 1. `upper`:将字符串转换为大写,如`{{ user.name | upper }}`将输出用户名的大写形式。 2. `add`:给变量加上指定的数值,例如`{{ user.age | ...
过滤器则允许对变量的值进行操作,比如`| upper`将字符串转为大写,`| slice:0:3`截取字符串的前三个字符等。 3. **函数调用**:Pongo2支持在模板中调用自定义函数,这使得模板更加灵活。你可以注册自定义的函数来...
模板过滤器是应用在变量上的函数,可以对变量的值进行转换或处理,例如格式化日期、转换大小写、截取字符串等。通过管道符(|)与变量连接,如`{{ variable|filter_name }}`。 5. 模板上下文: 模板上下文是传递给...
- **自定义标签和过滤器**:开发者可以定义自己的标签和过滤器来满足特定需求。 #### 常见标签和过滤器详解 - **abs**:返回数字的绝对值。 - **batch**:分批处理数组。 - **capitalize**:首字母大写。 - **...
3. **过滤器**:如同Django,Dotiac DTL提供了一系列内置过滤器,如`lower`用于转换字符串为小写,`upper`转换为大写,`truncatechars`截取字符串等。这些过滤器可以方便地应用于模板中的变量,对数据进行处理。 4....
除了内置的过滤器和测试外,开发者还可以根据需求自定义新的过滤器和测试。这需要在 Flask 应用中通过 `app.jinja_env.filters` 和 `app.jinja_env.tests` 来注册。 ##### 2. 宏 (Macros) 宏类似于函数,可以在模板...