2015-12-31 3 views
0

Я хотел бы разобрать E-Mail, подобные этойКак пропустить ненужный текст с attoparsec

Random Info: ........ 
From: [email protected] 
Other Info: ....... 
Subject: ima subject 
Some More Info: ..... 

This is a message. 

Но я не нужна вся информация из этого E-Mail. Только «От», «Тема» и само сообщение. Как я могу разобрать такое сообщение? Более конкретно, как я могу пропустить нежелательные данные?

Вот код, который я до сих пор

{-# LANGUAGE OverloadedStrings #-} 

module MailParser where 

import qualified Data.Text as T 
import Data.Attoparsec.Text 

type From = Address 
type Message = T.Text 
type Subject = T.Text 
type Local = T.Text 
type Domain = T.Text 

data Address = Address Local Domain 
data Mail = Mail From Subject Message 

addressParser :: Parser Address 
addressParser = do 
    _ <- string "From: " 
    local <- takeWhile1 (/= '@') 
    _ <- char '@' 
    domain <- takeWhile1 (/= '\n') 
    return $ Address local domain 

subjectParser :: Parser T.Text 
subjectParser = do 
    _ <- string "Subject: " 
    takeWhile1 (/= '\n') 

messageParser :: Parser Message 
messageParser = do 
    _ <- char '\n' 
    takeText 

mailParser :: Parser Mail 
mailParser = do 
    -- skip unwanted info 
    from <- addressParser 
    -- skip unwanted info 
    subject <- subjectParser 
    -- skip unwanted info 
    message <- messageParser 
    return $ Mail from subject message 
+0

Обратите внимание, что вместо записи '_ <- foo' вы всегда можете написать только' foo'. – amalloy

+0

Я знаю, но я получаю предупреждения в Atom об этом, и я не знаю, как их отключить. – TomTom

ответ

1

Вместо того, чтобы игнорировать текст с анализатором, другой подход для разбора электронной почты обычно, а затем проект только заголовки вы заинтересованы.

-- After parsing, say we end up with this data. 
data Email = Email { headers :: [Header], message :: Text } 

data Header = Header { label :: Text, value :: Text } 

-- Helper to find headers in an Email. 
findHeader :: Text -> Email -> Maybe Header 
findHeader x = find ((==x) . label) . headers 

-- Project the Email's "Subject" header. 
subject :: Email -> Maybe Header 
subject = findHeader "Subject" 

-- Project the Email's "From" header. 
from :: Email -> Maybe Header 
from = findHeader "From" 

Кроме того, hsemail и hsemail-ns определили парсеровские парсеры.