Скрипт FastCGI Haskell для использования преобразования текста Pandoc

1. Мотивация

Я пишу свою собственную мини-вики. Я хочу иметь возможность легко конвертировать из уценки в LATEX/HTML и наоборот. После некоторых поисков я обнаружил Pandoc, который написан на Haskell и что я могу использовать модуль FastCGI для запуска Программа Haskell на моем сервере Apache.

2. Проблема/вопрос

Я не уверен, какой протокол я должен использовать для отправки моего скрипта FastCGI переменных ввода/вывода (POST/GET?) и как именно это делается. Есть идеи, предложения, решения?

3. Предпринятые шаги

3.1 Попытка

Вот что я сделал до сих пор (на основе примера кода). Обратите внимание, у меня нет опыта работы с Haskell, и на данный момент у меня не так много времени на изучение языка. Мне бы очень хотелось иметь возможность использовать инструмент преобразования текстового формата pandoc.

module Main ( main ) where

import Control.Concurrent
import Network.FastCGI
import Text.Pandoc

--initialize Variables/ functions
fastcgiResult :: CGI CGIResult
markdownToHTML:: String -> String

--implement conversion function
markdownToHTML s = writeLaTeX defaultWriterOptions {writerReferenceLinks = True} (readMarkdown defaultParserState s)    

--main action
fastcgiResult = do
    setHeader "Content-type" "text/plain"
    n <- queryString
    output $ (markdownToHTML n)

main :: IO ()
main = runFastCGIConcurrent' forkIO 10 fastcgiResult

Этот код считывает строку после вопросительного знака в URL-адресе запроса. Но это не очень хорошее решение, так как некоторые символы опускаются (например, «#»), а пробелы заменяются на /20%.

Заранее спасибо.

3.2 Сеть.CGI

Документация находится здесь. Под заголовком «Ввод» есть несколько способов ввода. Какой из них мне подходит?

Is it :

Получить значение входной переменной, например, из формы. Если переменная имеет несколько значений, возвращается первое из них. Пример:

query <- getInput "query"

Итак, скажем, у меня есть форма HTML POST с name='Joe', могу ли я получить ее с помощью getInput? И если да, то как мне обрабатывать тип Maybe String?


person Flying Swissman    schedule 20.03.2011    source источник


Ответы (1)


Пакет fastCGI на самом деле является расширением пакета cgi, который включает типы протоколов для получения данных запроса и возврата страниц результатов. Я бы предложил использовать CGI для начала, а затем перейти к fastCGI, как только вы поймете, что делаете.

Вы также можете просмотреть это руководство.

Изменить, чтобы ответить на вопросы об учебнике:

«Может быть» — это тип, который может содержать либо «Просто», либо «Ничего». В большинстве языков нулевой указатель используется для обозначения отсутствия данных, но в Haskell нулевых указателей нет. Таким образом, вместо этого у нас есть явный тип «Может быть» для случаев, когда данные могут быть нулевыми. Два конструктора ("Just" и "Nothing") вместе с типом заставляют вас явно разрешать нулевой случай, когда он может произойти, но также позволяют игнорировать его, когда он не может произойти.

Функция «может быть» является универсальным экстрактором для типов «может быть». Подпись:

maybe :: b -> (a -> b) -> Maybe a -> b

Беря аргументы спереди назад, третий аргумент «Может быть» — это значение, с которым вы пытаетесь работать. Второй аргумент — это функция, вызываемая, если третьим аргументом является «Just v», и в этом случае результатом является «f v». Первый аргумент используется по умолчанию и возвращается, если третий имеет значение «Ничего».

В этом случае хитрость заключается в том, что функция "cgiMain" вызывается дважды. Если он находит поле ввода «имя», тогда для переменной «mn» будет установлено значение (Просто «Джо Блоггс»), в противном случае для нее будет установлено значение (Ничего). (Теперь я использую скобки для разделения значений, потому что кавычки используются для строк).

Таким образом, вызов «может быть» возвращает страницу для рендеринга. В первый раз имя не указывается, поэтому «mn» равно (Nothing), и для рендеринга возвращается страница «inputForm» по умолчанию. Когда пользователь нажимает «Отправить», запрашивается тот же URL-адрес, но на этот раз с установленным полем «имя», поэтому теперь вы получаете функцию «приветствия», вызываемую с именем в качестве аргумента, поэтому она говорит «Привет, Джо Блоггс».

person Paul Johnson    schedule 20.03.2011
comment
Да, я знаю об этом. n <- queryString Взято из документации CGI (Newtork.FastCGI очень похож на модуль Network.CGI). Но не могли бы вы сказать мне, как я могу добавить $_POST['var'] в свою программу? Каким-то образом многие функции возвращают Maybe String, тип которого меня немного смущает. У меня все еще будет та же проблема, когда я буду делать это в CGI - person Flying Swissman; 20.03.2011
comment
Я уже просмотрел этот учебник, в нем есть только один пример (раздел 7), как получить пользовательский ввод. Пример не поясняется. let x = maybe inputForm Что именно делает возможное в этом фрагменте? - person Flying Swissman; 20.03.2011
comment
Ответ принят. Вернувшись на шаг назад и внимательно изучив руководство и ваш дополнительный комментарий, я нашел решение - спасибо! - person Flying Swissman; 23.03.2011