- fromId :: DocumentID -> IO (PageName, RevNum)
- fromId docId
- = do uri <- getDocURI index docId
- rev <- getDocAttr index docId "rakka:revision"
- >>= return . read . fromJust
- return (decodePageName $ uriPath uri, rev)
+ parseHint :: [(String, Int)] -> (Int, [String])
+ parseHint xs
+ = let total = fromJust $ lookup "" xs
+ words = filter (/= "") $ map fst xs
+ in
+ (total, words)
+
+ fromId :: [String] -> DocumentID -> IO HitPage
+ fromId words docId
+ = do uri <- getDocURI index docId
+ rev <- unsafeInterleaveIO $
+ getDocAttr index docId "rakka:revision"
+ >>=
+ return . read . fromJust
+ lastMod <- unsafeInterleaveIO $
+ getDocAttr index docId "@mdate"
+ >>=
+ return . zonedTimeToUTC . fromJust . parseW3CDateTime . fromJust
+ summary <- unsafeInterleaveIO $
+ getDocAttr index docId "rakka:summary"
+ snippet <- unsafeInterleaveIO $
+ do doc <- getDocument index docId [NoAttributes, NoKeywords]
+ sn <- makeSnippet doc words 300 80 80
+ return (trim (== Boundary) $ map toFragment sn)
+ return HitPage {
+ hpPageName = decodePageName $ uriPath uri
+ , hpPageRev = rev
+ , hpLastMod = lastMod
+ , hpSummary = summary
+ , hpSnippet = snippet
+ }
+
+ toFragment :: Either String (String, String) -> SnippetFragment
+ toFragment (Left "") = Boundary
+ toFragment (Left t) = NormalText t
+ toFragment (Right (w, _)) = HighlightedWord w