2014-10-08
当前,Ghost博客并不支持标签云功能。
这是几个解决方案:
在模板中遍历
在某个模板中遍历每一个博客,對每一篇博客遍历其tag,然后将这些tag输出到网页。
这种方法有两个问题:
1、输出的标签会有重复。
2、性能问题。
手动
手动在模板中某处添加某些常用的标签。
单独一个网站来显示所有标签
假如数据库使用的sqlite,其存放在ghost下的/content/data/
目录中,假如使用生产环境,数据库名为ghost.db
。ghost.db
中,表tags
存放了所有的标签信息,表posts_tags
存储了文章与标签的对应关系。在表tags
中,name
字段是标签名称,slug
字段用来构造url。
据此,可以再写一个小网站,只显示tag信息,甚至将这个网站以iframe
的形式嵌入到ghost的一个页面中。
生成tag信息,放入ghost的一个页面中
只显示标签的基本信息:
select name, slug from tags;
同时获取tag对应的文章数量:
select tags.id, count(tags.id), tags.name, tags.slug
from tags inner join posts_tags
on tags.id=posts_tags.tag_id
group by tags.id;
下面是一段生成标签云的代码:
# !/usr/bin/python
# -*- encoding:utf-8 -*-
'''
Created on Oct 8, 2014
@author: letian
'''
import jinja2
import sqlite3
import sys
reload(sys)
sys.setdefaultencoding('utf8')
DB = './ghost.db'
template_str = '''
{% for tag in tags %}
<a href="{{ tag.url }}" style="margin:6px 6px;">{{ tag.name }}</a>
{% endfor %}
'''
template = jinja2.Template(template_str)
conn = sqlite3.connect(DB)
cursor = conn.cursor()
tags = []
for row in cursor.execute("select name, slug from tags "):
tags.append({'name': row[0], 'url':'/tag/'+row[1]})
print template.render(tags=tags)
将输出结果复制到某个页面即可。
生成字体大小有变化的标签云
(2015-05-09 添加)
# !/usr/bin/python
# -*- encoding:utf-8 -*-
import jinja2
import sqlite3
import sys
import random
reload(sys)
sys.setdefaultencoding('utf8')
DB = './ghost.db'
template_str = '''
{% for tag in tags %} <a href="{{ tag.url }}" style="margin:30px 10px; font-size: {{ tag.font_size }}">{{ tag.name }}</a> {% endfor %}
'''
template = jinja2.Template(template_str)
conn = sqlite3.connect(DB)
cursor = conn.cursor()
tags = []
tags_dic = []
sql = '''select tags.name as name, tags.slug as slug, count(*) as num
from tags, posts_tags
where tags.id = posts_tags.tag_id
group by tags.id; '''
for row in cursor.execute(sql):
tags.append(( row[0], '/tag/'+row[1], row[2] )) # name, url, num
tags = sorted(tags, key=lambda item: item[2])
font_size = 12
count = 0
for tag in tags:
count += 1
if count % 5 == 0: # 5个一组,字体大小下一组比上一组大2
font_size += 2
tags_dic.append( {'name': tag[0], 'url': tag[1], 'font_size': str(font_size) + 'px' } )
random.shuffle(tags_dic) # 洗个牌
print template.render(tags=tags_dic)
也是将输出结果复制到某个页面即可。