packages feed

naver-translate 0.1.0.0 → 0.1.0.1

raw patch · 2 files changed

+52/−16 lines, 2 filesdep +network-uri

Dependencies added: network-uri

Files

naver-translate.cabal view
@@ -1,7 +1,8 @@ name:                naver-translate-version:             0.1.0.0+version:             0.1.0.1 synopsis:            Interface to Naver Translate homepage:            https://github.com/dahlia/naver-translate+bug-reports:         https://github.com/dahlia/naver-translate/issues license:             GPL-3 license-file:        LICENSE author:              Hong Minhee@@ -14,13 +15,14 @@  library   exposed-modules:     Language.Translate.Naver-  build-depends:       aeson       >=0.7.0.6  && <0.8.0.0,-                       base        >=4.7 && <4.8,+  build-depends:       aeson        >=0.7.0.6  && <0.8.0.0,+                       base         >=4.7 && <4.8,                        iso639,-                       lens        >=4.8 && <4.9,-                       lens-aeson  >=1.0.0.3  && <1.1.0.0,-                       text        >=1.1.0.0  && <1.2.0.0,-                       wreq        >=0.3.0.1  && <0.4.0.0,-                       random      >=1.0.1.1  && <1.1.0.0+                       lens         >=4.8 && <4.9,+                       lens-aeson   >=1.0.0.3  && <1.1.0.0,+                       network-uri  >=2.6.0.0  && <3.0.0.0,+                       text         >=1.1.0.0  && <1.2.0.0,+                       wreq         >=0.3.0.1  && <0.4.0.0,+                       random       >=1.0.1.1  && <1.1.0.0   hs-source-dirs:      src   default-language:    Haskell2010
src/Language/Translate/Naver.hs view
@@ -1,28 +1,35 @@ {-# LANGUAGE OverloadedStrings #-} module Language.Translate.Naver ( translate                                 , translateMultiple+                                , translateUrl                                 ) where  import Control.Lens ((^?))+import Control.Monad (liftM) import Data.Aeson.Lens (key) import Data.Aeson.Types (Value(String))-import Data.LanguageCodes (ISO639_1, language)+import Data.LanguageCodes (ISO639_1(JA, KO), language) import Data.Text (Text, cons, intercalate, pack, snoc, splitOn, strip)+import Network.URI (URI(URI), URIAuth(URIAuth), relativeTo, uriIsAbsolute) import Network.Wreq (FormParam((:=)), post, responseBody) import System.Random (getStdRandom, randomR) -translate :: ISO639_1 -> ISO639_1 -> Text -> IO Text+-- | Translate a string.+translate :: ISO639_1 -- ^ The language translated from+          -> ISO639_1 -- ^ The language to translate to+          -> Text     -- ^ The text to translate+          -> IO Text  -- ^ The translated text translate sourceLanguage targetLanguage text =     let response =             post             "http://translate.naver.com/translate.dic"             [ "query" := text-            , "srcLang" := (pack $ language sourceLanguage)-            , "tarLang" := (pack $ language targetLanguage)+            , "srcLang" := pack (language sourceLanguage)+            , "tarLang" := pack (language targetLanguage)             , "highlight" := ("0" :: Text)             , "hurigana" := ("0" :: Text)]         getResultData resp = resp ^? responseBody . key "resultData"-        resultData = response >>= return . getResultData+        resultData = liftM getResultData response     in         resultData >>= \dat -> case dat of             Just (String translated) -> return translated@@ -35,13 +42,40 @@ arbitraryNumeric =     let         randomDigit i = getStdRandom (randomR (if i > 1 then '0' else '1', '9'))-        string = sequence $ map randomDigit [1..arbitraryNumericLength]+        string = mapM randomDigit [1..arbitraryNumericLength]     in-        string >>= return . pack+        liftM pack string -translateMultiple :: ISO639_1 -> ISO639_1 -> [Text] -> IO [Text]+-- | Translate multiple strings at one go.+translateMultiple :: ISO639_1  -- ^ The language translated from+                  -> ISO639_1  -- ^ The language to translate to+                  -> [Text]    -- ^ The texts to translate+                  -> IO [Text] -- ^ The translated texts translateMultiple sourceLanguage targetLanguage texts = do     spliter <- arbitraryNumeric     let bundle = intercalate (snoc (cons ' ' spliter) ' ') texts     result <- translate sourceLanguage targetLanguage bundle     return $ map strip $ splitOn spliter result++-- | Get the url of the translated page.  Other languages than Korean+-- ('KO') and Japanese ('JA') are unsupported, so they get 'Nothing'.+translateUrl :: ISO639_1  -- ^ The language translated from+             -> ISO639_1  -- ^ The language to translate to+             -> URI       -- ^ The url of the page to translate+             -> Maybe URI -- ^ The url of the translated page+translateUrl sourceLanguage targetLanguage (URI scheme authority path query _) =+    case (scheme, authority) of+        ("http:", Just (URIAuth "" host port)) ->+            let relUrl = getRelUrl host port+                getUrl = Just . relativeTo relUrl+            in case langPair of+                (JA, KO) -> getUrl j2k+                (KO, JA) -> getUrl k2j+                _ -> Nothing+        _ -> Nothing+  where+    langPair = (sourceLanguage, targetLanguage)+    baseAuth = Just $ URIAuth "" "jptrans.naver.net" ""+    j2k = URI "http:" baseAuth "/j2k_frame.php/korean/" "" ""+    k2j = URI "http:" baseAuth "/webtrans.php/korean/" "" ""+    getRelUrl host port = URI "" Nothing (host ++ port ++ path) query ""