Skip to content

Commit

Permalink
refactor & proper type definition
Browse files Browse the repository at this point in the history
  • Loading branch information
Raynos committed Apr 6, 2014
1 parent b9ceef7 commit cbec444
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 100 deletions.
95 changes: 75 additions & 20 deletions docs.mli
@@ -1,10 +1,16 @@
type DOMText := { type DOMText := {
data: String, data: String,
type: "DOMTextNode", type: "DOMTextNode",
length: Number,
nodeType: 3, nodeType: 3,


constructor: (value: String) => DOMText, toString: (this: DOMText) => String,
toString: () => String replaceChild: (
this: DOMText,
index: Number,
length: Number,
value: String
) => void
} }


type DOMNode := DOMText | DOMElement | DocumentFragment type DOMNode := DOMText | DOMElement | DocumentFragment
Expand All @@ -19,13 +25,16 @@ type DOMElement := {
style: Object<String, String>, style: Object<String, String>,
type: "DOMElement", type: "DOMElement",
nodeType: 1, nodeType: 1,
ownerDoucment: null | Document,


constructor: (tagName: String) => DOMElement, appendChild: (this: DOMElement, child: DOMChild),
appendChild: (child: DOMNode), replaceChild:
removeChild: (child: DOMChild), (this: DOMElement, elem: DOMChild, needle: DOMChild),
replaceChild: (elem: DOMNode, needle: DOMChild), removeChild: (this: DOMElement, child: DOMChild),
addEventListener: addEventListener,
dispatchEvent: dispatchEvent,
focus: () => void, focus: () => void,
toString: () => String toString: (this: DOMElement) => String
} }


