3

1.モチベーション

私は自分のミニウィキを書いています。マークダウンからLATEX/HTMLに、またはその逆に簡単に変換できるようにしたいと思います。いくつか検索した後、Haskellで書かれたPandocを発見し、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 Network.CGI

ドキュメントはここにあります。「入力」という見出しの下には、入力を取得するためのいくつかのメソッドがあります。どちらが私にぴったりですか?

それは...ですか :

たとえば、フォームから入力変数の値を取得します。変数に複数の値がある場合は、最初の値が返されます。例:

query <- getInput "query"

では、HTML POSTフォームがあり、name='Joe'getInputを使用してこれを取得できるとしましょう。もしそうなら、私はどのようにMaybe Stringタイプを処理しますか?

4

1 に答える 1

2

fastCGIパッケージは、実際にはcgiパッケージの拡張であり、要求データを受信して​​結果ページを返すためのプロトコルタイプが含まれています。最初にCGIを使用し、何をしているのかがわかったらfastCGIに移行することをお勧めします。

このチュートリアルもご覧ください。

チュートリアルに関する質問に答えるために編集します。

「たぶんa」は「Justa」または「Nothing」のいずれかを含むことができるタイプです。ほとんどの言語は、データがないことを示すためにnullポインターを使用しますが、Haskellにはnullポインターがありません。したがって、データがnullになる可能性がある場合に備えて、代わりに明示的な「Maybe」型を使用します。2つのコンストラクター(「Just」と「Nothing」)とタイプにより、nullの場合は明示的に許可する必要がありますが、発生しない場合は無視することもできます。

「maybe」関数は、Maybeタイプのユニバーサルエクストラクターです。署名は次のとおりです。

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

前から後ろに引数を取ると、「たぶん」の3番目の引数は、処理しようとしている値です。2番目の引数は、3番目の引数が「Justv」の場合に呼び出される関数です。この場合、結果は「fv」になります。最初の引数がデフォルトで、3番目が「Nothing」の場合に返されます。

この場合の秘訣は、「cgiMain」関数が2回呼び出されることです。入力フィールド「name」が見つかった場合、「mn」変数は(Just "Joe Bloggs")に設定され、それ以外の場合は(Nothing)に設定されます。(文字列には引用符が使用されているため、現在は角かっこを使用して値を区切ります)。

したがって、「多分」呼び出しは、レンダリングするページを返します。初回は名前が指定されていないため、「mn」は(Nothing)であり、デフォルトの「inputForm」ページがレンダリング用に返されます。ユーザーが[送信]をクリックすると、同じURLが要求されますが、今回は[名前]フィールドが設定されているため、名前を引数として呼び出される「挨拶」関数が表示され、「HelloJoeBloggs」と表示されます。

于 2011-03-20T11:20:20.340 に答える