让micolog首页自动生成摘要
micolog是GAE下几个最好的开源博客之一,但是首页不能自动生成摘要这个看起来很头疼。现在刚好找到一篇文章可以解决这个问题。徐明大哥好好加油,也希望更多的高手写出很多的插件。
———————–
不知各位使用Micolog的朋友有无发现,如果你的文章没有填写摘要部分,默认情况下首页会显示文章的全部内容,比如你配置了每页显示10篇,那么每页就会显示10页的全部内容,如果文章内容过长的话,浏览效果感觉非常的不好。
所以我就想着自动生成摘要,对于python,我也就是个初学者,相关语法资料什么的学习时间加起来都不超过3小时,还好python语法还算简单,而且网上搜索了半天,发现了已经有人写了一个小函数,可以提取html中的文字。--------这里要解释一下,可能有些朋友的做法或者想法较简单,认为就是对文章内容的一个简单的substring就搞定了么,呵呵,很可惜,不是那么的简单,如果文章里边包含了html的话,你会发现这个substring出来的文字显示是乱七八糟,有时候甚至会破坏你的网站布局。 所以我们必须做的是提取出html中的文字部分。
那找到这个html处理函数后,就需要找修改Micolog的位置,您大可以在publishi这篇文章的时候使用这个函数,也可以在页面进行加载的时候使用,我是采用的第二种策略,下边给出详细位置,不太版本可能不一样,但如果您都已经搜到这篇文章了,那我相信您一定知道怎么找使用位置的。
打开Model.py, 找到下边这个函数
def get_content_excerpt(self,more='..more'):
if g_blog.show_excerpt:
if self.excerpt:
return self.excerpt+' %s'%(self.link,more)
else:
sc=self.content.split('《换掉书名号!--more--》')
if len(sc)>1:
return sc[0]+u' %s'%(self.link,more)
else:
return sc[0]
else:
return self.content
然后修改为下边的样子:
def get_content_excerpt(self,more='..more'):
if g_blog.show_excerpt:
if self.excerpt:
return self.excerpt+' %s'%(self.link,more)
else:
sc=self.content.split('《换掉书名号!--more--》')
if len(sc)>1:
return sc[0]+u' %s'%(self.link,more)
else:
return self.truncate_html((sc[0]),'120 html') +u' %s'%(self.link,more)
else:
return self.content
def truncate_html(self,content, args):
maxlen=100 #显示字数
format = 'html' #html:保留html格式截取 text:纯文本取
showimg = '' #空 表示不显示图片 img 显示图片
end='...' #省略显示符号
if args:
bits = args.split(' ')
if len(bits) == 3:
maxlen, format, showimg = bits
elif len(bits) == 2:
maxlen, format = bits
else:
maxlen = args
maxlen = int(maxlen)
#过虑段落标记
content = re.sub('?(P|p)[^<>]*/?>', '', content)
#截取纯文本
if format == 'text':
content = re.sub('(<)[^<>]*(>?)', '', content)
content = re.sub(' ', '', content)#过虑掉
if len(content) <= maxlen:
return content
return '%s%s' % (content[:maxlen],end)
#过虑图片标记
if showimg != 'img':
content = re.sub('?(IMG|img)[^<>]*/?>', '', content)
n =0
result = ''
temp = ''
isCode = False #是不是HTML代码
isHtml = False #是不是HTML特殊字符,如
#获取指定长度的内容
for i in range(len(content)):
temp = content[i]
if temp == '<':
isCode = True
elif temp == '&':
isHtml = True
elif temp == '>' and isCode:
n = n -1
isCode = False
elif temp == ';' and isHtml:
isHtml = False
if not isCode and not isHtml:
n = n + 1
result += temp
if n >= maxlen:
break
#取出所有html标记
temp_result = re.sub('(>)[^<>]*()','><', result)
temp_result = temp_result.lower()
if len(content) - len(temp_result) < maxlen:
return content
result += str(end)
#去掉不需要结束标记html标记
rg = "?(AREA|BASE|BASEFONT|BODY|BR|COL|COLGROUP|DD|DT|FRAME|HEAD|HR|HTML|IMG|INPUT|ISINDEX|LI|LINK|META|OPTION|P|PARAM|TBODY|TD|TFOOT|TH|THEAD|TR|area|base|basefont|body|br|col|colgroup|dd|dt|frame|head|hr|html|img|input|isindex|li|link|meta|option|p|param|tbody|td|tfoot|th|thead|tr)[^<>]*/?>"
temp_result = re.sub(rg, '',temp_result)
#去掉成对的html标记
temp_result = re.sub('<([a-zA-Z]+)[^<>]*>(.*?)\\1>', '',temp_result)
#取出html标记符号
arr = re.findall('<([a-zA-Z]+)[^<>]*>', temp_result)
#补全html标记
for i in range(len(arr)):
result += '%s>' % arr[len(arr)-i-1]
return result
上边这个函数核心都是摘自网络,可惜找不到原作者链接了,抱歉抱歉...
然后直接保存上传即可
当然,您也可以直接使用我的这个py文件. http://www.xioxu.com/media/agp4aW94dXNpdGUxcg0LEgVNZWRpYRix4AcM/model.py.zip
最后再加一句牢骚,我真的是很不喜欢python没有大括弧这样的东西,通过对齐来进行逻辑区分,这真的是很不舒服。
----------------------------
我试过了,果真可以!
转自:http://www.xioxu.com/2010/10/24/micolog_summary.html
发表评论