Skip to content

Commit 731c0e0

Browse files
committed
Implemented DOM Level 4 (read-only)
1 parent 51b902d commit 731c0e0

File tree

9 files changed

+92
-22
lines changed

9 files changed

+92
-22
lines changed

src/XMLAttribute.coffee

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,33 +2,42 @@ NodeType = require './NodeType'
22
XMLNode = require './XMLNode'
33

44
# Represents an attribute
5-
module.exports = class XMLAttribute extends XMLNode
5+
module.exports = class XMLAttribute
66

77

88
# Initializes a new instance of `XMLAttribute`
99
#
1010
# `parent` the parent node
1111
# `name` attribute target
1212
# `value` attribute value
13-
constructor: (parent, name, value) ->
14-
super parent
13+
constructor: (@parent, name, value) ->
14+
if @parent
15+
@options = @parent.options
16+
@stringify = @parent.stringify
1517

1618
if not name?
1719
throw new Error "Missing attribute name. " + @debugInfo(name)
1820

1921
@name = @stringify.name name
2022
@value = @stringify.attValue value
21-
@specified = true
2223
@type = NodeType.Attribute
2324
# DOM level 3
2425
@isId = false
2526
@schemaTypeInfo = null
2627

2728

2829
# DOM level 1
30+
Object.defineProperty @::, 'nodeType', get: () -> @type
2931
Object.defineProperty @::, 'ownerElement', get: () -> @parent
3032

3133

34+
# DOM level 4
35+
Object.defineProperty @::, 'namespaceURI', get: () -> ''
36+
Object.defineProperty @::, 'prefix', get: () -> ''
37+
Object.defineProperty @::, 'localName', get: () -> @name
38+
Object.defineProperty @::, 'specified', get: () -> true
39+
40+
3241
# Creates and returns a deep clone of `this`
3342
clone: () ->
3443
Object.create @

src/XMLCharacterData.coffee

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
XMLNode = require './XMLNode'
22

3-
# Represents a CDATA node
3+
# Represents a character data node
44
module.exports = class XMLCharacterData extends XMLNode
55

66

@@ -12,13 +12,15 @@ module.exports = class XMLCharacterData extends XMLNode
1212
@value = ''
1313

1414
# DOM level 1
15-
Object.defineProperty @::, 'data', get: () -> @value
15+
Object.defineProperty @::, 'data',
16+
get: () -> @value
17+
set: (value) -> @value = value or ''
1618
Object.defineProperty @::, 'length', get: () -> @value.length
1719

1820
# DOM level 3
1921
Object.defineProperty @::, 'textContent',
2022
get: () -> @data
21-
set: (value) -> @value = value
23+
set: (value) -> @value = value or ''
2224

2325

2426
# Creates and returns a deep clone of `this`

src/XMLDOMImplementation.coffee

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,13 @@ module.exports = class XMLDOMImplementation
3232
throw new Error "This DOM method is not implemented."
3333

3434

35+
# Creates a new HTML document.
36+
#
37+
# `title` document title
38+
createHTMLDocument: (title) ->
39+
throw new Error "This DOM method is not implemented."
40+
41+
3542
# Returns a specialized object which implements the specialized APIs
3643
# of the specified feature and version.
3744
#

src/XMLDocument.coffee

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ module.exports = class XMLDocument extends XMLNode
7272
return "1.0"
7373

7474

75+
# DOM level 4
76+
Object.defineProperty @::, 'URL', get: () -> @documentURI
77+
Object.defineProperty @::, 'origin', get: () -> null
78+
Object.defineProperty @::, 'compatMode', get: () -> null
79+
Object.defineProperty @::, 'characterSet', get: () -> null
80+
Object.defineProperty @::, 'contentType', get: () -> null
81+
82+
7583
# Ends the document and passes it to the given XML writer
7684
#
7785
# `writer` is either an XML writer or a plain object to pass to the
@@ -125,3 +133,10 @@ module.exports = class XMLDocument extends XMLNode
125133
adoptNode: (source) -> throw new Error "This DOM method is not implemented." + @debugInfo()
126134
normalizeDocument: () -> throw new Error "This DOM method is not implemented." + @debugInfo()
127135
renameNode: (node, namespaceURI, qualifiedName) -> throw new Error "This DOM method is not implemented." + @debugInfo()
136+
137+
# DOM level 4 functions to be implemented later
138+
getElementsByClassName: (classNames) -> throw new Error "This DOM method is not implemented." + @debugInfo()
139+
createEvent: (eventInterface) -> throw new Error "This DOM method is not implemented." + @debugInfo()
140+
createRange: () -> throw new Error "This DOM method is not implemented." + @debugInfo()
141+
createNodeIterator: (root, whatToShow, filter) -> throw new Error "This DOM method is not implemented." + @debugInfo()
142+
createTreeWalker: (root, whatToShow, filter) -> throw new Error "This DOM method is not implemented." + @debugInfo()

src/XMLElement.coffee

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
XMLNode = require './XMLNode'
44
NodeType = require './NodeType'
55
XMLAttribute = require './XMLAttribute'
6+
XMLNamedNodeMap = require './XMLNamedNodeMap'
67

78
# Represents an element of the XML document
89
module.exports = class XMLElement extends XMLNode
@@ -42,6 +43,19 @@ module.exports = class XMLElement extends XMLNode
4243
Object.defineProperty @::, 'tagName', get: () -> @name
4344

4445

