Re[10]: Проектирование браузера
От: McSeem2 США http://www.antigrain.com
Дата: 17.12.04 17:53
Оценка:
Здравствуйте, Зверёк Харьковский, Вы писали:

ЗХ>Короче говоря, мой вики-конвертер (дядя Макс, не надо? могу поделиться ) тоже все почти "в лоб" решает — из-за большой "нерегулярности" вики-разметки.

ЗХ>Я покрутил-покрутил ее с недельку в попытках написать простого формата расширяемый конфиг, да и.... захардкодил.
ЗХ>Така грустна история.

Я тоже могу "похвастаться" своим подходом , буду рад, если навеет какие-нибудь мысли.

Поскольку исходный формат не поддается четкому описанию в терминах формальной грамматики (на самом деле, конечно же поддается, но превышает все разумные пределы по сложности), то я сразу отверг классический однопроходный конечный автомат и сделал конвейер, который в несколько проходов преобразует "неформальный" синтакс в строгую well-formed XML-like структуру, то есть,
\element[attributes]{content}


Разметка "нерегулярна"? Что надо сделать? Формализовать и "регуляризировать"!
Например, toc_structurizer преобразует:
\h1{Part}
. . .
\h2{Chapter}
. . .
\h3{Section}
. . .
. . .
\h2{Another Chapter}
. . .


в следующую строгую иерархическую стркуктуру:
\h1[Part] 
{
   . . .
   \h2[Chapter] 
   {
      . . .
      \h3[Section] 
      {
         . . .
         . . .
      }
   }
   \h2[Another Chapter]
   {
     . . .
   }
   . . .
}


Далее, обрабатываюся параграфы, то есть, просто-напросто, куски текста, отделенные пустой строкой обрамляются в
\p{. . .}


После чего, обрабатываются списки и так же формализуются в \ol{...}, \ul{...}, \li{...}

То же происходит с таблицами, линками, декорированием wiki-like элементов. На выходе всего этого дела получается well-formed структура, которую очень легко преобразовать в XML/HTML, и т.д. Фактически, методом контекстной замены. Для каждого типа элемента в конфиге определяются его обрамляющие таги, которые в частном случае могут быть и пустыми. Ну, плюс еще есть доступ к псевдо-переменным, типа $(this.content), $(this.attribute.image), и т.д. Вместо "this" можно получить доступ к любому элементу, либо от корня, типа $(title.content), либо от текущего узла, например, $(../../menu.content).

Когда абсолютно все сущности формализованы подобным образом, синтакс и содержимое конфига уже не составляют проблемы.

ЗХ>ЗЫ: у меня в результате получился формат конфига такой, что, чтобы его разобрать, по уму надо было бы сделать еще один расширяемый парсер и конфиг к нему


А у меня конфиг парсится тем же самым примитивным базовым парсером:
\tr_open        [<TR>]
\tr_close       [</TR>]

\thr_open       [<TR>]
\thr_close      [</TR>]

\th_open        [<TH>]
\th_close       [</TH>]

\td_open        [<TD>]
\td_close       [</TD>]

\tdr_open       [<TD style="text-align:right">]
\tdr_close      [</TD>]

\tdc_open       [<TD style="text-align:center">]
\tdc_close      [</TD>]

\tdj_open       [<TD style="text-align:justify">]
\tdj_close      [</TD>]


Более того, оглавление и индекс тоже собираются в отдельный файл такой же структуры, после чего снова парсится:
\toc
{
    \toc1[Rendering Buffer; anchor="toc0001";]{
        \toc2[The First and the Simplest Example; anchor="toc0002";]{}
        \toc2[Class rendering_buffer; anchor="toc0003";]{}
        \toc2[Two Modifications of the Example; anchor="toc0004";]{}}
    \toc1[Pixel Format Renderers; anchor="toc0005";]{
        \toc2[Creation; anchor="toc0006";]{}
        \toc2[Member Functions; anchor="toc0007";]{}
        \toc2[Alpha-Mask Adaptor; anchor="toc0008";]{}}
    \toc1[Basic Renderers; anchor="toc0009";]{
        \toc2[Creation; anchor="toc0010";]{}
        \toc2[Member Functions; anchor="toc0011";]{}
        \toc2[A common example; anchor="toc0012";]{}}
    \toc1[Primitives and Markers Renderers; anchor="toc0013";]{
        \toc2[Primitives Renderer; anchor="toc0014";]{
            \toc3[Declaration; anchor="toc0015";]{}
            \toc3[Creation; anchor="toc0016";]{}
            \toc3[Member functions; anchor="toc0017";]{}}
        \toc2[Marker Renderer; anchor="toc0018";]{
            \toc3[Declaration; anchor="toc0019";]{}
            \toc3[Creation; anchor="toc0020";]{}
            \toc3[Member Functions; anchor="toc0021";]{}}}
}

