    --------------------------------------------------------------------
    -- |
    -- Module    : Text.Atom.Feed.Link
    -- Copyright : (c) Galois, Inc. 2008,
    --             (c) Sigbjorn Finne 2009-
    -- License   : BSD3
    --
    -- Maintainer: Sigbjorn Finne <sof@forkIO.com>
    -- Stability : provisional
    -- Portability: portable
    --
    --------------------------------------------------------------------
    module Text.Atom.Feed.Link
      ( LinkRelation(..)
      , showLinkRelation
      , showLinkAttr
      ) where

    import Prelude.Compat

    -- | Atom feeds uses typed IRI links to represent
    -- information \/ metadata that is of interest to the
    -- consumers (software, in the main) of feeds. For instance,
    -- the edit link relation attached to an atom:entry element
    -- points to the IRI to use to update\/edit it.
    --
    -- The Atom standard encourages that such typed links to
    -- be registered with IANA if they have wider applicability,
    -- and the 'LinkRelation' data type encodes the currently
    -- registered link types (derived from:
    --  http:\/\/www.iana.org\/assignments\/link-relations.html
    -- on 2007-10-28]
    --
    data LinkRelation -- relevant RFC:
      = LinkAlternate -- http://www.rfc-editor.org/rfc/rfc4287.txt
      | LinkCurrent -- http://www.rfc-editor.org/rfc/rfc5005.txt
      | LinkEnclosure -- http://www.rfc-editor.org/rfc/rfc4287.txt
      | LinkEdit -- http://www.rfc-editor.org/rfc/rfc5023.txt
      | LinkEditMedia -- http://www.rfc-editor.org/rfc/rfc5023.txt
      | LinkFirst -- http://www.iana.org/assignments/link-relations/first
      | LinkLast -- http://www.iana.org/assignments/link-relations/last
      | LinkLicense -- http://www.rfc-editor.org/rfc/rfc4946.txt
      | LinkNext -- http://www.rfc-editor.org/rfc/rfc5005.txt
      | LinkNextArchive -- http://www.rfc-editor.org/rfc/rfc5005.txt
      | LinkPayment -- http://www.iana.org/assignments/link-relations/payment
      | LinkPrevArchive -- http://www.rfc-editor.org/rfc/rfc5005.txt
      | LinkPrevious -- http://www.rfc-editor.org/rfc/rfc5005.txt
      | LinkRelated -- http://www.rfc-editor.org/rfc/rfc4287.txt
      | LinkReplies -- http://www.rfc-editor.org/rfc/rfc4685.txt
      | LinkSelf -- http://www.rfc-editor.org/rfc/rfc4287.txt
      | LinkVia -- http://www.rfc-editor.org/rfc/rfc4287.txt
      | LinkOther String
      deriving (Eq, Show)

    showLinkRelation :: LinkRelation -> String
    showLinkRelation lr =
      case lr of
        LinkAlternate -> "alternate"
        LinkCurrent -> "current"
        LinkEnclosure -> "enclosure"
        LinkEdit -> "edit"
        LinkEditMedia -> "edit-media"
        LinkFirst -> "first"
        LinkLast -> "last"
        LinkLicense -> "license"
        LinkNext -> "next"
        LinkNextArchive -> "next-archive"
        LinkPayment -> "payment"
        LinkPrevArchive -> "prev-archive"
        LinkPrevious -> "previous"
        LinkRelated -> "related"
        LinkReplies -> "replies"
        LinkSelf -> "self"
        LinkVia -> "via"
        LinkOther s -> s

    showLinkAttr :: LinkRelation -> String -> String {-URI-}
    showLinkAttr lr s = showLinkRelation lr ++ '=' : '"' : concatMap escQ s ++ "\""
      where
        escQ '"' = "&dquot;"
        escQ x = [x]