3

1. 动机

我正在编写自己的迷你维基。我希望能够轻松地从 markdown 转换为 LATEX/HTML,反之亦然。经过一番搜索,我发现了Pandoc,它是用 Haskell 编写的,我可以使用 FastCGI 模块在我的 Apache 服务器上运行 Haskell 程序。

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类型?

4

1 回答 1

2

fastCGI包实际上是cgi包的扩展,包含了接收请求数据和返回结果页面的协议类型。我建议从 CGI 开始,然后在你知道自己在做什么后转向 fastCGI。

您可能还想查看本教程

编辑以回答有关本教程的问题:

“Maybe a”是一种可以包含“Just a”或“Nothing”的类型。大多数语言使用空指针来表示没有数据,但 Haskell 没有空指针。所以我们有一个明确的“可能”类型来代替数据可能为空的情况。这两个构造函数(“Just”和“Nothing”)以及类型会强制您在可能发生 null 情况时显式允许它,但也让您在它不可能发生时忽略它。

“maybe”函数是 Maybe 类型的通用提取器。签名是:

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

将参数从前到后,“可能是”第三个参数是您尝试使用的值。第二个参数是一个函数,如果第三个参数是“Just v”,则结果是“f v”。第一个参数是默认值,如果第三个是“Nothing”则返回。

在这种情况下,诀窍是“cgiMain”函数被调用了两次。如果找到输入字段“name”,则“mn”变量将设置为(Just“Joe Bloggs”),否则将设置为(Nothing)。(我现在使用括号来分隔值,因为引号用于字符串)。

所以“可能”调用返回要渲染的页面。第一次通过没有提供名称,因此“mn”为(Nothing)并返回默认的“inputForm”页面进行渲染。当用户单击提交时,请求相同的 URL,但这次设置了“名称”字段,所以现在您会使用名称作为参数调用“问候”函数,因此它会显示“Hello Joe Bloggs”。

于 2011-03-20T11:20:20.340 回答