on 477ea92 help sign in
76 lines 2.3 kB history raw
1{-# LANGUAGE CPP #-}
2{-# LANGUAGE FlexibleInstances #-}
3{-# LANGUAGE TypeSynonymInstances #-}
4-----------------------------------------------------------------------------
5--
6-- Module : Language.Javascript.JSaddle.String
7-- Copyright : (c) Hamish Mackenzie
8-- License : MIT
9--
10-- Maintainer : Hamish Mackenzie <Hamish.K.Mackenzie@googlemail.com>
11--
12-- | JavaScript string conversion functions
13--
14-----------------------------------------------------------------------------
16module Language.Javascript.JSaddle.String (
17 JSString
18 , ToJSString(..)
20 -- * Data.Text helpers
21 , strToText
22 , textToStr
23 , nullJSString
24) where
26import Data.Text (Text)
27import Control.Monad.IO.Class (MonadIO(..))
28import Language.Javascript.JSaddle.Types (JSString)
29#ifdef ghcjs_HOST_OS
30import Data.JSString.Text (textFromJSString, textToJSString)
31import GHCJS.Marshal.Internal (PFromJSVal(..))
32import GHCJS.Types (nullRef)
33#else
34import Graphics.UI.Gtk.WebKit.JavaScriptCore.JSStringRef
35 (jsstringcreatewithcharacters, jsstringgetcharactersptr,
36 jsstringgetlength)
37import Language.Javascript.JSaddle.Native (makeNewJSString, withJSString)
38import System.IO.Unsafe (unsafePerformIO)
39import Foreign.ForeignPtr (newForeignPtr_)
40import Foreign.Ptr (nullPtr)
41import qualified Data.Text.Foreign as T (fromPtr)
42import Foreign (castPtr)
43import Data.Text.Foreign (useAsPtr)
44#endif
45import Language.Javascript.JSaddle.Classes (ToJSString(..))
47-- | Convert a JavaScript string to a Haskell 'Text'
48strToText :: MonadIO m => JSString -> m Text
49#ifdef ghcjs_HOST_OS
50strToText = return . textFromJSString
51#else
52strToText jsstring' = liftIO $ withJSString jsstring' $ \jsstring -> do
53 l <- jsstringgetlength jsstring
54 p <- jsstringgetcharactersptr jsstring
55 T.fromPtr (castPtr p) (fromIntegral l)
56#endif
57{-# INLINE strToText #-}
59-- | Convert a Haskell 'Text' to a JavaScript string
60textToStr :: Text -> JSString
61#ifdef ghcjs_HOST_OS
62textToStr = textToJSString
63#else
64textToStr text = unsafePerformIO $
65 useAsPtr text $ \p l ->
66 jsstringcreatewithcharacters (castPtr p) (fromIntegral l) >>= makeNewJSString
67#endif
68{-# INLINE textToStr #-}
70nullJSString :: JSString
71#ifdef ghcjs_HOST_OS
72nullJSString = pFromJSVal nullRef
73#else
74nullJSString = unsafePerformIO $ newForeignPtr_ nullPtr
75#endif