Создание документа с помощью Pandoc

#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