Skip to content

Commit 326c125

Browse files
garybflip111
andauthored
NamedNodeMap & Attr (#59)
* NamedNodeMap & Attr * Fix getting attributes * fix Attr * DOMTokenList * Updated to ps 0.15 * Fix es6 exports * Fix export again * Make eslint happy * Drop spago files for now * Extract names into separate modules, fix some attr stuff * Fix some stuff in `DOMTokenList` * Drop `getEffProp` introduction * Use conventional argument order * Use more types * Use more types still --------- Co-authored-by: flip111 <[email protected]>
1 parent 8dde115 commit 326c125

23 files changed

+416
-98
lines changed

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,9 @@ package-lock.json
77
/node_modules/
88
/output/
99
/generated-docs/
10+
/.pulp-cache/
11+
/.psc-package/
12+
/.psc*
13+
/.purs*
14+
/.psa*
15+
/.spago

src/Web/DOM/Attr.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
export const _namespaceURI = (attr) => attr.namespaceURI;
2+
3+
export const _prefix = (attr) => attr.prefix;
4+
5+
export const localName = (attr) => attr.localName;
6+
7+
export const getValue = (attr) => () => attr.value;
8+
9+
export const setValue = (attr) => (value) => () => {
10+
attr.value = value;
11+
};
12+
13+
export const _ownerElement = (attr) => () => attr.ownerElement;

src/Web/DOM/Attr.purs

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
module Web.DOM.Attr
2+
( module Exports
3+
, namespaceURI
4+
, prefix
5+
, localName
6+
, getValue
7+
, setValue
8+
, ownerElement
9+
) where
10+
11+
import Prelude
12+
13+
import Data.Maybe (Maybe)
14+
import Data.Nullable (Nullable, toMaybe)
15+
import Effect (Effect)
16+
import Web.DOM.AttrName (AttrName)
17+
import Web.DOM.Internal.Types (Attr) as Exports
18+
import Web.DOM.Internal.Types (Attr, Element)
19+
import Web.DOM.NamespacePrefix (NamespacePrefix)
20+
import Web.DOM.NamespaceURI (NamespaceURI)
21+
22+
foreign import _namespaceURI :: Attr -> Nullable NamespaceURI
23+
24+
namespaceURI :: Attr -> Maybe NamespaceURI
25+
namespaceURI attr = toMaybe (_namespaceURI attr)
26+
27+
foreign import _prefix :: Attr -> Nullable NamespacePrefix
28+
29+
prefix :: Attr -> Maybe NamespacePrefix
30+
prefix attr = toMaybe (_prefix attr)
31+
32+
foreign import localName :: Attr -> AttrName
33+
34+
foreign import getValue :: Attr -> Effect String
35+
36+
foreign import setValue :: Attr -> String -> Effect Unit
37+
38+
foreign import _ownerElement :: Attr -> Effect (Nullable Element)
39+
40+
-- | The element the attribute belongs to, unless the attribute is not (yet)
41+
-- | attached to an element.
42+
ownerElement :: Attr -> Effect (Maybe Element)
43+
ownerElement attr = map toMaybe (_ownerElement attr)

src/Web/DOM/AttrName.purs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module Web.DOM.AttrName where
2+
3+
import Prelude
4+
5+
import Data.Newtype (class Newtype)
6+
7+
-- | A wrapper for attribute names.
8+
newtype AttrName = AttrName String
9+
10+
derive instance newtypeAttrName :: Newtype AttrName _
11+
derive newtype instance eqAttrName :: Eq AttrName
12+
derive newtype instance ordAttrName :: Ord AttrName

src/Web/DOM/ClassName.purs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
module Web.DOM.ClassName where
2+
3+
import Prelude
4+
5+
import Data.Newtype (class Newtype)
6+
7+
-- | A wrapper for strings which are used as CSS classes.
8+
newtype ClassName = ClassName String
9+
10+
derive instance newtypeClassName :: Newtype ClassName _
11+
derive newtype instance eqClassName :: Eq ClassName
12+
derive newtype instance ordClassName :: Ord ClassName

src/Web/DOM/DOMTokenList.js

Lines changed: 53 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,33 @@
1-
export function add(list) {
1+
export const length = (list) => () => list.length;
2+
3+
export function _item(list) {
4+
return function(index) {
5+
return function() {
6+
return list.item(index);
7+
};
8+
};
9+
}
10+
11+
export function contains(list) {
212
return function(token) {
313
return function() {
4-
return list.add(token);
14+
return list.contains(token);
515
};
616
};
717
}
818

9-
export function remove(list) {
19+
export function add(list) {
1020
return function(token) {
1121
return function() {
12-
return list.remove(token);
22+
return list.add(token);
1323
};
1424
};
1525
}
1626

17-
export function contains(list) {
27+
export function remove(list) {
1828
return function(token) {
1929
return function() {
20-
return list.contains(token);
30+
return list.remove(token);
2131
};
2232
};
2333
}
@@ -40,10 +50,44 @@ export function toggleForce(list) {
4050
};
4151
}
4252

43-
export function _item(list) {
44-
return function(index) {
53+
export function replace(list) {
54+
return function(token) {
55+
return function(newToken) {
56+
return function() {
57+
return list.replace(token, newToken);
58+
};
59+
};
60+
};
61+
}
62+
63+
export function supports(list) {
64+
return function(token) {
4565
return function() {
46-
return list.item(index);
66+
return list.supports(token);
67+
};
68+
};
69+
}
70+
71+
export function getValue(list) {
72+
return function() {
73+
return list.value;
74+
};
75+
}
76+
77+
export function setValue(list) {
78+
return function(token) {
79+
return function() {
80+
list.value = token;
4781
};
4882
};
4983
}
84+
85+
export function tokens(list) {
86+
return function () {
87+
const result = [];
88+
for (const token of list.tokens) {
89+
result.push(token);
90+
}
91+
return result;
92+
};
93+
}

src/Web/DOM/DOMTokenList.purs

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
module Web.DOM.DOMTokenList
22
( DOMTokenList
3-
, add
4-
, contains
3+
, length
54
, item
5+
, contains
6+
, add
67
, remove
78
, toggle
89
, toggleForce
10+
, replace
11+
, supports
12+
, getValue
13+
, setValue
14+
, tokens
915
) where
1016

1117
import Prelude
@@ -16,17 +22,29 @@ import Data.Nullable (Nullable, toMaybe)
1622

1723
foreign import data DOMTokenList :: Type
1824

19-
foreign import add :: DOMTokenList -> String -> Effect Unit
25+
foreign import length :: DOMTokenList -> Effect Int
2026

21-
foreign import remove :: DOMTokenList -> String -> Effect Unit
27+
foreign import _item :: DOMTokenList -> Int -> Effect (Nullable String)
28+
29+
item :: DOMTokenList -> Int -> Effect (Maybe String)
30+
item index = map toMaybe <<< _item index
2231

2332
foreign import contains :: DOMTokenList -> String -> Effect Boolean
2433

34+
foreign import add :: DOMTokenList -> String -> Effect Unit
35+
36+
foreign import remove :: DOMTokenList -> String -> Effect Unit
37+
2538
foreign import toggle :: DOMTokenList -> String -> Effect Boolean
2639

2740
foreign import toggleForce :: DOMTokenList -> String -> Boolean -> Effect Boolean
2841

29-
foreign import _item :: DOMTokenList -> Int -> Effect (Nullable String)
42+
foreign import replace :: DOMTokenList -> String -> String -> Effect Unit
3043

31-
item :: DOMTokenList -> Int -> Effect (Maybe String)
32-
item index = map toMaybe <<< _item index
44+
foreign import supports :: DOMTokenList -> String -> Effect Boolean
45+
46+
foreign import getValue :: DOMTokenList -> Effect String
47+
48+
foreign import setValue :: DOMTokenList -> String -> Effect Unit
49+
50+
foreign import tokens :: DOMTokenList -> Effect (Array String)

src/Web/DOM/Document.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ var getEffProp = function (name) {
99
export const url = getEffProp("URL");
1010
export const documentURI = getEffProp("documentURI");
1111
export const origin = getEffProp("origin");
12-
export const compatMode = getEffProp("compatMode");
12+
export const _compatMode = getEffProp("compatMode");
1313
export const characterSet = getEffProp("characterSet");
1414
export const contentType = getEffProp("contentType");
1515
export function _doctype(doc) {

src/Web/DOM/Document.purs

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,16 +39,21 @@ module Web.DOM.Document
3939

4040
import Prelude
4141

42-
import Data.Maybe (Maybe)
42+
import Data.Maybe (Maybe, fromMaybe)
4343
import Data.Nullable (Nullable, toMaybe, toNullable)
4444
import Effect (Effect)
4545
import Unsafe.Coerce (unsafeCoerce)
46+
import Web.DOM.ClassName (ClassName)
4647
import Web.DOM.Comment (Comment)
48+
import Web.DOM.Document.CompatMode (CompatMode)
49+
import Web.DOM.Document.CompatMode as CompatMode
4750
import Web.DOM.DocumentFragment (DocumentFragment)
4851
import Web.DOM.DocumentType (DocumentType)
4952
import Web.DOM.Element (Element)
53+
import Web.DOM.ElementName (ElementName)
5054
import Web.DOM.HTMLCollection (HTMLCollection)
5155
import Web.DOM.Internal.Types (Node)
56+
import Web.DOM.NamespaceURI (NamespaceURI)
5257
import Web.DOM.NonElementParentNode (NonElementParentNode)
5358
import Web.DOM.ParentNode (ParentNode)
5459
import Web.DOM.ProcessingInstruction (ProcessingInstruction)
@@ -85,7 +90,12 @@ toEventTarget = unsafeCoerce
8590
foreign import url :: Document -> Effect String
8691
foreign import documentURI :: Document -> Effect String
8792
foreign import origin :: Document -> Effect String
88-
foreign import compatMode :: Document -> Effect String
93+
94+
foreign import _compatMode :: Document -> Effect String
95+
96+
compatMode :: Document -> Effect CompatMode
97+
compatMode doc = fromMaybe CompatMode.CSS1Compat <<< CompatMode.parse <$> _compatMode doc
98+
8999
foreign import characterSet :: Document -> Effect String
90100
foreign import contentType :: Document -> Effect String
91101

@@ -99,20 +109,20 @@ documentElement = map toMaybe <<< _documentElement
99109

100110
foreign import _documentElement :: Document -> Effect (Nullable Element)
101111

102-
foreign import getElementsByTagName :: String -> Document -> Effect HTMLCollection
112+
foreign import getElementsByTagName :: ElementName -> Document -> Effect HTMLCollection
103113

104-
getElementsByTagNameNS :: Maybe String -> String -> Document -> Effect HTMLCollection
114+
getElementsByTagNameNS :: Maybe NamespaceURI -> ElementName -> Document -> Effect HTMLCollection
105115
getElementsByTagNameNS = _getElementsByTagNameNS <<< toNullable
106116

107-
foreign import _getElementsByTagNameNS :: Nullable String -> String -> Document -> Effect HTMLCollection
108-
foreign import getElementsByClassName :: String -> Document -> Effect HTMLCollection
117+
foreign import _getElementsByTagNameNS :: Nullable NamespaceURI -> ElementName -> Document -> Effect HTMLCollection
118+
foreign import getElementsByClassName :: ClassName -> Document -> Effect HTMLCollection
109119

110-
foreign import createElement :: String -> Document -> Effect Element
120+
foreign import createElement :: ElementName -> Document -> Effect Element
111121

112-
createElementNS :: Maybe String -> String -> Document -> Effect Element
122+
createElementNS :: Maybe NamespaceURI -> ElementName -> Document -> Effect Element
113123
createElementNS = _createElementNS <<< toNullable
114124

115-
foreign import _createElementNS :: Nullable String -> String -> Document -> Effect Element
125+
foreign import _createElementNS :: Nullable NamespaceURI -> ElementName -> Document -> Effect Element
116126
foreign import createDocumentFragment :: Document -> Effect DocumentFragment
117127
foreign import createTextNode :: String -> Document -> Effect Text
118128
foreign import createComment :: String -> Document -> Effect Comment

src/Web/DOM/Document/CompatMode.purs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
module Web.DOM.Document.CompatMode where
2+
3+
import Data.Maybe (Maybe(..))
4+
5+
data CompatMode
6+
= BackCompat
7+
| CSS1Compat
8+
9+
parse String -> Maybe CompatMode
10+
parse = case _ of
11+
"BackCompat" -> Just BackCompat
12+
"CSS1Compat" -> Just CSS1Compat
13+
_ -> Nothing
14+
15+
print CompatMode -> String
16+
print = case _ of
17+
BackCompat"BackCompat"
18+
CSS1Compat"CSS1Compat"

src/Web/DOM/Element.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export function getElementsByClassName(classNames) {
6969
};
7070
}
7171

72+
export const attributes = (element) => () => element.attributes;
73+
7274
export function setAttribute(name) {
7375
return function (value) {
7476
return function (element) {

0 commit comments

Comments
 (0)