46+
# DOM level 4
47+
Object.defineProperty @::, 'namespaceURI', get: () -> ''
48+
Object.defineProperty @::, 'prefix', get: () -> ''
49+
Object.defineProperty @::, 'localName', get: () -> @name
50+
Object.defineProperty @::, 'id', get: () -> throw new Error "This DOM method is not implemented." + @debugInfo()
51+
Object.defineProperty @::, 'className', get: () -> throw new Error "This DOM method is not implemented." + @debugInfo()
52+
Object.defineProperty @::, 'classList', get: () -> throw new Error "This DOM method is not implemented." + @debugInfo()
53+
Object.defineProperty @::, 'attributes', get: () ->
54+
if not @attributeMap or not @attributeMap.nodes
55+
@attributeMap = new XMLNamedNodeMap @attribs
56+
return @attributeMap
57+
58+
4559
# Creates and returns a deep clone of `this`
4660
#
4761
clone: () ->
@@ -143,3 +157,9 @@ module.exports = class XMLElement extends XMLNode
143157
setIdAttribute: (name, isId) -> if @attribs.hasOwnProperty(name) then @attribs[name].isId else isId
144158
setIdAttributeNS: (namespaceURI, localName, isId) -> throw new Error "This DOM method is not implemented." + @debugInfo()
145159
setIdAttributeNode: (idAttr, isId) -> throw new Error "This DOM method is not implemented." + @debugInfo()
160+
161+
162+
# DOM Level 4
163+
getElementsByTagName: (tagname) -> throw new Error "This DOM method is not implemented." + @debugInfo()
164+
getElementsByTagNameNS: (namespaceURI, localName) -> throw new Error "This DOM method is not implemented." + @debugInfo()
165+
getElementsByClassName: (classNames) -> throw new Error "This DOM method is not implemented." + @debugInfo()

src/XMLNode.coffee

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -63,18 +63,9 @@ module.exports = class XMLNode
6363
Object.defineProperty @::, 'nextSibling', get: () ->
6464
i = @parent.children.indexOf @
6565
@parent.children[i + 1] or null
66-
Object.defineProperty @::, 'attributes', get: () ->
67-
if not @attributeMap or not @attributeMap.nodes
68-
@attributeMap = new XMLNamedNodeMap @attribs
69-
return @attributeMap
7066
Object.defineProperty @::, 'ownerDocument', get: () -> @document() or null
7167

7268

73-
# DOM level 2
74-
Object.defineProperty @::, 'namespaceURI', get: () -> ''
75-
Object.defineProperty @::, 'prefix', get: () -> ''
76-
Object.defineProperty @::, 'localName', get: () -> @name
77-
7869
# DOM level 3
7970
Object.defineProperty @::, 'textContent',
8071
get: () ->
@@ -608,4 +599,7 @@ module.exports = class XMLNode
608599
isEqualNode: (arg) -> throw new Error "This DOM method is not implemented." + @debugInfo()
609600
getFeature: (feature, version) -> throw new Error "This DOM method is not implemented." + @debugInfo()
610601
setUserData: (key, data, handler) -> throw new Error "This DOM method is not implemented." + @debugInfo()
611-
getUserData: (key) -> throw new Error "This DOM method is not implemented." + @debugInfo()
602+
getUserData: (key) -> throw new Error "This DOM method is not implemented." + @debugInfo()
603+
604+
# DOM level 4 functions to be implemented later
605+
contains: (other) -> throw new Error "This DOM method is not implemented." + @debugInfo()

src/XMLNodeFilter.coffee

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
# Represents a node filter
3+
module.exports = class XMLNodeFilter
4+
5+
FilterAccept : 1
6+
FilterReject : 2
7+
FilterSkip : 3
8+
9+
ShowAll : 0xffffffff
10+
ShowElement : 0x1
11+
ShowAttribute : 0x2
12+
ShowText : 0x4
13+
ShowCDataSection : 0x8
14+
ShowEntityReference : 0x10
15+
ShowEntity : 0x20
16+
ShowProcessingInstruction : 0x40
17+
ShowComment : 0x80
18+
ShowDocument : 0x100
19+
ShowDocumentType : 0x200
20+
ShowDocumentFragment : 0x400
21+
ShowNotation : 0x800
22+
23+
24+
# DOM level 4 functions to be implemented later
25+
acceptNode: (node) -> throw new Error "This DOM method is not implemented."

src/XMLProcessingInstruction.coffee

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
NodeType = require './NodeType'
2-
XMLNode = require './XMLNode'
2+
XMLCharacterData = require './XMLCharacterData'
33

44
# Represents a processing instruction
5-
module.exports = class XMLProcessingInstruction extends XMLNode
5+
module.exports = class XMLProcessingInstruction extends XMLCharacterData
66

77

88
# Initializes a new instance of `XMLProcessingInstruction`
@@ -21,9 +21,6 @@ module.exports = class XMLProcessingInstruction extends XMLNode
2121
@name = @target
2222
@value = @stringify.insValue value if value
2323

24-
# DOM level 1
25-
Object.defineProperty @::, 'data', get: () -> @value
26-
2724

2825
# Creates and returns a deep clone of `this`
2926
clone: () ->

test/dom/level1.coffee

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,3 +144,4 @@ suite 'DOM Level 1:', ->
144144

145145
eq( node.target, 'target' )
146146
eq( node.data, 'value' )
147+
eq( node.value, 'value' )

0 commit comments

Comments
 (0)