diff --git a/cabal.project b/cabal.project index dc73f9d..7e6c5c7 100644 --- a/cabal.project +++ b/cabal.project @@ -1,8 +1,2 @@ -tests: True +packages: */*.cabal -packages: - msgpack - msgpack-aeson - msgpack-rpc --- msgpack-idl --- msgpack-idl-web diff --git a/cabal.project.floor-ghc-7.8.4 b/cabal.project.floor-ghc-7.8.4 deleted file mode 100644 index b61c623..0000000 --- a/cabal.project.floor-ghc-7.8.4 +++ /dev/null @@ -1,22 +0,0 @@ --- freeze file for validating lower bounds - --- with-compiler: ghc-7.8.4 -constraints: bytestring installed - , deepseq installed - , binary installed - , containers installed - - , mtl == 2.2.1 - , vector == 0.10.11.0 - , data-binary-ieee754 == 0.4.4 - , unordered-containers == 0.2.5.0 - , hashable == 1.1.2.4 - , text == 1.2.3.0 - , scientific == 0.3.2.0 - , aeson == 0.8.0.2 - , exceptions == 0.8 - , network == 2.6.0.0 - , monad-control == 1.0.0.0 - , conduit == 1.2.3.1 - , conduit-extra == 1.1.3.4 - , binary-conduit == 1.2.3 diff --git a/msgpack-aeson/msgpack-aeson.cabal b/msgpack-aeson/msgpack-aeson.cabal index 063ebd4..7ea19e8 100644 --- a/msgpack-aeson/msgpack-aeson.cabal +++ b/msgpack-aeson/msgpack-aeson.cabal @@ -23,16 +23,15 @@ library hs-source-dirs: src exposed-modules: Data.MessagePack.Aeson - build-depends: base >= 4.7 && < 4.14 - , aeson >= 0.8.0.2 && < 0.12 - || >= 1.0 && < 1.5 - , bytestring >= 0.10.4 && < 0.11 - , msgpack >= 1.1.0 && < 1.2 - , scientific >= 0.3.2 && < 0.4 - , text >= 1.2.3 && < 1.3 - , unordered-containers >= 0.2.5 && < 0.3 - , vector >= 0.10.11 && < 0.13 - , deepseq >= 1.3 && < 1.5 + build-depends: base + , aeson + , bytestring + , msgpack + , scientific + , text + , unordered-containers + , vector + , deepseq default-language: Haskell2010 @@ -48,7 +47,7 @@ test-suite msgpack-aeson-test , aeson , msgpack -- test-specific dependencies - , tasty == 1.2.* - , tasty-hunit == 0.10.* + , tasty + , tasty-hunit default-language: Haskell2010 diff --git a/msgpack-aeson/src/Data/MessagePack/Aeson.hs b/msgpack-aeson/src/Data/MessagePack/Aeson.hs index d97ecc1..02bcd2a 100644 --- a/msgpack-aeson/src/Data/MessagePack/Aeson.hs +++ b/msgpack-aeson/src/Data/MessagePack/Aeson.hs @@ -25,6 +25,8 @@ import Control.Arrow import Control.DeepSeq import Control.Exception import Data.Aeson as A +import Data.Aeson.KeyMap as KM (fromList, toList) +import Data.Aeson.Key as K (toText, fromText, Key) import qualified Data.ByteString.Lazy as L (ByteString) import Data.Data import qualified Data.HashMap.Strict as HM @@ -50,7 +52,7 @@ toAeson = \case ObjectBin b -> fail $ "ObjectBin is not supported by JSON" ObjectArray v -> Array <$> V.mapM toAeson v ObjectMap m -> - A.Object . HM.fromList . V.toList + A.Object . KM.fromList . V.toList <$> V.mapM (\(k, v) -> (,) <$> from k <*> toAeson v) m where from = mpResult fail pure . MP.fromObject ObjectExt _ _ -> fail "ObjectExt is not supported by JSON" @@ -68,7 +70,7 @@ fromAeson = \case Right _ -> fail "number out of bounds" String t -> pure $ ObjectStr t Array v -> ObjectArray <$> traverse fromAeson v - A.Object o -> (ObjectMap . V.fromList) <$> traverse fromEntry (HM.toList o) + A.Object o -> (ObjectMap . V.fromList) <$> traverse fromEntry ((\(k, v) -> (K.toText k, v)) <$> KM.toList o) where fromEntry (k, v) = (\a -> (ObjectStr k, a)) <$> fromAeson v @@ -111,6 +113,10 @@ instance MessagePack a => FromJSON (AsAeson a) where MP.Error e -> fail e MP.Success a -> mpResult fail (pure . AsAeson) $ fromObject a +instance MessagePack K.Key where + fromObject o = K.fromText <$> fromObject o + toObject = toObject . K.toText + -- | Encode to MessagePack via "Data.Aeson"'s 'ToJSON' instances packAeson :: ToJSON a => a -> MP.Result L.ByteString packAeson a = pack <$> (fromAeson $ toJSON a) diff --git a/msgpack-idl-web/LICENSE b/msgpack-idl-web/LICENSE deleted file mode 100644 index 7fd5055..0000000 --- a/msgpack-idl-web/LICENSE +++ /dev/null @@ -1,25 +0,0 @@ -The following license covers this documentation, and the source code, except -where otherwise indicated. - -Copyright 2012, Hideyuki Tanaka. 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. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS "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 HOLDERS 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. diff --git a/msgpack-idl-web/config/favicon.ico b/msgpack-idl-web/config/favicon.ico deleted file mode 100644 index 9dd5f35..0000000 Binary files a/msgpack-idl-web/config/favicon.ico and /dev/null differ diff --git a/msgpack-idl-web/config/models b/msgpack-idl-web/config/models deleted file mode 100644 index c6e732e..0000000 --- a/msgpack-idl-web/config/models +++ /dev/null @@ -1,11 +0,0 @@ -User - ident Text - password Text Maybe - UniqueUser ident -Email - email Text - user UserId Maybe - verkey Text Maybe - UniqueEmail email - - -- By default this file is used in Model.hs (which is imported by Foundation.hs) diff --git a/msgpack-idl-web/config/robots.txt b/msgpack-idl-web/config/robots.txt deleted file mode 100644 index 7d329b1..0000000 --- a/msgpack-idl-web/config/robots.txt +++ /dev/null @@ -1 +0,0 @@ -User-agent: * diff --git a/msgpack-idl-web/config/routes b/msgpack-idl-web/config/routes deleted file mode 100644 index c1f7063..0000000 --- a/msgpack-idl-web/config/routes +++ /dev/null @@ -1,7 +0,0 @@ -/static StaticR Static getStatic -/auth AuthR Auth getAuth - -/favicon.ico FaviconR GET -/robots.txt RobotsR GET - -/ HomeR GET POST diff --git a/msgpack-idl-web/config/settings.yml b/msgpack-idl-web/config/settings.yml deleted file mode 100644 index ac3d1f3..0000000 --- a/msgpack-idl-web/config/settings.yml +++ /dev/null @@ -1,21 +0,0 @@ -Default: &defaults - host: "*4" # any IPv4 host - port: 3000 - approot: "http://192.168.0.70:3000" - copyright: Insert copyright statement here - #analytics: UA-YOURCODE - -Development: - <<: *defaults - -Testing: - port: 3334 - approot: "http://office.pfidev.jp/mpidl" - <<: *defaults - -Staging: - <<: *defaults - -Production: - #approot: "http://www.example.com" - <<: *defaults diff --git a/msgpack-idl-web/config/sqlite.yml b/msgpack-idl-web/config/sqlite.yml deleted file mode 100644 index 90dd3f9..0000000 --- a/msgpack-idl-web/config/sqlite.yml +++ /dev/null @@ -1,20 +0,0 @@ -Default: &defaults - database: mpidl-web.sqlite3 - poolsize: 10 - -Development: - <<: *defaults - -Testing: - database: mpidl-web_test.sqlite3 - <<: *defaults - -Staging: - database: mpidl-web_staging.sqlite3 - poolsize: 100 - <<: *defaults - -Production: - database: mpidl-web_production.sqlite3 - poolsize: 100 - <<: *defaults diff --git a/msgpack-idl-web/deploy/Procfile b/msgpack-idl-web/deploy/Procfile deleted file mode 100644 index 0f93399..0000000 --- a/msgpack-idl-web/deploy/Procfile +++ /dev/null @@ -1,97 +0,0 @@ -# Free deployment to Heroku. -# -# !! Warning: You must use a 64 bit machine to compile !! -# -# This could mean using a virtual machine. Give your VM as much memory as you can to speed up linking. -# -# Basic Yesod setup: -# -# * Move this file out of the deploy directory and into your root directory -# -# mv deploy/Procfile ./ -# -# * Create an empty package.json -# echo '{ "name": "mpidl-web", "version": "0.0.1", "dependencies": {} }' >> package.json -# -# Postgresql Yesod setup: -# -# * add a dependency on the "heroku" package in your cabal file -# -# * add code in Application.hs to use the heroku package and load the connection parameters. -# The below works for Postgresql. -# -# #ifndef DEVELOPMENT -# import qualified Web.Heroku -# #endif -# -# -# makeApplication :: AppConfig DefaultEnv Extra -> Logger -> IO Application -# makeApplication conf logger = do -# manager <- newManager def -# s <- staticSite -# hconfig <- loadHerokuConfig -# dbconf <- withYamlEnvironment "config/postgresql.yml" (appEnv conf) -# (Database.Persist.Store.loadConfig . combineMappings hconfig) >>= -# Database.Persist.Store.applyEnv -# p <- Database.Persist.Store.createPoolConfig (dbconf :: Settings.PersistConfig) -# Database.Persist.Store.runPool dbconf (runMigration migrateAll) p -# let foundation = App conf setLogger s p manager dbconf -# app <- toWaiAppPlain foundation -# return $ logWare app -# where -##ifdef DEVELOPMENT -# logWare = logCallbackDev (logBS setLogger) -# setLogger = logger -##else -# setLogger = toProduction logger -- by default the logger is set for development -# logWare = logCallback (logBS setLogger) -##endif -# -# #ifndef DEVELOPMENT -# canonicalizeKey :: (Text, val) -> (Text, val) -# canonicalizeKey ("dbname", val) = ("database", val) -# canonicalizeKey pair = pair -# -# toMapping :: [(Text, Text)] -> AT.Value -# toMapping xs = AT.Object $ M.fromList $ map (\(key, val) -> (key, AT.String val)) xs -# #endif -# -# combineMappings :: AT.Value -> AT.Value -> AT.Value -# combineMappings (AT.Object m1) (AT.Object m2) = AT.Object $ m1 `M.union` m2 -# combineMappings _ _ = error "Data.Object is not a Mapping." -# -# loadHerokuConfig :: IO AT.Value -# loadHerokuConfig = do -# #ifdef DEVELOPMENT -# return $ AT.Object M.empty -# #else -# Web.Heroku.dbConnParams >>= return . toMapping . map canonicalizeKey -# #endif - - - -# Heroku setup: -# Find the Heroku guide. Roughly: -# -# * sign up for a heroku account and register your ssh key -# * create a new application on the *cedar* stack -# -# * make your Yesod project the git repository for that application -# * create a deploy branch -# -# git checkout -b deploy -# -# Repeat these steps to deploy: -# * add your web executable binary (referenced below) to the git repository -# -# git checkout deploy -# git add ./dist/build/mpidl-web/mpidl-web -# git commit -m deploy -# -# * push to Heroku -# -# git push heroku deploy:master - - -# Heroku configuration that runs your app -web: ./dist/build/mpidl-web/mpidl-web production -p $PORT diff --git a/msgpack-idl-web/messages/en.msg b/msgpack-idl-web/messages/en.msg deleted file mode 100644 index e928c34..0000000 --- a/msgpack-idl-web/messages/en.msg +++ /dev/null @@ -1 +0,0 @@ -Hello: Hello diff --git a/msgpack-idl-web/mpidl-web.cabal b/msgpack-idl-web/mpidl-web.cabal deleted file mode 100644 index f55b172..0000000 --- a/msgpack-idl-web/mpidl-web.cabal +++ /dev/null @@ -1,114 +0,0 @@ -name: mpidl-web -version: 0.0.0 -license: BSD3 -license-file: LICENSE -author: Hideyuki Tanaka -maintainer: Hideyuki Tanaka -synopsis: The greatest Yesod web application ever. -description: I'm sure you can say something clever here if you try. -category: Web -stability: Experimental -cabal-version: >= 1.8 -build-type: Simple -homepage: http://mpidl-web.yesodweb.com/ - -Flag dev - Description: Turn on development settings, like auto-reload templates. - Default: False - -Flag library-only - Description: Build for use with "yesod devel" - Default: False - -library - exposed-modules: Application - Foundation - Import - Model - Settings - Settings.StaticFiles - Settings.Development - Handler.Home - - if flag(dev) || flag(library-only) - cpp-options: -DDEVELOPMENT - ghc-options: -Wall -threaded -O0 - else - ghc-options: -Wall -threaded -O2 - - extensions: TemplateHaskell - QuasiQuotes - OverloadedStrings - NoImplicitPrelude - CPP - MultiParamTypeClasses - TypeFamilies - GADTs - GeneralizedNewtypeDeriving - FlexibleContexts - EmptyDataDecls - NoMonomorphismRestriction - - build-depends: base >= 4 && < 5 - , yesod-platform >= 1.0 && < 1.1 - , yesod >= 1.0 && < 1.1 - , yesod-core >= 1.0 && < 1.1 - , yesod-auth >= 1.0 && < 1.1 - , yesod-static >= 1.0 && < 1.1 - , yesod-default >= 1.0 && < 1.1 - , yesod-form >= 1.0 && < 1.1 - , yesod-test >= 0.2 && < 0.3 - , clientsession >= 0.7.3 && < 0.8 - , bytestring >= 0.9 && < 0.10 - , text >= 0.11 && < 0.12 - , persistent >= 0.9 && < 0.10 - , persistent-sqlite >= 0.9 && < 0.10 - , template-haskell - , hamlet >= 1.0 && < 1.1 - , shakespeare-css >= 1.0 && < 1.1 - , shakespeare-js >= 1.0 && < 1.1 - , shakespeare-text >= 1.0 && < 1.1 - , hjsmin >= 0.1 && < 0.2 - , monad-control >= 0.3 && < 0.4 - , wai-extra >= 1.2 && < 1.3 - , yaml >= 0.7 && < 0.8 - , http-conduit >= 1.4 && < 1.5 - , directory >= 1.1 && < 1.2 - , warp >= 1.2 && < 1.3 - - , shelly - , bytestring - , system-fileio - -executable mpidl-web - if flag(library-only) - Buildable: False - - main-is: main.hs - hs-source-dirs: src - build-depends: base - , mpidl-web - , yesod-default - -test-suite test - type: exitcode-stdio-1.0 - main-is: main.hs - hs-source-dirs: tests - ghc-options: -Wall - extensions: TemplateHaskell - QuasiQuotes - OverloadedStrings - NoImplicitPrelude - CPP - OverloadedStrings - MultiParamTypeClasses - TypeFamilies - GADTs - GeneralizedNewtypeDeriving - FlexibleContexts - - build-depends: base - , mpidl-web - , yesod-test - , yesod-default - , yesod-core diff --git a/msgpack-idl-web/src/Application.hs b/msgpack-idl-web/src/Application.hs deleted file mode 100644 index 607a11f..0000000 --- a/msgpack-idl-web/src/Application.hs +++ /dev/null @@ -1,61 +0,0 @@ -{-# OPTIONS_GHC -fno-warn-orphans #-} -module Application - ( makeApplication - , getApplicationDev - , makeFoundation - ) where - -import Import -import Settings -import Yesod.Auth -import Yesod.Default.Config -import Yesod.Default.Main -import Yesod.Default.Handlers -import Yesod.Logger (Logger, logBS, toProduction) -import Network.Wai.Middleware.RequestLogger (logCallback, logCallbackDev) -import qualified Database.Persist.Store -import Database.Persist.GenericSql (runMigration) -import Network.HTTP.Conduit (newManager, def) - --- Import all relevant handler modules here. --- Don't forget to add new modules to your cabal file! -import Handler.Home - --- This line actually creates our YesodSite instance. It is the second half --- of the call to mkYesodData which occurs in Foundation.hs. Please see --- the comments there for more details. -mkYesodDispatch "App" resourcesApp - --- This function allocates resources (such as a database connection pool), --- performs initialization and creates a WAI application. This is also the --- place to put your migrate statements to have automatic database --- migrations handled by Yesod. -makeApplication :: AppConfig DefaultEnv Extra -> Logger -> IO Application -makeApplication conf logger = do - foundation <- makeFoundation conf setLogger - app <- toWaiAppPlain foundation - return $ logWare app - where - setLogger = if development then logger else toProduction logger - logWare = if development then logCallbackDev (logBS setLogger) - else logCallback (logBS setLogger) - -makeFoundation :: AppConfig DefaultEnv Extra -> Logger -> IO App -makeFoundation conf setLogger = do - manager <- newManager def - s <- staticSite - dbconf <- withYamlEnvironment "config/sqlite.yml" (appEnv conf) - Database.Persist.Store.loadConfig >>= - Database.Persist.Store.applyEnv - p <- Database.Persist.Store.createPoolConfig (dbconf :: Settings.PersistConfig) - Database.Persist.Store.runPool dbconf (runMigration migrateAll) p - return $ App conf setLogger s p manager dbconf - --- for yesod devel -getApplicationDev :: IO (Int, Application) -getApplicationDev = - defaultDevelApp loader makeApplication - where - loader = loadConfig (configSettings Development) - { csParseExtra = parseExtra - } diff --git a/msgpack-idl-web/src/Foundation.hs b/msgpack-idl-web/src/Foundation.hs deleted file mode 100644 index fed8a4f..0000000 --- a/msgpack-idl-web/src/Foundation.hs +++ /dev/null @@ -1,162 +0,0 @@ -module Foundation - ( App (..) - , Route (..) - , AppMessage (..) - , resourcesApp - , Handler - , Widget - , Form - , maybeAuth - , requireAuth - , module Settings - , module Model - ) where - -import Prelude -import Yesod -import Yesod.Static -import Yesod.Auth -import Yesod.Auth.BrowserId -import Yesod.Auth.GoogleEmail -import Yesod.Default.Config -import Yesod.Default.Util (addStaticContentExternal) -import Yesod.Logger (Logger, logMsg, formatLogText) -import Network.HTTP.Conduit (Manager) -import qualified Settings -import qualified Database.Persist.Store -import Settings.StaticFiles -import Database.Persist.GenericSql -import Settings (widgetFile, Extra (..)) -import Model -import Text.Jasmine (minifym) -import Web.ClientSession (getKey) -import Text.Hamlet (hamletFile) - --- | The site argument for your application. This can be a good place to --- keep settings and values requiring initialization before your application --- starts running, such as database connections. Every handler will have --- access to the data present here. -data App = App - { settings :: AppConfig DefaultEnv Extra - , getLogger :: Logger - , getStatic :: Static -- ^ Settings for static file serving. - , connPool :: Database.Persist.Store.PersistConfigPool Settings.PersistConfig -- ^ Database connection pool. - , httpManager :: Manager - , persistConfig :: Settings.PersistConfig - } - --- Set up i18n messages. See the message folder. -mkMessage "App" "messages" "en" - --- This is where we define all of the routes in our application. For a full --- explanation of the syntax, please see: --- http://www.yesodweb.com/book/handler --- --- This function does three things: --- --- * Creates the route datatype AppRoute. Every valid URL in your --- application can be represented as a value of this type. --- * Creates the associated type: --- type instance Route App = AppRoute --- * Creates the value resourcesApp which contains information on the --- resources declared below. This is used in Handler.hs by the call to --- mkYesodDispatch --- --- What this function does *not* do is create a YesodSite instance for --- App. Creating that instance requires all of the handler functions --- for our application to be in scope. However, the handler functions --- usually require access to the AppRoute datatype. Therefore, we --- split these actions into two functions and place them in separate files. -mkYesodData "App" $(parseRoutesFile "config/routes") - -type Form x = Html -> MForm App App (FormResult x, Widget) - --- Please see the documentation for the Yesod typeclass. There are a number --- of settings which can be configured by overriding methods here. -instance Yesod App where - approot = ApprootMaster $ appRoot . settings - - -- Store session data on the client in encrypted cookies, - -- default session idle timeout is 120 minutes - makeSessionBackend _ = do - key <- getKey "config/client_session_key.aes" - return . Just $ clientSessionBackend key 120 - - defaultLayout widget = do - master <- getYesod - mmsg <- getMessage - - -- We break up the default layout into two components: - -- default-layout is the contents of the body tag, and - -- default-layout-wrapper is the entire page. Since the final - -- value passed to hamletToRepHtml cannot be a widget, this allows - -- you to use normal widget features in default-layout. - - pc <- widgetToPageContent $ do - $(widgetFile "normalize") - addStylesheet $ StaticR css_bootstrap_css - $(widgetFile "default-layout") - hamletToRepHtml $(hamletFile "templates/default-layout-wrapper.hamlet") - - -- This is done to provide an optimization for serving static files from - -- a separate domain. Please see the staticRoot setting in Settings.hs - urlRenderOverride y (StaticR s) = - Just $ uncurry (joinPath y (Settings.staticRoot $ settings y)) $ renderRoute s - urlRenderOverride _ _ = Nothing - - -- The page to be redirected to when authentication is required. - authRoute _ = Just $ AuthR LoginR - - messageLogger y loc level msg = - formatLogText (getLogger y) loc level msg >>= logMsg (getLogger y) - - -- This function creates static content files in the static folder - -- and names them based on a hash of their content. This allows - -- expiration dates to be set far in the future without worry of - -- users receiving stale content. - addStaticContent = addStaticContentExternal minifym base64md5 Settings.staticDir (StaticR . flip StaticRoute []) - - -- Place Javascript at bottom of the body tag so the rest of the page loads first - jsLoader _ = BottomOfBody - --- How to run database actions. -instance YesodPersist App where - type YesodPersistBackend App = SqlPersist - runDB f = do - master <- getYesod - Database.Persist.Store.runPool - (persistConfig master) - f - (connPool master) - -instance YesodAuth App where - type AuthId App = UserId - - -- Where to send a user after successful login - loginDest _ = HomeR - -- Where to send a user after logout - logoutDest _ = HomeR - - getAuthId creds = runDB $ do - x <- getBy $ UniqueUser $ credsIdent creds - case x of - Just (Entity uid _) -> return $ Just uid - Nothing -> do - fmap Just $ insert $ User (credsIdent creds) Nothing - - -- You can add other plugins like BrowserID, email or OAuth here - authPlugins _ = [authBrowserId, authGoogleEmail] - - authHttpManager = httpManager - --- This instance is required to use forms. You can modify renderMessage to --- achieve customized and internationalized form validation messages. -instance RenderMessage App FormMessage where - renderMessage _ _ = defaultFormMessage - --- Note: previous versions of the scaffolding included a deliver function to --- send emails. Unfortunately, there are too many different options for us to --- give a reasonable default. Instead, the information is available on the --- wiki: --- --- https://github.com/yesodweb/yesod/wiki/Sending-email diff --git a/msgpack-idl-web/src/Handler/Home.hs b/msgpack-idl-web/src/Handler/Home.hs deleted file mode 100644 index c0ee0c2..0000000 --- a/msgpack-idl-web/src/Handler/Home.hs +++ /dev/null @@ -1,59 +0,0 @@ -{-# LANGUAGE TupleSections, OverloadedStrings, ViewPatterns #-} -module Handler.Home where - -import Import - -import Data.Maybe -import qualified Data.Text.Lazy as LT -import qualified Filesystem as FS -import Shelly -import Text.Shakespeare.Text - -defaultCode :: Text -defaultCode = [st| -message hoge { - 0: int moge - 1: map hage -} - -service test { - void foo(0: hoge x) -} -|] - -getHomeR :: Handler RepHtml -getHomeR = do - let submission = Nothing :: Maybe (FileInfo, Text) - handlerName = "getHomeR" :: Text - defaultLayout $ do - aDomId <- lift newIdent - setTitle "MessagePack IDL Code Generator" - $(widgetFile "homepage") - -postHomeR :: Handler (ContentType, Content) -postHomeR = do - (fromMaybe "noname" -> name, source, lang, namespace) <- runInputPost $ (,,,) - <$> iopt textField "name" - <*> ireq textField "source" - <*> ireq textField "lang" - <*> iopt textField "namespace" - - let tarname = [lt|#{name}.tar.bz2|] - idlname = [lt|#{name}.idl|] - - let opts = map LT.fromStrict $ case (lang, namespace) of - ("cpp", Just ns) -> ["-n", ns] - ("java", Just pn) -> ["-p", pn] - ("ruby", Just mn) -> ["-m", mn] - _ -> [] - - archive <- shelly $ do - withTmpDir $ \tmppath -> chdir tmppath $ do - writefile (fromText idlname) $ LT.fromStrict source - run_ "mpidl" $ [LT.fromStrict lang, "-o", [lt|#{name}|], idlname] ++ opts - run_ "tar" ["-cjf", tarname, [lt|#{name}|]] - p <- pwd - liftIO $ FS.readFile $ p fromText tarname - - setHeader "Content-Disposition" [st|attachment; filename="#{tarname}"|] - return ("application/x-bz2", toContent archive) diff --git a/msgpack-idl-web/src/Import.hs b/msgpack-idl-web/src/Import.hs deleted file mode 100644 index 641de38..0000000 --- a/msgpack-idl-web/src/Import.hs +++ /dev/null @@ -1,28 +0,0 @@ -module Import - ( module Prelude - , module Yesod - , module Foundation - , module Settings.StaticFiles - , module Settings.Development - , module Data.Monoid - , module Control.Applicative - , Text -#if __GLASGOW_HASKELL__ < 704 - , (<>) -#endif - ) where - -import Prelude hiding (writeFile, readFile, head, tail, init, last) -import Yesod hiding (Route(..)) -import Foundation -import Data.Monoid (Monoid (mappend, mempty, mconcat)) -import Control.Applicative ((<$>), (<*>), pure) -import Data.Text (Text) -import Settings.StaticFiles -import Settings.Development - -#if __GLASGOW_HASKELL__ < 704 -infixr 5 <> -(<>) :: Monoid m => m -> m -> m -(<>) = mappend -#endif diff --git a/msgpack-idl-web/src/Model.hs b/msgpack-idl-web/src/Model.hs deleted file mode 100644 index 12f6697..0000000 --- a/msgpack-idl-web/src/Model.hs +++ /dev/null @@ -1,14 +0,0 @@ -module Model where - -import Prelude -import Yesod -import Data.Text (Text) -import Database.Persist.Quasi - - --- You can define all of your database entities in the entities file. --- You can find more information on persistent and how to declare entities --- at: --- http://www.yesodweb.com/book/persistent/ -share [mkPersist sqlSettings, mkMigrate "migrateAll"] - $(persistFileWith lowerCaseSettings "config/models") diff --git a/msgpack-idl-web/src/Settings.hs b/msgpack-idl-web/src/Settings.hs deleted file mode 100644 index f9f7075..0000000 --- a/msgpack-idl-web/src/Settings.hs +++ /dev/null @@ -1,68 +0,0 @@ --- | Settings are centralized, as much as possible, into this file. This --- includes database connection settings, static file locations, etc. --- In addition, you can configure a number of different aspects of Yesod --- by overriding methods in the Yesod typeclass. That instance is --- declared in the Foundation.hs file. -module Settings - ( widgetFile - , PersistConfig - , staticRoot - , staticDir - , Extra (..) - , parseExtra - ) where - -import Prelude -import Text.Shakespeare.Text (st) -import Language.Haskell.TH.Syntax -import Database.Persist.Sqlite (SqliteConf) -import Yesod.Default.Config -import qualified Yesod.Default.Util -import Data.Text (Text) -import Data.Yaml -import Control.Applicative -import Settings.Development - --- | Which Persistent backend this site is using. -type PersistConfig = SqliteConf - --- Static setting below. Changing these requires a recompile - --- | The location of static files on your system. This is a file system --- path. The default value works properly with your scaffolded site. -staticDir :: FilePath -staticDir = "static" - --- | The base URL for your static files. As you can see by the default --- value, this can simply be "static" appended to your application root. --- A powerful optimization can be serving static files from a separate --- domain name. This allows you to use a web server optimized for static --- files, more easily set expires and cache values, and avoid possibly --- costly transference of cookies on static files. For more information, --- please see: --- http://code.google.com/speed/page-speed/docs/request.html#ServeFromCookielessDomain --- --- If you change the resource pattern for StaticR in Foundation.hs, you will --- have to make a corresponding change here. --- --- To see how this value is used, see urlRenderOverride in Foundation.hs -staticRoot :: AppConfig DefaultEnv x -> Text -staticRoot conf = [st|#{appRoot conf}/static|] - - --- The rest of this file contains settings which rarely need changing by a --- user. - -widgetFile :: String -> Q Exp -widgetFile = if development then Yesod.Default.Util.widgetFileReload - else Yesod.Default.Util.widgetFileNoReload - -data Extra = Extra - { extraCopyright :: Text - , extraAnalytics :: Maybe Text -- ^ Google Analytics - } deriving Show - -parseExtra :: DefaultEnv -> Object -> Parser Extra -parseExtra _ o = Extra - <$> o .: "copyright" - <*> o .:? "analytics" diff --git a/msgpack-idl-web/src/Settings/Development.hs b/msgpack-idl-web/src/Settings/Development.hs deleted file mode 100644 index 73613f0..0000000 --- a/msgpack-idl-web/src/Settings/Development.hs +++ /dev/null @@ -1,14 +0,0 @@ -module Settings.Development where - -import Prelude - -development :: Bool -development = -#if DEVELOPMENT - True -#else - False -#endif - -production :: Bool -production = not development diff --git a/msgpack-idl-web/src/Settings/StaticFiles.hs b/msgpack-idl-web/src/Settings/StaticFiles.hs deleted file mode 100644 index 2510795..0000000 --- a/msgpack-idl-web/src/Settings/StaticFiles.hs +++ /dev/null @@ -1,18 +0,0 @@ -module Settings.StaticFiles where - -import Prelude (IO) -import Yesod.Static -import qualified Yesod.Static as Static -import Settings (staticDir) -import Settings.Development - --- | use this to create your static file serving site -staticSite :: IO Static.Static -staticSite = if development then Static.staticDevel staticDir - else Static.static staticDir - --- | This generates easy references to files in the static directory at compile time, --- giving you compile-time verification that referenced files exist. --- Warning: any files added to your static directory during run-time can't be --- accessed this way. You'll have to use their FilePath or URL to access them. -$(staticFiles Settings.staticDir) diff --git a/msgpack-idl-web/src/devel.hs b/msgpack-idl-web/src/devel.hs deleted file mode 100644 index 6ce1f7f..0000000 --- a/msgpack-idl-web/src/devel.hs +++ /dev/null @@ -1,26 +0,0 @@ -{-# LANGUAGE PackageImports #-} -import "mpidl-web" Application (getApplicationDev) -import Network.Wai.Handler.Warp - (runSettings, defaultSettings, settingsPort) -import Control.Concurrent (forkIO) -import System.Directory (doesFileExist, removeFile) -import System.Exit (exitSuccess) -import Control.Concurrent (threadDelay) - -main :: IO () -main = do - putStrLn "Starting devel application" - (port, app) <- getApplicationDev - forkIO $ runSettings defaultSettings - { settingsPort = port - } app - loop - -loop :: IO () -loop = do - threadDelay 100000 - e <- doesFileExist "dist/devel-terminate" - if e then terminateDevel else loop - -terminateDevel :: IO () -terminateDevel = exitSuccess diff --git a/msgpack-idl-web/src/main.hs b/msgpack-idl-web/src/main.hs deleted file mode 100644 index a059fcb..0000000 --- a/msgpack-idl-web/src/main.hs +++ /dev/null @@ -1,8 +0,0 @@ -import Prelude (IO) -import Yesod.Default.Config (fromArgs) -import Yesod.Default.Main (defaultMain) -import Settings (parseExtra) -import Application (makeApplication) - -main :: IO () -main = defaultMain (fromArgs parseExtra) makeApplication diff --git a/msgpack-idl-web/static/css/bootstrap.css b/msgpack-idl-web/static/css/bootstrap.css deleted file mode 100644 index 495188a..0000000 --- a/msgpack-idl-web/static/css/bootstrap.css +++ /dev/null @@ -1,3990 +0,0 @@ -/*! - * Bootstrap v2.0.2 - * - * Copyright 2012 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world @twitter by @mdo and @fat. - */ -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} -audio:not([controls]) { - display: none; -} -html { - font-size: 100%; - -webkit-text-size-adjust: 100%; - -ms-text-size-adjust: 100%; -} -a:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -a:hover, -a:active { - outline: 0; -} -sub, -sup { - position: relative; - font-size: 75%; - line-height: 0; - vertical-align: baseline; -} -sup { - top: -0.5em; -} -sub { - bottom: -0.25em; -} -img { - height: auto; - border: 0; - -ms-interpolation-mode: bicubic; - vertical-align: middle; -} -button, -input, -select, -textarea { - margin: 0; - font-size: 100%; - vertical-align: middle; -} -button, -input { - *overflow: visible; - line-height: normal; -} -button::-moz-focus-inner, -input::-moz-focus-inner { - padding: 0; - border: 0; -} -button, -input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; - -webkit-appearance: button; -} -input[type="search"] { - -webkit-appearance: textfield; - -webkit-box-sizing: content-box; - -moz-box-sizing: content-box; - box-sizing: content-box; -} -input[type="search"]::-webkit-search-decoration, -input[type="search"]::-webkit-search-cancel-button { - -webkit-appearance: none; -} -textarea { - overflow: auto; - vertical-align: top; -} -.clearfix { - *zoom: 1; -} -.clearfix:before, -.clearfix:after { - display: table; - content: ""; -} -.clearfix:after { - clear: both; -} -.hide-text { - overflow: hidden; - text-indent: 100%; - white-space: nowrap; -} -.input-block-level { - display: block; - width: 100%; - min-height: 28px; - /* Make inputs at least the height of their button counterpart */ - - /* Makes inputs behave like true block-level elements */ - - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; -} -body { - margin: 0; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; - color: #333333; - background-color: #ffffff; -} -a { - color: #0088cc; - text-decoration: none; -} -a:hover { - color: #005580; - text-decoration: underline; -} -.row { - margin-left: -20px; - *zoom: 1; -} -.row:before, -.row:after { - display: table; - content: ""; -} -.row:after { - clear: both; -} -[class*="span"] { - float: left; - margin-left: 20px; -} -.container, -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.span12 { - width: 940px; -} -.span11 { - width: 860px; -} -.span10 { - width: 780px; -} -.span9 { - width: 700px; -} -.span8 { - width: 620px; -} -.span7 { - width: 540px; -} -.span6 { - width: 460px; -} -.span5 { - width: 380px; -} -.span4 { - width: 300px; -} -.span3 { - width: 220px; -} -.span2 { - width: 140px; -} -.span1 { - width: 60px; -} -.offset12 { - margin-left: 980px; -} -.offset11 { - margin-left: 900px; -} -.offset10 { - margin-left: 820px; -} -.offset9 { - margin-left: 740px; -} -.offset8 { - margin-left: 660px; -} -.offset7 { - margin-left: 580px; -} -.offset6 { - margin-left: 500px; -} -.offset5 { - margin-left: 420px; -} -.offset4 { - margin-left: 340px; -} -.offset3 { - margin-left: 260px; -} -.offset2 { - margin-left: 180px; -} -.offset1 { - margin-left: 100px; -} -.row-fluid { - width: 100%; - *zoom: 1; -} -.row-fluid:before, -.row-fluid:after { - display: table; - content: ""; -} -.row-fluid:after { - clear: both; -} -.row-fluid > [class*="span"] { - float: left; - margin-left: 2.127659574%; -} -.row-fluid > [class*="span"]:first-child { - margin-left: 0; -} -.row-fluid > .span12 { - width: 99.99999998999999%; -} -.row-fluid > .span11 { - width: 91.489361693%; -} -.row-fluid > .span10 { - width: 82.97872339599999%; -} -.row-fluid > .span9 { - width: 74.468085099%; -} -.row-fluid > .span8 { - width: 65.95744680199999%; -} -.row-fluid > .span7 { - width: 57.446808505%; -} -.row-fluid > .span6 { - width: 48.93617020799999%; -} -.row-fluid > .span5 { - width: 40.425531911%; -} -.row-fluid > .span4 { - width: 31.914893614%; -} -.row-fluid > .span3 { - width: 23.404255317%; -} -.row-fluid > .span2 { - width: 14.89361702%; -} -.row-fluid > .span1 { - width: 6.382978723%; -} -.container { - margin-left: auto; - margin-right: auto; - *zoom: 1; -} -.container:before, -.container:after { - display: table; - content: ""; -} -.container:after { - clear: both; -} -.container-fluid { - padding-left: 20px; - padding-right: 20px; - *zoom: 1; -} -.container-fluid:before, -.container-fluid:after { - display: table; - content: ""; -} -.container-fluid:after { - clear: both; -} -p { - margin: 0 0 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - line-height: 18px; -} -p small { - font-size: 11px; - color: #999999; -} -.lead { - margin-bottom: 18px; - font-size: 20px; - font-weight: 200; - line-height: 27px; -} -h1, -h2, -h3, -h4, -h5, -h6 { - margin: 0; - font-family: inherit; - font-weight: bold; - color: inherit; - text-rendering: optimizelegibility; -} -h1 small, -h2 small, -h3 small, -h4 small, -h5 small, -h6 small { - font-weight: normal; - color: #999999; -} -h1 { - font-size: 30px; - line-height: 36px; -} -h1 small { - font-size: 18px; -} -h2 { - font-size: 24px; - line-height: 36px; -} -h2 small { - font-size: 18px; -} -h3 { - line-height: 27px; - font-size: 18px; -} -h3 small { - font-size: 14px; -} -h4, -h5, -h6 { - line-height: 18px; -} -h4 { - font-size: 14px; -} -h4 small { - font-size: 12px; -} -h5 { - font-size: 12px; -} -h6 { - font-size: 11px; - color: #999999; - text-transform: uppercase; -} -.page-header { - padding-bottom: 17px; - margin: 18px 0; - border-bottom: 1px solid #eeeeee; -} -.page-header h1 { - line-height: 1; -} -ul, -ol { - padding: 0; - margin: 0 0 9px 25px; -} -ul ul, -ul ol, -ol ol, -ol ul { - margin-bottom: 0; -} -ul { - list-style: disc; -} -ol { - list-style: decimal; -} -li { - line-height: 18px; -} -ul.unstyled, -ol.unstyled { - margin-left: 0; - list-style: none; -} -dl { - margin-bottom: 18px; -} -dt, -dd { - line-height: 18px; -} -dt { - font-weight: bold; - line-height: 17px; -} -dd { - margin-left: 9px; -} -.dl-horizontal dt { - float: left; - clear: left; - width: 120px; - text-align: right; -} -.dl-horizontal dd { - margin-left: 130px; -} -hr { - margin: 18px 0; - border: 0; - border-top: 1px solid #eeeeee; - border-bottom: 1px solid #ffffff; -} -strong { - font-weight: bold; -} -em { - font-style: italic; -} -.muted { - color: #999999; -} -abbr[title] { - border-bottom: 1px dotted #ddd; - cursor: help; -} -abbr.initialism { - font-size: 90%; - text-transform: uppercase; -} -blockquote { - padding: 0 0 0 15px; - margin: 0 0 18px; - border-left: 5px solid #eeeeee; -} -blockquote p { - margin-bottom: 0; - font-size: 16px; - font-weight: 300; - line-height: 22.5px; -} -blockquote small { - display: block; - line-height: 18px; - color: #999999; -} -blockquote small:before { - content: '\2014 \00A0'; -} -blockquote.pull-right { - float: right; - padding-left: 0; - padding-right: 15px; - border-left: 0; - border-right: 5px solid #eeeeee; -} -blockquote.pull-right p, -blockquote.pull-right small { - text-align: right; -} -q:before, -q:after, -blockquote:before, -blockquote:after { - content: ""; -} -address { - display: block; - margin-bottom: 18px; - line-height: 18px; - font-style: normal; -} -small { - font-size: 100%; -} -cite { - font-style: normal; -} -code, -pre { - padding: 0 3px 2px; - font-family: Menlo, Monaco, "Courier New", monospace; - font-size: 12px; - color: #333333; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -code { - padding: 2px 4px; - color: #d14; - background-color: #f7f7f9; - border: 1px solid #e1e1e8; -} -pre { - display: block; - padding: 8.5px; - margin: 0 0 9px; - font-size: 12.025px; - line-height: 18px; - background-color: #f5f5f5; - border: 1px solid #ccc; - border: 1px solid rgba(0, 0, 0, 0.15); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - white-space: pre; - white-space: pre-wrap; - word-break: break-all; - word-wrap: break-word; -} -pre.prettyprint { - margin-bottom: 18px; -} -pre code { - padding: 0; - color: inherit; - background-color: transparent; - border: 0; -} -.pre-scrollable { - max-height: 340px; - overflow-y: scroll; -} -form { - margin: 0 0 18px; -} -fieldset { - padding: 0; - margin: 0; - border: 0; -} -legend { - display: block; - width: 100%; - padding: 0; - margin-bottom: 27px; - font-size: 19.5px; - line-height: 36px; - color: #333333; - border: 0; - border-bottom: 1px solid #eee; -} -legend small { - font-size: 13.5px; - color: #999999; -} -label, -input, -button, -select, -textarea { - font-size: 13px; - font-weight: normal; - line-height: 18px; -} -input, -button, -select, -textarea { - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -} -label { - display: block; - margin-bottom: 5px; - color: #333333; -} -input, -textarea, -select, -.uneditable-input { - display: inline-block; - width: 210px; - height: 18px; - padding: 4px; - margin-bottom: 9px; - font-size: 13px; - line-height: 18px; - color: #555555; - border: 1px solid #cccccc; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.uneditable-textarea { - width: auto; - height: auto; -} -label input, -label textarea, -label select { - display: block; -} -input[type="image"], -input[type="checkbox"], -input[type="radio"] { - width: auto; - height: auto; - padding: 0; - margin: 3px 0; - *margin-top: 0; - /* IE7 */ - - line-height: normal; - cursor: pointer; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; - border: 0 \9; - /* IE9 and down */ - -} -input[type="image"] { - border: 0; -} -input[type="file"] { - width: auto; - padding: initial; - line-height: initial; - border: initial; - background-color: #ffffff; - background-color: initial; - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -input[type="button"], -input[type="reset"], -input[type="submit"] { - width: auto; - height: auto; -} -select, -input[type="file"] { - height: 28px; - /* In IE7, the height of the select element cannot be changed by height, only font-size */ - - *margin-top: 4px; - /* For IE7, add top margin to align select with labels */ - - line-height: 28px; -} -input[type="file"] { - line-height: 18px \9; -} -select { - width: 220px; - background-color: #ffffff; -} -select[multiple], -select[size] { - height: auto; -} -input[type="image"] { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -textarea { - height: auto; -} -input[type="hidden"] { - display: none; -} -.radio, -.checkbox { - padding-left: 18px; -} -.radio input[type="radio"], -.checkbox input[type="checkbox"] { - float: left; - margin-left: -18px; -} -.controls > .radio:first-child, -.controls > .checkbox:first-child { - padding-top: 5px; -} -.radio.inline, -.checkbox.inline { - display: inline-block; - padding-top: 5px; - margin-bottom: 0; - vertical-align: middle; -} -.radio.inline + .radio.inline, -.checkbox.inline + .checkbox.inline { - margin-left: 10px; -} -input, -textarea { - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; - -moz-transition: border linear 0.2s, box-shadow linear 0.2s; - -ms-transition: border linear 0.2s, box-shadow linear 0.2s; - -o-transition: border linear 0.2s, box-shadow linear 0.2s; - transition: border linear 0.2s, box-shadow linear 0.2s; -} -input:focus, -textarea:focus { - border-color: rgba(82, 168, 236, 0.8); - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); - outline: 0; - outline: thin dotted \9; - /* IE6-9 */ - -} -input[type="file"]:focus, -input[type="radio"]:focus, -input[type="checkbox"]:focus, -select:focus { - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.input-mini { - width: 60px; -} -.input-small { - width: 90px; -} -.input-medium { - width: 150px; -} -.input-large { - width: 210px; -} -.input-xlarge { - width: 270px; -} -.input-xxlarge { - width: 530px; -} -input[class*="span"], -select[class*="span"], -textarea[class*="span"], -.uneditable-input { - float: none; - margin-left: 0; -} -input, -textarea, -.uneditable-input { - margin-left: 0; -} -input.span12, textarea.span12, .uneditable-input.span12 { - width: 930px; -} -input.span11, textarea.span11, .uneditable-input.span11 { - width: 850px; -} -input.span10, textarea.span10, .uneditable-input.span10 { - width: 770px; -} -input.span9, textarea.span9, .uneditable-input.span9 { - width: 690px; -} -input.span8, textarea.span8, .uneditable-input.span8 { - width: 610px; -} -input.span7, textarea.span7, .uneditable-input.span7 { - width: 530px; -} -input.span6, textarea.span6, .uneditable-input.span6 { - width: 450px; -} -input.span5, textarea.span5, .uneditable-input.span5 { - width: 370px; -} -input.span4, textarea.span4, .uneditable-input.span4 { - width: 290px; -} -input.span3, textarea.span3, .uneditable-input.span3 { - width: 210px; -} -input.span2, textarea.span2, .uneditable-input.span2 { - width: 130px; -} -input.span1, textarea.span1, .uneditable-input.span1 { - width: 50px; -} -input[disabled], -select[disabled], -textarea[disabled], -input[readonly], -select[readonly], -textarea[readonly] { - background-color: #eeeeee; - border-color: #ddd; - cursor: not-allowed; -} -.control-group.warning > label, -.control-group.warning .help-block, -.control-group.warning .help-inline { - color: #c09853; -} -.control-group.warning input, -.control-group.warning select, -.control-group.warning textarea { - color: #c09853; - border-color: #c09853; -} -.control-group.warning input:focus, -.control-group.warning select:focus, -.control-group.warning textarea:focus { - border-color: #a47e3c; - -webkit-box-shadow: 0 0 6px #dbc59e; - -moz-box-shadow: 0 0 6px #dbc59e; - box-shadow: 0 0 6px #dbc59e; -} -.control-group.warning .input-prepend .add-on, -.control-group.warning .input-append .add-on { - color: #c09853; - background-color: #fcf8e3; - border-color: #c09853; -} -.control-group.error > label, -.control-group.error .help-block, -.control-group.error .help-inline { - color: #b94a48; -} -.control-group.error input, -.control-group.error select, -.control-group.error textarea { - color: #b94a48; - border-color: #b94a48; -} -.control-group.error input:focus, -.control-group.error select:focus, -.control-group.error textarea:focus { - border-color: #953b39; - -webkit-box-shadow: 0 0 6px #d59392; - -moz-box-shadow: 0 0 6px #d59392; - box-shadow: 0 0 6px #d59392; -} -.control-group.error .input-prepend .add-on, -.control-group.error .input-append .add-on { - color: #b94a48; - background-color: #f2dede; - border-color: #b94a48; -} -.control-group.success > label, -.control-group.success .help-block, -.control-group.success .help-inline { - color: #468847; -} -.control-group.success input, -.control-group.success select, -.control-group.success textarea { - color: #468847; - border-color: #468847; -} -.control-group.success input:focus, -.control-group.success select:focus, -.control-group.success textarea:focus { - border-color: #356635; - -webkit-box-shadow: 0 0 6px #7aba7b; - -moz-box-shadow: 0 0 6px #7aba7b; - box-shadow: 0 0 6px #7aba7b; -} -.control-group.success .input-prepend .add-on, -.control-group.success .input-append .add-on { - color: #468847; - background-color: #dff0d8; - border-color: #468847; -} -input:focus:required:invalid, -textarea:focus:required:invalid, -select:focus:required:invalid { - color: #b94a48; - border-color: #ee5f5b; -} -input:focus:required:invalid:focus, -textarea:focus:required:invalid:focus, -select:focus:required:invalid:focus { - border-color: #e9322d; - -webkit-box-shadow: 0 0 6px #f8b9b7; - -moz-box-shadow: 0 0 6px #f8b9b7; - box-shadow: 0 0 6px #f8b9b7; -} -.form-actions { - padding: 17px 20px 18px; - margin-top: 18px; - margin-bottom: 18px; - background-color: #eeeeee; - border-top: 1px solid #ddd; - *zoom: 1; -} -.form-actions:before, -.form-actions:after { - display: table; - content: ""; -} -.form-actions:after { - clear: both; -} -.uneditable-input { - display: block; - background-color: #ffffff; - border-color: #eee; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); - cursor: not-allowed; -} -:-moz-placeholder { - color: #999999; -} -::-webkit-input-placeholder { - color: #999999; -} -.help-block, -.help-inline { - color: #555555; -} -.help-block { - display: block; - margin-bottom: 9px; -} -.help-inline { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - vertical-align: middle; - padding-left: 5px; -} -.input-prepend, -.input-append { - margin-bottom: 5px; -} -.input-prepend input, -.input-append input, -.input-prepend select, -.input-append select, -.input-prepend .uneditable-input, -.input-append .uneditable-input { - *margin-left: 0; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend input:focus, -.input-append input:focus, -.input-prepend select:focus, -.input-append select:focus, -.input-prepend .uneditable-input:focus, -.input-append .uneditable-input:focus { - position: relative; - z-index: 2; -} -.input-prepend .uneditable-input, -.input-append .uneditable-input { - border-left-color: #ccc; -} -.input-prepend .add-on, -.input-append .add-on { - display: inline-block; - width: auto; - min-width: 16px; - height: 18px; - padding: 4px 5px; - font-weight: normal; - line-height: 18px; - text-align: center; - text-shadow: 0 1px 0 #ffffff; - vertical-align: middle; - background-color: #eeeeee; - border: 1px solid #ccc; -} -.input-prepend .add-on, -.input-append .add-on, -.input-prepend .btn, -.input-append .btn { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend .active, -.input-append .active { - background-color: #a9dba9; - border-color: #46a546; -} -.input-prepend .add-on, -.input-prepend .btn { - margin-right: -1px; -} -.input-append input, -.input-append select .uneditable-input { - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-append .uneditable-input { - border-left-color: #eee; - border-right-color: #ccc; -} -.input-append .add-on, -.input-append .btn { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.input-prepend.input-append input, -.input-prepend.input-append select, -.input-prepend.input-append .uneditable-input { - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.input-prepend.input-append .add-on:first-child, -.input-prepend.input-append .btn:first-child { - margin-right: -1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.input-prepend.input-append .add-on:last-child, -.input-prepend.input-append .btn:last-child { - margin-left: -1px; - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.search-query { - padding-left: 14px; - padding-right: 14px; - margin-bottom: 0; - -webkit-border-radius: 14px; - -moz-border-radius: 14px; - border-radius: 14px; -} -.form-search input, -.form-inline input, -.form-horizontal input, -.form-search textarea, -.form-inline textarea, -.form-horizontal textarea, -.form-search select, -.form-inline select, -.form-horizontal select, -.form-search .help-inline, -.form-inline .help-inline, -.form-horizontal .help-inline, -.form-search .uneditable-input, -.form-inline .uneditable-input, -.form-horizontal .uneditable-input, -.form-search .input-prepend, -.form-inline .input-prepend, -.form-horizontal .input-prepend, -.form-search .input-append, -.form-inline .input-append, -.form-horizontal .input-append { - display: inline-block; - margin-bottom: 0; -} -.form-search .hide, -.form-inline .hide, -.form-horizontal .hide { - display: none; -} -.form-search label, -.form-inline label { - display: inline-block; -} -.form-search .input-append, -.form-inline .input-append, -.form-search .input-prepend, -.form-inline .input-prepend { - margin-bottom: 0; -} -.form-search .radio, -.form-search .checkbox, -.form-inline .radio, -.form-inline .checkbox { - padding-left: 0; - margin-bottom: 0; - vertical-align: middle; -} -.form-search .radio input[type="radio"], -.form-search .checkbox input[type="checkbox"], -.form-inline .radio input[type="radio"], -.form-inline .checkbox input[type="checkbox"] { - float: left; - margin-left: 0; - margin-right: 3px; -} -.control-group { - margin-bottom: 9px; -} -legend + .control-group { - margin-top: 18px; - -webkit-margin-top-collapse: separate; -} -.form-horizontal .control-group { - margin-bottom: 18px; - *zoom: 1; -} -.form-horizontal .control-group:before, -.form-horizontal .control-group:after { - display: table; - content: ""; -} -.form-horizontal .control-group:after { - clear: both; -} -.form-horizontal .control-label { - float: left; - width: 140px; - padding-top: 5px; - text-align: right; -} -.form-horizontal .controls { - margin-left: 160px; - /* Super jank IE7 fix to ensure the inputs in .input-append and input-prepend don't inherit the margin of the parent, in this case .controls */ - - *display: inline-block; - *margin-left: 0; - *padding-left: 20px; -} -.form-horizontal .help-block { - margin-top: 9px; - margin-bottom: 0; -} -.form-horizontal .form-actions { - padding-left: 160px; -} -table { - max-width: 100%; - border-collapse: collapse; - border-spacing: 0; - background-color: transparent; -} -.table { - width: 100%; - margin-bottom: 18px; -} -.table th, -.table td { - padding: 8px; - line-height: 18px; - text-align: left; - vertical-align: top; - border-top: 1px solid #dddddd; -} -.table th { - font-weight: bold; -} -.table thead th { - vertical-align: bottom; -} -.table colgroup + thead tr:first-child th, -.table colgroup + thead tr:first-child td, -.table thead:first-child tr:first-child th, -.table thead:first-child tr:first-child td { - border-top: 0; -} -.table tbody + tbody { - border-top: 2px solid #dddddd; -} -.table-condensed th, -.table-condensed td { - padding: 4px 5px; -} -.table-bordered { - border: 1px solid #dddddd; - border-left: 0; - border-collapse: separate; - *border-collapse: collapsed; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.table-bordered th, -.table-bordered td { - border-left: 1px solid #dddddd; -} -.table-bordered thead:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child th, -.table-bordered tbody:first-child tr:first-child td { - border-top: 0; -} -.table-bordered thead:first-child tr:first-child th:first-child, -.table-bordered tbody:first-child tr:first-child td:first-child { - -webkit-border-radius: 4px 0 0 0; - -moz-border-radius: 4px 0 0 0; - border-radius: 4px 0 0 0; -} -.table-bordered thead:first-child tr:first-child th:last-child, -.table-bordered tbody:first-child tr:first-child td:last-child { - -webkit-border-radius: 0 4px 0 0; - -moz-border-radius: 0 4px 0 0; - border-radius: 0 4px 0 0; -} -.table-bordered thead:last-child tr:last-child th:first-child, -.table-bordered tbody:last-child tr:last-child td:first-child { - -webkit-border-radius: 0 0 0 4px; - -moz-border-radius: 0 0 0 4px; - border-radius: 0 0 0 4px; -} -.table-bordered thead:last-child tr:last-child th:last-child, -.table-bordered tbody:last-child tr:last-child td:last-child { - -webkit-border-radius: 0 0 4px 0; - -moz-border-radius: 0 0 4px 0; - border-radius: 0 0 4px 0; -} -.table-striped tbody tr:nth-child(odd) td, -.table-striped tbody tr:nth-child(odd) th { - background-color: #f9f9f9; -} -.table tbody tr:hover td, -.table tbody tr:hover th { - background-color: #f5f5f5; -} -table .span1 { - float: none; - width: 44px; - margin-left: 0; -} -table .span2 { - float: none; - width: 124px; - margin-left: 0; -} -table .span3 { - float: none; - width: 204px; - margin-left: 0; -} -table .span4 { - float: none; - width: 284px; - margin-left: 0; -} -table .span5 { - float: none; - width: 364px; - margin-left: 0; -} -table .span6 { - float: none; - width: 444px; - margin-left: 0; -} -table .span7 { - float: none; - width: 524px; - margin-left: 0; -} -table .span8 { - float: none; - width: 604px; - margin-left: 0; -} -table .span9 { - float: none; - width: 684px; - margin-left: 0; -} -table .span10 { - float: none; - width: 764px; - margin-left: 0; -} -table .span11 { - float: none; - width: 844px; - margin-left: 0; -} -table .span12 { - float: none; - width: 924px; - margin-left: 0; -} -table .span13 { - float: none; - width: 1004px; - margin-left: 0; -} -table .span14 { - float: none; - width: 1084px; - margin-left: 0; -} -table .span15 { - float: none; - width: 1164px; - margin-left: 0; -} -table .span16 { - float: none; - width: 1244px; - margin-left: 0; -} -table .span17 { - float: none; - width: 1324px; - margin-left: 0; -} -table .span18 { - float: none; - width: 1404px; - margin-left: 0; -} -table .span19 { - float: none; - width: 1484px; - margin-left: 0; -} -table .span20 { - float: none; - width: 1564px; - margin-left: 0; -} -table .span21 { - float: none; - width: 1644px; - margin-left: 0; -} -table .span22 { - float: none; - width: 1724px; - margin-left: 0; -} -table .span23 { - float: none; - width: 1804px; - margin-left: 0; -} -table .span24 { - float: none; - width: 1884px; - margin-left: 0; -} -[class^="icon-"], -[class*=" icon-"] { - display: inline-block; - width: 14px; - height: 14px; - line-height: 14px; - vertical-align: text-top; - background-image: url("../img/glyphicons-halflings.png"); - background-position: 14px 14px; - background-repeat: no-repeat; - *margin-right: .3em; -} -[class^="icon-"]:last-child, -[class*=" icon-"]:last-child { - *margin-left: 0; -} -.icon-white { - background-image: url("../img/glyphicons-halflings-white.png"); -} -.icon-glass { - background-position: 0 0; -} -.icon-music { - background-position: -24px 0; -} -.icon-search { - background-position: -48px 0; -} -.icon-envelope { - background-position: -72px 0; -} -.icon-heart { - background-position: -96px 0; -} -.icon-star { - background-position: -120px 0; -} -.icon-star-empty { - background-position: -144px 0; -} -.icon-user { - background-position: -168px 0; -} -.icon-film { - background-position: -192px 0; -} -.icon-th-large { - background-position: -216px 0; -} -.icon-th { - background-position: -240px 0; -} -.icon-th-list { - background-position: -264px 0; -} -.icon-ok { - background-position: -288px 0; -} -.icon-remove { - background-position: -312px 0; -} -.icon-zoom-in { - background-position: -336px 0; -} -.icon-zoom-out { - background-position: -360px 0; -} -.icon-off { - background-position: -384px 0; -} -.icon-signal { - background-position: -408px 0; -} -.icon-cog { - background-position: -432px 0; -} -.icon-trash { - background-position: -456px 0; -} -.icon-home { - background-position: 0 -24px; -} -.icon-file { - background-position: -24px -24px; -} -.icon-time { - background-position: -48px -24px; -} -.icon-road { - background-position: -72px -24px; -} -.icon-download-alt { - background-position: -96px -24px; -} -.icon-download { - background-position: -120px -24px; -} -.icon-upload { - background-position: -144px -24px; -} -.icon-inbox { - background-position: -168px -24px; -} -.icon-play-circle { - background-position: -192px -24px; -} -.icon-repeat { - background-position: -216px -24px; -} -.icon-refresh { - background-position: -240px -24px; -} -.icon-list-alt { - background-position: -264px -24px; -} -.icon-lock { - background-position: -287px -24px; -} -.icon-flag { - background-position: -312px -24px; -} -.icon-headphones { - background-position: -336px -24px; -} -.icon-volume-off { - background-position: -360px -24px; -} -.icon-volume-down { - background-position: -384px -24px; -} -.icon-volume-up { - background-position: -408px -24px; -} -.icon-qrcode { - background-position: -432px -24px; -} -.icon-barcode { - background-position: -456px -24px; -} -.icon-tag { - background-position: 0 -48px; -} -.icon-tags { - background-position: -25px -48px; -} -.icon-book { - background-position: -48px -48px; -} -.icon-bookmark { - background-position: -72px -48px; -} -.icon-print { - background-position: -96px -48px; -} -.icon-camera { - background-position: -120px -48px; -} -.icon-font { - background-position: -144px -48px; -} -.icon-bold { - background-position: -167px -48px; -} -.icon-italic { - background-position: -192px -48px; -} -.icon-text-height { - background-position: -216px -48px; -} -.icon-text-width { - background-position: -240px -48px; -} -.icon-align-left { - background-position: -264px -48px; -} -.icon-align-center { - background-position: -288px -48px; -} -.icon-align-right { - background-position: -312px -48px; -} -.icon-align-justify { - background-position: -336px -48px; -} -.icon-list { - background-position: -360px -48px; -} -.icon-indent-left { - background-position: -384px -48px; -} -.icon-indent-right { - background-position: -408px -48px; -} -.icon-facetime-video { - background-position: -432px -48px; -} -.icon-picture { - background-position: -456px -48px; -} -.icon-pencil { - background-position: 0 -72px; -} -.icon-map-marker { - background-position: -24px -72px; -} -.icon-adjust { - background-position: -48px -72px; -} -.icon-tint { - background-position: -72px -72px; -} -.icon-edit { - background-position: -96px -72px; -} -.icon-share { - background-position: -120px -72px; -} -.icon-check { - background-position: -144px -72px; -} -.icon-move { - background-position: -168px -72px; -} -.icon-step-backward { - background-position: -192px -72px; -} -.icon-fast-backward { - background-position: -216px -72px; -} -.icon-backward { - background-position: -240px -72px; -} -.icon-play { - background-position: -264px -72px; -} -.icon-pause { - background-position: -288px -72px; -} -.icon-stop { - background-position: -312px -72px; -} -.icon-forward { - background-position: -336px -72px; -} -.icon-fast-forward { - background-position: -360px -72px; -} -.icon-step-forward { - background-position: -384px -72px; -} -.icon-eject { - background-position: -408px -72px; -} -.icon-chevron-left { - background-position: -432px -72px; -} -.icon-chevron-right { - background-position: -456px -72px; -} -.icon-plus-sign { - background-position: 0 -96px; -} -.icon-minus-sign { - background-position: -24px -96px; -} -.icon-remove-sign { - background-position: -48px -96px; -} -.icon-ok-sign { - background-position: -72px -96px; -} -.icon-question-sign { - background-position: -96px -96px; -} -.icon-info-sign { - background-position: -120px -96px; -} -.icon-screenshot { - background-position: -144px -96px; -} -.icon-remove-circle { - background-position: -168px -96px; -} -.icon-ok-circle { - background-position: -192px -96px; -} -.icon-ban-circle { - background-position: -216px -96px; -} -.icon-arrow-left { - background-position: -240px -96px; -} -.icon-arrow-right { - background-position: -264px -96px; -} -.icon-arrow-up { - background-position: -289px -96px; -} -.icon-arrow-down { - background-position: -312px -96px; -} -.icon-share-alt { - background-position: -336px -96px; -} -.icon-resize-full { - background-position: -360px -96px; -} -.icon-resize-small { - background-position: -384px -96px; -} -.icon-plus { - background-position: -408px -96px; -} -.icon-minus { - background-position: -433px -96px; -} -.icon-asterisk { - background-position: -456px -96px; -} -.icon-exclamation-sign { - background-position: 0 -120px; -} -.icon-gift { - background-position: -24px -120px; -} -.icon-leaf { - background-position: -48px -120px; -} -.icon-fire { - background-position: -72px -120px; -} -.icon-eye-open { - background-position: -96px -120px; -} -.icon-eye-close { - background-position: -120px -120px; -} -.icon-warning-sign { - background-position: -144px -120px; -} -.icon-plane { - background-position: -168px -120px; -} -.icon-calendar { - background-position: -192px -120px; -} -.icon-random { - background-position: -216px -120px; -} -.icon-comment { - background-position: -240px -120px; -} -.icon-magnet { - background-position: -264px -120px; -} -.icon-chevron-up { - background-position: -288px -120px; -} -.icon-chevron-down { - background-position: -313px -119px; -} -.icon-retweet { - background-position: -336px -120px; -} -.icon-shopping-cart { - background-position: -360px -120px; -} -.icon-folder-close { - background-position: -384px -120px; -} -.icon-folder-open { - background-position: -408px -120px; -} -.icon-resize-vertical { - background-position: -432px -119px; -} -.icon-resize-horizontal { - background-position: -456px -118px; -} -.dropdown { - position: relative; -} -.dropdown-toggle { - *margin-bottom: -3px; -} -.dropdown-toggle:active, -.open .dropdown-toggle { - outline: 0; -} -.caret { - display: inline-block; - width: 0; - height: 0; - vertical-align: top; - border-left: 4px solid transparent; - border-right: 4px solid transparent; - border-top: 4px solid #000000; - opacity: 0.3; - filter: alpha(opacity=30); - content: ""; -} -.dropdown .caret { - margin-top: 8px; - margin-left: 2px; -} -.dropdown:hover .caret, -.open.dropdown .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.dropdown-menu { - position: absolute; - top: 100%; - left: 0; - z-index: 1000; - float: left; - display: none; - min-width: 160px; - padding: 4px 0; - margin: 0; - list-style: none; - background-color: #ffffff; - border-color: #ccc; - border-color: rgba(0, 0, 0, 0.2); - border-style: solid; - border-width: 1px; - -webkit-border-radius: 0 0 5px 5px; - -moz-border-radius: 0 0 5px 5px; - border-radius: 0 0 5px 5px; - -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); - -webkit-background-clip: padding-box; - -moz-background-clip: padding; - background-clip: padding-box; - *border-right-width: 2px; - *border-bottom-width: 2px; -} -.dropdown-menu.pull-right { - right: 0; - left: auto; -} -.dropdown-menu .divider { - height: 1px; - margin: 8px 1px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; - *width: 100%; - *margin: -5px 0 5px; -} -.dropdown-menu a { - display: block; - padding: 3px 15px; - clear: both; - font-weight: normal; - line-height: 18px; - color: #333333; - white-space: nowrap; -} -.dropdown-menu li > a:hover, -.dropdown-menu .active > a, -.dropdown-menu .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #0088cc; -} -.dropdown.open { - *z-index: 1000; -} -.dropdown.open .dropdown-toggle { - color: #ffffff; - background: #ccc; - background: rgba(0, 0, 0, 0.3); -} -.dropdown.open .dropdown-menu { - display: block; -} -.pull-right .dropdown-menu { - left: auto; - right: 0; -} -.dropup .caret, -.navbar-fixed-bottom .dropdown .caret { - border-top: 0; - border-bottom: 4px solid #000000; - content: "\2191"; -} -.dropup .dropdown-menu, -.navbar-fixed-bottom .dropdown .dropdown-menu { - top: auto; - bottom: 100%; - margin-bottom: 1px; -} -.typeahead { - margin-top: 2px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.well { - min-height: 20px; - padding: 19px; - margin-bottom: 20px; - background-color: #f5f5f5; - border: 1px solid #eee; - border: 1px solid rgba(0, 0, 0, 0.05); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -} -.well blockquote { - border-color: #ddd; - border-color: rgba(0, 0, 0, 0.15); -} -.well-large { - padding: 24px; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.well-small { - padding: 9px; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.fade { - -webkit-transition: opacity 0.15s linear; - -moz-transition: opacity 0.15s linear; - -ms-transition: opacity 0.15s linear; - -o-transition: opacity 0.15s linear; - transition: opacity 0.15s linear; - opacity: 0; -} -.fade.in { - opacity: 1; -} -.collapse { - -webkit-transition: height 0.35s ease; - -moz-transition: height 0.35s ease; - -ms-transition: height 0.35s ease; - -o-transition: height 0.35s ease; - transition: height 0.35s ease; - position: relative; - overflow: hidden; - height: 0; -} -.collapse.in { - height: auto; -} -.close { - float: right; - font-size: 20px; - font-weight: bold; - line-height: 18px; - color: #000000; - text-shadow: 0 1px 0 #ffffff; - opacity: 0.2; - filter: alpha(opacity=20); -} -.close:hover { - color: #000000; - text-decoration: none; - opacity: 0.4; - filter: alpha(opacity=40); - cursor: pointer; -} -.btn { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - padding: 4px 10px 4px; - margin-bottom: 0; - font-size: 13px; - line-height: 18px; - color: #333333; - text-align: center; - text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); - vertical-align: middle; - background-color: #f5f5f5; - background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); - background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); - background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); - background-image: linear-gradient(top, #ffffff, #e6e6e6); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); - border-color: #e6e6e6 #e6e6e6 #bfbfbf; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - border: 1px solid #cccccc; - border-bottom-color: #b3b3b3; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - cursor: pointer; - *margin-left: .3em; -} -.btn:hover, -.btn:active, -.btn.active, -.btn.disabled, -.btn[disabled] { - background-color: #e6e6e6; -} -.btn:active, -.btn.active { - background-color: #cccccc \9; -} -.btn:first-child { - *margin-left: 0; -} -.btn:hover { - color: #333333; - text-decoration: none; - background-color: #e6e6e6; - background-position: 0 -15px; - -webkit-transition: background-position 0.1s linear; - -moz-transition: background-position 0.1s linear; - -ms-transition: background-position 0.1s linear; - -o-transition: background-position 0.1s linear; - transition: background-position 0.1s linear; -} -.btn:focus { - outline: thin dotted #333; - outline: 5px auto -webkit-focus-ring-color; - outline-offset: -2px; -} -.btn.active, -.btn:active { - background-image: none; - -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - background-color: #e6e6e6; - background-color: #d9d9d9 \9; - outline: 0; -} -.btn.disabled, -.btn[disabled] { - cursor: default; - background-image: none; - background-color: #e6e6e6; - opacity: 0.65; - filter: alpha(opacity=65); - -webkit-box-shadow: none; - -moz-box-shadow: none; - box-shadow: none; -} -.btn-large { - padding: 9px 14px; - font-size: 15px; - line-height: normal; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-large [class^="icon-"] { - margin-top: 1px; -} -.btn-small { - padding: 5px 9px; - font-size: 11px; - line-height: 16px; -} -.btn-small [class^="icon-"] { - margin-top: -1px; -} -.btn-mini { - padding: 2px 6px; - font-size: 11px; - line-height: 14px; -} -.btn-primary, -.btn-primary:hover, -.btn-warning, -.btn-warning:hover, -.btn-danger, -.btn-danger:hover, -.btn-success, -.btn-success:hover, -.btn-info, -.btn-info:hover, -.btn-inverse, -.btn-inverse:hover { - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - color: #ffffff; -} -.btn-primary.active, -.btn-warning.active, -.btn-danger.active, -.btn-success.active, -.btn-info.active, -.btn-inverse.active { - color: rgba(255, 255, 255, 0.75); -} -.btn-primary { - background-color: #0074cc; - background-image: -moz-linear-gradient(top, #0088cc, #0055cc); - background-image: -ms-linear-gradient(top, #0088cc, #0055cc); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); - background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); - background-image: -o-linear-gradient(top, #0088cc, #0055cc); - background-image: linear-gradient(top, #0088cc, #0055cc); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); - border-color: #0055cc #0055cc #003580; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-primary:hover, -.btn-primary:active, -.btn-primary.active, -.btn-primary.disabled, -.btn-primary[disabled] { - background-color: #0055cc; -} -.btn-primary:active, -.btn-primary.active { - background-color: #004099 \9; -} -.btn-warning { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); - border-color: #f89406 #f89406 #ad6704; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-warning:hover, -.btn-warning:active, -.btn-warning.active, -.btn-warning.disabled, -.btn-warning[disabled] { - background-color: #f89406; -} -.btn-warning:active, -.btn-warning.active { - background-color: #c67605 \9; -} -.btn-danger { - background-color: #da4f49; - background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); - background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); - background-image: linear-gradient(top, #ee5f5b, #bd362f); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); - border-color: #bd362f #bd362f #802420; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-danger:hover, -.btn-danger:active, -.btn-danger.active, -.btn-danger.disabled, -.btn-danger[disabled] { - background-color: #bd362f; -} -.btn-danger:active, -.btn-danger.active { - background-color: #942a25 \9; -} -.btn-success { - background-color: #5bb75b; - background-image: -moz-linear-gradient(top, #62c462, #51a351); - background-image: -ms-linear-gradient(top, #62c462, #51a351); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); - background-image: -webkit-linear-gradient(top, #62c462, #51a351); - background-image: -o-linear-gradient(top, #62c462, #51a351); - background-image: linear-gradient(top, #62c462, #51a351); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); - border-color: #51a351 #51a351 #387038; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-success:hover, -.btn-success:active, -.btn-success.active, -.btn-success.disabled, -.btn-success[disabled] { - background-color: #51a351; -} -.btn-success:active, -.btn-success.active { - background-color: #408140 \9; -} -.btn-info { - background-color: #49afcd; - background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); - background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); - background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); - background-image: linear-gradient(top, #5bc0de, #2f96b4); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); - border-color: #2f96b4 #2f96b4 #1f6377; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-info:hover, -.btn-info:active, -.btn-info.active, -.btn-info.disabled, -.btn-info[disabled] { - background-color: #2f96b4; -} -.btn-info:active, -.btn-info.active { - background-color: #24748c \9; -} -.btn-inverse { - background-color: #414141; - background-image: -moz-linear-gradient(top, #555555, #222222); - background-image: -ms-linear-gradient(top, #555555, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); - background-image: -webkit-linear-gradient(top, #555555, #222222); - background-image: -o-linear-gradient(top, #555555, #222222); - background-image: linear-gradient(top, #555555, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); -} -.btn-inverse:hover, -.btn-inverse:active, -.btn-inverse.active, -.btn-inverse.disabled, -.btn-inverse[disabled] { - background-color: #222222; -} -.btn-inverse:active, -.btn-inverse.active { - background-color: #080808 \9; -} -button.btn, -input[type="submit"].btn { - *padding-top: 2px; - *padding-bottom: 2px; -} -button.btn::-moz-focus-inner, -input[type="submit"].btn::-moz-focus-inner { - padding: 0; - border: 0; -} -button.btn.btn-large, -input[type="submit"].btn.btn-large { - *padding-top: 7px; - *padding-bottom: 7px; -} -button.btn.btn-small, -input[type="submit"].btn.btn-small { - *padding-top: 3px; - *padding-bottom: 3px; -} -button.btn.btn-mini, -input[type="submit"].btn.btn-mini { - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-group { - position: relative; - *zoom: 1; - *margin-left: .3em; -} -.btn-group:before, -.btn-group:after { - display: table; - content: ""; -} -.btn-group:after { - clear: both; -} -.btn-group:first-child { - *margin-left: 0; -} -.btn-group + .btn-group { - margin-left: 5px; -} -.btn-toolbar { - margin-top: 9px; - margin-bottom: 9px; -} -.btn-toolbar .btn-group { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; -} -.btn-group .btn { - position: relative; - float: left; - margin-left: -1px; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.btn-group .btn:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 4px; - -moz-border-radius-topleft: 4px; - border-top-left-radius: 4px; - -webkit-border-bottom-left-radius: 4px; - -moz-border-radius-bottomleft: 4px; - border-bottom-left-radius: 4px; -} -.btn-group .btn:last-child, -.btn-group .dropdown-toggle { - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topright: 4px; - border-top-right-radius: 4px; - -webkit-border-bottom-right-radius: 4px; - -moz-border-radius-bottomright: 4px; - border-bottom-right-radius: 4px; -} -.btn-group .btn.large:first-child { - margin-left: 0; - -webkit-border-top-left-radius: 6px; - -moz-border-radius-topleft: 6px; - border-top-left-radius: 6px; - -webkit-border-bottom-left-radius: 6px; - -moz-border-radius-bottomleft: 6px; - border-bottom-left-radius: 6px; -} -.btn-group .btn.large:last-child, -.btn-group .large.dropdown-toggle { - -webkit-border-top-right-radius: 6px; - -moz-border-radius-topright: 6px; - border-top-right-radius: 6px; - -webkit-border-bottom-right-radius: 6px; - -moz-border-radius-bottomright: 6px; - border-bottom-right-radius: 6px; -} -.btn-group .btn:hover, -.btn-group .btn:focus, -.btn-group .btn:active, -.btn-group .btn.active { - z-index: 2; -} -.btn-group .dropdown-toggle:active, -.btn-group.open .dropdown-toggle { - outline: 0; -} -.btn-group .dropdown-toggle { - padding-left: 8px; - padding-right: 8px; - -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); - *padding-top: 3px; - *padding-bottom: 3px; -} -.btn-group .btn-mini.dropdown-toggle { - padding-left: 5px; - padding-right: 5px; - *padding-top: 1px; - *padding-bottom: 1px; -} -.btn-group .btn-small.dropdown-toggle { - *padding-top: 4px; - *padding-bottom: 4px; -} -.btn-group .btn-large.dropdown-toggle { - padding-left: 12px; - padding-right: 12px; -} -.btn-group.open { - *z-index: 1000; -} -.btn-group.open .dropdown-menu { - display: block; - margin-top: 1px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.btn-group.open .dropdown-toggle { - background-image: none; - -webkit-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: inset 0 1px 6px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); -} -.btn .caret { - margin-top: 7px; - margin-left: 0; -} -.btn:hover .caret, -.open.btn-group .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.btn-mini .caret { - margin-top: 5px; -} -.btn-small .caret { - margin-top: 6px; -} -.btn-large .caret { - margin-top: 6px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.btn-primary .caret, -.btn-warning .caret, -.btn-danger .caret, -.btn-info .caret, -.btn-success .caret, -.btn-inverse .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 0.75; - filter: alpha(opacity=75); -} -.alert { - padding: 8px 35px 8px 14px; - margin-bottom: 18px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - background-color: #fcf8e3; - border: 1px solid #fbeed5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - color: #c09853; -} -.alert-heading { - color: inherit; -} -.alert .close { - position: relative; - top: -2px; - right: -21px; - line-height: 18px; -} -.alert-success { - background-color: #dff0d8; - border-color: #d6e9c6; - color: #468847; -} -.alert-danger, -.alert-error { - background-color: #f2dede; - border-color: #eed3d7; - color: #b94a48; -} -.alert-info { - background-color: #d9edf7; - border-color: #bce8f1; - color: #3a87ad; -} -.alert-block { - padding-top: 14px; - padding-bottom: 14px; -} -.alert-block > p, -.alert-block > ul { - margin-bottom: 0; -} -.alert-block p + p { - margin-top: 5px; -} -.nav { - margin-left: 0; - margin-bottom: 18px; - list-style: none; -} -.nav > li > a { - display: block; -} -.nav > li > a:hover { - text-decoration: none; - background-color: #eeeeee; -} -.nav .nav-header { - display: block; - padding: 3px 15px; - font-size: 11px; - font-weight: bold; - line-height: 18px; - color: #999999; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); - text-transform: uppercase; -} -.nav li + .nav-header { - margin-top: 9px; -} -.nav-list { - padding-left: 15px; - padding-right: 15px; - margin-bottom: 0; -} -.nav-list > li > a, -.nav-list .nav-header { - margin-left: -15px; - margin-right: -15px; - text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); -} -.nav-list > li > a { - padding: 3px 15px; -} -.nav-list > .active > a, -.nav-list > .active > a:hover { - color: #ffffff; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); - background-color: #0088cc; -} -.nav-list [class^="icon-"] { - margin-right: 2px; -} -.nav-list .divider { - height: 1px; - margin: 8px 1px; - overflow: hidden; - background-color: #e5e5e5; - border-bottom: 1px solid #ffffff; - *width: 100%; - *margin: -5px 0 5px; -} -.nav-tabs, -.nav-pills { - *zoom: 1; -} -.nav-tabs:before, -.nav-pills:before, -.nav-tabs:after, -.nav-pills:after { - display: table; - content: ""; -} -.nav-tabs:after, -.nav-pills:after { - clear: both; -} -.nav-tabs > li, -.nav-pills > li { - float: left; -} -.nav-tabs > li > a, -.nav-pills > li > a { - padding-right: 12px; - padding-left: 12px; - margin-right: 2px; - line-height: 14px; -} -.nav-tabs { - border-bottom: 1px solid #ddd; -} -.nav-tabs > li { - margin-bottom: -1px; -} -.nav-tabs > li > a { - padding-top: 8px; - padding-bottom: 8px; - line-height: 18px; - border: 1px solid transparent; - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #dddddd; -} -.nav-tabs > .active > a, -.nav-tabs > .active > a:hover { - color: #555555; - background-color: #ffffff; - border: 1px solid #ddd; - border-bottom-color: transparent; - cursor: default; -} -.nav-pills > li > a { - padding-top: 8px; - padding-bottom: 8px; - margin-top: 2px; - margin-bottom: 2px; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.nav-pills > .active > a, -.nav-pills > .active > a:hover { - color: #ffffff; - background-color: #0088cc; -} -.nav-stacked > li { - float: none; -} -.nav-stacked > li > a { - margin-right: 0; -} -.nav-tabs.nav-stacked { - border-bottom: 0; -} -.nav-tabs.nav-stacked > li > a { - border: 1px solid #ddd; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.nav-tabs.nav-stacked > li:first-child > a { - -webkit-border-radius: 4px 4px 0 0; - -moz-border-radius: 4px 4px 0 0; - border-radius: 4px 4px 0 0; -} -.nav-tabs.nav-stacked > li:last-child > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.nav-tabs.nav-stacked > li > a:hover { - border-color: #ddd; - z-index: 2; -} -.nav-pills.nav-stacked > li > a { - margin-bottom: 3px; -} -.nav-pills.nav-stacked > li:last-child > a { - margin-bottom: 1px; -} -.nav-tabs .dropdown-menu, -.nav-pills .dropdown-menu { - margin-top: 1px; - border-width: 1px; -} -.nav-pills .dropdown-menu { - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.nav-tabs .dropdown-toggle .caret, -.nav-pills .dropdown-toggle .caret { - border-top-color: #0088cc; - border-bottom-color: #0088cc; - margin-top: 6px; -} -.nav-tabs .dropdown-toggle:hover .caret, -.nav-pills .dropdown-toggle:hover .caret { - border-top-color: #005580; - border-bottom-color: #005580; -} -.nav-tabs .active .dropdown-toggle .caret, -.nav-pills .active .dropdown-toggle .caret { - border-top-color: #333333; - border-bottom-color: #333333; -} -.nav > .dropdown.active > a:hover { - color: #000000; - cursor: pointer; -} -.nav-tabs .open .dropdown-toggle, -.nav-pills .open .dropdown-toggle, -.nav > .open.active > a:hover { - color: #ffffff; - background-color: #999999; - border-color: #999999; -} -.nav .open .caret, -.nav .open.active .caret, -.nav .open a:hover .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; - opacity: 1; - filter: alpha(opacity=100); -} -.tabs-stacked .open > a:hover { - border-color: #999999; -} -.tabbable { - *zoom: 1; -} -.tabbable:before, -.tabbable:after { - display: table; - content: ""; -} -.tabbable:after { - clear: both; -} -.tab-content { - display: table; - width: 100%; -} -.tabs-below .nav-tabs, -.tabs-right .nav-tabs, -.tabs-left .nav-tabs { - border-bottom: 0; -} -.tab-content > .tab-pane, -.pill-content > .pill-pane { - display: none; -} -.tab-content > .active, -.pill-content > .active { - display: block; -} -.tabs-below .nav-tabs { - border-top: 1px solid #ddd; -} -.tabs-below .nav-tabs > li { - margin-top: -1px; - margin-bottom: 0; -} -.tabs-below .nav-tabs > li > a { - -webkit-border-radius: 0 0 4px 4px; - -moz-border-radius: 0 0 4px 4px; - border-radius: 0 0 4px 4px; -} -.tabs-below .nav-tabs > li > a:hover { - border-bottom-color: transparent; - border-top-color: #ddd; -} -.tabs-below .nav-tabs .active > a, -.tabs-below .nav-tabs .active > a:hover { - border-color: transparent #ddd #ddd #ddd; -} -.tabs-left .nav-tabs > li, -.tabs-right .nav-tabs > li { - float: none; -} -.tabs-left .nav-tabs > li > a, -.tabs-right .nav-tabs > li > a { - min-width: 74px; - margin-right: 0; - margin-bottom: 3px; -} -.tabs-left .nav-tabs { - float: left; - margin-right: 19px; - border-right: 1px solid #ddd; -} -.tabs-left .nav-tabs > li > a { - margin-right: -1px; - -webkit-border-radius: 4px 0 0 4px; - -moz-border-radius: 4px 0 0 4px; - border-radius: 4px 0 0 4px; -} -.tabs-left .nav-tabs > li > a:hover { - border-color: #eeeeee #dddddd #eeeeee #eeeeee; -} -.tabs-left .nav-tabs .active > a, -.tabs-left .nav-tabs .active > a:hover { - border-color: #ddd transparent #ddd #ddd; - *border-right-color: #ffffff; -} -.tabs-right .nav-tabs { - float: right; - margin-left: 19px; - border-left: 1px solid #ddd; -} -.tabs-right .nav-tabs > li > a { - margin-left: -1px; - -webkit-border-radius: 0 4px 4px 0; - -moz-border-radius: 0 4px 4px 0; - border-radius: 0 4px 4px 0; -} -.tabs-right .nav-tabs > li > a:hover { - border-color: #eeeeee #eeeeee #eeeeee #dddddd; -} -.tabs-right .nav-tabs .active > a, -.tabs-right .nav-tabs .active > a:hover { - border-color: #ddd #ddd #ddd transparent; - *border-left-color: #ffffff; -} -.navbar { - *position: relative; - *z-index: 2; - overflow: visible; - margin-bottom: 18px; -} -.navbar-inner { - padding-left: 20px; - padding-right: 20px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); - box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); -} -.navbar .container { - width: auto; -} -.btn-navbar { - display: none; - float: right; - padding: 7px 10px; - margin-left: 5px; - margin-right: 5px; - background-color: #2c2c2c; - background-image: -moz-linear-gradient(top, #333333, #222222); - background-image: -ms-linear-gradient(top, #333333, #222222); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); - background-image: -webkit-linear-gradient(top, #333333, #222222); - background-image: -o-linear-gradient(top, #333333, #222222); - background-image: linear-gradient(top, #333333, #222222); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); - border-color: #222222 #222222 #000000; - border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); - filter: progid:dximagetransform.microsoft.gradient(enabled=false); - -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); - box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); -} -.btn-navbar:hover, -.btn-navbar:active, -.btn-navbar.active, -.btn-navbar.disabled, -.btn-navbar[disabled] { - background-color: #222222; -} -.btn-navbar:active, -.btn-navbar.active { - background-color: #080808 \9; -} -.btn-navbar .icon-bar { - display: block; - width: 18px; - height: 2px; - background-color: #f5f5f5; - -webkit-border-radius: 1px; - -moz-border-radius: 1px; - border-radius: 1px; - -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); - box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -} -.btn-navbar .icon-bar + .icon-bar { - margin-top: 3px; -} -.nav-collapse.collapse { - height: auto; -} -.navbar { - color: #999999; -} -.navbar .brand:hover { - text-decoration: none; -} -.navbar .brand { - float: left; - display: block; - padding: 8px 20px 12px; - margin-left: -20px; - font-size: 20px; - font-weight: 200; - line-height: 1; - color: #ffffff; -} -.navbar .navbar-text { - margin-bottom: 0; - line-height: 40px; -} -.navbar .btn, -.navbar .btn-group { - margin-top: 5px; -} -.navbar .btn-group .btn { - margin-top: 0; -} -.navbar-form { - margin-bottom: 0; - *zoom: 1; -} -.navbar-form:before, -.navbar-form:after { - display: table; - content: ""; -} -.navbar-form:after { - clear: both; -} -.navbar-form input, -.navbar-form select, -.navbar-form .radio, -.navbar-form .checkbox { - margin-top: 5px; -} -.navbar-form input, -.navbar-form select { - display: inline-block; - margin-bottom: 0; -} -.navbar-form input[type="image"], -.navbar-form input[type="checkbox"], -.navbar-form input[type="radio"] { - margin-top: 3px; -} -.navbar-form .input-append, -.navbar-form .input-prepend { - margin-top: 6px; - white-space: nowrap; -} -.navbar-form .input-append input, -.navbar-form .input-prepend input { - margin-top: 0; -} -.navbar-search { - position: relative; - float: left; - margin-top: 6px; - margin-bottom: 0; -} -.navbar-search .search-query { - padding: 4px 9px; - font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; - font-size: 13px; - font-weight: normal; - line-height: 1; - color: #ffffff; - background-color: #626262; - border: 1px solid #151515; - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0px rgba(255, 255, 255, 0.15); - -webkit-transition: none; - -moz-transition: none; - -ms-transition: none; - -o-transition: none; - transition: none; -} -.navbar-search .search-query:-moz-placeholder { - color: #cccccc; -} -.navbar-search .search-query::-webkit-input-placeholder { - color: #cccccc; -} -.navbar-search .search-query:focus, -.navbar-search .search-query.focused { - padding: 5px 10px; - color: #333333; - text-shadow: 0 1px 0 #ffffff; - background-color: #ffffff; - border: 0; - -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); - outline: 0; -} -.navbar-fixed-top, -.navbar-fixed-bottom { - position: fixed; - right: 0; - left: 0; - z-index: 1030; - margin-bottom: 0; -} -.navbar-fixed-top .navbar-inner, -.navbar-fixed-bottom .navbar-inner { - padding-left: 0; - padding-right: 0; - -webkit-border-radius: 0; - -moz-border-radius: 0; - border-radius: 0; -} -.navbar-fixed-top .container, -.navbar-fixed-bottom .container { - width: 940px; -} -.navbar-fixed-top { - top: 0; -} -.navbar-fixed-bottom { - bottom: 0; -} -.navbar .nav { - position: relative; - left: 0; - display: block; - float: left; - margin: 0 10px 0 0; -} -.navbar .nav.pull-right { - float: right; -} -.navbar .nav > li { - display: block; - float: left; -} -.navbar .nav > li > a { - float: none; - padding: 10px 10px 11px; - line-height: 19px; - color: #999999; - text-decoration: none; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); -} -.navbar .nav > li > a:hover { - background-color: transparent; - color: #ffffff; - text-decoration: none; -} -.navbar .nav .active > a, -.navbar .nav .active > a:hover { - color: #ffffff; - text-decoration: none; - background-color: #222222; -} -.navbar .divider-vertical { - height: 40px; - width: 1px; - margin: 0 9px; - overflow: hidden; - background-color: #222222; - border-right: 1px solid #333333; -} -.navbar .nav.pull-right { - margin-left: 10px; - margin-right: 0; -} -.navbar .dropdown-menu { - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.navbar .dropdown-menu:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 9px; -} -.navbar .dropdown-menu:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 10px; -} -.navbar-fixed-bottom .dropdown-menu:before { - border-top: 7px solid #ccc; - border-top-color: rgba(0, 0, 0, 0.2); - border-bottom: 0; - bottom: -7px; - top: auto; -} -.navbar-fixed-bottom .dropdown-menu:after { - border-top: 6px solid #ffffff; - border-bottom: 0; - bottom: -6px; - top: auto; -} -.navbar .nav .dropdown-toggle .caret, -.navbar .nav .open.dropdown .caret { - border-top-color: #ffffff; - border-bottom-color: #ffffff; -} -.navbar .nav .active .caret { - opacity: 1; - filter: alpha(opacity=100); -} -.navbar .nav .open > .dropdown-toggle, -.navbar .nav .active > .dropdown-toggle, -.navbar .nav .open.active > .dropdown-toggle { - background-color: transparent; -} -.navbar .nav .active > .dropdown-toggle:hover { - color: #ffffff; -} -.navbar .nav.pull-right .dropdown-menu, -.navbar .nav .dropdown-menu.pull-right { - left: auto; - right: 0; -} -.navbar .nav.pull-right .dropdown-menu:before, -.navbar .nav .dropdown-menu.pull-right:before { - left: auto; - right: 12px; -} -.navbar .nav.pull-right .dropdown-menu:after, -.navbar .nav .dropdown-menu.pull-right:after { - left: auto; - right: 13px; -} -.breadcrumb { - padding: 7px 14px; - margin: 0 0 18px; - list-style: none; - background-color: #fbfbfb; - background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); - background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); - background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); - background-image: linear-gradient(top, #ffffff, #f5f5f5); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); - border: 1px solid #ddd; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; -} -.breadcrumb li { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - text-shadow: 0 1px 0 #ffffff; -} -.breadcrumb .divider { - padding: 0 5px; - color: #999999; -} -.breadcrumb .active a { - color: #333333; -} -.pagination { - height: 36px; - margin: 18px 0; -} -.pagination ul { - display: inline-block; - *display: inline; - /* IE7 inline-block hack */ - - *zoom: 1; - margin-left: 0; - margin-bottom: 0; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -} -.pagination li { - display: inline; -} -.pagination a { - float: left; - padding: 0 14px; - line-height: 34px; - text-decoration: none; - border: 1px solid #ddd; - border-left-width: 0; -} -.pagination a:hover, -.pagination .active a { - background-color: #f5f5f5; -} -.pagination .active a { - color: #999999; - cursor: default; -} -.pagination .disabled span, -.pagination .disabled a, -.pagination .disabled a:hover { - color: #999999; - background-color: transparent; - cursor: default; -} -.pagination li:first-child a { - border-left-width: 1px; - -webkit-border-radius: 3px 0 0 3px; - -moz-border-radius: 3px 0 0 3px; - border-radius: 3px 0 0 3px; -} -.pagination li:last-child a { - -webkit-border-radius: 0 3px 3px 0; - -moz-border-radius: 0 3px 3px 0; - border-radius: 0 3px 3px 0; -} -.pagination-centered { - text-align: center; -} -.pagination-right { - text-align: right; -} -.pager { - margin-left: 0; - margin-bottom: 18px; - list-style: none; - text-align: center; - *zoom: 1; -} -.pager:before, -.pager:after { - display: table; - content: ""; -} -.pager:after { - clear: both; -} -.pager li { - display: inline; -} -.pager a { - display: inline-block; - padding: 5px 14px; - background-color: #fff; - border: 1px solid #ddd; - -webkit-border-radius: 15px; - -moz-border-radius: 15px; - border-radius: 15px; -} -.pager a:hover { - text-decoration: none; - background-color: #f5f5f5; -} -.pager .next a { - float: right; -} -.pager .previous a { - float: left; -} -.pager .disabled a, -.pager .disabled a:hover { - color: #999999; - background-color: #fff; - cursor: default; -} -.modal-open .dropdown-menu { - z-index: 2050; -} -.modal-open .dropdown.open { - *z-index: 2050; -} -.modal-open .popover { - z-index: 2060; -} -.modal-open .tooltip { - z-index: 2070; -} -.modal-backdrop { - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - z-index: 1040; - background-color: #000000; -} -.modal-backdrop.fade { - opacity: 0; -} -.modal-backdrop, -.modal-backdrop.fade.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.modal { - position: fixed; - top: 50%; - left: 50%; - z-index: 1050; - overflow: auto; - width: 560px; - margin: -250px 0 0 -280px; - background-color: #ffffff; - border: 1px solid #999; - border: 1px solid rgba(0, 0, 0, 0.3); - *border: 1px solid #999; - /* IE6-7 */ - - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.modal.fade { - -webkit-transition: opacity .3s linear, top .3s ease-out; - -moz-transition: opacity .3s linear, top .3s ease-out; - -ms-transition: opacity .3s linear, top .3s ease-out; - -o-transition: opacity .3s linear, top .3s ease-out; - transition: opacity .3s linear, top .3s ease-out; - top: -25%; -} -.modal.fade.in { - top: 50%; -} -.modal-header { - padding: 9px 15px; - border-bottom: 1px solid #eee; -} -.modal-header .close { - margin-top: 2px; -} -.modal-body { - overflow-y: auto; - max-height: 400px; - padding: 15px; -} -.modal-form { - margin-bottom: 0; -} -.modal-footer { - padding: 14px 15px 15px; - margin-bottom: 0; - text-align: right; - background-color: #f5f5f5; - border-top: 1px solid #ddd; - -webkit-border-radius: 0 0 6px 6px; - -moz-border-radius: 0 0 6px 6px; - border-radius: 0 0 6px 6px; - -webkit-box-shadow: inset 0 1px 0 #ffffff; - -moz-box-shadow: inset 0 1px 0 #ffffff; - box-shadow: inset 0 1px 0 #ffffff; - *zoom: 1; -} -.modal-footer:before, -.modal-footer:after { - display: table; - content: ""; -} -.modal-footer:after { - clear: both; -} -.modal-footer .btn + .btn { - margin-left: 5px; - margin-bottom: 0; -} -.modal-footer .btn-group .btn + .btn { - margin-left: -1px; -} -.tooltip { - position: absolute; - z-index: 1020; - display: block; - visibility: visible; - padding: 5px; - font-size: 11px; - opacity: 0; - filter: alpha(opacity=0); -} -.tooltip.in { - opacity: 0.8; - filter: alpha(opacity=80); -} -.tooltip.top { - margin-top: -2px; -} -.tooltip.right { - margin-left: 2px; -} -.tooltip.bottom { - margin-top: 2px; -} -.tooltip.left { - margin-left: -2px; -} -.tooltip.top .tooltip-arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.tooltip.left .tooltip-arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.tooltip.bottom .tooltip-arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.tooltip.right .tooltip-arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.tooltip-inner { - max-width: 200px; - padding: 3px 8px; - color: #ffffff; - text-align: center; - text-decoration: none; - background-color: #000000; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.tooltip-arrow { - position: absolute; - width: 0; - height: 0; -} -.popover { - position: absolute; - top: 0; - left: 0; - z-index: 1010; - display: none; - padding: 5px; -} -.popover.top { - margin-top: -5px; -} -.popover.right { - margin-left: 5px; -} -.popover.bottom { - margin-top: 5px; -} -.popover.left { - margin-left: -5px; -} -.popover.top .arrow { - bottom: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-top: 5px solid #000000; -} -.popover.right .arrow { - top: 50%; - left: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-right: 5px solid #000000; -} -.popover.bottom .arrow { - top: 0; - left: 50%; - margin-left: -5px; - border-left: 5px solid transparent; - border-right: 5px solid transparent; - border-bottom: 5px solid #000000; -} -.popover.left .arrow { - top: 50%; - right: 0; - margin-top: -5px; - border-top: 5px solid transparent; - border-bottom: 5px solid transparent; - border-left: 5px solid #000000; -} -.popover .arrow { - position: absolute; - width: 0; - height: 0; -} -.popover-inner { - padding: 3px; - width: 280px; - overflow: hidden; - background: #000000; - background: rgba(0, 0, 0, 0.8); - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; - -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); - box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -} -.popover-title { - padding: 9px 15px; - line-height: 1; - background-color: #f5f5f5; - border-bottom: 1px solid #eee; - -webkit-border-radius: 3px 3px 0 0; - -moz-border-radius: 3px 3px 0 0; - border-radius: 3px 3px 0 0; -} -.popover-content { - padding: 14px; - background-color: #ffffff; - -webkit-border-radius: 0 0 3px 3px; - -moz-border-radius: 0 0 3px 3px; - border-radius: 0 0 3px 3px; - -webkit-background-clip: padding-box; - -moz-background-clip: padding-box; - background-clip: padding-box; -} -.popover-content p, -.popover-content ul, -.popover-content ol { - margin-bottom: 0; -} -.thumbnails { - margin-left: -20px; - list-style: none; - *zoom: 1; -} -.thumbnails:before, -.thumbnails:after { - display: table; - content: ""; -} -.thumbnails:after { - clear: both; -} -.thumbnails > li { - float: left; - margin: 0 0 18px 20px; -} -.thumbnail { - display: block; - padding: 4px; - line-height: 1; - border: 1px solid #ddd; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); - box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); -} -a.thumbnail:hover { - border-color: #0088cc; - -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); - box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -} -.thumbnail > img { - display: block; - max-width: 100%; - margin-left: auto; - margin-right: auto; -} -.thumbnail .caption { - padding: 9px; -} -.label { - padding: 1px 4px 2px; - font-size: 10.998px; - font-weight: bold; - line-height: 13px; - color: #ffffff; - vertical-align: middle; - white-space: nowrap; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #999999; - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; -} -.label:hover { - color: #ffffff; - text-decoration: none; -} -.label-important { - background-color: #b94a48; -} -.label-important:hover { - background-color: #953b39; -} -.label-warning { - background-color: #f89406; -} -.label-warning:hover { - background-color: #c67605; -} -.label-success { - background-color: #468847; -} -.label-success:hover { - background-color: #356635; -} -.label-info { - background-color: #3a87ad; -} -.label-info:hover { - background-color: #2d6987; -} -.label-inverse { - background-color: #333333; -} -.label-inverse:hover { - background-color: #1a1a1a; -} -.badge { - padding: 1px 9px 2px; - font-size: 12.025px; - font-weight: bold; - white-space: nowrap; - color: #ffffff; - background-color: #999999; - -webkit-border-radius: 9px; - -moz-border-radius: 9px; - border-radius: 9px; -} -.badge:hover { - color: #ffffff; - text-decoration: none; - cursor: pointer; -} -.badge-error { - background-color: #b94a48; -} -.badge-error:hover { - background-color: #953b39; -} -.badge-warning { - background-color: #f89406; -} -.badge-warning:hover { - background-color: #c67605; -} -.badge-success { - background-color: #468847; -} -.badge-success:hover { - background-color: #356635; -} -.badge-info { - background-color: #3a87ad; -} -.badge-info:hover { - background-color: #2d6987; -} -.badge-inverse { - background-color: #333333; -} -.badge-inverse:hover { - background-color: #1a1a1a; -} -@-webkit-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@-moz-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@-ms-keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -@keyframes progress-bar-stripes { - from { - background-position: 0 0; - } - to { - background-position: 40px 0; - } -} -.progress { - overflow: hidden; - height: 18px; - margin-bottom: 18px; - background-color: #f7f7f7; - background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); - background-image: linear-gradient(top, #f5f5f5, #f9f9f9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); - -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.progress .bar { - width: 0%; - height: 18px; - color: #ffffff; - font-size: 12px; - text-align: center; - text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); - background-color: #0e90d2; - background-image: -moz-linear-gradient(top, #149bdf, #0480be); - background-image: -ms-linear-gradient(top, #149bdf, #0480be); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); - background-image: -webkit-linear-gradient(top, #149bdf, #0480be); - background-image: -o-linear-gradient(top, #149bdf, #0480be); - background-image: linear-gradient(top, #149bdf, #0480be); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); - -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); - -webkit-box-sizing: border-box; - -moz-box-sizing: border-box; - -ms-box-sizing: border-box; - box-sizing: border-box; - -webkit-transition: width 0.6s ease; - -moz-transition: width 0.6s ease; - -ms-transition: width 0.6s ease; - -o-transition: width 0.6s ease; - transition: width 0.6s ease; -} -.progress-striped .bar { - background-color: #149bdf; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - -webkit-background-size: 40px 40px; - -moz-background-size: 40px 40px; - -o-background-size: 40px 40px; - background-size: 40px 40px; -} -.progress.active .bar { - -webkit-animation: progress-bar-stripes 2s linear infinite; - -moz-animation: progress-bar-stripes 2s linear infinite; - animation: progress-bar-stripes 2s linear infinite; -} -.progress-danger .bar { - background-color: #dd514c; - background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); - background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); - background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); - background-image: linear-gradient(top, #ee5f5b, #c43c35); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); -} -.progress-danger.progress-striped .bar { - background-color: #ee5f5b; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-success .bar { - background-color: #5eb95e; - background-image: -moz-linear-gradient(top, #62c462, #57a957); - background-image: -ms-linear-gradient(top, #62c462, #57a957); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); - background-image: -webkit-linear-gradient(top, #62c462, #57a957); - background-image: -o-linear-gradient(top, #62c462, #57a957); - background-image: linear-gradient(top, #62c462, #57a957); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); -} -.progress-success.progress-striped .bar { - background-color: #62c462; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-info .bar { - background-color: #4bb1cf; - background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); - background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); - background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); - background-image: -o-linear-gradient(top, #5bc0de, #339bb9); - background-image: linear-gradient(top, #5bc0de, #339bb9); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); -} -.progress-info.progress-striped .bar { - background-color: #5bc0de; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.progress-warning .bar { - background-color: #faa732; - background-image: -moz-linear-gradient(top, #fbb450, #f89406); - background-image: -ms-linear-gradient(top, #fbb450, #f89406); - background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); - background-image: -webkit-linear-gradient(top, #fbb450, #f89406); - background-image: -o-linear-gradient(top, #fbb450, #f89406); - background-image: linear-gradient(top, #fbb450, #f89406); - background-repeat: repeat-x; - filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); -} -.progress-warning.progress-striped .bar { - background-color: #fbb450; - background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); - background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); - background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -} -.accordion { - margin-bottom: 18px; -} -.accordion-group { - margin-bottom: 2px; - border: 1px solid #e5e5e5; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; -} -.accordion-heading { - border-bottom: 0; -} -.accordion-heading .accordion-toggle { - display: block; - padding: 8px 15px; -} -.accordion-inner { - padding: 9px 15px; - border-top: 1px solid #e5e5e5; -} -.carousel { - position: relative; - margin-bottom: 18px; - line-height: 1; -} -.carousel-inner { - overflow: hidden; - width: 100%; - position: relative; -} -.carousel .item { - display: none; - position: relative; - -webkit-transition: 0.6s ease-in-out left; - -moz-transition: 0.6s ease-in-out left; - -ms-transition: 0.6s ease-in-out left; - -o-transition: 0.6s ease-in-out left; - transition: 0.6s ease-in-out left; -} -.carousel .item > img { - display: block; - line-height: 1; -} -.carousel .active, -.carousel .next, -.carousel .prev { - display: block; -} -.carousel .active { - left: 0; -} -.carousel .next, -.carousel .prev { - position: absolute; - top: 0; - width: 100%; -} -.carousel .next { - left: 100%; -} -.carousel .prev { - left: -100%; -} -.carousel .next.left, -.carousel .prev.right { - left: 0; -} -.carousel .active.left { - left: -100%; -} -.carousel .active.right { - left: 100%; -} -.carousel-control { - position: absolute; - top: 40%; - left: 15px; - width: 40px; - height: 40px; - margin-top: -20px; - font-size: 60px; - font-weight: 100; - line-height: 30px; - color: #ffffff; - text-align: center; - background: #222222; - border: 3px solid #ffffff; - -webkit-border-radius: 23px; - -moz-border-radius: 23px; - border-radius: 23px; - opacity: 0.5; - filter: alpha(opacity=50); -} -.carousel-control.right { - left: auto; - right: 15px; -} -.carousel-control:hover { - color: #ffffff; - text-decoration: none; - opacity: 0.9; - filter: alpha(opacity=90); -} -.carousel-caption { - position: absolute; - left: 0; - right: 0; - bottom: 0; - padding: 10px 15px 5px; - background: #333333; - background: rgba(0, 0, 0, 0.75); -} -.carousel-caption h4, -.carousel-caption p { - color: #ffffff; -} -.hero-unit { - padding: 60px; - margin-bottom: 30px; - background-color: #eeeeee; - -webkit-border-radius: 6px; - -moz-border-radius: 6px; - border-radius: 6px; -} -.hero-unit h1 { - margin-bottom: 0; - font-size: 60px; - line-height: 1; - color: inherit; - letter-spacing: -1px; -} -.hero-unit p { - font-size: 18px; - font-weight: 200; - line-height: 27px; - color: inherit; -} -.pull-right { - float: right; -} -.pull-left { - float: left; -} -.hide { - display: none; -} -.show { - display: block; -} -.invisible { - visibility: hidden; -} diff --git a/msgpack-idl-web/static/img/glyphicons-halflings-white.png b/msgpack-idl-web/static/img/glyphicons-halflings-white.png deleted file mode 100644 index 3bf6484..0000000 Binary files a/msgpack-idl-web/static/img/glyphicons-halflings-white.png and /dev/null differ diff --git a/msgpack-idl-web/static/img/glyphicons-halflings.png b/msgpack-idl-web/static/img/glyphicons-halflings.png deleted file mode 100644 index 79bc568..0000000 Binary files a/msgpack-idl-web/static/img/glyphicons-halflings.png and /dev/null differ diff --git a/msgpack-idl-web/templates/default-layout-wrapper.hamlet b/msgpack-idl-web/templates/default-layout-wrapper.hamlet deleted file mode 100644 index 37a22d9..0000000 --- a/msgpack-idl-web/templates/default-layout-wrapper.hamlet +++ /dev/null @@ -1,47 +0,0 @@ -\ -\ -\ -\ -\ - - - - - #{pageTitle pc} - <meta name="description" content=""> - <meta name="author" content=""> - - <meta name="viewport" content="width=device-width,initial-scale=1"> - - ^{pageHead pc} - - \<!--[if lt IE 9]> - \<script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> - \<![endif]--> - - <script> - document.documentElement.className = document.documentElement.className.replace(/\bno-js\b/,'js'); - <body> - <div class="container"> - <header> - <div id="main" role="main"> - ^{pageBody pc} - <footer> - #{extraCopyright $ appExtra $ settings master} - - $maybe analytics <- extraAnalytics $ appExtra $ settings master - <script> - if(!window.location.href.match(/localhost/)){ - window._gaq = [['_setAccount','#{analytics}'],['_trackPageview'],['_trackPageLoadTime']]; - (function() { - \ var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; - \ ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; - \ var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); - })(); - } - \<!-- Prompt IE 6 users to install Chrome Frame. Remove this if you want to support IE 6. chromium.org/developers/how-tos/chrome-frame-getting-started --> - \<!--[if lt IE 7 ]> - <script src="//ajax.googleapis.com/ajax/libs/chrome-frame/1.0.3/CFInstall.min.js"> - <script> - window.attachEvent('onload',function(){CFInstall.check({mode:'overlay'})}) - \<![endif]--> diff --git a/msgpack-idl-web/templates/default-layout.hamlet b/msgpack-idl-web/templates/default-layout.hamlet deleted file mode 100644 index fa86744..0000000 --- a/msgpack-idl-web/templates/default-layout.hamlet +++ /dev/null @@ -1,3 +0,0 @@ -$maybe msg <- mmsg - <div #message>#{msg} -^{widget} diff --git a/msgpack-idl-web/templates/homepage.hamlet b/msgpack-idl-web/templates/homepage.hamlet deleted file mode 100644 index 43f4202..0000000 --- a/msgpack-idl-web/templates/homepage.hamlet +++ /dev/null @@ -1,20 +0,0 @@ -<h1>MessagePack IDL Code Generator - -<form.well method=post action=@{HomeR}> - <label>IDL Name - <input type="text" name="name"> - <label>IDL Source - <textarea.input-xxlarge rows="20" name="source"> - #{defaultCode} - - <label>Language to Generate - <select name="lang"> - <option value="cpp">C++ - <option value="java">Java - <option value="python">Python - <option value="ruby">Ruby - - <label>Namespace / Package name / Module name - <input type="text" name="namespace"> - - <button.btn type="submit">Generate diff --git a/msgpack-idl-web/templates/homepage.julius b/msgpack-idl-web/templates/homepage.julius deleted file mode 100644 index efae799..0000000 --- a/msgpack-idl-web/templates/homepage.julius +++ /dev/null @@ -1 +0,0 @@ -document.getElementById("#{aDomId}").innerHTML = "This text was added by the Javascript part of the homepage widget."; diff --git a/msgpack-idl-web/templates/homepage.lucius b/msgpack-idl-web/templates/homepage.lucius deleted file mode 100644 index 54986f8..0000000 --- a/msgpack-idl-web/templates/homepage.lucius +++ /dev/null @@ -1,6 +0,0 @@ -h1 { - text-align: center -} -h2##{aDomId} { - color: #990 -} diff --git a/msgpack-idl-web/templates/normalize.lucius b/msgpack-idl-web/templates/normalize.lucius deleted file mode 100644 index 9fc7ae4..0000000 --- a/msgpack-idl-web/templates/normalize.lucius +++ /dev/null @@ -1,439 +0,0 @@ -/*! normalize.css 2011-08-12T17:28 UTC · http://github.com/necolas/normalize.css */ - -/* ============================================================================= - HTML5 display definitions - ========================================================================== */ - -/* - * Corrects block display not defined in IE6/7/8/9 & FF3 - */ - -article, -aside, -details, -figcaption, -figure, -footer, -header, -hgroup, -nav, -section { - display: block; -} - -/* - * Corrects inline-block display not defined in IE6/7/8/9 & FF3 - */ - -audio, -canvas, -video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -/* - * Prevents modern browsers from displaying 'audio' without controls - */ - -audio:not([controls]) { - display: none; -} - -/* - * Addresses styling for 'hidden' attribute not present in IE7/8/9, FF3, S4 - * Known issue: no IE6 support - */ - -[hidden] { - display: none; -} - - -/* ============================================================================= - Base - ========================================================================== */ - -/* - * 1. Corrects text resizing oddly in IE6/7 when body font-size is set using em units - * http://clagnut.com/blog/348/#c790 - * 2. Keeps page centred in all browsers regardless of content height - * 3. Prevents iOS text size adjust after orientation change, without disabling user zoom - * www.456bereastreet.com/archive/201012/controlling_text_size_in_safari_for_ios_without_disabling_user_zoom/ - */ - -html { - font-size: 100%; /* 1 */ - overflow-y: scroll; /* 2 */ - -webkit-text-size-adjust: 100%; /* 3 */ - -ms-text-size-adjust: 100%; /* 3 */ -} - -/* - * Addresses margins handled incorrectly in IE6/7 - */ - -body { - margin: 0; -} - -/* - * Addresses font-family inconsistency between 'textarea' and other form elements. - */ - -body, -button, -input, -select, -textarea { - font-family: sans-serif; -} - - -/* ============================================================================= - Links - ========================================================================== */ - -a { - color: #00e; -} - -a:visited { - color: #551a8b; -} - -/* - * Addresses outline displayed oddly in Chrome - */ - -a:focus { - outline: thin dotted; -} - -/* - * Improves readability when focused and also mouse hovered in all browsers - * people.opera.com/patrickl/experiments/keyboard/test - */ - -a:hover, -a:active { - outline: 0; -} - - -/* ============================================================================= - Typography - ========================================================================== */ - -/* - * Addresses styling not present in IE7/8/9, S5, Chrome - */ - -abbr[title] { - border-bottom: 1px dotted; -} - -/* - * Addresses style set to 'bolder' in FF3/4, S4/5, Chrome -*/ - -b, -strong { - font-weight: bold; -} - -blockquote { - margin: 1em 40px; -} - -/* - * Addresses styling not present in S5, Chrome - */ - -dfn { - font-style: italic; -} - -/* - * Addresses styling not present in IE6/7/8/9 - */ - -mark { - background: #ff0; - color: #000; -} - -/* - * Corrects font family set oddly in IE6, S4/5, Chrome - * en.wikipedia.org/wiki/User:Davidgothberg/Test59 - */ - -pre, -code, -kbd, -samp { - font-family: monospace, serif; - _font-family: 'courier new', monospace; - font-size: 1em; -} - -/* - * Improves readability of pre-formatted text in all browsers - */ - -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/* - * 1. Addresses CSS quotes not supported in IE6/7 - * 2. Addresses quote property not supported in S4 - */ - -/* 1 */ - -q { - quotes: none; -} - -/* 2 */ - -q:before, -q:after { - content: ''; - content: none; -} - -small { - font-size: 75%; -} - -/* - * Prevents sub and sup affecting line-height in all browsers - * gist.github.com/413930 - */ - -sub, -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - - -/* ============================================================================= - Lists - ========================================================================== */ - -ul, -ol { - margin: 1em 0; - padding: 0 0 0 40px; -} - -dd { - margin: 0 0 0 40px; -} - -nav ul, -nav ol { - list-style: none; - list-style-image: none; -} - - -/* ============================================================================= - Embedded content - ========================================================================== */ - -/* - * 1. Removes border when inside 'a' element in IE6/7/8/9 - * 2. Improves image quality when scaled in IE7 - * code.flickr.com/blog/2008/11/12/on-ui-quality-the-little-things-client-side-image-resizing/ - */ - -img { - border: 0; /* 1 */ - -ms-interpolation-mode: bicubic; /* 2 */ -} - -/* - * Corrects overflow displayed oddly in IE9 - */ - -svg:not(:root) { - overflow: hidden; -} - - -/* ============================================================================= - Figures - ========================================================================== */ - -/* - * Addresses margin not present in IE6/7/8/9, S5, O11 - */ - -figure { - margin: 0; -} - - -/* ============================================================================= - Forms - ========================================================================== */ - -/* - * Corrects margin displayed oddly in IE6/7 - */ - -form { - margin: 0; -} - -/* - * Define consistent margin and padding - */ - -fieldset { - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/* - * 1. Corrects color not being inherited in IE6/7/8/9 - * 2. Corrects alignment displayed oddly in IE6/7 - */ - -legend { - border: 0; /* 1 */ - *margin-left: -7px; /* 2 */ -} - -/* - * 1. Corrects font size not being inherited in all browsers - * 2. Addresses margins set differently in IE6/7, F3/4, S5, Chrome - * 3. Improves appearance and consistency in all browsers - */ - -button, -input, -select, -textarea { - font-size: 100%; /* 1 */ - margin: 0; /* 2 */ - vertical-align: baseline; /* 3 */ - *vertical-align: middle; /* 3 */ -} - -/* - * 1. Addresses FF3/4 setting line-height using !important in the UA stylesheet - * 2. Corrects inner spacing displayed oddly in IE6/7 - */ - -button, -input { - line-height: normal; /* 1 */ - *overflow: visible; /* 2 */ -} - -/* - * Corrects overlap and whitespace issue for buttons and inputs in IE6/7 - * Known issue: reintroduces inner spacing - */ - -table button, -table input { - *overflow: auto; -} - -/* - * 1. Improves usability and consistency of cursor style between image-type 'input' and others - * 2. Corrects inability to style clickable 'input' types in iOS - */ - -button, -html input[type="button"], -input[type="reset"], -input[type="submit"] { - cursor: pointer; /* 1 */ - -webkit-appearance: button; /* 2 */ -} - -/* - * 1. Addresses box sizing set to content-box in IE8/9 - * 2. Addresses excess padding in IE8/9 - */ - -input[type="checkbox"], -input[type="radio"] { - box-sizing: border-box; /* 1 */ - padding: 0; /* 2 */ -} - -/* - * 1. Addresses appearance set to searchfield in S5, Chrome - * 2. Addresses box sizing set to border-box in S5, Chrome (include -moz to future-proof) - */ - -input[type="search"] { - -webkit-appearance: textfield; /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; /* 2 */ - box-sizing: content-box; -} - -/* - * Corrects inner padding displayed oddly in S5, Chrome on OSX - */ - -input[type="search"]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/* - * Corrects inner padding and border displayed oddly in FF3/4 - * www.sitepen.com/blog/2008/05/14/the-devils-in-the-details-fixing-dojos-toolbar-buttons/ - */ - -button::-moz-focus-inner, -input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/* - * 1. Removes default vertical scrollbar in IE6/7/8/9 - * 2. Improves readability and alignment in all browsers - */ - -textarea { - overflow: auto; /* 1 */ - vertical-align: top; /* 2 */ -} - - -/* ============================================================================= - Tables - ========================================================================== */ - -/* - * Remove most spacing between table cells - */ - -table { - border-collapse: collapse; - border-spacing: 0; -} diff --git a/msgpack-idl-web/tests/HomeTest.hs b/msgpack-idl-web/tests/HomeTest.hs deleted file mode 100644 index 17c9e6d..0000000 --- a/msgpack-idl-web/tests/HomeTest.hs +++ /dev/null @@ -1,24 +0,0 @@ -module HomeTest - ( homeSpecs - ) where - -import Import -import Yesod.Test - -homeSpecs :: Specs -homeSpecs = - describe "These are some example tests" $ - it "loads the index and checks it looks right" $ do - get_ "/" - statusIs 200 - htmlAllContain "h1" "Hello" - - post "/" $ do - addNonce - fileByLabel "Choose a file" "tests/main.hs" "text/plain" -- talk about self-reference - byLabel "What's on the file?" "Some Content" - - statusIs 200 - htmlCount ".message" 1 - htmlAllContain ".message" "Some Content" - htmlAllContain ".message" "text/plain" diff --git a/msgpack-idl-web/tests/main.hs b/msgpack-idl-web/tests/main.hs deleted file mode 100644 index d475fe8..0000000 --- a/msgpack-idl-web/tests/main.hs +++ /dev/null @@ -1,22 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE NoMonomorphismRestriction #-} -{-# OPTIONS_GHC -fno-warn-orphans #-} - -module Main where - -import Import -import Settings -import Yesod.Logger (defaultDevelopmentLogger) -import Yesod.Default.Config -import Yesod.Test -import Application (makeFoundation) - -import HomeTest - -main :: IO a -main = do - conf <- loadConfig $ (configSettings Testing) { csParseExtra = parseExtra } - logger <- defaultDevelopmentLogger - foundation <- makeFoundation conf logger - app <- toWaiAppPlain foundation - runTests app (connPool foundation) homeSpecs diff --git a/msgpack-idl/LICENSE b/msgpack-idl/LICENSE deleted file mode 100644 index 6eba326..0000000 --- a/msgpack-idl/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c)2011, Hideyuki Tanaka - -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. - - * Neither the name of Hideyuki Tanaka nor the names of other - 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. diff --git a/msgpack-idl/Language/MessagePack/IDL.hs b/msgpack-idl/Language/MessagePack/IDL.hs deleted file mode 100644 index 08c6784..0000000 --- a/msgpack-idl/Language/MessagePack/IDL.hs +++ /dev/null @@ -1,9 +0,0 @@ -module Language.MessagePack.IDL ( - module Language.MessagePack.IDL.Syntax, - module Language.MessagePack.IDL.Parser, - module Language.MessagePack.IDL.CodeGen.Haskell, - ) where - -import Language.MessagePack.IDL.Syntax -import Language.MessagePack.IDL.Parser -import Language.MessagePack.IDL.CodeGen.Haskell diff --git a/msgpack-idl/Language/MessagePack/IDL/Check.hs b/msgpack-idl/Language/MessagePack/IDL/Check.hs deleted file mode 100644 index 3207365..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/Check.hs +++ /dev/null @@ -1,9 +0,0 @@ -module Language.MessagePack.IDL.Check ( - check, - ) where - -import Language.MessagePack.IDL.Syntax - --- TODO: Implement it! -check :: Spec -> Bool -check _ = True diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Cpp.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Cpp.hs deleted file mode 100644 index 951e1a4..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Cpp.hs +++ /dev/null @@ -1,298 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Cpp ( - Config(..), - generate, - ) where - -import Data.Char -import Data.List -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - , configNameSpace :: String - , configPFICommon :: Bool - } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - let name = takeBaseName configFilePath - once = map toUpper name - ns = LT.splitOn "::" $ LT.pack configNameSpace - - typeHeader - | configPFICommon = - [lt|#include <msgpack.hpp>|] - | otherwise = - [lt|#include <msgpack.hpp>|] - serverHeader - | configPFICommon = - [lt|#include <pficommon/network/mprpc.h> -#include <pficommon/lang/bind.h>|] - | otherwise = - [lt|#include <msgpack/rpc/server.h>|] - clientHeader - | configPFICommon = - [lt|#include <pficommon/network/mprpc.h>|] - | otherwise = - [lt|#include <msgpack/rpc/client.h>|] - - LT.writeFile (name ++ "_types.hpp") $ templ configFilePath ns once "TYPES" [lt| -#include <vector> -#include <map> -#include <string> -#include <stdexcept> -#include <stdint.h> -#{typeHeader} - -#{genNameSpace ns $ LT.concat $ map (genTypeDecl name) spec } -|] - - LT.writeFile (name ++ "_server.hpp") $ templ configFilePath (snoc ns "server") once "SERVER" [lt| -#include "#{name}_types.hpp" -#{serverHeader} - -#{genNameSpace (snoc ns "server") $ LT.concat $ map (genServer configPFICommon) spec} -|] - - LT.writeFile (name ++ "_client.hpp") $ templ configFilePath (snoc ns "client") once "CLIENT" [lt| -#include "#{name}_types.hpp" -#{clientHeader} - -#{genNameSpace (snoc ns "client") $ LT.concat $ map (genClient configPFICommon) spec} -|] - -genTypeDecl :: String -> Decl -> LT.Text -genTypeDecl _ MPMessage {..} = - genMsg msgName msgFields False - -genTypeDecl _ MPException {..} = - genMsg excName excFields True - -genTypeDecl _ MPType { .. } = - [lt| -typedef #{genType tyType} #{tyName}; -|] - -genTypeDecl _ _ = "" - -genMsg name flds isExc = - let fields = map f flds - fs = map (maybe undefined fldName) $ sortField flds - in [lt| -struct #{name}#{e} { -public: - - #{destructor} - MSGPACK_DEFINE(#{T.intercalate ", " fs}); -#{LT.concat fields} -}; -|] - where - e = if isExc then [lt| : public std::exception|] else "" - destructor = if isExc then [lt|~#{name}() throw() {} -|] else "" - - f Field {..} = [lt| - #{genType fldType} #{fldName};|] - -sortField flds = - flip map [0 .. maximum $ [-1] ++ map fldId flds] $ \ix -> - find ((==ix). fldId) flds - -genServer :: Bool -> Decl -> LT.Text -genServer False MPService {..} = [lt| -template <class Impl> -class #{serviceName} : public msgpack::rpc::server::base { -public: - - void dispatch(msgpack::rpc::request req) { - try { - std::string method; - req.method().convert(&method); -#{LT.concat $ map genMethodDispatch serviceMethods} - } catch (const msgpack::type_error& e) { - req.error(msgpack::rpc::ARGUMENT_ERROR); - } catch (const std::exception& e) { - req.error(std::string(e.what())); - } - } -}; -|] - where - genMethodDispatch Function {..} = - -- TODO: FIX IT! - let typs = map (genRetType . maybe Nothing (Just . fldType)) $ sortField methodArgs in - let params = map g methodArgs in - case params of - [] -> [lt| - if (method == "#{methodName}") { - req.result<#{genRetType methodRetType} >(static_cast<Impl*>(this)->#{methodName}()); - return; - } -|] - _ -> [lt| - if (method == "#{methodName}") { - msgpack::type::tuple<#{LT.intercalate ", " typs} > params; - req.params().convert(¶ms); - req.result<#{genRetType methodRetType} >(static_cast<Impl*>(this)->#{methodName}(#{LT.intercalate ", " params})); - return; - } -|] - where - g fld = [lt|params.get<#{show $ fldId fld}>()|] - - genMethodDispatch _ = "" - -genServer True MPService {..} = [lt| -template <class Impl> -class #{serviceName} : public pfi::network::mprpc::rpc_server { -public: - #{serviceName}(double timeout_sec): rpc_server(timeout_sec) { -#{LT.concat $ map genSetMethod serviceMethods} - } -}; -|] - where - genSetMethod Function {..} = - let typs = map (genRetType . maybe Nothing (Just . fldType)) $ sortField methodArgs - sign = [lt|#{genRetType methodRetType}(#{LT.intercalate ", " typs})|] - phs = LT.concat $ [[lt|, pfi::lang::_#{show ix}|] | ix <- [1 .. length (typs)]] - in [lt| - rpc_server::add<#{sign} >("#{methodName}", pfi::lang::bind(&Impl::#{methodName}, static_cast<Impl*>(this)#{phs}));|] - - genSetMethod _ = "" - -genServer _ _ = "" - -genClient :: Bool -> Decl -> LT.Text -genClient False MPService {..} = [lt| -class #{serviceName} { -public: - #{serviceName}(const std::string &host, uint64_t port) - : c_(host, port) {} -#{LT.concat $ map genMethodCall serviceMethods} -private: - msgpack::rpc::client c_; -}; -|] - where - genMethodCall Function {..} = - let args = LT.intercalate ", " $ map arg methodArgs in - let vals = LT.concat $ map val methodArgs in - case methodRetType of - Nothing -> [lt| - void #{methodName}(#{args}) { - c_.call("#{methodName}"#{vals}); - } -|] - Just typ -> [lt| - #{genType typ} #{methodName}(#{args}) { - return c_.call("#{methodName}"#{vals}).get<#{genType typ} >(); - } -|] - where - arg Field {..} = [lt|#{genType fldType} #{fldName}|] - val Field {..} = [lt|, #{fldName}|] - - genMethodCall _ = "" - -genClient True MPService {..} = [lt| -class #{serviceName} : public pfi::network::mprpc::rpc_client { -public: - #{serviceName}(const std::string &host, uint64_t port, double timeout_sec) - : rpc_client(host, port, timeout_sec) {} -#{LT.concat $ map genMethodCall serviceMethods} -private: -}; -|] - where - genMethodCall Function {..} = - let typs = map (genRetType . maybe Nothing (\f -> Just (fldType f))) $ sortField methodArgs - sign = [lt|#{genRetType methodRetType}(#{LT.intercalate ", " typs})|] - args = LT.intercalate ", " $ map arg methodArgs - vals = LT.intercalate ", " $ map val methodArgs in - case methodRetType of - Nothing -> [lt| - void #{methodName}(#{args}) { - call<#{sign}>("#{methodName}")(#{vals}); - } -|] - Just t -> [lt| - #{genType t} #{methodName}(#{args}) { - return call<#{sign}>("#{methodName}")(#{vals}); - } -|] - where - arg Field {..} = [lt|#{genType fldType} #{fldName}|] - val Field {..} = [lt|#{fldName}|] - - genMethodCall _ = "" - -genClient _ _ = "" - -genType :: Type -> LT.Text -genType (TInt sign bits) = - let base = if sign then "int" else "uint" :: LT.Text in - [lt|#{base}#{show bits}_t|] -genType (TFloat False) = - [lt|float|] -genType (TFloat True) = - [lt|double|] -genType TBool = - [lt|bool|] -genType TRaw = - [lt|std::string|] -genType TString = - [lt|std::string|] -genType (TList typ) = - [lt|std::vector<#{genType typ} >|] -genType (TMap typ1 typ2) = - [lt|std::map<#{genType typ1}, #{genType typ2} >|] -genType (TUserDef className params) = - [lt|#{className}|] -genType (TTuple ts) = - -- TODO: FIX - foldr1 (\t1 t2 -> [lt|std::pair<#{t1}, #{t2} >|]) $ map genType ts -genType TObject = - [lt|msgpack::object|] - -genRetType :: Maybe Type -> LT.Text -genRetType Nothing = [lt|void|] -genRetType (Just t) = genType t - -templ :: FilePath -> [LT.Text] -> String -> String -> LT.Text -> LT.Text -templ filepath ns once name content = [lt| -// This file is auto-generated from #{filepath} -// *** DO NOT EDIT *** - -#ifndef #{namespace}_#{once}_#{name}_HPP_ -#define #{namespace}_#{once}_#{name}_HPP_ - -#{content} - -#endif // #{namespace}_#{once}_#{name}_HPP_ -|] where - namespace = LT.intercalate "_" $ map LT.toUpper ns - - -genNameSpace :: [LT.Text] -> LT.Text -> LT.Text -genNameSpace namespace content = f namespace - where - f [] = [lt|#{content}|] - f (n:ns) = [lt| -namespace #{n} { -#{f ns} -} // namespace #{n} -|] - -snoc xs x = xs ++ [x] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Erlang.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Erlang.hs deleted file mode 100644 index e2e8d5d..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Erlang.hs +++ /dev/null @@ -1,189 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Erlang ( - Config(..), - generate, - ) where - -import Data.Char -import Data.List -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - let name = takeBaseName configFilePath - once = map toUpper name - - headerFile = name ++ "_types.hrl" - - LT.writeFile (headerFile) $ templ configFilePath once "TYPES" [lt| --ifndef(#{once}). --define(#{once}, 1). - --type mp_string() :: binary(). - -#{LT.concat $ map (genTypeDecl name) spec } - --endif. -|] - - LT.writeFile (name ++ "_server.tmpl.erl") $ templ configFilePath once "SERVER" [lt| - --module(#{name}_server). --author('@msgpack-idl'). - --include("#{headerFile}"). - -#{LT.concat $ map genServer spec} -|] - - LT.writeFile (name ++ "_client.erl") [lt| -% This file is automatically generated by msgpack-idl. --module(#{name}_client). --author('@msgpack-idl'). - --include("#{headerFile}"). --export([connect/3, close/1]). - -#{LT.concat $ map genClient spec} -|] - -genTypeDecl :: String -> Decl -> LT.Text -genTypeDecl _ MPMessage {..} = - genMsg msgName msgFields False - -genTypeDecl _ MPException {..} = - genMsg excName excFields True - -genTypeDecl _ MPType { .. } = - [lt| --type #{tyName}() :: #{genType tyType}. -|] - -genTypeDecl _ _ = "" - -genMsg name flds isExc = - let fields = map f flds - in [lt| --type #{name}() :: [ - #{LT.intercalate "\n | " fields} - ]. % #{e} -|] - where - e = if isExc then [lt| (exception)|] else "" - f Field {..} = [lt|#{genType fldType} % #{fldName}|] - -sortField flds = - flip map [0 .. maximum $ [-1] ++ map fldId flds] $ \ix -> - find ((==ix). fldId) flds - -makeExport i Function {..} = - let j = i + length methodArgs in - [lt|#{methodName}/#{show j}|] -makeExport _ _ = "" - - -genServer :: Decl -> LT.Text -genServer MPService {..} = [lt| - --export([#{LT.intercalate ", " $ map (makeExport 0) serviceMethods}]). - -#{LT.concat $ map genSetMethod serviceMethods} - -|] - where - genSetMethod Function {..} = - let typs = map (genRetType . maybe Nothing (Just . fldType)) $ sortField methodArgs - args = map f methodArgs - f Field {..} = [lt|#{capitalize0 fldName}|] - capitalize0 str = T.cons (toUpper $ T.head str) (T.tail str) - - in [lt| --spec #{methodName}(#{LT.intercalate ", " typs}) -> #{genRetType methodRetType}. -#{methodName}(#{LT.intercalate ", " args}) -> - Reply = <<"ok">>, % write your code here - Reply. -|] - genSetMethod _ = "" - -genServer _ = "" - -genClient :: Decl -> LT.Text -genClient MPService {..} = [lt| - --export([#{LT.intercalate ", " $ map (makeExport 1) serviceMethods}]). - --spec connect(inet:ip_address(), inet:port_number(), [proplists:property()]) -> {ok, pid()} | {error, any()}. -connect(Host,Port,Options)-> - msgpack_rpc_client:connect(tcp,Host,Port,Options). - --spec close(pid())-> ok. -close(Pid)-> - msgpack_rpc_client:close(Pid). - -#{LT.concat $ map genMethodCall serviceMethods} -|] - where - genMethodCall Function {..} = - let typs = map (genRetType . maybe Nothing (Just . fldType)) $ sortField methodArgs - args = map f methodArgs - f Field {..} = [lt|#{capitalize0 fldName}|] - capitalize0 str = T.cons (toUpper $ T.head str) (T.tail str) - in [lt| --spec #{methodName}(pid(), #{LT.intercalate ", " typs}) -> #{genRetType methodRetType}. -#{methodName}(Pid, #{LT.intercalate ", " args}) -> - msgpack_rpc_client:call(Pid, #{methodName}, [#{LT.intercalate ", " args}]). -|] - where - arg Field {..} = [lt|#{genType fldType} #{fldName}|] - val Field {..} = [lt|#{fldName}|] - - genMethodCall _ = "" - -genClient _ = "" - -genType :: Type -> LT.Text -genType (TInt sign bits) = - let base = if sign then "non_neg_integer" else "integer" :: LT.Text in - [lt|#{base}()|] -genType (TFloat _) = - [lt|float()|] -genType TBool = - [lt|boolean()|] -genType TRaw = - [lt|binary()|] -genType TString = - [lt|mp_string()|] -genType (TList typ) = - [lt|list(#{genType typ})|] -genType (TMap typ1 typ2) = - [lt|list({#{genType typ1}, #{genType typ2}})|] -genType (TUserDef className params) = - [lt|#{className}()|] -genType (TTuple ts) = - -- TODO: FIX - foldr1 (\t1 t2 -> [lt|{#{t1}, #{t2}}|]) $ map genType ts -genType TObject = - [lt|term()|] - -genRetType :: Maybe Type -> LT.Text -genRetType Nothing = [lt|void()|] -genRetType (Just t) = genType t - -templ :: FilePath -> String -> String -> LT.Text -> LT.Text -templ filepath once name content = [lt| -% This file is auto-generated from #{filepath} - -#{content}|] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Haskell.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Haskell.hs deleted file mode 100644 index 40fbff6..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Haskell.hs +++ /dev/null @@ -1,209 +0,0 @@ -{-# LANGUAGE TemplateHaskell, QuasiQuotes #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE RecordWildCards #-} - -module Language.MessagePack.IDL.CodeGen.Haskell ( - Config(..), - generate, - ) where - -import Data.Char -import Data.Monoid -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import Text.Shakespeare.Text - -import Language.MessagePack.IDL.Syntax as MP - -data Config - = Config - { configFilePath :: FilePath - } - -generate :: Config -> Spec -> IO () -generate Config {..} spec = do - LT.writeFile "Types.hs" [lt| -{-# LANGUAGE TemplateHaskell #-} - -module Types where - -import Data.Int -import Data.MessagePack -import Data.Map (Map) -import qualified Data.Map as Map -import Data.Words -#{LT.concat $ map genTypeDecl spec} -|] - - LT.writeFile "Server.hs" [lt| -|] - - LT.writeFile "Client.hs" [lt| -module Server where - -import Data.ByteString (ByteString) -import qualified Data.ByteString as B -import Data.Map (Map) -import qualified Data.Map as M -import Data.Text (Text) -import qualified Data.Text as T - -import qualified Network.MessagePackRpc.Client as MP - -import Types -#{LT.concat $ map genClient spec} -|] - -genClient :: Decl -> LT.Text -genClient MPService {..} = - [lt| -newtype #{monadName} m a - = #{monadName} { un#{monadName} :: StateT () m a } - deriving (Monad, MonadIO, MonadTrans, MonadState ()) -#{LT.concat $ map genMethod serviceMethods} -|] - where - monadName = classize (serviceName) `mappend` "T" - genMethod Function {..} = - let ts = map (genType . fldType) methodArgs in - let typs = ts ++ [ [lt|#{monadName} (#{genRetType methodRetType})|] ] in - [lt| -#{methodize methodName} :: #{LT.intercalate " -> " typs} -#{methodize methodName} = MP.method "#{methodName}" -|] - genMethod f = error $ "unsupported: " ++ show f - -genClient _ = "" - -genTypeDecl :: Decl -> LT.Text -genTypeDecl MPMessage {..} = - let mems = LT.intercalate "\n , " $ map f msgFields in - [lt| -data #{dataName} - = #{dataName} - { #{mems} - } - deriving (Eq, Show) -deriveObject False ''#{dataName} -|] - where - dataName = classize msgName - f Field {..} = - let fname = uncapital dataName `mappend` (capital $ camelize fldName) in - [lt|#{fname} :: #{genType fldType}|] - -genTypeDecl _ = "" - -genType :: Type -> LT.Text -genType (TInt sign bits) = - let base = if sign then "Int" else "Word" :: T.Text in - [lt|#{base}#{show bits}|] -genType (TFloat False) = - [lt|Float|] -genType (TFloat True) = - [lt|Double|] -genType TBool = - [lt|Bool|] -genType TRaw = - [lt|ByteString|] -genType TString = - [lt|Text|] -genType (TList typ) = - [lt|[#{genType typ}]|] -genType (TMap typ1 typ2) = - [lt|Map (#{genType typ1}) (#{genType typ2})|] -genType (TTuple typs) = - [lt|(#{LT.intercalate ", " $ map genType typs})|] -genType (TUserDef name params) = - [lt|#{classize name}|] -genType (TObject) = - undefined - -genRetType :: Maybe Type -> LT.Text -genRetType Nothing = "()" -genRetType (Just t) = genType t - -classize :: T.Text -> T.Text -classize = capital . camelize - -methodize :: T.Text -> T.Text -methodize = uncapital . camelize - -camelize :: T.Text -> T.Text -camelize = T.concat . map capital . T.words . T.map ubToSpc where - ubToSpc '_' = ' ' - ubToSpc c = c - -capital :: T.Text -> T.Text -capital word = - (T.map toUpper $ T.take 1 word) `mappend` T.drop 1 word - -uncapital :: T.Text -> T.Text -uncapital word = - (T.map toLower $ T.take 1 word) `mappend` T.drop 1 word - -{- -genServer :: Spec -> IO Builder -genServer = undefined - -genClient :: Spec -> IO Builder -genClient spec = do - decs <- runQ $ genClient' spec - putStrLn $ pprint decs - undefined - -genClient' :: Spec -> Q [Dec] -genClient' spec = return . concat =<< mapM genDecl spec - -genDecl :: Decl -> Q [Dec] -genDecl (Message name super fields) = do - let clsName = mkName $ T.unpack name - con = recC clsName $ map genFld fields - d <- dataD (cxt []) clsName [] [con] [''Eq, ''Ord, ''Show] - return [d] - where - genFld (Field fid req typ fname _) = - varStrictType (mkName $ uncapital $ T.unpack name ++ capital (T.unpack fname)) (strictType notStrict $ genType typ) - -genDecl (Service name version meths) = do - return [] - -genDecl _ = do - d <- dataD (cxt []) (mkName "Ign") [] [] [] - return [d] - -genType :: MP.Type -> Q TH.Type -genType (TInt False 8 ) = conT ''Word8 -genType (TInt False 16) = conT ''Word16 -genType (TInt False 32) = conT ''Word32 -genType (TInt False 64) = conT ''Word64 -genType (TInt True 8 ) = conT ''Int8 -genType (TInt True 16) = conT ''Int16 -genType (TInt True 32) = conT ''Int32 -genType (TInt True 64) = conT ''Int64 - -genType (TFloat False) = conT ''Float -genType (TFloat True ) = conT ''Double - -genType TBool = conT ''Bool -genType TRaw = conT ''B.ByteString -genType TString = conT ''T.Text - -genType (TList typ) = - listT `appT` genType typ -genType (TMap kt vt) = - [t| M.Map $(genType kt) $(genType vt) |] - -genType (TClass name) = - conT $ mkName $ capital $ T.unpack name - -genType (TTuple typs) = - foldl appT (tupleT (length typs)) (map genType typs) - -capital (c:cs) = toUpper c : cs -capital cs = cs - -uncapital (c:cs) = toLower c : cs -uncapital cs = cs --} diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Java.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Java.hs deleted file mode 100644 index b92c0ed..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Java.hs +++ /dev/null @@ -1,349 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Java ( - Config(..), - generate, - ) where - -import Data.Char -import Data.Monoid -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import System.Directory -import Text.Shakespeare.Text - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - , configPackage :: String - } - deriving (Show, Eq) - -generate :: Config -> Spec -> IO() -generate config spec = do - let typeAlias = map genAlias $ filter isMPType spec - dirName = joinPath $ map LT.unpack $ LT.split (== '.') $ LT.pack $ configPackage config - - genTuple config - createDirectoryIfMissing True dirName - mapM_ (genClient typeAlias config) spec - mapM_ (genStruct typeAlias config) spec - mapM_ (genException typeAlias config) spec - -{-- - LT.writeFile (name ++ "Server.java") $ templ (configFilePath ++ configPackage ++"/server/")[lt| -import org.msgpack.rpc.Server; -package #{configPackage} - -#{LT.concat $ map genServer spec} -|] ---} - -genTuple :: Config -> IO() -genTuple Config {..} = do - LT.writeFile("Tuple.java") $ templ (configFilePath) [lt| -package #{configPackage}; -public class Tuple<T, U> { - public T a; - public U b; -}; -|] - -genImport :: FilePath -> Decl -> LT.Text -genImport packageName MPMessage {..} = - [lt|import #{packageName}.#{formatClassNameT msgName}; -|] -genImport _ _ = "" - -genStruct :: [(T.Text, Type)] -> Config -> Decl -> IO() -genStruct alias Config{..} MPMessage {..} = do - let params = if null msgParam then "" else [lt|<#{T.intercalate ", " msgParam}>|] - resolvedMsgFields = map (resolveFieldAlias alias) msgFields - hashMapImport | not $ null [() | TMap _ _ <- map fldType resolvedMsgFields] = [lt|import java.util.HashMap;|] - | otherwise = "" - arrayListImport | not $ null [() | TList _ <- map fldType resolvedMsgFields] = [lt|import java.util.ArrayList;|] - | otherwise = "" - dirName = joinPath $ map LT.unpack $ LT.split (== '.') $ LT.pack configPackage - fileName = dirName ++ "/" ++ (T.unpack $ formatClassNameT msgName) ++ ".java" - - LT.writeFile fileName $ templ configFilePath [lt| -package #{configPackage}; - -#{hashMapImport} -#{arrayListImport} -import org.msgpack.MessagePack; -import org.msgpack.annotation.Message; - -@Message -public class #{formatClassNameT msgName} #{params} { - -#{LT.concat $ map genDecl resolvedMsgFields} - public #{formatClassNameT msgName}() { - #{LT.concat $ map genInit resolvedMsgFields} - } -}; -|] -genStruct _ _ _ = return () - -resolveMethodAlias :: [(T.Text, Type)] -> Method -> Method -resolveMethodAlias alias Function {..} = Function methodInherit methodName (resolveRetTypeAlias alias methodRetType) (map (resolveFieldAlias alias) methodArgs) -resolveMethodAlias _ f = f - -resolveFieldAlias :: [(T.Text, Type)] -> Field -> Field -resolveFieldAlias alias Field {..} = Field fldId (resolveTypeAlias alias fldType) fldName fldDefault - -resolveTypeAlias :: [(T.Text, Type)] -> Type -> Type -resolveTypeAlias alias ty = let fixedAlias = resolveTypeAlias alias in - case ty of - TNullable t -> - TNullable $ fixedAlias t - TList t -> - TList $ fixedAlias t - TMap s t -> - TMap (fixedAlias s) (fixedAlias t) - TTuple ts -> - TTuple $ map fixedAlias ts - TUserDef className params -> - case lookup className alias of - Just resolvedType -> resolvedType - Nothing -> TUserDef className (map fixedAlias params) - _ -> ty - -resolveRetTypeAlias :: [(T.Text, Type)] -> Maybe Type -> Maybe Type -resolveRetTypeAlias alias Nothing = Nothing -resolveRetTypeAlias alias (Just t) = Just (resolveTypeAlias alias t) - -genInit :: Field -> LT.Text -genInit Field {..} = case fldDefault of - Nothing -> "" - Just defaultVal -> [lt| #{fldName} = #{genLiteral defaultVal};|] - -genDecl :: Field -> LT.Text -genDecl Field {..} = - [lt| public #{genType fldType} #{fldName}; -|] - -genException :: [(T.Text, Type)] -> Config -> Decl -> IO() -genException alias Config{..} MPException{..} = do - LT.writeFile ( (formatClassName $ T.unpack excName) ++ ".java") $ templ configFilePath [lt| -package #{configPackage}; - -import org.msgpack.MessagePack; -import org.msgpack.annotation.Message; - -@Message -public class #{formatClassNameT excName} #{params}{ -#{LT.concat $ map genDecl excFields} - public #{formatClassNameT excName}() { - #{LT.concat $ map genInit excFields} - } -}; -|] - where - params = if null excParam then "" else [lt|<#{T.intercalate ", " excParam}>|] - super = case excSuper of - Just x -> [st|extends #{x}|] - Nothing -> "" -genException _ _ _ = return () - -genClient :: [(T.Text, Type)] -> Config -> Decl -> IO() -genClient alias Config {..} MPService {..} = do - let resolvedServiceMethods = map (resolveMethodAlias alias) serviceMethods - hashMapImport | not $ null [() | Just (TMap _ _) <- map methodRetType resolvedServiceMethods ] = [lt|import java.util.HashMap;|] - | otherwise = "" - arrayListImport | not $ null [() | Just (TList _) <- map methodRetType resolvedServiceMethods] = [lt|import java.util.ArrayList;|] - | otherwise = "" - dirName = joinPath $ map LT.unpack $ LT.split (== '.') $ LT.pack configPackage - fileName = dirName ++ "/" ++ (T.unpack className) ++ ".java" - - LT.writeFile fileName $ templ configFilePath [lt| -package #{configPackage}; - -#{hashMapImport} -#{arrayListImport} -import org.msgpack.rpc.Client; -import org.msgpack.rpc.loop.EventLoop; - -public class #{className} { - public #{className}(String host, int port, double timeout_sec) throws Exception { - EventLoop loop = EventLoop.defaultEventLoop(); - c_ = new Client(host, port, loop); - iface_ = c_.proxy(RPCInterface.class); - } - - public static interface RPCInterface { -#{LT.concat $ map genSignature resolvedServiceMethods} - } - -#{LT.concat $ map genMethodCall resolvedServiceMethods} - private Client c_; - private RPCInterface iface_; -}; -|] - where - className = (formatClassNameT serviceName) `mappend` "Client" - genMethodCall Function {..} = - let args = T.intercalate ", " $ map genArgs' methodArgs - vals = T.intercalate ", " $ pack methodArgs genVal in - case methodRetType of - Nothing -> [lt| - public void #{methodName}(#{args}) { - iface_.#{methodName}(#{vals}); - } -|] - Just typ -> [lt| - public #{genType typ} #{methodName}(#{args}) { - return iface_.#{methodName}(#{vals}); - } -|] - genMethodCall _ = "" - -genClient _ _ _ = return () - -genSignature :: Method -> LT.Text -genSignature Function {..} = - [lt| #{genRetType methodRetType} #{methodName}(#{args}); -|] - where - args = (T.intercalate ", " $ map genArgs' methodArgs) -genSignature _ = "" - -genArgs :: Maybe Field -> T.Text -genArgs (Just field) = genArgs' field -genArgs Nothing = "" - -genArgs' :: Field -> T.Text -genArgs' Field {..} = [st|#{genType fldType} #{fldName}|] - -pack :: [Field] -> (Maybe Field -> T.Text) -> [T.Text] -pack fields converter= - let ixs = map (\f -> fldId f) fields - dic = zip ixs [0..] - m = maximum (-1 :ixs) - sortedIxs = [ lookup ix dic | ix <- [0..m]] :: [Maybe Int] in - map (\sIx -> case sIx of - Nothing -> converter Nothing - Just i -> converter $ Just (fields!!i) ) sortedIxs - -genVal :: Maybe Field -> T.Text -genVal Nothing = "null" -genVal (Just field) = fldName field - -formatClassNameT :: T.Text -> T.Text -formatClassNameT = T.pack . formatClassName . T.unpack - -formatClassName :: String -> String -formatClassName = concatMap (\(c:cs) -> toUpper c:cs) . words . map (\c -> if c=='_' then ' ' else c) - -genServer :: Decl -> LT.Text -genServer _ = "" - -genLiteral :: Literal -> LT.Text -genLiteral (LInt i) = [lt|#{show i}|] -genLiteral (LFloat d) = [lt|#{show d}|] -genLiteral (LBool b) = [lt|#{show b}|] -genLiteral LNull = [lt|null|] -genLiteral (LString s) = [lt|#{show s}|] - -associateBracket :: [LT.Text] -> LT.Text -associateBracket msgParam = - if null msgParam then "" else [lt|<#{LT.intercalate ", " msgParam}>|] - - -genType :: Type -> LT.Text -genType (TInt _ bits) = case bits of - 8 -> [lt|byte|] - 16 -> [lt|short|] - 32 -> [lt|int|] - 64 -> [lt|long|] - _ -> [lt|int|] -genType (TFloat False) = - [lt|float|] -genType (TFloat True) = - [lt|double|] -genType TBool = - [lt|boolean|] -genType TRaw = - [lt|String|] -genType TString = - [lt|String|] -genType (TList typ) = - [lt|ArrayList<#{genWrapperType typ} >|] -genType (TMap typ1 typ2) = - [lt|HashMap<#{genType typ1}, #{genType typ2} >|] -genType (TUserDef className params) = - [lt|#{formatClassNameT className} #{associateBracket $ map genType params}|] -genType (TTuple ts) = - -- TODO: FIX - foldr1 (\t1 t2 -> [lt|Tuple<#{t1}, #{t2} >|]) $ map genWrapperType ts -genType TObject = - [lt|org.msgpack.type.Value|] - -genRetType :: Maybe Type -> LT.Text -genRetType Nothing = [lt|void|] -genRetType (Just t) = genType t - -genTypeWithContext :: Spec -> Type -> LT.Text -genTypeWithContext spec t = case t of - (TUserDef className params) -> - case lookup className $ map genAlias $ filter isMPType spec of - Just x -> genType x - Nothing -> "" - otherwise -> genType t - -isMPType :: Decl -> Bool -isMPType MPType {..} = True -isMPType _ = False - -genAlias :: Decl -> (T.Text, Type) -genAlias MPType {..} = (tyName, tyType) -genAlias _ = ("", TBool) - -genTypeWithTypedef :: T.Text -> Decl -> Maybe Type -genTypeWithTypedef className MPType {..} = - if className == tyName then Just tyType else Nothing -genTypeWithTypedef className _ = Nothing - -genWrapperType :: Type -> LT.Text -genWrapperType (TInt _ bits) = case bits of - 8 -> [lt|Byte|] - 16 -> [lt|Short|] - 32 -> [lt|Integer|] - 64 -> [lt|Long|] - _ -> [lt|Integer|] -genWrapperType (TFloat False) = - [lt|Float|] -genWrapperType (TFloat True) = - [lt|Double|] -genWrapperType TBool = - [lt|Boolean|] -genWrapperType TRaw = - [lt|String|] -genWrapperType TString = - [lt|String|] -genWrapperType (TList typ) = - [lt|ArrayList<#{genWrapperType typ} >|] -genWrapperType (TMap typ1 typ2) = - [lt|HashMap<#{genWrapperType typ1}, #{genWrapperType typ2} >|] -genWrapperType (TUserDef className params) = - [lt|#{formatClassNameT className} #{associateBracket $ map genWrapperType params}|] -genWrapperType (TTuple ts) = - -- TODO: FIX - foldr1 (\t1 t2 -> [lt|Tuple<#{t1}, #{t2} >|]) $ map genWrapperType ts -genWrapperType TObject = - [lt|org.msgpack.type.Value|] -genWrapperType (TNullable typ) = - genWrapperType typ - -templ :: FilePath -> LT.Text -> LT.Text -templ filepath content = [lt| -// This file is auto-generated from #{filepath} -// *** DO NOT EDIT *** - -#{content} - -|] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Perl.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Perl.hs deleted file mode 100644 index 357ef5d..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Perl.hs +++ /dev/null @@ -1,104 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Perl ( - Config(..), - generate, - ) where - -import Data.Char -import Data.List -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - , configNameSpace :: String - } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - let name = takeBaseName configFilePath - once = map toUpper name - ns = LT.splitOn "::" $ LT.pack configNameSpace - --- types - mapM_ writeType spec - --- clients - LT.writeFile (name ++ "_client.pm") [lt| -package #{name}_client; -use strict; -use warnings; -use AnyEvent::MPRPC::Client; -#{LT.concat $ map genClient spec} -|] - -writeType :: Decl -> IO () -writeType MPMessage {..} = - let fields = sortBy (\x y -> fldId x `compare` fldId y) msgFields - fieldNames = map fldName fields :: [T.Text] - packageName = msgName :: T.Text - in LT.writeFile (T.unpack packageName ++ ".pm") [lt|package #{LT.pack $ T.unpack packageName}; -sub new { - return bless { #{LT.concat $ map f fieldNames} }; -} - -1; -|] - where - f :: T.Text -> LT.Text - f name = LT.append (LT.pack $ T.unpack name) $ LT.pack " => \"\"," - -writeType MPException {..} = - let fields = sortBy (\x y -> fldId x `compare` fldId y) excFields - fieldNames = map fldName fields :: [T.Text] - packageName = excName :: T.Text - in LT.writeFile (T.unpack packageName ++ ".pm") [lt|package #{LT.pack $ T.unpack packageName}; -sub new { - return bless { #{LT.concat $ map f fieldNames} }; -} - -1; -|] - where - f :: T.Text -> LT.Text - f name = LT.append (LT.pack $ T.unpack name) $ LT.pack " => \"\",\n" - -writeType _ = return () - -genClient :: Decl -> LT.Text -genClient MPService {..} = [lt| -sub new { - my ($self, $host, $port) = @_; - my $client = AnyEvent::MPRPC::Client->new( - host => $host, - port => $port - ); - bless { client => $client }, $self; -}; - -sub bar { - my ($self, $lang, $xs) = @_; - $self->{'client'}->call(bar => [$xs, $lang])->recv; -}; - -1; -|] - -genClient _ = "" - -templ :: FilePath -> String -> String -> LT.Text -> LT.Text -templ filepath once name content = [lt| -// This file is auto-generated from #{filepath} -// *** DO NOT EDIT *** - -#{content} - -|] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Php.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Php.hs deleted file mode 100644 index 1c5bce6..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Php.hs +++ /dev/null @@ -1,181 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Php ( - Config(..), - generate, - ) where - -import Data.Char -import Data.List -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text -import Data.Monoid - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - let name = takeBaseName configFilePath - once = map toUpper name - - LT.writeFile (name ++ "_types.php") $ templ configFilePath once "TYPES" [lt| -include_once 'Net/MessagePackRPC.php'; - -#{LT.concat $ map genTypeDecl spec} - -class ObjectDecoder { - public static $USER_DEFINED_CLASSES = array( - #{LT.concat $ map genClassName spec} - ); - public static function decodeToObject($ret_array, $type_array) { - if ($type_array == "") { - // do nothing - $ret = $ret_array; - } else if (in_array($type_array, self::$USER_DEFINED_CLASSES)) { - // array -> object - $ret = new $type_array(); - $ret_keys = array_keys((array)$ret); - for ($i = 0; $i < count($ret_keys); $i++) { - $ret->{$ret_keys[$i]} = $ret_array[$i]; - } - } else { - // dissolve array - if (is_array($type_array)) { - if (count($type_array) == 1) { - // if array - foreach ($type_array as $key => $type) { - foreach ($ret_array as $ret_key => $ret_value) { - $ret[$ret_key] = $this->decodeToObject($ret_value, $type); - } - } - } else { - // if tuple - $ret = array(); - $i = 0; - foreach ($type_array as $type) { - $ret[$i] = $this->decodeToObject($ret_array[$i], $type); - $i++; - } - } - } else { - // type error - return $ret_array; - } - } - return $ret; - } -} - -|] - - LT.writeFile (name ++ "_client.php") [lt| -<?php -include_once(dirname(__FILE__)."/#{name}_types.php"); - -#{LT.concat $ map genClient spec} -?> -|] - -genClassName :: Decl -> LT.Text -genClassName MPMessage {..} = - [lt| "#{msgName}", - |] -genClassName _ = "" - -genTypeDecl :: Decl -> LT.Text -genTypeDecl MPMessage {..} = - genMsg msgName msgFields False - -genTypeDecl MPException {..} = - genMsg excName excFields True - -genTypeDecl _ = "" - -genMsg name flds isExc = - let fields = map f flds - fs = map (maybe undefined fldName) $ sortField flds - in [lt| -class #{name}#{e} { - -#{LT.concat fields} -} -|] - where - e = if isExc then [lt| extends Exception|] else "" - - f Field {..} = [lt| public $#{fldName}; -|] - -sortField flds = - flip map [0 .. maximum $ [-1] ++ map fldId flds] $ \ix -> - find ((==ix). fldId) flds - -genClient :: Decl -> LT.Text -genClient MPService {..} = [lt| -class #{serviceName} { - public function __construct($host, $port) { - $this->client = new MessagePackRPC_Client($host, $port); - } -#{LT.concat $ map genMethodCall serviceMethods} - private $client; -} -|] - where - genMethodCall Function {..} = - let args = LT.intercalate ", " $ map arg methodArgs in - let sortedArgs = LT.intercalate ", " $ map (maybe undefined arg) $ sortField methodArgs in - case methodRetType of - Nothing -> [lt| - public function #{methodName}(#{args}) { - $this->client->call("#{methodName}", array(#{sortedArgs})); - } -|] - Just typ -> [lt| - public function #{methodName}(#{args}) { - $ret = $this->client->call("#{methodName}", array(#{sortedArgs})); - $type_array = #{genTypeArray typ}; - return ObjectDecoder::decodeToObject($ret, $type_array); - } -|] - where - arg Field {..} = [lt|$#{fldName}|] - - genMethodCall _ = "" - -genClient _ = "" - -genTypeArray :: Type -> LT.Text -genTypeArray (TList typ) = - [lt|array(#{genTypeArray typ})|] -genTypeArray (TMap typ1 typ2) = - [lt|array(#{genTypeArray typ1} => #{genTypeArray typ2})|] -genTypeArray (TUserDef className params) = - [lt|"#{className}"|] -genTypeArray (TTuple ts) = - foldr1 (\t1 t2 -> [lt|array(#{t1}, #{t2})|]) $ map genTypeArray ts -genTypeArray _ = [lt|""|] - -genType :: Type -> LT.Text -genType (TUserDef className params) = - [lt|#{className}|] -genType _ = "" - -templ :: FilePath -> String -> String -> LT.Text -> LT.Text -templ filepath once name content = [lt| -// This file is auto-generated from #{filepath} -// *** DO NOT EDIT *** -<?php -#{content} -?> -|] - -snoc xs x = xs ++ [x] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Python.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Python.hs deleted file mode 100644 index 2e696b5..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Python.hs +++ /dev/null @@ -1,172 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Python ( - Config(..), - generate, - ) where - -import Data.List -import Data.Monoid -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text -import System.Directory - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - createDirectoryIfMissing True (takeBaseName configFilePath); - setCurrentDirectory (takeBaseName configFilePath); - LT.writeFile "__init__.py" $ templ configFilePath [lt| -|] - LT.writeFile "types.py" $ templ configFilePath [lt| -import sys -import msgpack - -#{LT.concat $ map (genTypeDecl "") spec } -|] - - LT.writeFile "server.tmpl.py" $ templ configFilePath [lt| -import msgpackrpc -from types import * -# write your server here and change file name to server.py - -|] - - LT.writeFile "client.py" $ templ configFilePath [lt| -import msgpackrpc -from types import * - -#{LT.concat $ map (genClient) spec} -|] - -genTypeDecl :: String -> Decl -> LT.Text - -genTypeDecl _ MPType {..} = [lt| -class #{tyName}: - @staticmethod - def from_msgpack(arg): - return #{fromMsgpack tyType "arg"} -|] - -genTypeDecl _ MPMessage {..} = - genMsg msgName msgFields False - -genTypeDecl _ MPException {..} = - genMsg excName excFields True - -genTypeDecl _ _ = "" - -genMsg :: ToText a => a -> [Field] -> Bool -> LT.Text -genMsg name flds isExc = - let fs = zipWith (\ix -> maybe ("_UNUSED" `mappend` T.pack (show ix)) fldName) [0 .. ] (sortField flds) - in [lt| -class #{name}#{e}: - def __init__(self, #{LT.intercalate ", " $ map g fs}): -#{LT.concat $ map f flds} - def to_msgpack(self): - return (#{LT.concat $ map typ flds} - ) - - @staticmethod - def from_msgpack(arg): - return #{name}( - #{LT.intercalate ",\n " $ map make_arg flds}) -|] - - where - e = if isExc then [lt|(Exception)|] else "" - f Field {..} = [lt| self.#{fldName} = #{fldName} -|] - typ Field {..} = [lt| - self.#{fldName},|] - make_arg Field {..} = - let fldId_str = T.concat $ map T.pack ["arg[", (show fldId), "]"] in - [lt|#{fromMsgpack fldType fldId_str}|] - g str = [lt|#{str}|] - -sortField :: [Field] -> [Maybe Field] -sortField flds = - flip map [0 .. maximum $ [-1] ++ map fldId flds] $ \ix -> - find ((==ix). fldId) flds - -genClient :: Decl -> LT.Text -genClient MPService {..} = [lt| -class #{serviceName}: - def __init__ (self, host, port): - address = msgpackrpc.Address(host, port) - self.client = msgpackrpc.Client(address) -#{LT.concat $ map genMethodCall serviceMethods} -|] - where - genMethodCall Function {..} = - let arg_list = zipWith (\ix -> maybe ("_UNUSED" `mappend` T.pack (show ix)) fldName) [0 .. ] $ sortField methodArgs - args = LT.concat $ map (\x -> [lt|, #{x}|]) arg_list - in - case methodRetType of - Nothing -> [lt| - def #{methodName} (self#{args}): - self.client.call('#{methodName}'#{args}) -|] - Just ts -> [lt| - def #{methodName} (self#{args}): - retval = self.client.call('#{methodName}'#{args}) - return #{fromMsgpack ts "retval"} -|] - - genMethodCall _ = "" - -genClient _ = "" - -sanitize :: Char -> Char -sanitize '[' = '_' -sanitize ']' = '_' -sanitize c = c - -fromMsgpack :: Type -> T.Text -> LT.Text -fromMsgpack (TNullable t) name = fromMsgpack t name -fromMsgpack (TInt _ _) name = [lt|#{name}|] -fromMsgpack (TFloat False) name = [lt|#{name}|] -fromMsgpack (TFloat True) name = [lt|#{name}|] -fromMsgpack TBool name = [lt|#{name}|] -fromMsgpack TRaw name = [lt|#{name}|] -fromMsgpack TString name = [lt|#{name}|] -fromMsgpack (TList typ) name = - let - varname = T.append (T.pack "elem_") (T.map sanitize name) in - [lt|[#{fromMsgpack typ varname} for #{varname} in #{name}]|] - -fromMsgpack (TMap typ1 typ2) name = - let - keyname = T.append (T.pack "k_" ) $ T.map sanitize name - valname = T.append (T.pack "v_" ) $ T.map sanitize name - in - [lt|{#{fromMsgpack typ1 keyname} : #{fromMsgpack typ2 valname} for #{keyname},#{valname} in #{name}.items()}|] - -fromMsgpack (TUserDef className _) name = [lt|#{className}.from_msgpack(#{name})|] - -fromMsgpack (TTuple ts) name = - let elems = map (f name) (zip [0..] ts) in - [lt| (#{LT.intercalate ", " elems}) |] - where - f :: T.Text -> (Integer, Type) -> LT.Text - f n (i, (TUserDef className _ )) = [lt|#{className}.from_msgpack(#{n}[#{show i}]) |] - f n (i, _) = [lt|#{n}[#{show i}]|] - -fromMsgpack TObject name = [lt|#{name}|] - -templ :: FilePath -> LT.Text -> LT.Text -templ filepath content = [lt| -# This file is auto-generated from #{filepath} -# *** DO NOT EDIT *** - -#{content} -|] diff --git a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Ruby.hs b/msgpack-idl/Language/MessagePack/IDL/CodeGen/Ruby.hs deleted file mode 100644 index 4225d65..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/CodeGen/Ruby.hs +++ /dev/null @@ -1,285 +0,0 @@ -{-# LANGUAGE QuasiQuotes, RecordWildCards, OverloadedStrings #-} - -module Language.MessagePack.IDL.CodeGen.Ruby ( - Config(..), - generate, - ) where - -import Data.Char -import Data.List -import Data.Monoid -import qualified Data.Text as T -import qualified Data.Text.Lazy as LT -import qualified Data.Text.Lazy.IO as LT -import System.FilePath -import Text.Shakespeare.Text -import System.Directory - -import Language.MessagePack.IDL.Syntax - -data Config - = Config - { configFilePath :: FilePath - , configModule :: String - } - deriving (Show, Eq) - -generate:: Config -> Spec -> IO () -generate Config {..} spec = do - createDirectoryIfMissing True (takeBaseName configFilePath); - setCurrentDirectory (takeBaseName configFilePath); - let - mods = LT.splitOn "::" $ LT.pack configModule - - LT.writeFile "types.rb" $ templ configFilePath [lt| -require 'rubygems' -require 'msgpack/rpc' -#{genModule mods $ LT.concat $ map (genTypeDecl "") spec } -|] - - LT.writeFile ("client.rb") $ templ configFilePath [lt| -require 'rubygems' -require 'msgpack/rpc' -require File.join(File.dirname(__FILE__), 'types') - -#{genModule (snoc mods "Client") $ LT.concat $ map genClient spec}|] - -genTypeDecl :: String -> Decl -> LT.Text -genTypeDecl _ MPType {..} = [lt| -class #{capitalizeT tyName} - def #{capitalizeT tyName}.from_tuple(tuple) - #{fromTuple tyType "tuple"} - end - def to_tuple(o) - o - end -end -|] - -genTypeDecl _ MPMessage {..} = - genMsg msgName msgFields False - -genTypeDecl _ MPException {..} = - genMsg excName excFields True - -genTypeDecl _ _ = "" - -genMsg :: T.Text -> [Field] -> Bool -> LT.Text -genMsg name flds isExc = [lt| -class #{capitalizeT name}#{deriveError} - def initialize(#{T.intercalate ", " fs}) - #{LT.intercalate "\n " $ map makeSubst fs} - end - def to_tuple - [#{LT.intercalate ",\n " $ map make_tuple flds}] - end - def to_msgpack(out = '') - to_tuple.to_msgpack(out) - end - def #{capitalizeT name}.from_tuple(tuple) - #{capitalizeT name}.new( - #{LT.intercalate ",\n " $ map make_arg flds} - ) - end -#{indent 2 $ genAccessors sorted_flds} -end -|]-- #{indent 2 $ LT.concat writers} - where - sorted_flds = sortField flds - fs = map (maybe undefined fldName) sorted_flds --- afs = LT.intercalate ",\n " $ map make_tuple flds - make_tuple Field {..} = - [lt|#{toTuple True fldType fldName}|] - deriveError = if isExc then [lt| < StandardError|] else "" - make_arg Field {..} = - let fldIdstr = T.concat $ map T.pack ["tuple[", (show fldId), "]"] - in [lt|#{fromTuple fldType fldIdstr}|] - -makeSubst :: T.Text -> LT.Text -makeSubst fld = [lt| @#{fld} = #{fld} |] - -toTuple :: Bool -> Type -> T.Text -> LT.Text -toTuple _ (TTuple ts) name = - let elems = map (f name) (zip [0..] ts) in - [lt| [#{LT.concat elems}] |] - where - f :: T.Text -> (Integer, Type) -> LT.Text - f n (i, (TUserDef _fg _ )) = [lt|#{n}[#{show i}].to_tuple}, |] - f n (i, _) = [lt|#{n}[#{show i}], |] - -toTuple True t name = [lt|@#{toTuple False t name}|] -toTuple _ (TNullable t) name = [lt|#{toTuple False t name}|] -toTuple _ (TInt _ _) name = [lt|#{name}|] -toTuple _ (TFloat _) name = [lt|#{name}|] -toTuple _ TBool name = [lt|#{name}|] -toTuple _ TRaw name = [lt|#{name}|] -toTuple _ TString name = [lt|#{name}|] -toTuple _ (TList typ) name = [lt|#{name}.map {|x| #{toTuple False typ "x"}}|] -toTuple _ (TMap typ1 typ2) name = - [lt|#{name}.each_with_object({}) {|(k,v),h| h[#{toTuple False typ1 "k"}] = #{toTuple False typ2 "v"}}|] -toTuple _ (TUserDef _ _) name = [lt|#{name}.to_tuple|] - -toTuple _ _ _ = "" - -fromTuple :: Type -> T.Text -> LT.Text -fromTuple (TNullable t) name = [lt|#{fromTuple t name}|] -fromTuple (TInt _ _) name = [lt|#{name}|] -fromTuple (TFloat _) name = [lt|#{name}|] -fromTuple TBool name = [lt|#{name}|] -fromTuple TRaw name = [lt|#{name}|] -fromTuple TString name = [lt|#{name}|] -fromTuple (TList typ) name = - [lt|#{name}.map { |x| #{fromTuple typ "x"} }|] - -fromTuple (TMap typ1 typ2) name = - [lt|#{name}.each_with_object({}) {|(k,v),h| h[#{fromTuple typ1 "k"}] = #{fromTuple typ2 "v"} }|] - -fromTuple (TUserDef className _) name = [lt|#{capitalizeT className}.from_tuple(#{name})|] - -fromTuple (TTuple ts) name = - let elems = map (f name) (zip [0..] ts) in - [lt| [#{LT.intercalate ", " elems}] |] - where - f :: T.Text -> (Integer, Type) -> LT.Text - f n (i, (TUserDef className _ )) = [lt|#{capitalizeT className}.from_tuple(#{n}[#{show i}]) |] - f n (i, _) = [lt|#{n}[#{show i}] |] - -fromTuple (TObject) name = [lt|#{name}|] - -capitalizeT :: T.Text -> T.Text -capitalizeT a = T.cons (toUpper $ T.head a) (T.tail a) - -sortField :: [Field] -> [Maybe Field] -sortField flds = - flip map [0 .. maximum $ [-1] ++ map fldId flds] $ \ix -> find ((==ix). fldId) flds - -indent :: Int -> LT.Text -> LT.Text -indent ind lines = indentedConcat ind $ LT.lines lines - -indentedConcat :: Int -> [LT.Text] -> LT.Text -indentedConcat ind lines = - LT.dropAround (== '\n') $ LT.unlines $ map (indentLine ind) lines - -indentLine :: Int -> LT.Text -> LT.Text -indentLine _ "" = "" -indentLine ind line = mappend (LT.pack $ replicate ind ' ') line - -{- -extractJust :: [Maybe a] -> [a] -extractJust [] = [] -extractJust (Nothing:xs) = extractJust xs -extractJust (Just v:xs) = v : extractJust xs --} - -data AccessorType = Read | ReadWrite deriving Eq - -getAccessorType :: Type -> AccessorType -getAccessorType TBool = Read -getAccessorType (TMap _ _) = Read -getAccessorType (TUserDef _ _) = Read -getAccessorType _ = ReadWrite - -genAccessors :: [Maybe Field] -> LT.Text -genAccessors [] = "" -genAccessors fs = [lt| -#{genAccessors' Read "attr_reader" fs}#{genAccessors' ReadWrite "attr_accessor" fs}|] - -genAccessors' :: AccessorType -> String -> [Maybe Field] -> LT.Text -genAccessors' at an flds = gen $ map (maybe undefined fldName) $ filter fldTypeEq flds - where - gen [] = "" - gen fs = [lt| -#{an} #{T.intercalate ", " $ map (mappend ":") fs}|] - - fldTypeEq (Just Field {..}) = at == getAccessorType fldType - fldTypeEq Nothing = False - - --- TODO: Check when val is not null with TNullable --- TODO: Write single precision value on TFloat False -{- -genAttrWriter :: Field -> LT.Text -genAttrWriter Field {..} = genAttrWriter' fldType fldName - -genAttrWriter' :: Type -> T.Text -> LT.Text - -genAttrWriter' TBool n = [lt| -def #{n}=(val) - @#{n} = val.to_b -end -|] - -genAttrWriter' (TMap kt vt) n = [lt| -def #{n}=(val) - @#{n} = {} - val.each do |k, v| -#{indent 4 $ convert "k" "newk" kt} -#{indent 4 $ convert "v" "newv" vt} - end -end -|] - where - convert from to (TUserDef t p) = - genConvertingType from to (TUserDef t p) - convert from to _ = [lt|#{to} = #{from}|] -genAttrWriter' (TUserDef name types) n = [lt| -def #{n}=(val) -#{indent 2 $ convert "val" atn (TUserDef name types)} -end -|] - where - atn = [lt|@#{n}|] - convert from to (TUserDef t p) = - genConvertingType from to (TUserDef t p) -genAttrWriter' _ _ = "" --} - - -genClient :: Decl -> LT.Text -genClient MPService {..} = [lt| -class #{capitalizeT serviceName} - def initialize(host, port) - @cli = MessagePack::RPC::Client.new(host, port) - end#{LT.concat $ map genMethodCall serviceMethods} -end -|] - where - genMethodCall Function {..} = [lt| - def #{methodName}(#{defArgs}) -#{indent 4 $ genConvertingType' callStr "v" methodRetType} - end|] - where - defArgs = T.intercalate ", " $ map fldName methodArgs - callStr = [lt|@cli.call(#{callArgs})|] - callArgs = mappend ":" $ T.intercalate ", " $ methodName : sortedArgNames - sortedArgNames = map (maybe undefined fldName) $ sortField methodArgs - -genClient _ = "" - -genConvertingType :: LT.Text -> LT.Text -> Type -> LT.Text -genConvertingType unpacked _ (TUserDef t _) = [lt| -#{capitalizeT t}.from_tuple(#{unpacked})|] -genConvertingType _ _ _ = "" - -genConvertingType' :: LT.Text -> LT.Text -> Maybe Type -> LT.Text -genConvertingType' unpacked v (Just (TUserDef t p)) = [lt| -#{genConvertingType unpacked v (TUserDef t p)} -|] -genConvertingType' unpacked _ _ = [lt|#{unpacked}|] - -templ :: FilePath -> LT.Text -> LT.Text -templ filepath content = [lt|# This file is auto-generated from #{filepath} -# *** DO NOT EDIT *** -#{content} -|] - -genModule :: [LT.Text] -> LT.Text -> LT.Text -genModule modules content = f modules - where - f [] = [lt|#{content}|] - f (n:ns) = [lt|module #{n} -#{f ns} -end|] - -snoc :: [a] -> a -> [a] -snoc xs x = xs ++ [x] diff --git a/msgpack-idl/Language/MessagePack/IDL/Internal.hs b/msgpack-idl/Language/MessagePack/IDL/Internal.hs deleted file mode 100644 index 474a9b9..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/Internal.hs +++ /dev/null @@ -1,14 +0,0 @@ -module Language.MessagePack.IDL.Internal ( - withDirectory - ) where - -import Control.Exception -import System.Directory - -withDirectory :: FilePath -> IO a -> IO a -withDirectory dir m = do - createDirectoryIfMissing True dir - bracket - getCurrentDirectory - setCurrentDirectory - (\_ -> setCurrentDirectory dir >> m) diff --git a/msgpack-idl/Language/MessagePack/IDL/Parser.hs b/msgpack-idl/Language/MessagePack/IDL/Parser.hs deleted file mode 100644 index fd55715..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/Parser.hs +++ /dev/null @@ -1,14 +0,0 @@ -{-# Language TemplateHaskell, QuasiQuotes, FlexibleContexts #-} - -module Language.MessagePack.IDL.Parser ( - idl, - ) where - -import Data.Maybe -import qualified Data.Text as T -import Text.Peggy -import Text.Peggy.CodeGen.TH - -import Language.MessagePack.IDL.Syntax - -genDecs $(peggyFile "mpidl.peggy") diff --git a/msgpack-idl/Language/MessagePack/IDL/Syntax.hs b/msgpack-idl/Language/MessagePack/IDL/Syntax.hs deleted file mode 100644 index 1838a69..0000000 --- a/msgpack-idl/Language/MessagePack/IDL/Syntax.hs +++ /dev/null @@ -1,76 +0,0 @@ -{-# LANGUAGE DeriveDataTypeable #-} -module Language.MessagePack.IDL.Syntax where - -import Data.Data -import qualified Data.Text as T - -type Spec = [Decl] - -data Decl - = MPMessage - { msgName :: T.Text - , msgParam :: [T.Text] - , msgFields :: [Field] - } - | MPException - { excName :: T.Text - , excParam :: [T.Text] - , excSuper :: Maybe T.Text - , excFields :: [Field] - } - | MPType - { tyName :: T.Text - , tyType :: Type - } - | MPEnum - { enumName :: T.Text - , enumMem :: [(Int, T.Text)] - } - | MPService - { serviceName :: T.Text - , serviceVersion :: Maybe Int - , serviceMethods :: [Method] - } - deriving (Eq, Show, Data, Typeable) - -data Field - = Field - { fldId :: Int - , fldType :: Type - , fldName :: T.Text - , fldDefault :: Maybe Literal - } - deriving (Eq, Show, Data, Typeable) - -data Method - = Function - { methodInherit :: Bool - , methodName :: T.Text - , methodRetType :: Maybe Type - , methodArgs :: [Field] - } - | InheritName T.Text - | InheritAll - deriving (Eq, Show, Data, Typeable) - -data Type - = TInt Bool Int -- signed? bits - | TFloat Bool -- double prec? - | TBool - | TRaw - | TString - | TNullable Type - | TList Type - | TMap Type Type - | TTuple [Type] - | TUserDef T.Text [Type] - | TObject - deriving (Eq, Show, Data, Typeable) - -data Literal - = LInt Int - | LFloat Double - | LBool Bool - | LNull - | LString T.Text - deriving (Eq, Show, Data, Typeable) diff --git a/msgpack-idl/README.md b/msgpack-idl/README.md deleted file mode 100644 index 332c7ff..0000000 --- a/msgpack-idl/README.md +++ /dev/null @@ -1,66 +0,0 @@ -IDL compiler for MessagePack RPC -================================ - -# Install - -~~~ {.bash} -$ cabal update -$ cabal install msgpack-idl -~~~ - -If you use ghc <= 7.0.x, you may need to specify template-haskell's version. - -~~~ {.bash} -$ cabal install msgpack-idl --constraint='template-haskell == 2.5.*' -~~~ - -# Usage - -~~~ -msgpack-rpc 0.1 - -config [OPTIONS] IDLFILE LANG -MessagePack RPC IDL Compiler - -Common flags: - -o --output=DIR Output directory - -? --help Display help message - -V --version Print version information -~~~ - -# Tutorial - -* Prepare/Write msgspec file - -~~~ -message UserInfo { - 1: int uid - 2: string name - 3: int? flags = 1 -} - -enum Sites { - 0: SiteA - 1: SiteB - 2: SiteC -} - -message LogInLog { - 1: UserInfo user - 2: Sites site -} - -service Foo { - bool login(1: Sites site, 2: UserInfo) -} -~~~ - -* execute msgspec command for generating client/server code - -~~~ {.bash} -$ mprpc foo.msgspec cpp -o cpp -$ ls cpp -client.hpp -server.hpp -types.hpp -~~~ diff --git a/msgpack-idl/Setup.hs b/msgpack-idl/Setup.hs deleted file mode 100644 index 9a994af..0000000 --- a/msgpack-idl/Setup.hs +++ /dev/null @@ -1,2 +0,0 @@ -import Distribution.Simple -main = defaultMain diff --git a/msgpack-idl/Specification.md b/msgpack-idl/Specification.md deleted file mode 100644 index f4c7ae8..0000000 --- a/msgpack-idl/Specification.md +++ /dev/null @@ -1,160 +0,0 @@ -MessagePack IDL Specification -============================= - -# Syntax of Specification File - -~~~ -<spec> <- <message> - / <exception> - / <type-alias> - / <enum> - / <service> -~~~ - -## message - -~~~ -message <name> ['<' <type-param>, ... '>'] { - <field>* -} -~~~ - -## exception - -* Similar to message definition. -* It can throw as an exception. - -~~~ -exception <name> ['<' <type-param>, ... '>'] [< <exception-name>] { - <field>* -} -~~~ - -## type alias - -* no type-parameter - -~~~ -type <name> = <type> -~~~ - -## enum - -~~~ -enum <name> { - <enum-id>: <enum-name> - ... -} -~~~ - -## service - -* multiple services can be defind -* One server contains several services - -~~~ -service <name> [: <version>] { - <method> - ... -} -~~~ - -## field - -~~~ -<field> = <field-id> : <type> <field-name> [ = <literal>] -~~~ - -## method - -~~~ -inherit * # inherit all -inherit <name> # inherit specified method -inherit <type> <name> (<field>, ...) # inherit specified method and check type -<type> <name> (<field>, ...) # define new-method -~~~ - -# Types - -* Primitive types - - `void` - - `object` - - `bool` - - integral types - - `byte` / `short` / `int` / `long` - - `ubyte` / `ushort` / `uint` / `ulong` - - fractional types - - `float` - - `double` - - `raw` - - `string` - -* Compound types - - `list<type>` - - `map<type, type>` - - `tuple<type, ...>` - - `<type>?` - - nullable type - -* User-defined types - - `<class-name><type, ...>` - -# Literals - -* bool - - `true` - - `false` - -* integral - - `0`, `1`, `-1`, ... - -* fractional - - `3.14`, `.9`, `-1.23`, `1e9`, `2.23e-2` - -* string - - `"Hello, World!"`, `"\n\r\t\u1234"` # unicode string - -* nullable - - `null` - -# include other files - -~~~ -include "foo.idl" -~~~ - -# Protocol extensions - -## Request - -* `(type, msgid, method-name, param)` - - same as normal msgpack-rpc - - calls <method-name> method in newest version of default service - -* `(type, msgid, (method-name, service?, versoin?), param)` - - extension of msgpack-idl - - can specify service name and version - - service name and version can be omitted - - this make one server can serve multiple services - -## Response - -* `(type, msgid, error, result)` - - same as normal msgpack-rpc - -# Semantics - -* Field - - `field-id` specifies an index of serialized array - - default value specified by `literal` is used when it is omitted - - field type is nullable - - it's value is omitted, it becomes to null. - - otherwise, type error will be occured - -* Version - - server invokes only method matches exact same as specified version. - - `inherit` inherits - - same service - - less version - - has specified method - - largest version's method diff --git a/msgpack-idl/exec/main.hs b/msgpack-idl/exec/main.hs deleted file mode 100644 index e0bbaf5..0000000 --- a/msgpack-idl/exec/main.hs +++ /dev/null @@ -1,138 +0,0 @@ -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE RecordWildCards #-} - -import Data.Version -import System.Console.CmdArgs -import Text.Peggy - -import Language.MessagePack.IDL -import Language.MessagePack.IDL.Internal -import qualified Language.MessagePack.IDL.CodeGen.Haskell as Haskell -import qualified Language.MessagePack.IDL.CodeGen.Cpp as Cpp -import qualified Language.MessagePack.IDL.CodeGen.Ruby as Ruby -import qualified Language.MessagePack.IDL.CodeGen.Java as Java -import qualified Language.MessagePack.IDL.CodeGen.Php as Php -import qualified Language.MessagePack.IDL.CodeGen.Python as Python -import qualified Language.MessagePack.IDL.CodeGen.Perl as Perl -import qualified Language.MessagePack.IDL.CodeGen.Erlang as Erlang - -import Paths_msgpack_idl - -data MPIDL - = Haskell - { output_dir :: FilePath - , module_name :: String - , filepath :: FilePath - } - | Cpp - { output_dir :: FilePath - , namespace :: String - , pficommon :: Bool - , filepath :: FilePath } - | Ruby - { output_dir :: FilePath - , modules :: String - , filepath :: FilePath } - | Java - { output_dir :: FilePath - , package :: String - , filepath :: FilePath - } - | Php - { output_dir :: FilePath - , filepath :: FilePath - } - | Python - { output_dir :: FilePath - , filepath :: FilePath - } - | Perl - { output_dir :: FilePath - , namespace :: String - , filepath :: FilePath } - | Erlang - { output_dir :: FilePath - , filepath :: FilePath } - deriving (Show, Eq, Data, Typeable) - -main :: IO () -main = do - conf <- cmdArgs $ - modes [ Haskell - { output_dir = def - , module_name = "" - , filepath = def &= argPos 0 - } - , Cpp - { output_dir = def - , namespace = "msgpack" - , pficommon = False - , filepath = def &= argPos 0 - } - , Ruby - { output_dir = def - , modules = "MessagePack" - , filepath = def &= argPos 0 - } - , Java - { output_dir = def - , package = "msgpack" - , filepath = def &= argPos 0 - } - , Php - { output_dir = def - , filepath = def &= argPos 0 - } - , Python - { output_dir = def - , filepath = def &= argPos 0 - } - , Perl - { output_dir = def - , namespace = "msgpack" - , filepath = def &= argPos 0 - } - , Erlang - { output_dir = def - , filepath = def &= argPos 0 - } - ] - &= help "MessagePack RPC IDL Compiler" - &= summary ("mpidl " ++ showVersion version) - - compile conf - -compile :: MPIDL -> IO () -compile conf = do - espec <- parseFile idl (filepath conf) - case espec of - Left err -> do - print err - Right spec -> do - print spec - withDirectory (output_dir conf) $ do - case conf of - Cpp {..} -> do - Cpp.generate (Cpp.Config filepath namespace pficommon) spec - - Haskell {..} -> do - Haskell.generate (Haskell.Config filepath) spec - - Java {..} -> do - Java.generate (Java.Config filepath package) spec - - Perl {..} -> do - Perl.generate (Perl.Config filepath namespace) spec - - Php {..} -> do - Php.generate (Php.Config filepath) spec - - Python {..} -> do - Python.generate (Python.Config filepath) spec - - Ruby {..} -> do - Ruby.generate (Ruby.Config filepath modules) spec - - Erlang {..} -> do - Erlang.generate (Erlang.Config filepath) spec - diff --git a/msgpack-idl/mpidl.peggy b/msgpack-idl/mpidl.peggy deleted file mode 100644 index 0f13574..0000000 --- a/msgpack-idl/mpidl.peggy +++ /dev/null @@ -1,87 +0,0 @@ -idl :: Spec = decl* !. - -decl :: Decl - = "message" identifier typeParam "{" field* "}" - { MPMessage $1 $2 $3 } - / "exception" identifier typeParam ("<" identifier)? "{" field* "}" - { MPException $1 $2 $3 $4 } - / "type" identifier "=" ftype - { MPType $1 $2 } - / "enum" identifier "{" (integer ":" identifier)* "}" - { MPEnum $1 $2 } - / "service" identifier (":" integer)? "{" method* "}" - { MPService $1 $2 $3 } - -typeParam :: [T.Text] - = "<" (identifier, ",") ">" - / "" { [] } - -method :: Method - = "inherit" identifier { InheritName $1 } - / "inherit" "*" { InheritAll } - / "inherit"? rtype identifier "(" (field , ",") ")" - { Function (isJust $1) $3 $2 $4 } - -field :: Field - = integer ":" ftype identifier ("=" literal)? - { Field $1 $2 $3 $4 } - -ftype :: Type - = ftypeNN "?" { TNullable $1 } - / ftypeNN - -rtype :: Maybe Type - = "void" { Nothing } - / ftype { Just $1 } - -ftypeNN :: Type - = "byte" { TInt True 8 } - / "short" { TInt True 16 } - / "int" { TInt True 32 } - / "long" { TInt True 64 } - / "ubyte" { TInt False 8 } - / "ushort" { TInt False 16 } - / "uint" { TInt False 32 } - / "ulong" { TInt False 64 } - / "float" { TFloat False } - / "double" { TFloat True } - / "bool" { TBool } - / "raw" { TRaw } - / "string" { TString } - / "object" { TObject } - - / "list" "<" ftype ">" { TList $1 } - / "map" "<" ftype "," ftype ">" { TMap $1 $2 } - / "tuple" "<" (ftype , ",") ">" { TTuple $1 } - - / identifier ("<" (ftype , ",") ">")? - { TUserDef $1 (fromMaybe [] $2) } - -literal ::: Literal - = integer { LInt $1 } - / "true" { LBool True } - / "false" { LBool False } - / "null" { LNull } - / '\"' charLit* '\"' { LString $ T.pack $1 } - -charLit :: Char - = '\\' escChar - / ![\'\"] . - -escChar :: Char - = 'n' { '\n' } - / 'r' { '\r' } - / 't' { '\t' } - / '\\' { '\\' } - / '\"' { '\"' } - / '\'' { '\'' } - -integer ::: Int - = [0-9]+ { read $1 } - -identifier ::: T.Text - = [a-zA-Z_][a-zA-Z0-9_]* { T.pack ($1 : $2) } - -skip :: () = [ \r\n\t] { () } / comment -comment :: () = '#' _:(!'\n' . { () })* '\n' { () } -delimiter :: () = [()[\]{}<>;:,./?] { () } diff --git a/msgpack-idl/msgpack-idl.cabal b/msgpack-idl/msgpack-idl.cabal deleted file mode 100644 index c10ff3a..0000000 --- a/msgpack-idl/msgpack-idl.cabal +++ /dev/null @@ -1,68 +0,0 @@ -name: msgpack-idl -version: 0.2.1 -synopsis: An IDL Compiler for MessagePack -description: An IDL Compiler for MessagePack <http://msgpack.org/> -homepage: http://msgpack.org/ -license: BSD3 -license-file: LICENSE -author: Hideyuki Tanaka -maintainer: Hideyuki Tanaka <tanaka.hideyuki@gmail.com> -copyright: Copyright (c) 2011, Hideyuki Tanaka -category: Language -stability: Experimental -cabal-version: >=1.8 -build-type: Simple - -extra-source-files: mpidl.peggy - -source-repository head - type: git - location: git://github.com/msgpack/msgpack-haskell.git - -library - build-depends: base == 4.* - , bytestring >= 0.9 - , text >= 0.11 - , shakespeare-text == 1.0.* - , blaze-builder == 0.3.* - , template-haskell >= 2.5 && < 2.9 - , containers >= 0.4 - , filepath >= 1.1 && < 1.4 - , directory - , msgpack == 0.7.* - , peggy == 0.3.* - - ghc-options: -Wall - - exposed-modules: Language.MessagePack.IDL - Language.MessagePack.IDL.Check - Language.MessagePack.IDL.CodeGen.Cpp - Language.MessagePack.IDL.CodeGen.Haskell - Language.MessagePack.IDL.CodeGen.Java - Language.MessagePack.IDL.CodeGen.Perl - Language.MessagePack.IDL.CodeGen.Php - Language.MessagePack.IDL.CodeGen.Python - Language.MessagePack.IDL.CodeGen.Ruby - Language.MessagePack.IDL.CodeGen.Erlang - Language.MessagePack.IDL.Internal - Language.MessagePack.IDL.Parser - Language.MessagePack.IDL.Syntax - -executable mpidl - hs-source-dirs: exec - main-is: main.hs - - build-depends: base == 4.* - , directory >= 1.0 - , cmdargs == 0.10.* - , peggy == 0.3.* - , msgpack-idl - -test-suite mpidl-test - type: exitcode-stdio-1.0 - hs-source-dirs: test - main-is: test.hs - - build-depends: base == 4.* - , hspec >= 1.1 - , msgpack-idl diff --git a/msgpack-idl/test/TODO.txt b/msgpack-idl/test/TODO.txt deleted file mode 100644 index 93c7a6a..0000000 --- a/msgpack-idl/test/TODO.txt +++ /dev/null @@ -1,19 +0,0 @@ - -[ ] empty - [ ] message - [ ] exception - [ ] service - -[ ] swap order of - [ ] message - [ ] argument - -[ ] including support - -[ ] versioning - [ ] inherit - -[ ] type-check - [ ] Python - [ ] Ruby - [ ] (Java) diff --git a/msgpack-idl/test/idls/empty.idl b/msgpack-idl/test/idls/empty.idl deleted file mode 100644 index 9e89281..0000000 --- a/msgpack-idl/test/idls/empty.idl +++ /dev/null @@ -1,8 +0,0 @@ -message empty_message { -} - -exception empty_error { -} - -service empty_service { -} diff --git a/msgpack-idl/test/test.hs b/msgpack-idl/test/test.hs deleted file mode 100644 index 6372586..0000000 --- a/msgpack-idl/test/test.hs +++ /dev/null @@ -1,18 +0,0 @@ -import Test.Hspec.Monadic - -main :: IO () -main = hspecX $ do - describe "parser" $ do - it "can parse xxx..." $ do - pending - - describe "checker" $ do - it "can check xxx..." $ do - pending - - describe "generator" $ do - describe "haskell" $ do - it "can generate client" $ do - pending - it "can communicate reference server" $ do - pending diff --git a/msgpack-rpc/LICENSE b/msgpack-rpc/LICENSE deleted file mode 100644 index a79d6cb..0000000 --- a/msgpack-rpc/LICENSE +++ /dev/null @@ -1,30 +0,0 @@ -Copyright (c)2010, Hideyuki Tanaka - -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. - - * Neither the name of Hideyuki Tanaka nor the names of other - 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. diff --git a/msgpack-rpc/Setup.hs b/msgpack-rpc/Setup.hs deleted file mode 100644 index 9a994af..0000000 --- a/msgpack-rpc/Setup.hs +++ /dev/null @@ -1,2 +0,0 @@ -import Distribution.Simple -main = defaultMain diff --git a/msgpack-rpc/msgpack-rpc.cabal b/msgpack-rpc/msgpack-rpc.cabal deleted file mode 100644 index 0acf909..0000000 --- a/msgpack-rpc/msgpack-rpc.cabal +++ /dev/null @@ -1,57 +0,0 @@ -cabal-version: 1.12 -name: msgpack-rpc -version: 1.0.0 - -synopsis: A MessagePack-RPC Implementation -description: A MessagePack-RPC Implementation <http://msgpack.org/> -homepage: http://msgpack.org/ -bug-reports: https://github.com/msgpack/msgpack-haskell/issues -license: BSD3 -license-file: LICENSE -author: Hideyuki Tanaka -maintainer: Herbert Valerio Riedel <hvr@gnu.org> -copyright: (c) 2010-2015, Hideyuki Tanaka -category: Network -build-type: Simple - -source-repository head - type: git - location: http://github.com/msgpack/msgpack-haskell.git - subdir: msgpack-rpc - -library - default-language: Haskell2010 - hs-source-dirs: src - - exposed-modules: Network.MessagePack.Server - Network.MessagePack.Client - - build-depends: base >= 4.5 && < 4.13 - , bytestring >= 0.10.4 && < 0.11 - , text >= 1.2.3 && < 1.3 - , network >= 2.6 && < 2.9 - || >= 3.0 && < 3.1 - , mtl >= 2.2.1 && < 2.3 - , monad-control >= 1.0.0.0 && < 1.1 - , conduit >= 1.2.3.1 && < 1.3 - , conduit-extra >= 1.1.3.4 && < 1.3 - , binary-conduit >= 1.2.3 && < 1.3 - , exceptions >= 0.8 && < 0.11 - , binary >= 0.7.1 && < 0.9 - , msgpack >= 1.1.0 && < 1.2 - -test-suite msgpack-rpc-test - default-language: Haskell2010 - type: exitcode-stdio-1.0 - hs-source-dirs: test - main-is: test.hs - - build-depends: msgpack-rpc - -- inherited constraints via `msgpack-rpc` - , base - , mtl - , network - -- test-specific dependencies - , async == 2.2.* - , tasty == 1.2.* - , tasty-hunit == 0.10.* diff --git a/msgpack-rpc/src/Network/MessagePack/Client.hs b/msgpack-rpc/src/Network/MessagePack/Client.hs deleted file mode 100644 index e7a8edb..0000000 --- a/msgpack-rpc/src/Network/MessagePack/Client.hs +++ /dev/null @@ -1,126 +0,0 @@ -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} - -------------------------------------------------------------------- --- | --- Module : Network.MessagePackRpc.Client --- Copyright : (c) Hideyuki Tanaka, 2010-2015 --- License : BSD3 --- --- Maintainer: Hideyuki Tanaka <tanaka.hideyuki@gmail.com> --- Stability : experimental --- Portability: portable --- --- This module is client library of MessagePack-RPC. --- The specification of MessagePack-RPC is at --- <http://redmine.msgpack.org/projects/msgpack/wiki/RPCProtocolSpec>. --- --- A simple example: --- --- > import Network.MessagePack.Client --- > --- > add :: Int -> Int -> Client Int --- > add = call "add" --- > --- > main = execClient "localhost" 5000 $ do --- > ret <- add 123 456 --- > liftIO $ print ret --- --------------------------------------------------------------------- - -module Network.MessagePack.Client ( - -- * MessagePack Client type - Client, execClient, - - -- * Call RPC method - call, - - -- * RPC error - RpcError(..), - ) where - -import Control.Applicative -import Control.Exception -import Control.Monad -import Control.Monad.Catch -import Control.Monad.State.Strict as CMS -import Data.Binary as Binary -import qualified Data.ByteString as S -import Data.Conduit -import qualified Data.Conduit.Binary as CB -import Data.Conduit.Network -import Data.Conduit.Serialization.Binary -import Data.MessagePack -import Data.Typeable -import System.IO - -newtype Client a - = ClientT { runClient :: StateT Connection IO a } - deriving (Functor, Applicative, Monad, MonadIO, MonadThrow) - --- | RPC connection type -data Connection - = Connection - !(ResumableSource IO S.ByteString) - !(Sink S.ByteString IO ()) - !Int - -execClient :: S.ByteString -> Int -> Client a -> IO () -execClient host port m = - runTCPClient (clientSettings port host) $ \ad -> do - (rsrc, _) <- appSource ad $$+ return () - void $ evalStateT (runClient m) (Connection rsrc (appSink ad) 0) - --- | RPC error type -data RpcError - = ServerError Object -- ^ Server error - | ResultTypeError String -- ^ Result type mismatch - | ProtocolError String -- ^ Protocol error - deriving (Show, Eq, Ord, Typeable) - -instance Exception RpcError - -class RpcType r where - rpcc :: String -> [Object] -> r - -instance MessagePack o => RpcType (Client o) where - rpcc m args = do - res <- rpcCall m (reverse args) - case fromObject res of - Success r -> return r - Error e -> throwM $ ResultTypeError e - -instance (MessagePack o, RpcType r) => RpcType (o -> r) where - rpcc m args arg = rpcc m (toObject arg:args) - -rpcCall :: String -> [Object] -> Client Object -rpcCall methodName args = ClientT $ do - Connection rsrc sink msgid <- CMS.get - (rsrc', res) <- lift $ do - CB.sourceLbs (pack (0 :: Int, msgid, methodName, args)) $$ sink - rsrc $$++ sinkGet Binary.get - CMS.put $ Connection rsrc' sink (msgid + 1) - - case fromObject res of - Error e -> throwM $ ProtocolError e - Success (rtype, rmsgid, rerror, rresult) -> do - - when (rtype /= (1 :: Int)) $ - throwM $ ProtocolError $ - "invalid response type (expect 1, but got " ++ show rtype ++ ")" - - when (rmsgid /= msgid) $ - throwM $ ProtocolError $ - "message id mismatch: expect " - ++ show msgid ++ ", but got " - ++ show rmsgid - - case fromObject rerror of - Error e -> throwM $ ServerError rerror - Success () -> return rresult - --- | Call an RPC Method -call :: RpcType a - => String -- ^ Method name - -> a -call m = rpcc m [] diff --git a/msgpack-rpc/src/Network/MessagePack/Server.hs b/msgpack-rpc/src/Network/MessagePack/Server.hs deleted file mode 100644 index f525e4d..0000000 --- a/msgpack-rpc/src/Network/MessagePack/Server.hs +++ /dev/null @@ -1,133 +0,0 @@ -{-# LANGUAGE DeriveDataTypeable #-} -{-# LANGUAGE FlexibleContexts #-} -{-# LANGUAGE FlexibleInstances #-} -{-# LANGUAGE GeneralizedNewtypeDeriving #-} -{-# LANGUAGE MultiParamTypeClasses #-} -{-# LANGUAGE OverloadedStrings #-} -{-# LANGUAGE ScopedTypeVariables #-} - -------------------------------------------------------------------- --- | --- Module : Network.MessagePackRpc.Server --- Copyright : (c) Hideyuki Tanaka, 2010-2015 --- License : BSD3 --- --- Maintainer: tanaka.hideyuki@gmail.com --- Stability : experimental --- Portability: portable --- --- This module is server library of MessagePack-RPC. --- The specification of MessagePack-RPC is at --- <http://redmine.msgpack.org/projects/msgpack/wiki/RPCProtocolSpec>. --- --- A simple example: --- --- > import Network.MessagePack.Server --- > --- > add :: Int -> Int -> Server Int --- > add x y = return $ x + y --- > --- > main = serve 1234 [ method "add" add ] --- --------------------------------------------------------------------- - -module Network.MessagePack.Server ( - -- * RPC method types - Method, MethodType(..), - ServerT(..), Server, - -- * Build a method - method, - -- * Start RPC server - serve, - ) where - -import Control.Applicative -import Control.Monad -import Control.Monad.Catch -import Control.Monad.Trans -import Control.Monad.Trans.Control -import Data.Binary -import Data.Conduit -import qualified Data.Conduit.Binary as CB -import Data.Conduit.Network -import Data.Conduit.Serialization.Binary -import Data.List -import Data.MessagePack -import Data.Typeable - --- ^ MessagePack RPC method -data Method m - = Method - { methodName :: String - , methodBody :: [Object] -> m Object - } - -type Request = (Int, Int, String, [Object]) -type Response = (Int, Int, Object, Object) - -data ServerError = ServerError String - deriving (Show, Typeable) - -instance Exception ServerError - -newtype ServerT m a = ServerT { runServerT :: m a } - deriving (Functor, Applicative, Monad, MonadIO) - -instance MonadTrans ServerT where - lift = ServerT - -type Server = ServerT IO - -class Monad m => MethodType m f where - -- | Create a RPC method from a Hakell function - toBody :: f -> [Object] -> m Object - -instance (Functor m, MonadThrow m, MessagePack o) => MethodType m (ServerT m o) where - toBody m ls = case ls of - [] -> toObject <$> runServerT m - _ -> throwM $ ServerError "argument number error" - -instance (MonadThrow m, MessagePack o, MethodType m r) => MethodType m (o -> r) where - toBody f (x: xs) = - case fromObject x of - Error e -> throwM $ ServerError e - Success r -> toBody (f r) xs - --- | Build a method -method :: MethodType m f - => String -- ^ Method name - -> f -- ^ Method body - -> Method m -method name body = Method name $ toBody body - --- | Start RPC server with a set of RPC methods. -serve :: (MonadBaseControl IO m, MonadIO m, MonadCatch m, MonadThrow m) - => Int -- ^ Port number - -> [Method m] -- ^ list of methods - -> m () -serve port methods = runGeneralTCPServer (serverSettings port "*") $ \ad -> do - (rsrc, _) <- appSource ad $$+ return () - (_ :: Either ParseError ()) <- try $ processRequests rsrc (appSink ad) - return () - where - processRequests rsrc sink = do - (rsrc', res) <- rsrc $$++ do - obj <- sinkGet get - case fromObject obj of - Error e -> throwM $ ServerError e - Success req -> lift $ getResponse (req :: Request) - _ <- CB.sourceLbs (pack res) $$ sink - processRequests rsrc' sink - - getResponse (rtype, msgid, methodName, args) = do - when (rtype /= 0) $ - throwM $ ServerError $ "request type is not 0, got " ++ show rtype - ret <- callMethod methodName args - return ((1, msgid, toObject (), ret) :: Response) - - callMethod name args = - case find ((== name) . methodName) methods of - Nothing -> - throwM $ ServerError $ "method '" ++ name ++ "' not found" - Just m -> - methodBody m args diff --git a/msgpack-rpc/test/test.hs b/msgpack-rpc/test/test.hs deleted file mode 100644 index be4f51b..0000000 --- a/msgpack-rpc/test/test.hs +++ /dev/null @@ -1,45 +0,0 @@ -{-# LANGUAGE OverloadedStrings #-} - -import Control.Concurrent -import Control.Concurrent.Async -import Control.Monad.Trans -import Test.Tasty -import Test.Tasty.HUnit - -import Network.MessagePack.Client -import Network.MessagePack.Server -import Network.Socket (withSocketsDo) - -port :: Int -port = 5000 - -main :: IO () -main = withSocketsDo $ defaultMain $ - testGroup "simple service" - [ testCase "test" $ server `race_` (threadDelay 1000 >> client) ] - -server :: IO () -server = - serve port - [ method "add" add - , method "echo" echo - ] - where - add :: Int -> Int -> Server Int - add x y = return $ x + y - - echo :: String -> Server String - echo s = return $ "***" ++ s ++ "***" - -client :: IO () -client = execClient "localhost" port $ do - r1 <- add 123 456 - liftIO $ r1 @?= 123 + 456 - r2 <- echo "hello" - liftIO $ r2 @?= "***hello***" - where - add :: Int -> Int -> Client Int - add = call "add" - - echo :: String -> Client String - echo = call "echo" diff --git a/msgpack/msgpack.cabal b/msgpack/msgpack.cabal index 9283e9e..e024d69 100644 --- a/msgpack/msgpack.cabal +++ b/msgpack/msgpack.cabal @@ -1,6 +1,6 @@ cabal-version: 1.12 name: msgpack -version: 1.1.0.0 +version: 2.0.0.0 synopsis: A Haskell implementation of MessagePack description: @@ -71,29 +71,21 @@ library Compat.Binary Compat.Prelude - build-depends: base >= 4.7 && < 4.14 - , mtl >= 2.2.1 && < 2.3 - , bytestring >= 0.10.4 && < 0.11 - , text >= 1.2.3 && < 1.3 - , containers >= 0.5.5 && < 0.7 - , unordered-containers >= 0.2.5 && < 0.3 - , hashable >= 1.1.2.4 && < 1.4 - , vector >= 0.10.11 && < 0.13 - , deepseq >= 1.3 && < 1.5 - , binary >= 0.7.1 && < 0.9 - , semigroups >= 0.5.0 && < 0.20 - , time >= 1.4.2 && < 1.10 - , int-cast >= 0.1.1 && < 0.3 - , array >= 0.5.0 && < 0.6 - - if !impl(ghc > 8.0) - build-depends: fail == 4.9.* - - ghc-options: -Wall - - if impl(ghc >= 7.10) - ghc-options: -fno-warn-trustworthy-safe + build-depends: base + , mtl + , bytestring + , text + , containers + , unordered-containers + , hashable + , vector + , deepseq + , binary + , time + , int-cast + , array + ghc-options: -Wall -fno-warn-trustworthy-safe test-suite msgpack-tests type: exitcode-stdio-1.0 @@ -106,7 +98,7 @@ test-suite msgpack-tests ghc-options: -Wall - build-depends: msgpack + build-depends: msgpack -- inherited constraints via `msgpack` , base , binary @@ -117,8 +109,8 @@ test-suite msgpack-tests -- test-specific dependencies , async == 2.2.* , filepath == 1.3.* || == 1.4.* - , HsYAML >= 0.1.1 && < 0.2 - , tasty == 1.2.* - , tasty-quickcheck == 0.10.* - , tasty-hunit == 0.10.* - , QuickCheck == 2.13.* + , HsYAML >= 0.1.1 + , tasty + , tasty-quickcheck + , tasty-hunit + , QuickCheck diff --git a/msgpack/test/DataCases.hs b/msgpack/test/DataCases.hs index f41db7c..8654683 100644 --- a/msgpack/test/DataCases.hs +++ b/msgpack/test/DataCases.hs @@ -76,26 +76,26 @@ instance FromYAML DataCase where parseYAML = Y.withMap "DataCase" $ \m -> do msgpack <- m .: "msgpack" - obj <- do { Just (Y.Scalar Y.SNull) <- m .:! "nil" ; pure ObjectNil } + obj <- do { Just (Y.Scalar _ Y.SNull) <- m .:! "nil" ; pure ObjectNil } <|> do { Just b <- m .:! "bool" ; pure (ObjectBool b) } <|> do { Just i <- m .:! "number" ; pure (ObjectInt (fromInteger i)) } <|> do { Just s <- m .:! "bignum" ; pure (ObjectInt (read . T.unpack $ s)) } <|> do { Just d <- m .:! "number" ; pure (ObjectDouble d) } <|> do { Just t <- m .:! "string" ; pure (ObjectStr t) } <|> do { Just t <- m .:! "binary" ; pure (ObjectBin (hex2bin t)) } - <|> do { Just v@(Y.Sequence _ _) <- m .:! "array" ; pure (nodeToObj v) } - <|> do { Just m'@(Y.Mapping _ _) <- m .:! "map" ; pure (nodeToObj m') } + <|> do { Just v@(Y.Sequence _ _ _) <- m .:! "array" ; pure (nodeToObj v) } + <|> do { Just m'@(Y.Mapping _ _ _) <- m .:! "map" ; pure (nodeToObj m') } <|> do { Just (n,t) <- m .:! "ext" ; pure (ObjectExt n (hex2bin t)) } <|> do { Just (s,ns) <- m .:! "timestamp"; pure (toObject $ mptsFromPosixSeconds2 s ns) } pure (DataCase { dcMsgPack = map hex2bin msgpack, dcObject = obj }) -nodeToObj :: Y.Node -> Object -nodeToObj (Y.Scalar sca) = scalarToObj sca -nodeToObj (Y.Sequence _ ns) = ObjectArray (Lst.fromList (map nodeToObj ns)) -nodeToObj (Y.Mapping _ ns) = ObjectMap (Lst.fromList $ map (\(k,v) -> (nodeToObj k, nodeToObj v)) $ Map.toList ns) -nodeToObj (Y.Anchor _ n) = nodeToObj n +nodeToObj :: Y.Node Pos -> Object +nodeToObj (Y.Scalar _ sca) = scalarToObj sca +nodeToObj (Y.Sequence _ _ ns) = ObjectArray (Lst.fromList (map nodeToObj ns)) +nodeToObj (Y.Mapping _ _ ns) = ObjectMap (Lst.fromList $ map (\(k,v) -> (nodeToObj k, nodeToObj v)) $ Map.toList ns) +nodeToObj (Y.Anchor _ _ n) = nodeToObj n scalarToObj :: Y.Scalar -> Object scalarToObj Y.SNull = ObjectNil