type DocumentFragment := { type DocumentFragment := {
Expand All @@ -34,25 +43,71 @@ type DocumentFragment := {
type: "DocumentFragment", type: "DocumentFragment",
nodeType: 11, nodeType: 11,
nodeName: "#document-fragment", nodeName: "#document-fragment",
ownerDoucment: Document | null,


constructor: () => DocumentFragment, appendChild: (this: DocumentFragment, child: DOMChild),
appendChild replaceChild:
replaceChild (this: DocumentFragment, elem: DOMChild, needle: DOMChild),
removeChild removeChild: (this: DocumentFragment, child: DOMChild),
toString: () => String toString: (this: DocumentFragment) => String
} }


type Document := { type Document := {
body: DOMElement, body: DOMElement,
documentElement: DOMElement,


Document: () => Document, createTextNode: (this: Document, value: String) => DOMText,
Text: (value: String) => DOMText, createElement: (this: Document, tagName: String) => DOMElement,
Element: (tagName: String) => DOMElement, createDocumentFragment: (this: Document) => DocumentFragment,
DocumentFragment: () => DocumentFragment, createEvent: () => Event,
createTextNode: (value: String) => DOMText, getElementById: (
createElement: (tagName: String) => Element, this: Document,
createDocumentFragment: () => DocumentFragment, id: String,
getElementById: (id: String) => null | Element parent?: DOMElement
) => null | DOMElement
} }


type Event := {
type: String,
bubbles: Boolean,
cancelable: Boolean,

initEvent: (
this: Event,
type: String,
bubbles: Boolean,
cancelable: Boolean
) => void
}

type addEventListener := (
this: DOMElement,
type: String,
listener: Listener
) => void

type dispatchEvent := (
this: DOMElement,
ev: Event
)

min-document/event/add-event-listener := addEventListener

min-document/event/dispatch-event := dispatchEvent

min-document/document := () => Document

min-document/dom-element :=
(tagName: String, owner?: Document) => DOMElement

min-document/dom-fragment :=
(owner?: Document) => DocumentFragment

min-document/dom-text :=
(value: String, owner?: Document) => DOMText

min-document/event := () => Event

min-document/serialize := (DOMElement) => String

min-document := Document min-document := Document
56 changes: 56 additions & 0 deletions document.js
@@ -0,0 +1,56 @@
var DOMText = require("./dom-text.js")
var DOMElement = require("./dom-element.js")
var DocumentFragment = require("./dom-fragment.js")
var Event = require("./event.js")

module.exports = Document;

function Document() {
if (!(this instanceof Document)) {
return new Document();
}

this.body = this.createElement("body")
this.documentElement = this.createElement("html")
this.documentElement.appendChild(this.body)
}

var proto = Document.prototype;
proto.createTextNode = function createTextNode(value) {
return new DOMText(value, this)
}

proto.createElement = function createElement(tagName) {
return new DOMElement(tagName, this)
}

proto.createDocumentFragment = function createDocumentFragment() {
return new DocumentFragment(this)
}

proto.createEvent = function createEvent(family) {
return new Event(family)
}

proto.getElementById = function getElementById(id, parent) {
if (!parent) {
parent = this.body
}

if (String(parent.id) === String(id)) {
return parent
}

var arr = parent.childNodes
var result = null

if (!arr) {
return result
}

for (var i = 0, len = arr.length; !result && i < len; i++) {
result = getElementById(id, arr[i])
}

return result
}
3 changes: 2 additions & 1 deletion dom-element.js
Expand Up @@ -4,7 +4,7 @@ var serializeElement = require("./serialize.js")


module.exports = DOMElement module.exports = DOMElement


function DOMElement(tagName) { function DOMElement(tagName, owner) {
if (!(this instanceof DOMElement)) { if (!(this instanceof DOMElement)) {
return new DOMElement(tagName) return new DOMElement(tagName)
} }
Expand All @@ -15,6 +15,7 @@ function DOMElement(tagName) {
this.childNodes = [] this.childNodes = []
this.parentNode = null this.parentNode = null
this.style = {} this.style = {}
this.ownerDocument = owner || null;
} }


DOMElement.prototype.type = "DOMElement" DOMElement.prototype.type = "DOMElement"
Expand Down
3 changes: 2 additions & 1 deletion dom-fragment.js
Expand Up @@ -2,13 +2,14 @@ var DOMElement = require("./dom-element.js")


module.exports = DocumentFragment module.exports = DocumentFragment


function DocumentFragment() { function DocumentFragment(owner) {
if (!(this instanceof DocumentFragment)) { if (!(this instanceof DocumentFragment)) {
return new DocumentFragment() return new DocumentFragment()
} }


this.childNodes = [] this.childNodes = []
this.parentNode = null this.parentNode = null
this.ownerDocument = owner || null
} }


DocumentFragment.prototype.type = "DocumentFragment" DocumentFragment.prototype.type = "DocumentFragment"
Expand Down
5 changes: 3 additions & 2 deletions dom-text.js
@@ -1,12 +1,13 @@
module.exports = DOMText module.exports = DOMText


function DOMText(value) { function DOMText(value, owner) {
if (!(this instanceof DOMText)) { if (!(this instanceof DOMText)) {
return new DOMText(value) return new DOMText(value)
} }


this.data = value || "" this.data = value || ""
this.length = this.data.length this.length = this.data.length
this.ownerDocument = owner || null
} }


DOMText.prototype.type = "DOMTextNode" DOMText.prototype.type = "DOMTextNode"
Expand All @@ -22,4 +23,4 @@ DOMText.prototype.replaceData = function replaceData(index, length, value) {
var right = current.substring(index + length, current.length) var right = current.substring(index + length, current.length)
this.data = left + value + right this.data = left + value + right
this.length = this.data.length this.length = this.data.length
} }
78 changes: 2 additions & 76 deletions index.js
@@ -1,77 +1,3 @@
var DOMText = require("./dom-text.js") var Document = require('./document.js');
var DOMElement = require("./dom-element.js")
var DocumentFragment = require("./dom-fragment.js")
var Event = require("./event.js")


var body = createElement("body") module.exports = new Document();
var documentElement = createElement("html")

documentElement.appendChild(body)

module.exports = Document()

function Document() {
return {
body: body,
documentElement: documentElement,
createTextNode: createTextNode,
createElement: createElement,
createDocumentFragment: createDocumentFragment,
createEvent: createEvent,
getElementById: getElementById,
Document: Document,
Text: DOMText,
Element: DOMElement,
DocumentFragment: DocumentFragment
}
}

function ownerDocument(that, node) {
node.ownerDocument = that
return node
}

function createTextNode(value) {
return ownerDocument(this, new DOMText(value))
}

function createElement(tagName) {
return ownerDocument(this, new DOMElement(tagName))
}

function createDocumentFragment() {
return ownerDocument(this, new DocumentFragment())
}

function createEvent(family) {
return new Event(family)
}


/*
* getElementById returns the Element whose ID is given by elementId.
* If no such element exists, returns null.
* Behavior is not defined if more than one element has this ID.
*/
function getElementById(id, parent) {
if (!parent) {
parent = body
}

if (String(parent.id) === String(id)) {
return parent
}

var arr = parent.childNodes
var result = null

if (!arr) {
return result
}

for (var i = 0, len = arr.length; !result && i < len; i++) {
result = getElementById(id, arr[i])
}

return result
}

0 comments on commit cbec444

Please sign in to comment.