#haskell #pandoc
#haskell #pandoc
Вопрос:
Я хотел бы создать программу на Haskell для автоматического создания документов с помощью Pandoc.
Я создал небольшой пример документа с типами данных, предоставляемыми Pandoc, но когда я запускаю свою программу, документ ODT пуст (но с заголовком My own test file
в свойствах), а текстовый файл содержит только слово Template
.
Это фрагмент кода моей программы :
import Text.Pandoc
import qualified Data.ByteString.Lazy as Byt
import Data.Map (fromList)
main = do
doc <- writeODT WriterOptions{ writerStandalone=True
, writerReferenceODT=Nothing
, writerUserDataDir=Nothing
, writerTemplate="Template"} doctest
let doc2 = writeMarkdown WriterOptions{ writerStandalone=True
, writerTemplate="Template"} doctest
putStrLn $ show doctest
Byt.writeFile "test.odt" doc
writeFile "test.txt" doc2
doctest = Pandoc ( Meta {unMeta = fromList [("title", MetaInlines [Str "My own testfile"])
,("authors", MetaInlines [Str "My Name"]) ]} )
[Para [Str "This",Space,Str "is",Space,Str "some",Space,Str "text"],HorizontalRule]
Как текстовый файл, так и документ ODT должны содержать фразу This is some text
, и я не понимаю, почему она не отображается.
Вы знаете, что я сделал неправильно?
У вас есть рабочий пример того, как сгенерировать файл Pandoc с помощью Haskell?
Комментарии:
1. Что происходит, когда вы пытаетесь использовать
writeMarkdown
без указанияwriterTemplate
?
Ответ №1:
Вы неправильно задаете значение writerTemplate
.
Вы можете настроить шаблон самостоятельно, но начинать следует с шаблонов по умолчанию, чтобы понять их требуемую структуру. Это особенно важно для экспортера ODT, где шаблон должен содержать довольно подробную XML-прелюдию.
Я смог заставить ваш код работать, сначала загрузив шаблоны по умолчанию, а затем заполнив их вашим документом:
main = do
Right odtTemplate <- getDefaultTemplate Nothing "odt"
doc <- writeODT def{ writerStandalone = True
, writerTemplate = odtTemplate
}
doctest
Byt.writeFile "test.odt" doc
Right mdTemplate <- getDefaultTemplate Nothing "markdown"
let doc2 = writeMarkdown def{ writerStandalone = True
, writerTemplate = mdTemplate
}
doctest
writeFile "test.txt" doc2
Ответ №2:
Вы включили опцию writerStandalone
, которая требует определения шаблона для правильной работы. Лично я не использую шаблоны и устанавливаю writerStandalone
параметр на False
Чтобы заставить его работать, используйте их WriterOptions
для записи обычного текста :
let textfile = writePlain WriterOptions{ writerStandalone=False
, writerExtensions=plainExtensions
, writerWrapText=True
, writerColumns=80} pandoc
для docx writer :
docxfile <- writeDocx WriterOptions{ writerStandalone=False
, writerReferenceDocx=Nothing
, writerUserDataDir=Nothing
, writerHighlight = False
} pandoc