tag:blogger.com,1999:blog-4475786026055229599.post7159263454528685404..comments2023-05-31T14:59:15.775+03:00Comments on Тех-Детали: Еще один фильтр для pandocgarudahttp://www.blogger.com/profile/09970790695114842323noreply@blogger.comBlogger6125tag:blogger.com,1999:blog-4475786026055229599.post-68890003986783210742015-03-01T01:03:13.156+03:002015-03-01T01:03:13.156+03:00Спасибо Вам огромное за помощь!!!
Буду пробовать п...Спасибо Вам огромное за помощь!!!<br />Буду пробовать писать)))Anonymoushttps://www.blogger.com/profile/02136838212738246030noreply@blogger.comtag:blogger.com,1999:blog-4475786026055229599.post-86716045060653761482015-02-28T14:46:40.558+03:002015-02-28T14:46:40.558+03:00Я тут пример для вас написал: http://lpaste.net/12...Я тут пример для вас написал: http://lpaste.net/121331<br /><br />Смотрите комментарии в коде, вкратце, эта штука переносит содержимое Para перед элементом BulletList в этот самый лист как первый его элемент, работает только в руте документа, но можно и расширить вообще на все возможные случаи: просто просмотрите все элементы, которые содержат тип списка [Block] отсюда https://hackage.haskell.org/package/pandoc-types-1.12/docs/Text-Pandoc-Definition.html и вызовите тело приведенной функции для всех возможных сигнатур (это потому что последовательная пара Para, BulletList может быть только элементом [Block].garudahttps://www.blogger.com/profile/09970790695114842323noreply@blogger.comtag:blogger.com,1999:blog-4475786026055229599.post-81508639719870188592015-02-28T00:16:04.468+03:002015-02-28T00:16:04.468+03:00Посмотрите на тип фильтра, описанного в данной ста...Посмотрите на тип фильтра, описанного в данной статье. Он соответствует<br /><br />styleFromMeta :: Maybe Format -> Pandoc -> IO Pandoc<br /><br />Обратите внимание на второй элемент Pandoc: это тип полного дерева документа! А значит вам доступны все элементы документа без исключения. В частности здесь я в первую очередь читаю метаданные (тип Mmap) , а затем на основании этих данных произвожу соответствующие изменения в нужных элементах.<br /><br />Соответственно, во-первых, вам доступен весь документ, если вам это действительно нужно, а во-вторых, вы можете получить зависимости расположения элементов внутри дерева. Это уже дело техники. Pandoc предоставляет для этого служебную функцию walk, кроме того, вы можете использовать паттерн матчинг для деконструкции элементов дерева. Я не думаю, что вы можете напрямую сопоставлять соседние элементы, но если вы знаете их возможных предков в иерархии (не могу сказать навскидку, что может быть общим предком Para и BulletList - видимо, какие-то корневые узлы дерева), то вы сможете обнаружить все интересные для вас места в документе.<br /><br />Что касается элегантности, то я думаю, что использование фильтра и есть самое элегантное решение. Если вы умеете работать с haskell, то я вообще проблем не вижу, но можно писать фильтры и на python, как я уже говорил.garudahttps://www.blogger.com/profile/09970790695114842323noreply@blogger.comtag:blogger.com,1999:blog-4475786026055229599.post-90908656842556336222015-02-27T23:44:29.852+03:002015-02-27T23:44:29.852+03:00Спасибо большое за ответ!
Как я поняла из докумен...Спасибо большое за ответ!<br /><br />Как я поняла из документации, фильтр принимает функцию и применяет ее последовательно к каждому элементу JSON дерева.<br />Поэтому у меня и возникли вопросы к соседним элементам. Если функция принимает на вход Блок, то мы имеет доступ и к его внутренним Inline элементам. <br />А есть ли возможность просмотреть какой Блок элемент следует за текущим? Например если функция работает с Para, посмотреть если следующий за ним блочный элемент BulletList и на этом основании делать изменения с Para? Возможно ли это, ведь функция не получает весь документ.<br /><br />Мне нужно написать большой фильтр работающий и с Block и Inline производящий различные замены.<br />Является ли фильтр элегантным решением для такой задачи?<br />Anonymoushttps://www.blogger.com/profile/02136838212738246030noreply@blogger.comtag:blogger.com,1999:blog-4475786026055229599.post-89846671000055347352015-02-27T02:50:21.101+03:002015-02-27T02:50:21.101+03:00Здравствуйте. Да, фильтры pandoc в основном и нужн...Здравствуйте. Да, фильтры pandoc в основном и нужны для проведения множественной замены в документе. По сути они производят типизированную подстановку, то есть изменяют определенный тип элементов (или заменяют его на другой) во всем документе. Например в этой статье: http://lin-techdet.blogspot.ru/2014/01/vim-publishhelper.html происходит замена всех элементов типа CodeBlock на элементы RawBlock. Правда, не всех ... Поскольку CodeBlock - это элемент со сложной иерархией, имеется возможность вытащить его подэлементы, в частности атрибуты языка и т.п. Я просто добавил новый атрибут hl и проверяю задан ли он в документе и если да, то какой, если он задан и равен vim, то производится замена на RawBlock с подсветкой из vim.<br /><br />В этой статье представлен фильтр, который также систематически подменяет ссылки на изображения и просто ссылки на основании наличия дополнительного элемента типа MathInline в иерархии типа ссылки (см. исходный код на https://github.com/lyokha/styleFromMeta). Мало того, здесь имеется возможность определять standalone изображения, то есть изображения, находящиеся в отдельном параграфе (это соответствует образцу b@(Para [Image (Style style : Alt (alt)) tgt]) в исходном коде фильтра). Это все примеры того, как вы можете определять "соседние" элементы в иерархии JSON.<br /><br />Я думаю, что для систематической типизированной замены элементов исходного дерева документа создание фильтра - самое лучшее и естественное решение.<br /><br />Кстати, есть возможность писать фильтры на python - см. https://github.com/jgm/pandoc/wiki/Pandoc-Filtersgarudahttps://www.blogger.com/profile/09970790695114842323noreply@blogger.comtag:blogger.com,1999:blog-4475786026055229599.post-56682034959857329892015-02-27T01:27:42.157+03:002015-02-27T01:27:42.157+03:00Здравствуйте!
Нужен совет по Pandoc. Только позна...Здравствуйте!<br /><br />Нужен совет по Pandoc. Только познакомилась с этой программой и многое не до конца понятно.<br />Подскажите пожалуйста, подходят ли фильтры для множественных изменений в документе.<br />Возможно ли получать информацию о предшественнике и последователе элемента в JSON когда выполняется функция из фильтра?<br />Хочу расширить Markdown нужными элементами, но пока не вижу возможности в фильтре проверки соседей элемента в JSON.<br />Или для больших задач лучше написать отдельный скрипт изменяющий JSON?<br />Anonymoushttps://www.blogger.com/profile/02136838212738246030noreply@blogger.com