Это надо для того, чтобы была возможность быстрой перегенерации только изменившихся файлов с использованием прежнего индекса и оглавления.

Данный подход тоже не лишен недостатков, например, очень тяжело становится ассоциировать номера строк с исходным файлом для выдачи синтаксических ошибок. Однако, мне он все-таки представляется наиболее оптимальным по соотношению трудозатрат к результату с минимумом рака головы

Кстати, можете посмеяться еще и вот над чем.
Базовый парсер создает в памяти некую псевдо-DOM структуру с возможностью рекурсивного доступа ко всем элементам. Но эта структура потом обрабатывается примитивным рекурсивным процессором, который вызывает абстрактный event-driven consumer в SAX-режиме(!) (там всего 3 функции, start_element, content, end_element), То есть, рекурсия таким образом линеаризуется, но зато консьюмеры неизбежно становятся конечными автоматами (хоть и примитивными). Не знаю, что лучше, рекурсия или конечные автоматы. По мне так чем меньше рекурсии, тем лучше. Умственный мозг у меня какой-то не очень рекурсивный
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[13]: тогда: Обращение к Общественности!
От: McSeem2 США http://www.antigrain.com
Дата: 17.12.04 18:21
Оценка: 85 (4)
Здравствуйте, c-smile, Вы писали:

CS>Согласен! За! Теорию знаю! Твою статью прочитал в свое время, кул! Но!

CS>Мне не надо 12.67! Вообще! У меня в то место палец попасть вообще не должен.

CS>Как художник художнику:


CS>У меня 16 на 16 пикселей. Итого 256 родимых.

CS>Я хочу что-бы линия начиналась пикселом № 21 и заканчивалась № 220.

CS>Начало и конец — это принципиально. Как она раскрасится посредине (линия наклонная) это уже не важно (лишь бы "антиалиаснуто").


На самом деле, надо и то и другое.

CS>Если я захочу то я могу выставить на самом деле и 12.67. Хочу я этого числа правда не часто.

