Domanda

1. Motivazione

Sto scrivendo il mio mini-wiki. Voglio essere in grado di convertirsi facilmente da Markdown in latex/html e viceversa. Dopo alcune ricerche ho scoperto Pandoc, che è scritto in Haskell e che potrei utilizzare il modulo FastCGI per eseguire un programma Haskell sul mio server Apache.

2. Problema/ domanda

Non sono sicuro di come il protocollo dovrei usare per inviare il mio script FastCGI le variabili di input/output (post/get?) E come viene fatto esattamente. Qualche idea, suggerimenti, soluzioni?

3. Maglie adottate

3.1 tentativo

Ecco cosa ho fatto finora (in base al codice di esempio). Nota, non ho esperienza in Haskell e al momento non ho troppo tempo per imparare la lingua. Mi piacerebbe solo poter utilizzare lo strumento di conversione del formato di testo 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

Questo codice legge la stringa dopo il punto interrogativo nell'URL della richiesta. Ma questa non è una buona soluzione in quanto alcuni personaggi vengono omessi (ad esempio '#') e gli spazi vengono sostituiti da "/20%".

Grazie in anticipo.

3.2 Network.CGI

Documentazione trovata qui. Sotto l'intestazione "input" ci sono una serie di metodi per ottenere l'input. Quale è giusto per me?

È :

Ottieni il valore di una variabile di input, ad esempio da un modulo. Se la variabile ha più valori, il primo viene restituito. Esempio:

query <- getInput "query"

Quindi diciamo che ho un modulo post HTML con name='Joe' Posso afferrarlo usando getInput? E in tal caso come gestisco il Maybe String genere?

È stato utile?

Soluzione

Il pacchetto FastCGI è in realtà un'estensione del CGI pacchetto, che include i tipi di protocollo per la ricezione di dati di richiesta e le pagine dei risultati di restituzione. Suggerirei di usare CGI per cominciare, quindi passare a FastCGI una volta che sai cosa stai facendo.

Potresti anche voler guardare Questo tutorial.

Modifica per rispondere alle domande sul tutorial:

"Forse a" è un tipo che può contenere "solo un" o "niente". La maggior parte delle lingue utilizza un puntatore nullo per indicare che non ci sono dati, ma Haskell non ha puntatori nulli. Quindi abbiamo un tipo "forse" esplicito invece per i casi in cui i dati potrebbero essere nulli. I due costruttori ("solo" e "nulla") insieme al tipo ti costringono a consentire esplicitamente il caso nullo quando potrebbe accadere, ma ti permettono anche di ignorarlo quando non può accadere.

La funzione "forse" è l'estrattore universale per i tipi forse. La firma è:

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

Prendendo gli argomenti dal davanti a schiena, il terzo argomento "forse un" terzo è il valore con cui stai cercando di lavorare. Il secondo argomento è una funzione chiamata se il terzo argomento è "solo V", nel qual caso il risultato è "FV". Il primo argomento è il valore predefinito, restituito se il terzo è "nulla".

In questo caso, il trucco è che la funzione "cgimain" si chiama due volte. Se trova un campo di input "nome", la variabile "MN" verrà impostata su (solo "Joe bloggs"), altrimenti verrà impostato su (nulla). (Sto usando parentesi per delimitare i valori ora perché le citazioni vengono utilizzate per le stringhe).

Quindi la chiamata "forse" restituisce la pagina per il rendering. Viene fornita la prima volta tramite nessun nome, quindi "MN" è (nulla) e la pagina "InputForm" predefinita viene restituita per il rendering. Quando l'utente fa clic, è richiesto lo stesso URL, ma questa volta con il set di campo "Nome", quindi ora ottieni la funzione "Greet" chiamata con il nome come argomento, quindi dice "Ciao Joe Bloggs".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top