eros- A text censorship library.

Copyright2014, Peter Harpending.
MaintainerPeter Harpending <>
Safe HaskellNone



This module serves as a bit of a capstone to the whole eros library. The idea being you can just import this module, and get all of the functions from all the rest of eros.

You will have to look in the documentation for the sub-modules for the functions. I haven't quite figured out how to get the documentation to show up here yet.

How to use this library

The basic idea is you take a Message type, and check it against a PhraseMap, using messageScore. Message is actually just a type alias for Text, so just enable the OverloadedStrings extension, and pretend you're using normal strings.

In GHCi,

>>> :set -XOverloadedStrings
>>> import Text.Eros

In a file,

{\-# LANGUAGE OverloadedStrings #-\}
import Text.Eros

Constructing PhraseMaps

A PhraseMap is just a Phraselist marshaled into the more Haskell-friendly Map type.

Eros provides a large number of Phraselists.

data ErosList = Chat
              | Conspiracy
              | DrugAdvocacy
              | Forums
              | Gambling
              | Games
              | Gore
              | IdTheft
              | IllegalDrugs
              | Intolerance
              | LegalDrugs
              | Malware
              | Music
              | News
              | Nudism
              | Peer2Peer
              | Personals
              | Pornography
              | Proxies
              | SecretSocieties
              | SelfLabeling
              | Sport
              | Translation
              | UpstreamFilter
              | Violence
              | WarezHacking
              | Weapons
              | Webmail
  deriving (Eq)

The easiest way to marshal a Phraselist into a PhraseMap is to use the readPhraseMap function.

readPhraseMap :: Phraselist t => t -> IO PhraseMap

Use it like this

>>> pornMap <- readPhraseMap Pornography

Internally, readPhraseMap reads JSON data containing the Phraselist, marshals it into a list of PhraseAlmostTrees, converts those into a PhraseForsest, and then into a PhraseMap.

You can obviously use mkMap and readPhraselist to do it yourself, but it's a lot easier to just use readPhraseMap.

You can then use messageScore to see the Score (actually an Int) of each message.

>>> messageScore "Go fuck yourself." pornMap

messageScore is not case sensitive, so "go fUck YoUrself" returns the same score as "go fuck yourself", and so on.

If you want to use multiple eros lists, do something like this

>>> let myLists = [Chat, Pornography, Weapons]
>>> myMaps <- mapM readPhraseMap myLists
>>> map (messageScore "Go fuck yourself") myMaps
[0, 30, 0]

Using your own phraselists

I haven't added good support in for this yet, but there still is support nonetheless. Your phraselist needs to be in JSON, in accordance with the Phraselist schema (I'm too lazy to find a link to it).

data MyList = MyList
instance Phraselist MyList where
  phraselistPath MyList = "/path/to/phraselist"

You can then do the normal stuff with messageScore and readPhraseMap.