Скрипт FastCGI Haskell для использования преобразования текста Pandoc
Вопрос
1.Мотивация
Я пишу свою мини-вики.Я хочу иметь возможность легко конвертировать уценку в LATEX/HTML и наоборот.После недолгих поисков я обнаружил Пандок, который написан на 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
Документация найдена здесь. В разделе «Ввод» представлено несколько способов получения данных. Какой из них подойдет мне?
Это :
Получите значение входной переменной, например, из формы.Если переменная имеет несколько значений, возвращается первое из них.Пример:
query <- getInput "query"
Допустим, у меня есть форма HTML POST с name='Joe'
могу ли я получить это с помощью getInput?И если да, то как мне справиться с Maybe String
тип?
Решение
Пакет fastCGI на самом деле является расширением пакета компьютерная графика пакет, включающий типы протоколов для получения данных запроса и возврата страниц результатов.Я бы предложил использовать CGI для начала, а затем перейти к fastCGI, как только вы поймете, что делаете.
Возможно, вы также захотите посмотреть этот урок.
Отредактируйте, чтобы ответить на вопросы об учебнике:
«Может быть» — это тип, который может содержать «Просто» или «Ничего».Большинство языков используют нулевой указатель для обозначения отсутствия данных, но в Haskell нет нулевых указателей.Поэтому вместо этого у нас есть явный тип «Может быть» для случаев, когда данные могут быть нулевыми.Два конструктора («Just» и «Nothing») вместе с типом заставляют вас явно разрешать нулевой случай, когда это может произойти, но также позволяют игнорировать его, когда это не может произойти.
Функция «может быть» — это универсальный экстрактор типов Maybe.Подпись:
maybe :: b -> (a -> b) -> Maybe a -> b
Если рассматривать аргументы спереди назад, третий аргумент «Может быть» — это значение, с которым вы пытаетесь работать.Второй аргумент — это функция, вызываемая, если третий аргумент — «Just v», и в этом случае результатом будет «f v».Первый аргумент — значение по умолчанию, возвращается, если третий — «Ничего».
В данном случае хитрость в том, что функция «cgiMain» вызывается дважды.Если он находит поле ввода «имя», то переменной «mn» будет присвоено значение (Просто «Джо Блоггс»), в противном случае ей будет присвоено значение (Ничего).(Сейчас я использую скобки для разделения значений, поскольку для строк используются кавычки).
Таким образом, вызов «может быть» возвращает страницу для рендеринга.В первый раз имя не указывается, поэтому «mn» равно (Ничего), и для рендеринга возвращается страница «inputForm» по умолчанию.Когда пользователь нажимает «Отправить», запрашивается тот же URL-адрес, но на этот раз с установленным полем «имя», поэтому теперь вы получаете функцию «приветствие», вызываемую с именем в качестве аргумента, поэтому она говорит «Привет, Джо Блоггс».