Skip to content

Commit

Permalink
make normalizer a class
Browse files Browse the repository at this point in the history
  • Loading branch information
jhchen committed Jan 13, 2015
1 parent 670efdc commit e168fd3
Show file tree
Hide file tree
Showing 14 changed files with 51 additions and 47 deletions.
2 changes: 1 addition & 1 deletion src/core/document.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ dom = require('../lib/dom')
Format = require('./format')
Line = require('./line')
LinkedList = require('../lib/linked-list')
Normalizer = require('../lib/normalizer')
Normalizer = require('./normalizer')


class Document
Expand Down
2 changes: 1 addition & 1 deletion src/core/line.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ Format = require('./format')
Leaf = require('./leaf')
Line = require('./line')
LinkedList = require('../lib/linked-list')
Normalizer = require('../lib/normalizer')
Normalizer = require('./normalizer')


class Line extends LinkedList.Node
Expand Down
36 changes: 19 additions & 17 deletions src/lib/normalizer.coffee → src/core/normalizer.coffee
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
_ = require('lodash')
dom = require('./dom')
dom = require('../lib/dom')


Normalizer =
ALIASES: {
class Normalizer
@ALIASES: {
'STRONG' : 'B'
'EM' : 'I'
'DEL' : 'S'
'STRIKE' : 'S'
}

ATTRIBUTES: {
@ATTRIBUTES: {
'color': 'color'
'face' : 'fontFamily'
'size' : 'fontSize'
}

STYLES: {
@STYLES: {
'background-color'
'color'
'font-family'
'font-size'
'text-align'
}

TAGS: {
@TAGS: {
'DIV'
'BR'
'SPAN'
Expand All @@ -39,16 +39,18 @@ Normalizer =
'LI'
}

constructor: ->

# Make sure descendant break tags are not causing multiple lines to be rendered
handleBreaks: (lineNode) ->
@handleBreaks: (lineNode) ->
breaks = _.map(lineNode.querySelectorAll(dom.DEFAULT_BREAK_TAG))
_.each(breaks, (br) =>
if br.nextSibling? and (!dom.isIE(10) or br.previousSibling?)
dom(br.nextSibling).splitBefore(lineNode.parentNode)
)
return lineNode

normalizeLine: (lineNode) ->
@normalizeLine: (lineNode) ->
lineNode = Normalizer.wrapInline(lineNode)
lineNode = Normalizer.handleBreaks(lineNode)
lineNode = Normalizer.pullBlocks(lineNode)
Expand All @@ -57,7 +59,7 @@ Normalizer =
lineNode = lineNode.firstChild if lineNode? and dom.LIST_TAGS[lineNode.tagName]?
return lineNode

normalizeNode: (node) ->
@normalizeNode: (node) ->
return node if dom(node).isTextNode()
_.each(Normalizer.ATTRIBUTES, (style, attribute) ->
if node.hasAttribute(attribute)
Expand All @@ -70,7 +72,7 @@ Normalizer =
return Normalizer.whitelistTags(node)

# Removes unnecessary tags but does not modify line contents
optimizeLine: (lineNode) ->
@optimizeLine: (lineNode) ->
lineNode.normalize()
lineNodeLength = dom(lineNode).length()
nodes = dom(lineNode).descendants()
Expand All @@ -91,7 +93,7 @@ Normalizer =
dom(node.previousSibling).merge(node)

# Make sure descendants are all inline elements
pullBlocks: (lineNode) ->
@pullBlocks: (lineNode) ->
curNode = lineNode.firstChild
while curNode?
if dom.BLOCK_TAGS[curNode.tagName]? and curNode.tagName != 'LI'
Expand All @@ -106,18 +108,18 @@ Normalizer =
curNode = curNode.nextSibling
return lineNode

stripComments: (html) ->
@stripComments: (html) ->
return html.replace(/<!--[\s\S]*?-->/g, '')

stripWhitespace: (html) ->
@stripWhitespace: (html) ->
html = html.trim()
# Replace all newline characters
html = html.replace(/(\r?\n|\r)+/g, ' ')
# Remove whitespace between tags, requires &nbsp; for legitmate spaces
html = html.replace(/\>\s+\</g, '><')
return html

whitelistStyles: (node) ->
@whitelistStyles: (node) ->
original = dom(node).styles()
styles = _.omit(original, (value, key) ->
return !Normalizer.STYLES[key]?
Expand All @@ -128,7 +130,7 @@ Normalizer =
else
node.removeAttribute('style')

whitelistTags: (node) ->
@whitelistTags: (node) ->
return node unless dom(node).isElement()
if Normalizer.ALIASES[node.tagName]?
node = dom(node).switchTag(Normalizer.ALIASES[node.tagName])
Expand All @@ -142,7 +144,7 @@ Normalizer =
return node

# Wrap inline nodes with block tags
wrapInline: (lineNode) ->
@wrapInline: (lineNode) ->
return lineNode if dom.BLOCK_TAGS[lineNode.tagName]?
blockNode = document.createElement(dom.DEFAULT_BLOCK_TAG)
lineNode.parentNode.insertBefore(blockNode, lineNode)
Expand All @@ -152,7 +154,7 @@ Normalizer =
lineNode = nextNode
return blockNode

unwrapText: (lineNode) ->
@unwrapText: (lineNode) ->
spans = _.map(lineNode.querySelectorAll(dom.DEFAULT_INLINE_TAG))
_.each(spans, (span) ->
dom(span).unwrap() if (!span.hasAttributes())
Expand Down
2 changes: 1 addition & 1 deletion src/core/selection.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
_ = require('lodash')
dom = require('../lib/dom')
Leaf = require('./leaf')
Normalizer = require('../lib/normalizer')
Normalizer = require('./normalizer')
Range = require('../lib/range')


Expand Down
2 changes: 1 addition & 1 deletion src/lib/picker.coffee
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
_ = require('lodash')
dom = require('./dom')
Normalizer = require('./normalizer')
Normalizer = require('../core/normalizer')


class Picker
Expand Down
2 changes: 1 addition & 1 deletion src/modules/tooltip.coffee
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
Quill = require('../quill')
Normalizer = require('../lib/normalizer')
_ = Quill.require('lodash')
dom = Quill.require('dom')
Normalizer = Quill.require('normalizer')


class Tooltip
Expand Down
2 changes: 2 additions & 0 deletions src/quill.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ EventEmitter2 = require('eventemitter2').EventEmitter2
dom = require('./lib/dom')
Editor = require('./core/editor')
Format = require('./core/format')
Normalizer = require('./core/normalizer')
Range = require('./lib/range')


Expand Down Expand Up @@ -47,6 +48,7 @@ class Quill extends EventEmitter2
switch name
when 'lodash' then return _
when 'delta' then return Delta
when 'normalizer' then return Normalizer
when 'dom' then return dom
else return null

Expand Down
2 changes: 1 addition & 1 deletion test/helpers/matchers.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ beforeEach( ->
html = html.join('') if Array.isArray(html)
html = html.innerHTML if _.isElement(html)
div = document.createElement('div')
div.innerHTML = Quill.Lib.Normalizer.stripWhitespace(html)
div.innerHTML = Quill.Normalizer.stripWhitespace(html)
return div
)
ignoredAttributes = if ignoreClassId then ['class', 'id'] else []
Expand Down
2 changes: 1 addition & 1 deletion test/quill.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ Quill.Editor = require('../src/core/editor')
Quill.Format = require('../src/core/format')
Quill.Leaf = require('../src/core/leaf')
Quill.Line = require('../src/core/line')
Quill.Normalizer = require('../src/core/normalizer')
Quill.Selection = require('../src/core/selection')

Quill.Lib =
EventEmitter2 : require('eventemitter2').EventEmitter2
ColorPicker : require('../src/lib/color-picker')
DOM : require('../src/lib/dom')
LinkedList : require('../src/lib/linked-list')
Normalizer : require('../src/lib/normalizer')
Picker : require('../src/lib/picker')
Range : require('../src/lib/range')

Expand Down
2 changes: 1 addition & 1 deletion test/unit/core/document.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ describe('Document', ->

describe('manipulation', ->
beforeEach( ->
@container.innerHTML = Quill.Lib.Normalizer.stripWhitespace('
@container.innerHTML = Quill.Normalizer.stripWhitespace('
<div>
<div>Test</div>
<div><i>Test</i></div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ describe('Normalizer', ->
return if test.ieOmit and Quill.Lib.DOM.isIE(10)
it(name, ->
@container.innerHTML = test.initial
lineNode = Quill.Lib.Normalizer.handleBreaks(@container.firstChild)
lineNode = Quill.Normalizer.handleBreaks(@container.firstChild)
expect(@container).toEqualHTML(test.expected)
expect(lineNode).toEqual(@container.firstChild)
)
Expand All @@ -42,7 +42,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = test.initial
lineNode = Quill.Lib.Normalizer.normalizeLine(@container.firstChild)
lineNode = Quill.Normalizer.normalizeLine(@container.firstChild)
expect(@container).toEqualHTML(test.expected)
expect(lineNode).toEqual(@container.firstChild)
)
Expand All @@ -52,19 +52,19 @@ describe('Normalizer', ->
describe('normalizeNode()', ->
it('whitelist style and tag', ->
@container.innerHTML = '<strong style="color: red; display: inline;">Test</strong>'
Quill.Lib.Normalizer.normalizeNode(@container.firstChild)
Quill.Normalizer.normalizeNode(@container.firstChild)
expect(@container).toEqualHTML('<b style="color: red;">Test</b>')
)

it('convert size attribute', ->
@container.innerHTML = '<font size="3">Test</font>'
Quill.Lib.Normalizer.normalizeNode(@container.firstChild)
Quill.Normalizer.normalizeNode(@container.firstChild)
expect(@container).toEqualHTML('<span style="font-size: 16px;">Test</span>')
)

it('text node', ->
@container.innerHTML = 'Test'
Quill.Lib.Normalizer.normalizeNode(@container.firstChild)
Quill.Normalizer.normalizeNode(@container.firstChild)
expect(@container).toEqualHTML('Test')
)
)
Expand Down Expand Up @@ -120,7 +120,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = "<div>#{test.initial}</div>"
Quill.Lib.Normalizer.optimizeLine(@container.firstChild)
Quill.Normalizer.optimizeLine(@container.firstChild)
expect(@container.firstChild).toEqualHTML(test.expected)
)
)
Expand Down Expand Up @@ -163,7 +163,7 @@ describe('Normalizer', ->
it(name, ->
@container.innerHTML = test.initial
firstChild = @container.firstChild
Quill.Lib.Normalizer.pullBlocks(firstChild)
Quill.Normalizer.pullBlocks(firstChild)
expect(@container).toEqualHTML(test.expected)
)
)
Expand All @@ -172,12 +172,12 @@ describe('Normalizer', ->
describe('stripComments()', ->
it('single line', ->
html = '<div>Test</div><!-- Comment --><div>Test</div>'
expect(Quill.Lib.Normalizer.stripComments(html)).toEqual('<div>Test</div><div>Test</div>')
expect(Quill.Normalizer.stripComments(html)).toEqual('<div>Test</div><div>Test</div>')
)

it('multiple lines', ->
html = "<div>Test</div>\n<!-- Comment \n More Comment -->\n<div>Test</div>"
expect(Quill.Lib.Normalizer.stripComments(html)).toEqual("<div>Test</div>\n\n<div>Test</div>")
expect(Quill.Normalizer.stripComments(html)).toEqual("<div>Test</div>\n\n<div>Test</div>")
)
)

Expand Down Expand Up @@ -205,7 +205,7 @@ describe('Normalizer', ->

_.each(tests, (test, name) ->
it(name, ->
strippedHTML = Quill.Lib.Normalizer.stripWhitespace(test.initial)
strippedHTML = Quill.Normalizer.stripWhitespace(test.initial)
expect(strippedHTML).toEqual(test.expected)
)
)
Expand All @@ -229,7 +229,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = test.initial
Quill.Lib.Normalizer.whitelistStyles(@container.firstChild)
Quill.Normalizer.whitelistStyles(@container.firstChild)
expect(@container).toEqualHTML(test.expected)
)
)
Expand All @@ -256,7 +256,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = test.initial
Quill.Lib.Normalizer.whitelistTags(@container.firstChild)
Quill.Normalizer.whitelistTags(@container.firstChild)
expect(@container).toEqualHTML(test.expected)
)
)
Expand Down Expand Up @@ -285,7 +285,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = test.initial.join('')
Quill.Lib.Normalizer.wrapInline(@container.firstChild)
Quill.Normalizer.wrapInline(@container.firstChild)
expect(@container).toEqualHTML(test.expected)
)
)
Expand All @@ -306,7 +306,7 @@ describe('Normalizer', ->
_.each(tests, (test, name) ->
it(name, ->
@container.innerHTML = test.initial
Quill.Lib.Normalizer.unwrapText(@container)
Quill.Normalizer.unwrapText(@container)
expect(@container).toEqualHTML(test.expected)
)
)
Expand Down
2 changes: 1 addition & 1 deletion test/unit/lib/color-picker.coffee
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
describe('ColorPicker', ->
it('constructor', ->
container = $('#test-container').html(Quill.Lib.Normalizer.stripWhitespace('
container = $('#test-container').html(Quill.Normalizer.stripWhitespace('
<select title="Text Color" class="ql-color">
<option value="rgb(0, 0, 0)" selected></option>
<option value="rgb(230, 0, 0)"></option>
Expand Down
Loading

0 comments on commit e168fd3

Please sign in to comment.