i don't like semicolons any more

fix-space-nbsp
Dmitri Akatov 11 years ago
parent 2c8dea244c
commit ccdece14ae

@ -17,7 +17,10 @@ module.exports = (grunt) ->
configFile: 'test/e2e.karma.coffee' configFile: 'test/e2e.karma.coffee'
singleRun: true singleRun: true
browsers: ['PhantomJS'] browsers: ['PhantomJS']
jshint: src: ['angular-contenteditable.js'] jshint:
src: ['angular-contenteditable.js']
options:
asi: true
require('matchdep').filterDev('grunt-*').forEach grunt.loadNpmTasks require('matchdep').filterDev('grunt-*').forEach grunt.loadNpmTasks

@ -2,71 +2,71 @@ angular.module('contenteditable', [])
.directive('contenteditable', function() { return { .directive('contenteditable', function() { return {
require: 'ngModel', require: 'ngModel',
link: function($scope, $element, attrs, ngModel) { link: function($scope, $element, attrs, ngModel) {
var old_render; var old_render
// view -> model // view -> model
$element.bind('input', function(e) { $element.bind('input', function(e) {
$scope.$apply(function() { $scope.$apply(function() {
var html, html2, rerender; var html, html2, rerender
html = $element.html(); html = $element.html()
rerender = false; rerender = false
if (attrs.stripBr && attrs.stripBr !== "false") { if (attrs.stripBr && attrs.stripBr !== "false") {
html = html.replace(/<br>$/, ''); html = html.replace(/<br>$/, '')
} }
if (attrs.noLineBreaks && attrs.noLineBreaks !== "false") { if (attrs.noLineBreaks && attrs.noLineBreaks !== "false") {
html2 = html.replace(/<div>/g, '').replace(/<br>/g, '').replace(/<\/div>/g, ''); html2 = html.replace(/<div>/g, '').replace(/<br>/g, '').replace(/<\/div>/g, '')
if (html2 !== html) { if (html2 !== html) {
rerender = true; rerender = true
html = html2; html = html2
} }
} }
ngModel.$setViewValue(html); ngModel.$setViewValue(html)
if (rerender) { if (rerender) {
ngModel.$render(); ngModel.$render()
} }
if (html === '') { if (html === '') {
// the cursor disappears if the contents is empty // the cursor disappears if the contents is empty
// so we need to refocus // so we need to refocus
$element.blur(); $element.blur()
$element.focus(); $element.focus()
} }
}); })
}); })
// model -> view // model -> view
old_render = ngModel.$render; old_render = ngModel.$render
ngModel.$render = function() { ngModel.$render = function() {
var el, el2, range, sel; var el, el2, range, sel
if (!!old_render) { if (!!old_render) {
old_render(); old_render()
} }
$element.html(ngModel.$viewValue || ''); $element.html(ngModel.$viewValue || '')
el = $element.get(0); el = $element.get(0)
range = document.createRange(); range = document.createRange()
sel = window.getSelection(); sel = window.getSelection()
if (el.childNodes.length > 0) { if (el.childNodes.length > 0) {
el2 = el.childNodes[el.childNodes.length - 1]; el2 = el.childNodes[el.childNodes.length - 1]
range.setStartAfter(el2); range.setStartAfter(el2)
} else { } else {
range.setStartAfter(el); range.setStartAfter(el)
} }
range.collapse(true); range.collapse(true)
sel.removeAllRanges(); sel.removeAllRanges()
sel.addRange(range); sel.addRange(range)
}; }
if (attrs.selectNonEditable && attrs.selectNonEditable !== "false") { if (attrs.selectNonEditable && attrs.selectNonEditable !== "false") {
$element.click(function(e) { $element.click(function(e) {
var range, sel, target; var range, sel, target
target = e.toElement; target = e.toElement
if (target !== this && angular.element(target).attr('contenteditable') === 'false') { if (target !== this && angular.element(target).attr('contenteditable') === 'false') {
range = document.createRange(); range = document.createRange()
sel = window.getSelection(); sel = window.getSelection()
range.setStartBefore(target); range.setStartBefore(target)
range.setEndAfter(target); range.setEndAfter(target)
sel.removeAllRanges(); sel.removeAllRanges()
sel.addRange(range); sel.addRange(range)
} }
}); })
} }
} }
};}); }})