From 29ab77fdeaa80750a6b1de6baa4c6f651f7f6e56 Mon Sep 17 00:00:00 2001 From: Paul Young Date: Sun, 12 Mar 2017 16:02:05 -0700 Subject: [PATCH 1/3] Add Selection API --- src/DOM/HTML/Selection.js | 154 ++++++++++++++++++++++++++++++++++++ src/DOM/HTML/Selection.purs | 149 ++++++++++++++++++++++++++++++++++ src/DOM/HTML/Types.purs | 9 +++ src/DOM/HTML/Window.js | 6 ++ src/DOM/HTML/Window.purs | 4 +- 5 files changed, 321 insertions(+), 1 deletion(-) create mode 100644 src/DOM/HTML/Selection.js create mode 100644 src/DOM/HTML/Selection.purs diff --git a/src/DOM/HTML/Selection.js b/src/DOM/HTML/Selection.js new file mode 100644 index 0000000..671e8ac --- /dev/null +++ b/src/DOM/HTML/Selection.js @@ -0,0 +1,154 @@ +"use strict"; + +exports.anchorNode = function (selection) { + return function () { + return selection.anchorNode; + }; +}; + +exports.anchorOffset = function (selection) { + return function () { + return selection.anchorOffset; + }; +}; + +exports.focusNode = function (selection) { + return function () { + return selection.focusNode; + }; +}; + +exports.focusOffset = function (selection) { + return function () { + return selection.focusOffset; + }; +}; + +exports.isCollapsed = function (selection) { + return function () { + return selection.isCollapsed; + }; +}; + +exports.rangeCount = function (selection) { + return function () { + return selection.rangeCount; + }; +}; + +exports.typeImpl = function (selection) { + return function () { + return selection.type; + }; +}; + +exports.getRangeAt = function (index) { + return function (selection) { + return function () { + return selection.getRangeAt(index); + }; + }; +}; + +exports.collapse = function (parentNode) { + return function (offset) { + return function (selection) { + return function () { + selection.collapse(parentNode, offset); + }; + }; + }; +}; + +exports.extend = function (parentNode) { + return function (offset) { + return function (selection) { + return function () { + selection.extend(parentNode, offset); + }; + }; + }; +}; + +exports.collapseToStart = function (selection) { + return function () { + selection.collapseToStart(); + }; +}; + +exports.collapseToEnd = function (selection) { + return function () { + selection.collapseToEnd(); + }; +}; + +exports.selectAllChildren = function (parentNode) { + return function (selection) { + return function () { + selection.selectAllChildren(parentNode); + }; + }; +}; + +exports.addRange = function (range) { + return function (selection) { + return function () { + selection.addRange(range); + }; + }; +}; + +exports.removeRange = function (range) { + return function (selection) { + return function () { + selection.removeRange(range); + }; + }; +}; + +exports.removeAllRanges = function (selection) { + return function () { + selection.removeAllRanges(); + }; +}; + +exports.deleteFromDocument = function (selection) { + return function () { + selection.deleteFromDocument(); + }; +}; + +exports.toString = function (selection) { + return function () { + return selection.toString(); + }; +}; + +exports.containsNode = function (aNode) { + return function (aPartlyContained) { + return function (selection) { + return function () { + return selection.containsNode(aNode, aPartlyContained); + }; + }; + }; +}; + +exports.setBaseAndExtent = function (anchorNode) { + return function (anchorOffset) { + return function (focusNode) { + return function (focusOffset) { + return function (selection) { + return function () { + selection.setBaseAndExtent( + anchorNode, + anchorOffset, + focusNode, + focusOffset + ); + }; + }; + }; + }; + }; +}; diff --git a/src/DOM/HTML/Selection.purs b/src/DOM/HTML/Selection.purs new file mode 100644 index 0000000..49358b7 --- /dev/null +++ b/src/DOM/HTML/Selection.purs @@ -0,0 +1,149 @@ +module DOM.HTML.Selection + ( SelectionType + , anchorNode + , anchorOffset + , focusNode + , focusOffset + , isCollapsed + , rangeCount + , type_ + ) where + +import Prelude +import Control.Monad.Eff (Eff) +import DOM (DOM) +import DOM.HTML.Types (Range, SELECTION, Selection) +import DOM.Node.Types (Node) +import Data.Maybe (Maybe(..), fromJust) + +foreign import anchorNode + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Node + +foreign import anchorOffset + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Int + +foreign import focusNode + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Node + +foreign import focusOffset + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Int + +foreign import isCollapsed + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Boolean + +foreign import rangeCount + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Int + +foreign import typeImpl + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) String + +type_ + :: forall eff + . Partial + => Selection + -> Eff (selection :: SELECTION | eff) SelectionType +type_ = typeImpl >=> pure <<< fromJust <<< toSelectionType + +data SelectionType + = None + | Caret + | Range + +toSelectionType :: String -> Maybe SelectionType +toSelectionType "None" = Just None +toSelectionType "Caret" = Just Caret +toSelectionType "Range" = Just Range +toSelectionType _ = Nothing + +foreign import getRangeAt + :: forall eff + . Int + -> Selection + -> Eff (selection :: SELECTION | eff) Range + +foreign import collapse + :: forall eff + . Node + -> Int + -> Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import extend + :: forall eff + . Node + -> Int + -> Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import collapseToStart + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import collapseToEnd + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import selectAllChildren + :: forall eff + . Node + -> Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import addRange + :: forall eff + . Range + -> Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import removeRange + :: forall eff + . Range + -> Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import removeAllRanges + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) Unit + +foreign import deleteFromDocument + :: forall eff + . Selection + -> Eff (dom :: DOM, selection :: SELECTION | eff) Unit + +foreign import toString + :: forall eff + . Selection + -> Eff (selection :: SELECTION | eff) String + +foreign import containsNode + :: forall eff + . Node + -> Boolean + -> Selection + -> Eff (selection :: SELECTION | eff) Boolean + +foreign import setBaseAndExtent + :: forall eff + . Node + -> Int + -> Node + -> Int + -> Selection + -> Eff (selection :: SELECTION | eff) Unit diff --git a/src/DOM/HTML/Types.purs b/src/DOM/HTML/Types.purs index d1ab2aa..6b089e6 100644 --- a/src/DOM/HTML/Types.purs +++ b/src/DOM/HTML/Types.purs @@ -3,12 +3,15 @@ module DOM.HTML.Types ( Navigator , Location , History + , Range + , Selection , URL , Window , ALERT , CONFIRM , HISTORY , PROMPT + , SELECTION , WINDOW , windowToEventTarget , HTMLDocument @@ -232,6 +235,10 @@ foreign import data Window :: * foreign import data History :: * +foreign import data Range :: * + +foreign import data Selection :: * + foreign import data URL :: * foreign import data ALERT :: ! @@ -242,6 +249,8 @@ foreign import data PROMPT :: ! foreign import data CONFIRM :: ! +foreign import data SELECTION :: ! + foreign import data WINDOW :: ! windowToEventTarget :: Window -> EventTarget diff --git a/src/DOM/HTML/Window.js b/src/DOM/HTML/Window.js index 120f8b4..d1ee706 100644 --- a/src/DOM/HTML/Window.js +++ b/src/DOM/HTML/Window.js @@ -187,3 +187,9 @@ exports.url = function (window) { return window.URL; }; }; + +exports.getSelection = function (window) { + return function () { + return window.getSelection(); + }; +} diff --git a/src/DOM/HTML/Window.purs b/src/DOM/HTML/Window.purs index fc8a5f3..d1474f7 100644 --- a/src/DOM/HTML/Window.purs +++ b/src/DOM/HTML/Window.purs @@ -27,7 +27,7 @@ module DOM.HTML.Window import Control.Monad.Eff (Eff) import DOM (DOM) -import DOM.HTML.Types (ALERT, CONFIRM, HISTORY, HTMLDocument, History, Location, Navigator, PROMPT, WINDOW, Window, URL) +import DOM.HTML.Types (ALERT, CONFIRM, HISTORY, HTMLDocument, History, Location, Navigator, PROMPT, SELECTION, Selection, URL, WINDOW, Window) import Data.Maybe (Maybe) import Data.Nullable (Nullable, toMaybe) import Prelude (Unit, (<$>)) @@ -91,3 +91,5 @@ foreign import scrollBy :: forall eff. Int -> Int -> Window -> Eff (window :: WI foreign import scrollX :: forall eff. Window -> Eff (dom :: DOM | eff) Int foreign import scrollY :: forall eff. Window -> Eff (dom :: DOM | eff) Int + +foreign import getSelection :: forall eff. Window -> Eff (selection :: SELECTION | eff) Selection From f1fc3762712f476b581b3ad9433cea1ea0098c4e Mon Sep 17 00:00:00 2001 From: Paul Young Date: Sun, 12 Mar 2017 16:30:15 -0700 Subject: [PATCH 2/3] Add missing semicolon --- src/DOM/HTML/Window.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/DOM/HTML/Window.js b/src/DOM/HTML/Window.js index d1ee706..7825355 100644 --- a/src/DOM/HTML/Window.js +++ b/src/DOM/HTML/Window.js @@ -192,4 +192,4 @@ exports.getSelection = function (window) { return function () { return window.getSelection(); }; -} +}; From 08c7af4ea514717563d2b8cb438d25ade9468572 Mon Sep 17 00:00:00 2001 From: Paul Young Date: Mon, 17 Apr 2017 23:18:27 -0700 Subject: [PATCH 3/3] Drop the `Partial` constraint via `unsafePartial` --- src/DOM/HTML/Selection.purs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/DOM/HTML/Selection.purs b/src/DOM/HTML/Selection.purs index 49358b7..0f26b94 100644 --- a/src/DOM/HTML/Selection.purs +++ b/src/DOM/HTML/Selection.purs @@ -15,6 +15,7 @@ import DOM (DOM) import DOM.HTML.Types (Range, SELECTION, Selection) import DOM.Node.Types (Node) import Data.Maybe (Maybe(..), fromJust) +import Partial.Unsafe (unsafePartial) foreign import anchorNode :: forall eff @@ -53,10 +54,9 @@ foreign import typeImpl type_ :: forall eff - . Partial - => Selection + . Selection -> Eff (selection :: SELECTION | eff) SelectionType -type_ = typeImpl >=> pure <<< fromJust <<< toSelectionType +type_ = unsafePartial $ typeImpl >=> pure <<< fromJust <<< toSelectionType data SelectionType = None