Как стать автором
Обновить

Отдам в хорошие руки…

Время на прочтение4 мин
Количество просмотров948
… LGPL проект:



Разработчики

Главным и единственным разрабочиком является ваш покорный слуга.
Спонсор проекта — Darren Gates, владелец tufat.com.

Почему отдаю?

Нехватка времени для собственных проектов. Увы, в последний год я выкраивал от силы 1-2 часа в неделю для работы над html2ps/pdf, что сводилось в основном к ответам на форуме, правке багов по мере их обнаружения и (редко-редко) добавлению новых небольших фич.
Естественно, проект жалко — хотя бы потому, что кое-какие из его фич уникальны среди LGPL-инструментов. Хотелось бы найти продолжателя.

Что значит «отдаю»?

  • админские права в проектах;
  • консультации по поводу того, почему внутри сделано именно так, а не иначе;
  • при необходимости — посредничество с Дарреном.

Краткая история

Проект появился на свет осенью 2004 года как клон широко известного html2ps, написанного на Perl. Точнее, клоном он был примерно 5 минут до того момента как я заглянул в код html2ps…
$pta=defined $p{"text-align"}?$p{"text-align"}:$body{"text-align"};
$pal=0;
$pal=1 if($pta=~/^c/i);
$pal=2 if($pta=~/^r/i);
$pal=3 if($pta=~/^j/i);
$bgcol=&col2rgb($body{"background"});
if(!$bgcol) {$bgcol="[16#FF 16#FF 16#FF]"};
if(!$p{"color"}) {$p{"color"}="black"};
$tcol=&col2rgb($p{"color"});
$lcol=&col2rgb($a__link{"color"});
if($lcol) {
$Lc="/Lc t D\n/Dl $lcol D\n";
$Lc.=$tcol ne $lcol?"/LX t D":"/LX f D";
} else {
$Lc="/Lc f D\n/LX f D";
}
$pcol=&col2rgb($pre{"color"});
if(!$pcol) {$pcol="[0 0 0]"};
$deftbg=&col2rgb($table{"background"});

… и решил, что сэкономлю время, написав свой собственный велосипед с нуля.

К началу нового 2005 года на свет появился код, способный сжевать простой HTML без таблиц, распарсить простой CSS и сгенерировать соответствующий Postscript. (Возможно, для некоторых будет шоком узнать тот факт, что 90% вычислений, связанных с размещением текста на странице, происходило внутри Postscript-файла).

В январе 2005 было решено сменить лицензию на LGPL (вместо изначально предполагавшейся модели «всё за $5»).

В течение года скрит развивался, полнел, пополнялся фичами и терял баги. К концу года стало ясно что: выбранный подход «запишем всё в Postscript, а принтер сам разберётся» далёк от идеального — объем вычислений рос вместе со сложностью обрабатываемых страниц и даже преобразование с помощью ps2pdf на «большом» компьютере начало занимать несколько секунд. Было решено прекратить насиловать принтеры вычислениями, и, наконец, убрать алгоритмы размещения элементов из postscript. Это изменение было отмечено выпуском html2ps/pdf 1.0

В новом виде скрипт просуществовал почти до конца 2006 года, когда стало окончательно ясно, что так жить дальше нельзя — пользователи просили новых фич в объемах, неожиданных для такого небольшого community, удобного API для встраивания html2ps/pdf в сторонние проекты не было, да и перенесённые с Postscript алгоритмы легли на PHP довольно-таки «странным» образом, совершенно не упрощая внесение изменений.Пришло время второго (и последнего) переписывания ядра и появления версии 2.0.

Первые две трети 2007 года стала, пожалуй, лучшим временем проекта: появление нормального API, оптимизации (нет, скрипт не стал работать действительно быстро; тем не менее, его страстная любовьк ресурсам несколько поуменьшилась) и множество новых возможностей.

С лета 2007 у меня всё больше и больше времени начинает занимать личная жизнь и другой проект. В результате html2ps/pdf получал жалких 1-2 часа в неделю, которые тратились в основном на поддержку скрипта на форуме. В мае 2008 я решил, что продолжать в таком же духе дальше не имеет смысла, поговорил с Дарреном и прекратил попытки найти время для дальнейшей разработки.

Плюсы и минусы

На текущий момент это единственный известный мне LGPL-инструмент, поддерживающий float'ы, position: absolute и position: fixed. Кроме этого, присутствует поддержка таких приятных мелочей(не говоря уже о «базовых» HTML / CSS), как:
  • Внутреннние и внешние ссылки;
  • Сноски;
  • Интерактивные формы;
  • Генерация оглавления;
  • Вставка «водяного знака»;
  • Поддержка сложных таблицы c rowspan / colspan;
  • Достаточно неплохой алгоритм разбиения на страницы (знающий о существовании CSS-свойств page-break-*, orphans и widows)
  • Unicode (успешно применялся для документов, содержавших корейский вперемешку с французским);

Есть неплохо задокументированный API с примерами.

Скрипт старается (с моей точки зрения — достаточно успешно) править в исходном коде страниц такие мелочи, как незакрытые тэги, отсутствующие кавычки вокруг атрибутов, символы <, > и & в неположенных местах и так далее.

Теперь с плохом и страшном. Во-первых, солидная часть кода была написана мной четыре года назад (соответственно, опыта проектирования и программирования было на четыре года меньше); во-вторых, код пережил одну смену стиля кодирования и два переписывания ядра.Естественным результатом этого является то, что кое-где можно встретить код, за который мне стыдно, а кое-где — за который мне очень стыдно. (А еще мне стыдно за жалкое 5% покрытие тестами).

Другая проблема — объем кода (~1.5 мегабайт в ~350 файлах) и достаточно сложная предметная область (вы сами не представляете, насколько большое пространство для толкований на самом деле оставляют стандарты).

Если вы заинтересовались и плохое и страшное вас не напугало — пишите. Буду рад ответить.
Теги:
Хабы:
Всего голосов 32: ↑29 и ↓3+26
Комментарии5

Публикации

Истории

Ближайшие события

Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область