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

StackOverflow https://stackoverflow.com/questions/5366113

  •  27-10-2019
  •  | 
  •  

Вопрос

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-адрес, но на этот раз с установленным полем «имя», поэтому теперь вы получаете функцию «приветствие», вызываемую с именем в качестве аргумента, поэтому она говорит «Привет, Джо Блоггс».

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top