packages feed

WikimediaParser (empty) → 0.1

raw patch · 4 files changed

+180/−0 lines, 4 filesdep +basedep +parsecsetup-changed

Dependencies added: base, parsec

Files

+ LICENSE view
@@ -0,0 +1,10 @@+Copyright (c) 2009, Ezekiel Smithburg+All rights reserved.++Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:++    * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.+    * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.+    * The names of contributors may be used to endorse or promote products derived from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ Text/WikimediaParser.hs view
@@ -0,0 +1,152 @@+module Text.WikimediaParser where++import Text.ParserCombinators.Parsec+import Data.List (intercalate)++data WikiMarkup = Text String | Link {text::String, target::String} deriving (Eq)++instance Show WikiMarkup where+  show (Text t) = t+  show (Link t _) = t++data Page = Page [WikiMarkup] deriving (Eq)++instance Show Page where+  show (Page xs) = foldl (\x y -> x ++ (show y)) "" xs++generalParseLink p = between (string "[[") (string "]]") p++isNot c = satisfy (/= c)++betweenMatching :: Char -> GenParser Char st [Char]+betweenMatching c = do open <- many1 $ char c +                       content <- (many $ isNot c)+                       count (length open) (char c)+                       return content++parseLink :: Parser WikiMarkup+parseLink = generalParseLink linkContent+            where linkContent = do target <- optionMaybe (try $ manyTill anyToken (char '|'))+                                   text <- many1 (noneOf "[]") +                                   return $ Link text (maybe text id target)++parseNoWiki :: Parser WikiMarkup+parseNoWiki = between (string "<nowiki>") (string "</nowiki>") parseText++parseCategory :: Parser WikiMarkup+parseCategory = generalParseLink linkContent+                where linkContent = do option "" (string ":")+                                       string "Catégorie"+                                       many (noneOf "]")+                                       return $ Text ""++eol = char '\n' +notEol = noneOf "\r\n"++parseUnorderedListItem = do char '*'+                            many notEol+                            eol++parseUnorderedList :: Parser WikiMarkup+parseUnorderedList = do many1 parseUnorderedListItem+                        return $ Text "" ++parseOrderedListItem = do char '#'+                          many notEol +                          eol++parseOrderedList :: Parser WikiMarkup+parseOrderedList = do many1 parseUnorderedListItem+                      return $ Text ""++parseLinkNameSpace :: Parser WikiMarkup+parseLinkNameSpace = generalParseLink linkContent+                     where linkContent = do manyTill anyToken (char ':')+                                            text <- many (noneOf "[]")+                                            return $ Text text++parseLinkOtherLanguage :: Parser WikiMarkup+parseLinkOtherLanguage = generalParseLink linkContent+                         where linkContent = do anyToken+                                                anyToken+                                                option "" (string "mple")+                                                char ':'+                                                many (noneOf "[]")+                                                return $ Text "" ++parseUnnamedLink :: Parser WikiMarkup+parseUnnamedLink = do between (char '[') (char ']') (many $ noneOf "]")+                      return $ Text ""++parseHTMLComment :: Parser WikiMarkup+parseHTMLComment = do string "<!--"+                      manyTill (string "-->") anyToken+                      return $ Text ""++parseHTML = do char '<'+               tagName <- many $ noneOf " >"+               options <- option "" $ manyTill anyToken (char '>')+               content <- nest+               string "</"+               endTag <- string tagName+               string ">"+               return $ intercalate "," $ [tagName, options, content, endTag] +            where nest = do text <- many $ isNot '<'+                            case text of+                              "" -> do return ""+                              _ -> do+                                html <- option "" parseHTML+                                case html of+                                  "" -> return text+                                  _ -> do+                                    next <- nest+                                    case next of+                                      "" -> return $ text ++ html+                                      _ -> return $ text ++ html ++ next++parseHeading :: Parser WikiMarkup+parseHeading = do try $ betweenMatching '=' +                  return $ Text ""++parseBrackets :: Parser WikiMarkup+parseBrackets = do between (string "{{") (string "}}") (many (noneOf "}"))+                   return $ Text ""++symbols :: String+symbols = "[{=*<"++symbol :: Parser Char+symbol = oneOf symbols++symbolW :: Parser WikiMarkup+symbolW = symbol >>= (return . Text . (\a->[a]))++notSymbol = noneOf symbols++parseSymbols = try parseCategory <|>+               try parseLink <|>+               try parseUnnamedLink <|>+               try parseBrackets <|>+               try parseHeading <|>+               try parseUnorderedList <|>+               try parseOrderedList <|>+               try parseHTMLComment <|>+               symbolW++parseText :: Parser WikiMarkup+parseText = do text <- many1 notSymbol+               return $ Text text++parseLine :: Parser WikiMarkup+parseLine = parseSymbols <|>+            parseText++parseArticle :: Parser [WikiMarkup]+parseArticle = do vals <- many parseLine+                  eof+                  return vals++concatText :: [WikiMarkup] -> [WikiMarkup]+concatText (Text x: Text y:xs) = Text (x ++ y) : concatText xs+concatText [] = []+concatText (x:xs) = x : concatText xs
+ WikimediaParser.cabal view
@@ -0,0 +1,16 @@+Name: WikimediaParser+Version: 0.1+Build-Type: Simple+License: BSD3+License-File: LICENSE+Cabal-Version: >= 1.2+Author: Ezekiel Smithburg+Maintainer: tehgeekmeister@gmail.com+Stability: Alpha+Category: Parsing+Description: Functions to parse various parts of wikimedia markup, or entire articles.  Currently has some french wikipedia specific code and doesn't return the values of some syntax it parses, but most of this will be fixed in the next release.  Feel free to submit a patch yourself using darcs send to my email if you fix any of these problems.+Synopsis: A parser for wikimedia style article markup.++Library+  Build-Depends: base, parsec+  Exposed-Modules: Text.WikimediaParser