Varia's website https://varia.zone
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

91 lines
1.8 KiB

# -*- coding: utf-8 -*-
"""
Section number plugin for Pelican
================================
Adds section numbers to section titles of the article
"""
from pelican import signals
def _extract_level(text, idx):
end = text.find(">", idx)
if end == -1:
return (idx, -1)
try:
level = int(text[idx: end])
return (end, level)
except:
return (idx, -1)
def _level_str(level_nums, level_max):
ret = u''
if len(level_nums) > level_max:
return ret
for n in level_nums:
ret += str(n) + '.'
return ret[:-1]
def _insert_title_number(text, level_max):
idx = 0
levels = []
level_nums = []
while True:
idx = text.find("<h", idx)
if idx == -1:
break
(idx, level) = _extract_level(text, idx + 2)
if level == -1:
continue
if not levels:
levels += [level]
level_nums += [1]
elif level == levels[-1]:
level_nums[-1] += 1
elif level < levels[-1]:
while level < levels[-1]:
levels.pop()
level_nums.pop()
level_nums[-1] += 1
else:
while level > levels[-1]:
levels += [levels[-1] + 1]
level_nums += [1]
text = text[:idx + 1] + \
_level_str(level_nums, level_max) + '. ' + text[idx + 1:]
# print text.encode('gb2312')
return text
def process_content(content):
if content._content is None:
return
level_max = content.settings.get('SECTION_NUMBER_MAX', 3)
if level_max <= 0:
return
content._content = _insert_title_number(content._content, level_max)
def register():
signals.content_object_init.connect(process_content)