(defun update-wiki-pathname (path)Пока разбирался с этими проблемами, обнаружил, что и мой патч к puri не безгрешен, пришлось править ещё раз. Внёс соответствующие изменения в свой форк gentoo-lis-overlay, но правда пакеты restas-wiki, restas-directory-publisher и т.п. не обновил, ибо просто не успеваю всё делать, надо бы для них сделать 9999-пакеты. Да, последние дни выдались напряжёнными...
(let ((new-path (pathname (closure-template:encode-uri
(hunchentoot:url-decode
(hunchentoot:url-decode (namestring path)))))))
(unless (equal path new-path)
(rename-file path
(make-pathname :defaults new-path :type :unspecific)))))
(fad:walk-directory #P"/var/to/wiki/dir"
#'update-wiki-pathname)
Показаны сообщения с ярлыком puri. Показать все сообщения
Показаны сообщения с ярлыком puri. Показать все сообщения
вторник, 23 марта 2010 г.
Puri и utf-8. Часть 2.
Стоило мне внести изменения в Puri, о чём я писал в предыдущей заметке, так сразу вылезла куча проблем в моих пакетах. Причиной этого является то, что ранее для компенсации "плохого" поведения Puri я использовал #'hunchentoot:url-decode. Пришлось разлруливать возникающие проблемы, в том числе, внести изменения в restas, в частности в ключевой метод genurl. В итоге, пришлось оформить это дело в виде новой версии - 0.0.6. Заодно, оформил новую версию cl-closure-template, которая теперь экспортирует простые функции для кодирования и декодирования url (есть и ещё пара небольших исправлений). Поначалу я их хотел убрать, ибо теперь есть нормальная версия Puri, но поразмышляв решил их оставить, они не совсем корректны, с точки зрения RFC 2396, но зато просты и будут стабильны. Между прочим, Puri сейчас является единственным инструментом, обеспечивающим абсолютно корректную работу с url в соответствии с RFC 2396, при этом, простые инструменты, типа url-encode/url-decode не могу обеспечить этого в принципе. Если кто успел попробовать пакет restas-wiki, то после обновления может обнаружить, что он теперь не видит некоторые старые страницы. Вылечить можно следующим кодом:
понедельник, 22 марта 2010 г.
Puri и utf-8
Всё началось с того, что я обнаружил, что restas-directory-publisher не может обрабатывать URL, содержащие #\+. Исследование показало, что используемая функция hunchentoot:url-decode, по совершенно неведомой мне причине, заменяет #\+ на #\Space (так нужно делать при декодировании форм, но не url). Чуть присмотревшись к коду функций hunchentoot:url-decode и hunchentoot:url-encode я вообще перестал понимать, что именно они делают и какому rfc это соответствуют, но, в большинстве случаев, результат приемлем. При этом, hunchentoot:url-decode вообще не очень хорошо реализована и я сначала попробовал переписать её как-нибудь более вменяемо. После чего вдруг вообще мои приложения отказались обрабатывать url, содержащие кириллицу. Что меня ввело в ступор, поскольку я был уверен в своём коде. Начав копать дальше вдруг обнаружил, что замечательная библиотека Puri жутко коверкает подобные url, ибо просто игнорирует тот факт, что для кодирования символов используется кодировка utf-8. Примечательным моментом при этом было то, что совместное использование Puri и hunchentoot:url-decode давало обычно приемлемый результат. А поскольку я обычно использовал их в связке, то долго не обращал внимания на эту проблему. Ну и тот факт, что всё работало, вселял в меня уверенность, что этим библиотекам можно доверять. Как оказалось, это классический случай, когда минус на минус давал плюс и приемлемые результаты получались только из-за довольно топорного и прямого метода реализации hunchentoot:url-decode: стоило переписать эту функции в чуть более интлектуальном виде, так сразу полезли проблемы. Итого, функциям hunchentoot:url-decode и hunchentoot:url-encode вообще нельзя доверять, а Puri содержит в себе серьёзную проблему. Самая большая моя проблема в том, что Puri лежит в основе используемого мною подхода, а более детальный анализ показал, что возможность декодирования url за пределами Puri вызывает весьма серьёзные проблемы (в случае работы с нетривиальными url). Мемного поразмыслив решил, что иного пути, как патчить Puri просто нет. В общем, это замечательная библиотека, вот только о существовании utf-8 не подозревает. Исправить код оказалось не очень сложно, патчи отослал разработчику. Но как-то многовато патчей я отослал за последние полторы недели и толи английский мой совсем плох, то со мной что не так, но только отвечать мне не спешат. Да и по прошлому опыту помню, что на некоторые патчи бывает приходит ответ спустя несколько недель. Так что пока решил разместить форк Puri с моими исправлениями на github.
Подписаться на:
Сообщения (Atom)
