Commit c9536adc authored by James Laver's avatar James Laver

Tons of G.U.Selection

parent a8689d6d
exports._getSelection = function() { return window.getSelection() || null; }; exports._getSelection = function() { return window.getSelection() || null; };
exports._toString = function(thing) { return thing.toString(); };
module Gargantext.Utils.Selection module Gargantext.Utils.Selection where
( class ToString, Selection, toString, getSelection ) where
import Prelude ((<$>)) import Prelude
import Data.Maybe (Maybe) import Data.Maybe (Maybe, fromMaybe, maybe)
import Data.Nullable (Nullable, toMaybe) import Data.Nullable (Nullable, toMaybe)
import DOM.Simple.Types (Element, DOMRect)
import DOM.Simple.Element as Element
import Effect (Effect) import Effect (Effect)
import FFI.Simple ((.?), (..), (...))
-- | Represents a text selection -- | Represents a text selection
foreign import data Selection :: Type foreign import data Selection :: Type
-- foreign import data Range :: Type -- Probably coming soon -- | Represents a single selection range
foreign import data Range :: Type
-- toString -- Terminology:
-- Anchor: point at which the selection was started
-- Focus: point at which the selection ends
class ToString t -- | The Node in which the anchor lies
anchorNode :: Selection -> Maybe Element
anchorNode s = s .? "anchorNode"
instance toStringSelection :: ToString Selection -- | The Node in which the focus lies
-- instance toStringRange :: ToString Range focusNode :: Selection -> Maybe Element
focusNode s = s .? "focusNode"
foreign import _toString :: forall t. t -> String -- | Whether the anchor and focus are at the same point
isSelectionCollapsed :: Selection -> Boolean
isSelectionCollapsed s = s .. "isCollapsed"
rangeCount :: Selection -> Int
rangeCount s = s .. "rangeCount"
getRange :: Selection -> Int -> Effect Range
getRange s i = pure $ s ... "getRangeAt" $ [i]
-- | Renders a selection or range as a string -- | Renders a selection or range as a string
toString :: forall t. ToString t => t -> String selectionToString :: Selection -> String
toString = _toString selectionToString s = s ... "toString" $ []
-- getSelection -- | Renders a range as a string
rangeToString :: Range -> String
rangeToString s = s ... "toString" $ []
foreign import _getSelection :: Effect (Nullable Selection) -- | Whether the anchor and focus are at the same point
isRangeCollapsed :: Range -> Boolean
isRangeCollapsed r = r .. "isCollapsed"
cloneRange :: Range -> Range
cloneRange r = r ... "cloneRange" $ []
collapseRange :: Range -> Boolean -> Effect Unit
collapseRange r toStart = pure $ r ... "collapse" $ [toStart]
commonAncestorContainer :: Range -> Element
commonAncestorContainer r = r .. "commonAncestorContainer"
insertNode :: Range -> Element -> Effect Unit
insertNode r e = pure $ r ... "insertNode" $ [e]
boundingRect :: Range -> DOMRect
boundingRect r = r ... "getBoundingClientRect" $ []
-- getSelection
-- | Fetches the current text selection, if any -- | Fetches the current text selection, if any
getSelection :: Effect (Maybe Selection) getSelection :: Effect (Maybe Selection)
getSelection = toMaybe <$> _getSelection getSelection = toMaybe <$> _getSelection
foreign import _getSelection :: Effect (Nullable Selection)
-- | Are both the start and end of the selection contained within an Element
doesSelectionLieWithin :: Selection -> Element -> Boolean
doesSelectionLieWithin sel elem = test anchorNode && test focusNode
where
test :: (Selection -> Maybe Element) -> Boolean
test f = maybe false (Element.contains elem) (f sel)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment