Skip to content

Commit

Permalink
refactor to use browserify correctly
Browse files Browse the repository at this point in the history
  • Loading branch information
jhchen committed Jul 31, 2013
1 parent 46f4f5b commit 8270cd9
Show file tree
Hide file tree
Showing 23 changed files with 416 additions and 355 deletions.
12 changes: 7 additions & 5 deletions src/debug.coffee
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
Scribe = require('./scribe')
_ = require('underscore')
ScribeDOM = require('./dom')
ScribeUtils = require('./utils')


Scribe.Debug =
ScribeDebug =
checkDocumentConsistency: (doc) ->
nodesByLine = _.map(_.clone(doc.root.childNodes), (lineNode) ->
nodes = lineNode.querySelectorAll('*')
return _.filter(nodes, (node) ->
return node.nodeType == Scribe.DOM.ELEMENT_NODE && (node.nodeName == 'BR' || !node.firstChild? || node.firstChild.nodeType == Scribe.DOM.TEXT_NODE)
return node.nodeType == ScribeDOM.ELEMENT_NODE && (node.nodeName == 'BR' || !node.firstChild? || node.firstChild.nodeType == ScribeDOM.TEXT_NODE)
)
)
lines = doc.lines.toArray()
Expand Down Expand Up @@ -52,7 +54,7 @@ Scribe.Debug =
if lines.length != nodesByLine.length
throw new Error("doc.lines and nodesByLine differ in length")
_.each(lines, (line, index) =>
calculatedLength = _.reduce(line.node.childNodes, ((length, node) -> Scribe.Utils.getNodeLength(node) + length), 0)
calculatedLength = _.reduce(line.node.childNodes, ((length, node) -> ScribeUtils.getNodeLength(node) + length), 0)
calculatedLength += 1 if line.trailingNewline
if line.length != calculatedLength
throw new Error('Line length inccorect')
Expand All @@ -79,4 +81,4 @@ Scribe.Debug =
return true


module.exports = Scribe
module.exports = ScribeDebug
29 changes: 17 additions & 12 deletions src/document.coffee
Original file line number Diff line number Diff line change
@@ -1,12 +1,17 @@
Scribe = require('./scribe')
Tandem = require('tandem-core')
_ = require('underscore')
ScribeDOM = require('./dom')
ScribeFormatManager = require('./format-manager')
ScribeLine = require('./line')
ScribeNormalizer = require('./normalizer')
ScribeUtils = require('./utils')
Tandem = require('tandem-core')


class Scribe.Document
class ScribeDocument
constructor: (@root, options = {}) ->
@formatManager = new Scribe.FormatManager(@root, options)
@normalizer = new Scribe.Normalizer(@root, @formatManager)
@root.innerHTML = Scribe.Normalizer.normalizeHtml(@root.innerHTML)
@formatManager = new ScribeFormatManager(@root, options)
@normalizer = new ScribeNormalizer(@root, @formatManager)
@root.innerHTML = ScribeNormalizer.normalizeHtml(@root.innerHTML)
@lines = new LinkedList()
@lineMap = {}
@normalizer.normalizeDoc()
Expand All @@ -19,7 +24,7 @@ class Scribe.Document

findLeaf: (node) ->
lineNode = node.parentNode
while lineNode? && !Scribe.Line.isLineNode(lineNode)
while lineNode? && !ScribeLine.isLineNode(lineNode)
lineNode = lineNode.parentNode
return null if !lineNode?
line = this.findLine(lineNode)
Expand All @@ -45,12 +50,12 @@ class Scribe.Document
return [retLine, offset]

findLineNode: (node) ->
while node? && !Scribe.Line.isLineNode(node)
while node? && !ScribeLine.isLineNode(node)
node = node.parentNode
return node

insertLineBefore: (newLineNode, refLine) ->
line = new Scribe.Line(this, newLineNode)
line = new ScribeLine(this, newLineNode)
if refLine != null
@lines.insertAfter(refLine.prev, line)
else
Expand All @@ -63,7 +68,7 @@ class Scribe.Document
_.each(_.clone(lineToMerge.node.childNodes), (child) ->
line.node.appendChild(child)
)
Scribe.DOM.removeNode(lineToMerge.node)
ScribeDOM.removeNode(lineToMerge.node)
this.removeLine(lineToMerge)
line.trailingNewline = lineToMerge.trailingNewline
line.rebuild()
Expand All @@ -73,7 +78,7 @@ class Scribe.Document
@lines.remove(line)

splitLine: (line, offset) ->
[lineNode1, lineNode2] = Scribe.Utils.splitNode(line.node, offset, true)
[lineNode1, lineNode2] = ScribeUtils.splitNode(line.node, offset, true)
line.node = lineNode1
this.updateLine(line)
return this.insertLineBefore(lineNode2, line.next)
Expand All @@ -90,4 +95,4 @@ class Scribe.Document
return line.rebuild()


module.exports = Scribe
module.exports = ScribeDocument
30 changes: 15 additions & 15 deletions src/dom.coffee
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
Scribe = require('./scribe')
_ = require('underscore')


Scribe.DOM =
ScribeDOM =
ELEMENT_NODE: 1
NOBREAK_SPACE: "&nbps;"
TEXT_NODE: 3
ZERO_WIDTH_NOBREAK_SPACE: "\uFEFF"

addClass: (node, cssClass) ->
return if Scribe.DOM.hasClass(node, cssClass)
return if ScribeDOM.hasClass(node, cssClass)
if node.classList?
node.classList.add(cssClass)
else if node.className?
Expand All @@ -30,16 +30,16 @@ Scribe.DOM =

getText: (node) ->
switch node.nodeType
when Scribe.DOM.ELEMENT_NODE
when ScribeDOM.ELEMENT_NODE
return if node.tagName == "BR" then "" else node.textContent or node.innerText or ""
when Scribe.DOM.TEXT_NODE then return node.data or ""
when ScribeDOM.TEXT_NODE then return node.data or ""
else return ""

hasClass: (node, cssClass) ->
if node.classList?
return node.classList.contains(cssClass)
else if node.className?
return _.indexOf(Scribe.DOM.getClasses(node), cssClass) > -1
return _.indexOf(ScribeDOM.getClasses(node), cssClass) > -1
return false

mergeNodes: (node1, node2) ->
Expand All @@ -48,7 +48,7 @@ Scribe.DOM =
this.moveChildren(node1, node2)
node2.parentNode.removeChild(node2)
if (node1.tagName == 'OL' || node1.tagName == 'UL') && node1.childNodes.length == 2
Scribe.DOM.mergeNodes(node1.firstChild, node1.lastChild)
ScribeDOM.mergeNodes(node1.firstChild, node1.lastChild)
return node1

moveChildren: (newParent, oldParent) ->
Expand All @@ -73,11 +73,11 @@ Scribe.DOM =
)

removeClass: (node, cssClass) ->
return unless Scribe.DOM.hasClass(node, cssClass)
return unless ScribeDOM.hasClass(node, cssClass)
if node.classList?
return node.classList.remove(cssClass)
else if node.className?
classArray = Scribe.DOM.getClasses(node)
classArray = ScribeDOM.getClasses(node)
classArray.splice(_.indexOf(classArray, cssClass), 1)
node.className = classArray.join(' ')

Expand All @@ -96,12 +96,12 @@ Scribe.DOM =

setText: (node, text) ->
switch node.nodeType
when Scribe.DOM.ELEMENT_NODE
when ScribeDOM.ELEMENT_NODE
if node.textContent?
node.textContent = text
else
node.innerText = text
when Scribe.DOM.TEXT_NODE then node.data = text
when ScribeDOM.TEXT_NODE then node.data = text
else return # Noop

switchTag: (node, newTag) ->
Expand All @@ -114,10 +114,10 @@ Scribe.DOM =
return newNode

toggleClass: (node, className) ->
if Scribe.DOM.hasClass(node, className)
Scribe.DOM.removeClass(node, className)
if ScribeDOM.hasClass(node, className)
ScribeDOM.removeClass(node, className)
else
Scribe.DOM.addClass(node, className)
ScribeDOM.addClass(node, className)

unwrap: (node) ->
ret = node.firstChild
Expand All @@ -134,4 +134,4 @@ Scribe.DOM =
return wrapper


module.exports = Scribe
module.exports = ScribeDOM
51 changes: 30 additions & 21 deletions src/editor.coffee
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
Scribe = require('./scribe')
Tandem = require('tandem-core')
_ = require('underscore')
ScribeDOM = require('./dom')
ScribeDocument = require('./document')
ScribeKeyboard = require('./keyboard')
ScribeLine = require('./line')
ScribeNormalizer = require('./normalizer')
ScribePasteManager = require('./paste-manager')
ScribeRenderer = require('./renderer')
ScribeSelection = require('./selection')
ScribeUndoManager = require('./undo-manager')
Tandem = require('tandem-core')


DEFAULT_API_OPTIONS = { silent: false, source: 'api' }
Expand Down Expand Up @@ -46,7 +55,7 @@ deleteAt = (index, length) ->
curLine.trailingNewline = false
curLine.rebuild()
else
Scribe.DOM.removeNode(curLine.node)
ScribeDOM.removeNode(curLine.node)
@doc.removeLine(curLine)
else
curLine.deleteText(offset, deleteLength)
Expand All @@ -67,7 +76,7 @@ formatAt = (index, length, name, value) ->
@selection.preserve(index, 0, =>
[line, offset] = @doc.findLineAtOffset(index)
while line? and length > 0
if Scribe.Line.FORMATS[name]?
if ScribeLine.FORMATS[name]?
# If newline character is being applied with formatting
if length > line.length - offset
line.format(name, value)
Expand Down Expand Up @@ -127,11 +136,11 @@ trackDelta = (fn, options) ->
else
decompose = decomposeA or decomposeB
if !decompose.isIdentity() and !options.silent
eventName = if options.source == 'api' then Scribe.Editor.events.API_TEXT_CHANGE else Scribe.Editor.events.USER_TEXT_CHANGE
eventName = if options.source == 'api' then ScribeEditor.events.API_TEXT_CHANGE else ScribeEditor.events.USER_TEXT_CHANGE
this.emit(eventName, decompose)


class Scribe.Editor extends EventEmitter2
class ScribeEditor extends EventEmitter2
@editors: []

@ID_PREFIX: 'editor-'
Expand All @@ -153,12 +162,12 @@ class Scribe.Editor extends EventEmitter2


constructor: (@iframeContainer, options = {}) ->
@options = _.defaults(options, Scribe.Editor.DEFAULTS)
@id = _.uniqueId(Scribe.Editor.ID_PREFIX)
@options = _.defaults(options, ScribeEditor.DEFAULTS)
@id = _.uniqueId(ScribeEditor.ID_PREFIX)
@iframeContainer = document.getElementById(@iframeContainer) if _.isString(@iframeContainer)
this.reset(true)
# Make sure we our selection is set to deepest textNode, prevent bug in Firefox when tabbing in
Scribe.DOM.addEventListener(@root, 'focus', =>
ScribeDOM.addEventListener(@root, 'focus', =>
range = this.getSelection()
this.setSelection(null, true)
this.setSelection(range, true)
Expand All @@ -179,18 +188,18 @@ class Scribe.Editor extends EventEmitter2
@ignoreDomChanges = true
@options.renderer.keepHTML = keepHTML
@iframeContainer.innerHTML = @root.innerHTML if @root?
@renderer = new Scribe.Renderer(@iframeContainer, @options)
@renderer = new ScribeRenderer(@iframeContainer, @options)
@contentWindow = @renderer.iframe.contentWindow
@root = @renderer.root
@doc = new Scribe.Document(@root, @options)
@keyboard = new Scribe.Keyboard(this)
@selection = new Scribe.Selection(this)
@undoManager = new Scribe.UndoManager(this, @options)
@pasteManager = new Scribe.PasteManager(this)
@doc = new ScribeDocument(@root, @options)
@keyboard = new ScribeKeyboard(this)
@selection = new ScribeSelection(this)
@undoManager = new ScribeUndoManager(this, @options)
@pasteManager = new ScribePasteManager(this)
@renderer.runWhenLoaded(@options.onReady)
initListeners.call(this)
@ignoreDomChanges = false
Scribe.Editor.editors.push(this)
ScribeEditor.editors.push(this)

applyDelta: (delta, options = {}) ->
options = _.defaults(options, DEFAULT_API_OPTIONS)
Expand All @@ -203,17 +212,17 @@ class Scribe.Editor extends EventEmitter2
oldDelta = @doc.toDelta()
delta.apply(insertAt, deleteAt, formatAt, this)
unless options.silent
eventName = if options.source == 'api' then Scribe.Editor.events.API_TEXT_CHANGE else Scribe.Editor.events.USER_TEXT_CHANGE
eventName = if options.source == 'api' then ScribeEditor.events.API_TEXT_CHANGE else ScribeEditor.events.USER_TEXT_CHANGE
this.emit(eventName, delta)
# TODO enable when we figure out addNewline issue, currently will fail if we do add newline
# console.assert(delta.endLength == this.getLength(), "Applying delta resulted in incorrect end length", delta, this.getLength())
forceTrailingNewline.call(this)
)

emit: (eventName, args...) ->
super(Scribe.Editor.events.PRE_EVENT, eventName, args...)
super(ScribeEditor.events.PRE_EVENT, eventName, args...)
super(eventName, args...)
super(Scribe.Editor.events.POST_EVENT, eventName, args...)
super(ScribeEditor.events.POST_EVENT, eventName, args...)

deleteAt: (index, length, options = {}) ->
options = _.defaults(options, DEFAULT_API_OPTIONS)
Expand Down Expand Up @@ -264,7 +273,7 @@ class Scribe.Editor extends EventEmitter2
this.doSilently( =>
trackDelta.call(this, =>
@selection.preserve( =>
Scribe.Normalizer.breakBlocks(@root)
ScribeNormalizer.breakBlocks(@root)
lines = @doc.lines.toArray()
lineNode = @root.firstChild
_.each(lines, (line, index) =>
Expand All @@ -286,4 +295,4 @@ class Scribe.Editor extends EventEmitter2
)


module.exports = Scribe
module.exports = ScribeEditor
11 changes: 6 additions & 5 deletions src/format-manager.coffee
Original file line number Diff line number Diff line change
@@ -1,16 +1,17 @@
Scribe = require('./scribe')
_ = require('underscore')
ScribeFormat = require('./format')


class Scribe.FormatManager
class ScribeFormatManager
@DEFAULTS:
formats: ['bold', 'italic', 'strike', 'underline', 'link', 'background', 'color', 'family', 'size']

constructor: (@container, options = {}) ->
@options = _.defaults(options.formatManager or {}, Scribe.FormatManager.DEFAULTS)
@options = _.defaults(options.formatManager or {}, ScribeFormatManager.DEFAULTS)
@formats = {}
_.each(@options.formats, (formatName) =>
className = formatName[0].toUpperCase() + formatName.slice(1)
this.addFormat(formatName, new Scribe.Format[className](@container))
this.addFormat(formatName, new ScribeFormat[className](@container))
)

addFormat: (name, format) ->
Expand All @@ -29,4 +30,4 @@ class Scribe.FormatManager
return []


module.exports = Scribe
module.exports = ScribeFormatManager
Loading

0 comments on commit 8270cd9

Please sign in to comment.