Изменение тегов ‹q› и ‹/q› на «пары» в определенных местах

Я использую цепочку инструментов для преобразования уценки в HMTL5, используя Pandoc для вставки в визуальный редактор WordPress в качестве содержимого HTML. .

Когда дело доходит до вставки изображений, WordPress помещает то, что называется shortcode формы

[caption id="attachment_100" align="aligncenter" width="300" caption="This is an image caption"]

в текст HTML. На самом деле это не уценка, но Pandoc интерпретирует ее так, что каждая пара " ... " преобразуется в пару <q> ... </q> для вывода HTML. Это неправильно работает в WordPress.

Мне нужно предотвратить преобразование " ... ", но только тех, которые встречаются в четко определенных квадратных скобках [caption ... ], которые вставляются исключительно WordPress и не могут быть перепутаны с другим содержимым, которое я добавляю.

Я недостаточно знаю об API Pandoc или Haskell, чтобы написать встроенный paseser/фильтр, чтобы исключить этот текстовый фрагмент из обработки Pandoc. Совет, который я получил в списке рассылки pandoc, до сих пор был выше моего понимания, учитывая мое отсутствие знакомства с Pandoc и Haskell.

Я думал о написании Perl-фильтра, но меня сильно отговорили от использования регулярных выражений по очень веской причине.

Я прошу здесь выяснить, есть ли надежный способ сделать обратную замену тегов <q> ... </q> на " ... " только для текста в блоке [caption ... ] после его прохождения через pandoc в качестве этапа постобработки.

Может кто-нибудь предложить, как я могу это сделать?

Большое спасибо.


person chandra    schedule 22.04.2012    source источник


Ответы (1)


Вы хотели что-то подобное?

import Data.List
import System.IO

main = do
   inh  <- openFile "input.txt"  ReadMode
   outh <- openFile "output.txt" WriteMode
   str <- hGetContents inh
   hPutStrLn outh (outsideCaption str) 
   hClose inh
   hClose outh

outsideCaption::String->String
outsideCaption [] = []
outsideCaption str@(x:xs)
    | isPrefixOf "[caption" str = insideCaption str
    | otherwise                 = x:outsideCaption xs


insideCaption::String->String
insideCaption []       = []
insideCaption (']':xs) = ']':outsideCaption xs
insideCaption str@(x:xs)
    | (isPrefixOf "<q>"  str) = '\"':insideCaption (drop 3 str)
    | (isPrefixOf "</q>" str) = '\"':insideCaption (drop 4 str)
    |  otherwise              = x   :insideCaption         xs

Этот фрагмент кода читает файл с именем «input.txt», выполняет описанную вами замену и печатает результат в «output.txt».

заменив текущую основную на:

main = interact outsideCaption 

заставляет его читать из стандартного ввода в стандартный вывод, например:

[rothesay]Ygfijj: echo "testing <q> [caption<q></q>]" | ./test 
testing <q> [caption""] 
person ygfijj    schedule 22.04.2012
comment
Спасибо. Я скомпилировал и запустил его, и он работает! Могу ли я побеспокоить вас о двух изменениях: (1) можно ли заставить его работать на месте, записывая в тот же выходной файл, что и ввод, или иным образом принимая ввод-вывод из stdin и stdout? (2) Я понимаю, что мне также нужно удалить пару тегов <p> </p>. Первый идет непосредственно перед начальным [caption как <p>[cation, а второй после второго ] как ]</p>, а не после первого заключающего ]. Спасибо еще раз. - person chandra; 24.04.2012
comment
@chandra Я добавил предложение о том, как использовать stdin/stdout, не могли бы вы привести пример ввода/вывода для другой замены, которую вы упомянули? - person ygfijj; 25.04.2012
comment
Спасибо за это. Я верю, что теперь могу читать и писать в один и тот же файл. Я не могу ввести образец ввода-вывода в поле для комментариев. Взгляните на эту ссылку. - person chandra; 25.04.2012