12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- # -*- 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)
|