CS>Т.е. нужен snap-to-grid с интеллигентной оптимизацией от "антиалиасера" в случае привязанного (snap'нутого) отрезка.
CS>Вот. Это конечно не строгое определение но близко.

Snap-to-grid — действительно архиважная задача, причем, не обязятельно к пикселам. В той же самой XaraX Snap-to-grid формально присутствует, но когда делаешь copy/paste привязка тут же теряется. Нафига он такой Snap-to-grid уперся?! Да и вообще, парадигма copy/paste в существующих редакторах устарела как дерьмо мамонта. Вот пример грамотного copy/paste в моем понимании:
http://www.rsdn.ru/Forum/Message.aspx?mid=780253&amp;only=1
Автор: McSeem2
Дата: 26.08.04

Рисуем некую молекулу из шаблонов (несколько бензольных гаек), далее — Lasso, выделяем, Ctrl-C, Ctrl-V и enjoy
Далее, мощность процессоров возросла настолько, что для несложных сцен можно все перерисовывать заново, а не использовать всякие устаревшие XOR-режимы для рисования управляющих элементов. Собственно, так оно и делается в скетчере.

MS>>Я могу войти в долю, сделав собственно рендерер, то есть набор классов типа Java2D или Quartz с необходимой функциональностью для рисования как основного канваса, так и контролов. Разумеется, со всеми прибамбасами, гаммами и прочими омегами.


CS>Вот а еще если при этом к DOM можно будет достукиваться да c-smile(JavaScript) управлять можно вообще

CS>строить генераторы изображений.
CS>Да любая Вижуал Студия с руками ногами оторвет.

Я не был бы столь оптимистичен, то тоже думаю, что время пришло.
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re[14]: тогда: Обращение к Общественности!
От: c-smile Канада http://terrainformatica.com
Дата: 17.12.04 19:44
Оценка: +2
Здравствуйте, McSeem2, Вы писали:

CS>>Как художник художнику:


MS>Snap-to-grid — действительно архиважная задача, причем, не обязятельно к пикселам. В той же самой XaraX Snap-to-grid формально присутствует, но когда делаешь copy/paste привязка тут же теряется. Нафига он такой Snap-to-grid уперся?! Да и вообще, парадигма copy/paste в существующих редакторах устарела как дерьмо мамонта. Вот пример грамотного copy/paste в моем понимании:

MS>http://www.rsdn.ru/Forum/Message.aspx?mid=780253&amp;only=1
Автор: McSeem2
Дата: 26.08.04


"Офигеть!" Извиняюсь за вульгаризм. Но the Sketcher меня убил Только сейчас его увидел.
Toolbar конечно отдает "Mac'сизмом" но ведь прелесть же!
Шляпу снимаю

MS>Рисуем некую молекулу из шаблонов (несколько бензольных гаек), далее — Lasso, выделяем, Ctrl-C, Ctrl-V и enjoy

MS>Далее, мощность процессоров возросла настолько, что для несложных сцен можно все перерисовывать заново, а не использовать всякие устаревшие XOR-режимы для рисования управляющих элементов. Собственно, так оно и делается в скетчере.

MS>Я не был бы столь оптимистичен, то тоже думаю, что время пришло.


Конечно, но! "Дорогу осилит идущий".
Re[14]: тогда: Обращение к Общественности!
От: c-smile Канада http://terrainformatica.com
Дата: 17.12.04 19:51
Оценка:
Здравствуйте, McSeem2, Вы писали:

Макс, там в Sketcher у тебя похоже WM_ERASEBСKG не перекрыта.
Мигает на ресайзе, а не должно. Так как рисуешь ты очень шустро.
Re[15]: тогда: Обращение к Общественности!
От: McSeem2 США http://www.antigrain.com
Дата: 17.12.04 21:45
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Макс, там в Sketcher у тебя похоже WM_ERASEBСKG не перекрыта.

CS>Мигает на ресайзе, а не должно.

Совершенно верно. Это я разбирался с WinAPI AlphaBlend(), чтобы буфер можно было делать полупрозрачным. А вырубить WM_ERASEBСKG потом забыл. А полупрозрачность работает в лучшем виде, например, для windowless activex:
http://antigrain.com/stuff/sketcher_ie.png (175k).
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Оффтоп
От: Mamut Швеция http://dmitriid.com
Дата: 17.12.04 22:01
Оценка:
MS>Да и вообще, парадигма copy/paste в существующих редакторах устарела как дерьмо мамонта. Вот пример грамотного copy/paste в моем понимании:

Old like mammoth's manure (c) описание Antigrain
... << RSDN@Home 1.1.4 beta 3 rev. 185>> ... <<Winamp is playing "Silence">>


dmitriid.comGitHubLinkedIn
Re[7]: Проектирование браузера
От: mbergal  
Дата: 19.12.04 18:06
Оценка:
Похоже что Restructured Text ближе всего к тому что Вам надо.

Для примера: From "C++ Template Metaprogramming," by David Abrahams and Aleksey Gurtovoy
Re[15]: Дарю озорную идею
От: McSeem2 США http://www.antigrain.com
Дата: 13.01.05 16:14
Оценка:
Здравствуйте, c-smile, Вы писали:

CS>Toolbar конечно отдает "Mac'сизмом" но ведь прелесть же!


Когда заканчивается trial period, надо не просто ограничиваться скучным окошком с надписью о том, что пора бы заплатить, а при этом еще продолжать функционировать, но "красиво"

http://antigrain.com/stuff/sketcher2.zip (370K)

Вроде бы ничего особенного, но попробуйте что-нибудь дорисовать. А как красиво работает Lasso — чтобы включить, нажмите Ctrl-L
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.