packages feed

lambdaFeed-0.3.1: Feed.hs

-- |A simple feed generator: Feed data structure
--
--  Copyright (c) 2006 Manuel M T Chakravarty
--
--  License: <http://www.gnu.org/licenses/gpl.html>
--
--- Description ---------------------------------------------------------------
--
--  Language: Haskell 98
--

module Feed (

  -- * Internal representation of feeds
  URL, Feed(..), Channel(..), Image(..), Category(..), Item(..),
  Enclosure(..), GUID(..), Source(..), Info(..),

  -- * Copying of non-parametric components of channels
  copyChannelInfo,

  -- * Default values for all feed sub-structures
  defaultChannel, defaultImage, defaultCategory, defaultItem,
  defaultEnclosure, defaultGUID, defaultSource

) where

-- lambdaFeed
import Date (
  Date)


-- Feed data structure (following RSS 2.0.1 (rv 6))
-- -------------------

-- URL data type
--
type URL = String

-- A feed consists of a set of channels.
--
data Feed items = Feed [Channel items]
		deriving Show

-- Channel description
--
data Channel items = 
  Channel {
    titleChan          :: String,
    linkChan           :: URL,
    descriptionChan    :: String,
    languageChan       :: Maybe String,
    copyrightChan      :: Maybe String,
    managingEditorChan :: Maybe String,
    webMasterChan      :: Maybe String,
    pubDateChan	       :: Maybe Date,
    lastBuildDateChan  :: Maybe Date,
    categoryChan       :: [Category],      -- may be empty
    generatorChan      :: Maybe String,
    docsChan	       :: Maybe URL,
    cloudChan	       :: (),
    ttlChan	       :: Maybe Int,       -- in minutes
    imageChan	       :: Maybe Image,
    ratingChan	       :: (),
    textInputChan      :: (),
    skipHoursChan      :: (),
    skipDaysChan       :: (),
    itemsChan	       :: items,
    infoChan	       :: Info		   -- internal info about a channel
  }
  deriving Show

-- Generic categorisation information
--
data Category = Category {
		  categoryCategory :: String,
		  domainCategory   :: Maybe String
		}
		deriving Show

-- Inline image
--
data Image = Image {
	       urlImage         :: URL,
	       titleImage       :: String,
	       linkImage        :: URL,
	       widthImage       :: Maybe Int,
	       heightImage      :: Maybe Int,
	       descriptionImage :: Maybe String
	     }
	     deriving Show

-- Feed item
--
-- * Either `titleItem' or `descriptionItem' must be present.
--
data Item = Item {
	      titleItem       :: Maybe String,
	      linkItem        :: Maybe URL,
	      descriptionItem :: Maybe String,
	      authorItem      :: Maybe String,    -- email of author
	      categoryItem    :: [Category],      -- may be empty
	      commentsItem    :: Maybe URL,
	      enclosureItem   :: Maybe Enclosure,
	      guidItem	      :: Maybe GUID,
	      pubDateItem     :: Maybe Date,
	      sourceItem      :: Maybe Source
	    }
	    deriving Show

-- Inline media content
--
data Enclosure = Enclosure {
		   urlEnclosure    :: URL,
		   lengthEnclosure :: Int,        -- in bytes
		   typeEnclosure   :: String
		 }
		 deriving Show

-- Global identification
--
data GUID = GUID {
	      guidGUID	      :: String,
	      isPermaLinkGUID :: Maybe Bool
	    }
	    deriving Show

-- Item source
--
data Source = Source {
		sourceSource :: String,
	        urlSource    :: URL
              }
	      deriving Show

-- lambdaFeed specific information about a channel
--
data Info = Info {
	      fnameInfo :: FilePath	-- basename of .lfc
	    }
	    deriving Show

-- Copies all components of a channel structure except `itemsChan'.
--
copyChannelInfo :: Channel a -> Channel b
copyChannelInfo chan =
  Channel {
    titleChan          = titleChan chan,
    linkChan           = linkChan chan,
    descriptionChan    = descriptionChan chan,
    languageChan       = languageChan chan,
    copyrightChan      = copyrightChan chan,
    managingEditorChan = managingEditorChan chan,
    webMasterChan      = webMasterChan chan,
    pubDateChan	       = pubDateChan chan,
    lastBuildDateChan  = lastBuildDateChan chan,
    categoryChan       = categoryChan chan,
    generatorChan      = generatorChan chan,
    docsChan	       = docsChan chan,
    cloudChan	       = cloudChan chan,
    ttlChan	       = ttlChan chan,
    imageChan	       = imageChan chan,
    ratingChan	       = ratingChan chan,
    textInputChan      = textInputChan chan,
    skipHoursChan      = skipHoursChan chan,
    skipDaysChan       = skipDaysChan chan,
    itemsChan	       = error "channel missing items (after copy)",
    infoChan	       = infoChan chan
  }

-- Channel value with default components.
--
defaultChannel :: Channel items
defaultChannel = Channel {
		   titleChan          = error "channel missing title",
		   linkChan           = error "channel missing link",
		   descriptionChan    = error "channel missing description",
		   languageChan       = Nothing,
		   copyrightChan      = Nothing,
		   managingEditorChan = Nothing,
		   webMasterChan      = Nothing,
		   pubDateChan	      = Nothing,
		   lastBuildDateChan  = Nothing,
		   categoryChan       = [],
		   generatorChan      = Nothing,
		   docsChan	      = Nothing,
		   cloudChan	      = (),
		   ttlChan	      = Nothing,
		   imageChan	      = Nothing,
		   ratingChan	      = (),
		   textInputChan      = (),
		   skipHoursChan      = (),
		   skipDaysChan	      = (),
		   itemsChan	      = error "channel missing items",
		   infoChan	      = error "channel missing info"
		 }

-- Image value with default components.
--
defaultImage :: Image
defaultImage = Image {
		 urlImage         = error "image missing url",
		 titleImage       = error "image missing title",
		 linkImage        = error "image missing link",
		 widthImage       = Nothing,
		 heightImage      = Nothing,
		 descriptionImage = Nothing
	       }

-- Category value with default components..
--
defaultCategory :: Category
defaultCategory = Category {
		    categoryCategory = error "category missing category",
		    domainCategory   = Nothing
		  }

-- Items value with default components.
--
defaultItem :: Item
defaultItem = Item {
		titleItem       = Nothing,
		linkItem        = Nothing,
		descriptionItem = Nothing,
		authorItem      = Nothing,
		categoryItem    = [],
		commentsItem    = Nothing,
		enclosureItem   = Nothing,
		guidItem	= Nothing,
		pubDateItem     = Nothing,
		sourceItem      = Nothing
	      }

-- Enclosure value with default components..
--
defaultEnclosure :: Enclosure
defaultEnclosure = Enclosure {
		     urlEnclosure    = error "enclosure missing url",
		     lengthEnclosure = error "enclosure missing length",
		     typeEnclosure   = error "enclosure missing type"
		   }

-- GUID value with default components..
--
defaultGUID :: GUID
defaultGUID = GUID {
		guidGUID        = error "guid missing guid",
		isPermaLinkGUID = Nothing
	      }

-- GUID value with default components..
--
defaultSource :: Source
defaultSource = Source {
		  sourceSource = error "source missing source",
		  urlSource    = error "source missing url"
	        }