2017-05-12 111 views
0

我需要解析iCalendar格式,這基本上是Google日曆和幾乎所有日曆應用程序使用的格式。解析iCalendar格式

我發現這個包iCalendar Hackage
但我無法弄清楚如何使用parseICalendar功能在這個包,如果有人能告訴我什麼,我做錯了,這將是巨大的。

主要是我無法弄清楚如何構建一個參數的類型DecodingFunctions

parseICalendar :: DecodingFunctions 
       -> FilePath --^Used in error messages. 
       -> ByteString 
       -> Either String ([VCalendar], [String]) 

我的努力:

module CalendarReader 
(getCalendar 
, getSummary 
) where 

{-# LANGUAGE OverloadedStrings #-} 

import qualified Data.ByteString.Lazy as B  -- package "bytestring" 
import qualified Text.ICalendar as ICal   -- package "iCalendar" 
import qualified Data.Map as Map    -- package "containers" 
import Network.HTTP.Simple      -- package "http-conduit" 


import qualified Time       -- local module 
import Constants 

getCalendar :: IO B.ByteString 
getCalendar = do 
    request <- parseRequest $ "GET" ++ calendarURL 
    response <- httpLBS request 
    return $ getResponseBody response 

getSummary :: B.ByteString -> Time.DateTime -> Int -> String 
getSummary cal dateTime dayOffset = summary 
    where 
    summary = "Event Summary" 
    ((ICal.VCalendar { ICal.vcEvents = vcEvents' }), _) = ICal.parseICalendar ?missingArgument? logFile cal 

回答

0

DecodingFunctions應該包含一個函數你ByteString(二進制數組)轉換到一個Text(代表一串unicode字符),一個對大小寫不敏感的表示(爲了比較的目的,我想)。如果您的iCalendar是「正常」和UTF-8編碼,你可以簡單地使用DecodingFunctionsDefault實例:

parseICalendar def logFile cal 

(不要忘了從什麼地方進口DEF)

如果您的iCalendar不在Utf-8中,您將不得不使用decode...功能Data.Text.Lazy.EncodingmkData.CaseInsensitive。對於Utf16,您將擁有:

decodings = DecodingFunctions decodeUtf16LE (mk . decodeUtf16LE) 

與正確的進口。

+0

是的,這個工程。什麼花了我額外的時間,雖然是搞清楚,我需要導入Data.default爲def – BinaryHexer