Скрипт FastCGI на Haskell для преобразования текста Pandoc - PullRequest
3 голосов
/ 20 марта 2011

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 Network.CGI

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

Это:

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

query <- getInput "query"

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

1 Ответ

2 голосов
/ 20 марта 2011

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

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

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

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

Функция "Maybe" - это универсальный экстрактор для типов Maybe. Подпись:

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

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

В этом случае хитрость заключается в том, что функция "cgiMain" вызывается дважды. Если он находит поле ввода «name», тогда переменная «mn» будет установлена ​​в («Just» Joe Bloggs »), в противном случае она будет установлена ​​в (Nothing). (Я использую скобки для разделения значений, потому что для строк используются кавычки).

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

...