module MediaWiki.API.Query.Revisions.Import where
import MediaWiki.API.Types
import MediaWiki.API.Utils
import MediaWiki.API.Query.Revisions
import Text.XML.Light.Types
import Text.XML.Light.Input ( parseXMLDoc )
import Text.XML.Light.Proc ( strContent )
import Control.Monad
import Data.Maybe
stringXml :: String -> Either (String,[String]) RevisionsResponse
stringXml s = parseDoc xml s
xml :: Element -> Maybe RevisionsResponse
xml e = do
guard (elName e == nsName "api")
let es1 = children e
p <- pNode "query" es1
let es = children p
ps <- fmap (mapMaybe xmlPage) (fmap children $ pNode "pages" es)
let cont = pNode "query-continue" es1 >>= xmlContinue "revisions" "rvstartid"
return emptyRevisionsResponse
{ rvPages = ps
, rvContinue = cont
}
xmlPage :: Element -> Maybe (PageTitle,[Revision])
xmlPage e = do
guard (elName e == nsName "page")
let ns = fromMaybe mainNamespace $ pAttr "ns" e
let tit = fromMaybe "" $ pAttr "title" e
let pid = pAttr "pageid" e
let es = children e
p <- pNode "revisions" es
let pg = emptyPageTitle{pgNS = ns, pgTitle=tit, pgMbId = pid}
rs <- fmap (mapMaybe (xmlRevision pg)) (fmap children $ pNode "rev" es)
return (pg, rs)
xmlRevision :: PageTitle -> Element -> Maybe Revision
xmlRevision pg e = do
guard (elName e == nsName "page")
let rid = fromMaybe "" $ pAttr "revid" e
let min = isJust (pAttr "minor" e)
let usr = fromMaybe "" $ pAttr "user" e
let anon = isJust (pAttr "anon" e)
let ts = fromMaybe "" $ pAttr "timestamp" e
let size = fromMaybe 0 (pAttr "size" e >>= readMb)
let com = pAttr "comment" e
let con = case strContent e of { "" -> Nothing ; xs -> Just xs}
return (emptyRevision pg)
{ revRevId = rid
, revIsMinor = min
, revUser = usr
, revIsAnon = anon
, revTimestamp = ts
, revSize = size
, revComment = com
, revContent = con
}