четверг, 9 июля 2009 г.

Pyblosxom: переход на следующую/предыдущую запись

Кажется, начинаю выходить из очередного периода застоя - дошли руки до обустройства дневника. Вести я его взялся в Pyblosxom. Код движка вгоняет в тоску, но это все, что есть. Остальные, либо написаны на языках, разбираться в которых лень, либо требуют базу данных, что мне тоже нисколько не улыбается. Постоянно наткаюсь на ситуацию: помню, делал недавно запись по теме, а в какой статье, не помню. Так и чешутся руки прикрутить навигацию следующая/предыдущая статья. В ядре блога эти вещи отсутствуют, как класс, из плагинов нашел только pyentrynavi. Все бы хорошо, если бы версия 0.4 2008/06/10 работала с PyBlosxom 1.5, который сейчас в trunk сидит. Пришлось немного похачить, чтобы заставить хоть как-то работать. Во-первых, вылез системно зависимый способ работы с путями файлов. Плагин оказался гвоздями прибит к unix путям, а под windows ни найти текущую запись не мог, ни ссылки корректно сформировать. Сравнение путей удалось вылечить с помощью os.path.normpath. Для формирования правильных ссылок переделал translate_file_to_link. Вообще-то, выкинул и заменил на entry_url. Во-вторых, плагин зачем-то был жестко привязан к расширению .txt файлов с постами. Поскольку мне удобнее писать заметки на reStructuredText (модуль rst и расширение файлов .rst), все мои записи пошли лесом. Такой расклад меня не устравает, так что ограничение выкинул. (Зачем автор парился с ограничением для меня осталось загадкой. Функция tools.walk и так учитывает известные движку расширения файлов, в том числе добавленные плагинами. Может раньше этого не было?) В результате имеем патч на версию 0.4 2008/06/10. Остается договориться с автором, чтобы пропихнуть в основную ветку.
--- a/pyentrynavi.py    Mon Jul 06 14:59:19 2009 +0600
+++ b/pyentrynavi.py    Thu Jul 09 14:54:35 2009 +0600
@@ -44,7 +44,7 @@

from Pyblosxom import tools, entries
import time
-import re
+import os.path

def verify_installation(request):
    config = request.getConfiguration()
@@ -53,11 +53,6 @@
        return 0
    return 1

-def translate_file_to_link(filename, datadir, base_url, flavour):
-    datadir = datadir.rstrip('/')
-    basename = filename[len(datadir):]
-    return base_url+basename[:(basename.rfind('.')+1)]+flavour
-
def cb_prepare(args):
    request = args['request']
    data = request.getData()
@@ -66,14 +61,13 @@

    entry = data['entry_list']
    flavour = data['flavour']
-    filename = entry[0]['filename']
+    filename = os.path.normpath(entry[0]['filename'])

    config = request.getConfiguration()
    datadir = config['datadir']
    base_url = config['base_url']

-    r = re.compile('(.*\.txt$)')
-    allentries = tools.Walk(request, datadir, pattern=r)
+    allentries = tools.walk(request, datadir)

#    cur_time = time.localtime()

@@ -94,19 +88,22 @@
    except ValueError:
        return

+    def entry_url(e):
+        # FIXME: flavour is not the same as entry extension
+        return "%s/%s.%s" % (base_url, e["file_path"], flavour)
+
    navi_str = ''
    if num != (len(entrylist)-1):
        fname = entrylist[num+1]
        e = entries.fileentry.FileEntry(request, fname, datadir)
-        prev_link = translate_file_to_link(fname, datadir,base_url, flavour)
+        prev_link = entry_url(e)
        navi_str += '&lt; <a href="http://www.blogger.com/%s">%s</a> '%(prev_link,e['title'])

    navi_str += '| <a href="http://www.blogger.com/%s">MAIN</a> |'%base_url
-
    if num:
        fname = entrylist[num-1]
        e = entries.fileentry.FileEntry(request, fname, datadir)
-        next_link = translate_file_to_link(fname, datadir, base_url, flavour)
+        next_link = entry_url(e)
        navi_str += ' <a href="http://www.blogger.com/%s">%s</a> &gt;'%(next_link,e['title'])

    data['entry_navi'] = navi_str

Комментариев нет:

Отправить комментарий