diff --git a/.bowerrc b/.bowerrc new file mode 100644 index 00000000..44491d3d --- /dev/null +++ b/.bowerrc @@ -0,0 +1,3 @@ +{ + "directory": "bower_components" +} diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5eb145c8..32809723 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -37,7 +37,7 @@ chances of your issue being dealt with quickly: * **Motivation for or Use Case** - explain why this is a bug for you * **Angular Version(s)** - is it a regression? * **Browsers and Operating System** - is this a problem with all browsers or only IE8? -* **Reproduce the error** - provide a live example ([Plunkr](http://plnkr.co/edit/tpl:iwVyu2?p=preview)) or a unambiguous set of steps. +* **Reproduce the error** - provide a live example ([Plunkr](http://plnkr.co/edit/tpl:RaBEszV5xrAZ0VRoZ7PM?p=preview)) or a unambiguous set of steps. * **Related issues** - has a similar issue been reported before? * **Suggest a Fix** - if you can't fix the bug yourself, perhaps you can point to what might be causing the problem (line of code or commit) diff --git a/Gruntfile.js b/Gruntfile.js index cb0672e4..e44f130a 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -1,99 +1,239 @@ module.exports = function (grunt) { - + // load all grunt tasks grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-clean'); + grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-istanbul-coverage'); grunt.loadNpmTasks('grunt-karma'); grunt.loadNpmTasks('grunt-karma-coveralls'); grunt.loadNpmTasks('grunt-conventional-changelog'); - - grunt.registerTask('compile', ['concat', 'uglify']); + grunt.loadNpmTasks('grunt-bump'); + grunt.loadNpmTasks('grunt-git'); + grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-umd'); + + grunt.registerTask('compile', ['concat', 'umd', 'copy:setupFiles', 'jshint', 'uglify']); grunt.registerTask('default', ['compile', 'test']); - grunt.registerTask('test', ['clean', 'jshint', 'karma', 'coverage']); - grunt.registerTask('travis-test', ['jshint', 'karma', 'coverage', 'coveralls']); + grunt.registerTask('test', ['clean:coverage', 'jshint', 'karma', 'coverage']); + grunt.registerTask('travis-test', ['concat', 'umd', 'copy:setupFiles', 'jshint', 'karma', 'coverage', 'coveralls']); + + grunt.registerTask('release', ['bump-only', 'setVersion', 'compile', 'demo_pages', 'conventionalChangelog', 'shell:changelog', 'gitcommit','bump-commit', 'shell:publish']); + grunt.registerTask('release:patch', ['bump-only:patch','setVersion','compile','demo_pages','conventionalChangelog','shell:changelog','gitcommit','bump-commit', 'shell:publish']); + grunt.registerTask('release:minor', ['bump-only:minor','setVersion','compile','demo_pages','conventionalChangelog','shell:changelog','gitcommit','bump-commit', 'shell:publish']); + grunt.registerTask('release:major', ['bump-only:major','setVersion','compile','demo_pages','conventionalChangelog','shell:changelog','gitcommit','bump-commit', 'shell:publish']); + grunt.registerTask('release:prerelease', ['bump-only:prerelease','setVersion','demo_pages','compile','conventionalChangelog','shell:changelog','gitcommit','bump-commit', 'shell:publish']); + grunt.registerTask('setVersion', function () { + var pkgJson = require('./package.json'); + var version = pkgJson.version; + //grunt.log.writeln('textAngular version:'+version); + var contents = grunt.file.read('./src/globals.js'); + contents = contents.replace(/textAngularVersion = 'v\d+.\d+.\d+(-\d)?'/i, "textAngularVersion = 'v"+version+"'"); + grunt.file.write('./src/globals.js', contents); + console.log('Updated src/globals.js to textAngular version: v'+version); + }); + var testConfig = function (configFile, customOptions) { var options = { configFile: configFile, keepalive: true }; var travisOptions = process.env.TRAVIS && { browsers: ['PhantomJS'], reporters: ['dots','coverage'] }; return grunt.util._.extend(options, customOptions, travisOptions); }; - + + grunt.registerMultiTask('demo_pages', 'Compile demo pages', function(){ + var d = this.data; + var srcPath = function(fname){ return d.cwd + fname; }; + var destPath = function(fname){ return d.dest + fname; }; + + grunt.file.expand({cwd: d.cwd}, d.src).forEach(function(each){ + grunt.file.copy(srcPath(each), destPath(each), { + process: function (contents, path){ + return grunt.template.process(contents, { + data: { + js: Object.keys(grunt.config('uglify.my_target.files')), + version: grunt.config('pkg.version') + } + }); + } + }); + }); + }); + // Project configuration. grunt.initConfig({ - changelog: {options: {dest: 'changelog.md'}}, - clean: ["coverage"], - coverage: { - options: { - thresholds: { - 'statements': 100, - 'branches': 100, - 'lines': 100, - 'functions': 100 + pkg: grunt.file.readJSON('package.json'), + // grunt-spawn + spawn_changelog: { + command: 'pico', + pattern: 'changelog.md', + commandArgs: ['{0}'], + opts: { + stdio: 'inherit' + } + }, + conventionalChangelog: { + options: { + changelogOpts: { + // conventional-changelog options go here + preset: 'angular' + }, + context: { + // context goes here + }, + gitRawCommitsOpts: { + // git-raw-commits options go here + }, + parserOpts: { + // conventional-commits-parser options go here + }, + writerOpts: { + // conventional-changelog-writer options go here + } + }, + release: { + src: 'changelog.md' }, + }, + bump: { + options: { + files: ['package.json','bower.json'], + commitFiles: ['package.json', 'changelog.md','bower.json'], + pushTo: 'origin', + updateConfigs: ['pkg'] + } + }, + gitcommit: { + release: { + options: { + message: "chore(release): Build Dist files" + }, + files: { + src: ['src/*', 'demo/*', 'src/demo/*','dist/*'] + } + } + }, + shell: { + publish: { + command: "npm publish" + }, + changelog: { + options: { + stdinRawMode: true + }, + command: 'pico changelog.md', + } + }, + clean: { + coverage: ["coverage"], + dist: ["dist"], + }, + coverage: { + options: { + thresholds: { + 'statements': 100, + 'branches': 100, + 'lines': 100, + 'functions': 100 + }, dir: 'coverage' - } + } }, coveralls: { options: { debug: true, - coverage_dir: 'coverage', - force: true + coverageDir: 'coverage', + force: true, } }, karma: { - jquery: { - options: testConfig('karma-jquery.conf.js') - }, - jqlite: { - options: testConfig('karma-jqlite.conf.js') - } + jquery: { + options: testConfig('karma-jquery.conf.js') + }, + jqlite: { + options: testConfig('karma-jqlite.conf.js') + } }, jshint: { - files: ['lib/*.js', 'src/textAngular.js', 'src/textAngularSetup.js', 'test/*.spec.js', 'test/taBind/*.spec.js'],// don't hint the textAngularSanitize as they will fail - options: { - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - boss: true, - eqnull: true, - globals: {} - } + files: ['src/*.js', 'test/*.spec.js', 'test/taBind/*.spec.js', '!src/textAngular-sanitize.js'],// don't hint the textAngularSanitize as they will fail + options: { + eqeqeq: true, + immed: true, + latedef: true, + newcap: true, + noarg: true, + sub: true, + boss: true, + eqnull: true, + globals: {} + } + }, + copy: { + setupFiles: { + expand: true, + cwd: 'src/', + src: ['textAngularSetup.js', 'textAngular.css', 'textAngular-sanitize.js'], + dest: 'dist/' + } }, concat: { - options: { - banner: "/*\n@license textAngular\nAuthor : Austin Anderson\nLicense : 2013 MIT\nVersion 1.3.0-pre14\n\nSee README.md or https://github.com/fraywing/textAngular/wiki for requirements and use.\n*/\n\n(function(){ // encapsulate all variables so they don't become global vars\n\"Use Strict\";", - footer: "})();" - }, dist: { - src: ['lib/globals.js','lib/factories.js','lib/DOM.js','lib/validators.js','lib/taBind.js','lib/main.js'], - dest: 'src/textAngular.js' + options: { + banner: "/*\n@license textAngular\nAuthor : Austin Anderson\nLicense : 2013 MIT\nVersion <%- pkg.version %>\n\nSee README.md or https://github.com/fraywing/textAngular/wiki for requirements and use.\n*/\n\n/*\nCommonjs package manager support (eg componentjs).\n*/\n\n\n\"use strict\";" + }, + files:{ + 'dist/textAngular.js': ['src/globals.js','src/factories.js','src/DOM.js','src/validators.js','src/taBind.js','src/main.js'], + } + }, + umd: { + files: { + 'dist/textAngular.umd.js': ['dist/textAngularSetup.js', 'dist/textAngular.js'] + } + } + }, + umd: { + all: { + options: { + src: 'dist/textAngular.umd.js', + dest: 'dist/textAngular.umd.js', + objectToExport: 'textAngular.name', + globalAlias: 'textAngular', + amdModuleId: 'textAngular', + deps: { + 'default': ['rangy'], + cjs: ['rangy', {'rangy/lib/rangy-selectionsaverestore': ''}], + amd: ['rangy', {'rangy/lib/rangy-selectionsaverestore': ''}] + } + } } }, uglify: { options: { mangle: true, - compress: true, - wrap: true, + compress: {}, + wrap: false, preserveComments: 'some' }, my_target: { files: { 'dist/textAngular-rangy.min.js': ['bower_components/rangy/rangy-core.js', 'bower_components/rangy/rangy-selectionsaverestore.js'], - 'dist/textAngular.min.js': ['src/textAngularSetup.js','src/textAngular.js'], - 'dist/textAngular-sanitize.min.js': ['src/textAngular-sanitize.js'] + 'dist/textAngular-sanitize.min.js': ['src/textAngular-sanitize.js'], + 'dist/textAngular.min.js': ['dist/textAngular.umd.js'] } } }, + demo_pages: { + main: { + cwd: 'src/demo/', + src: '*.html', + dest: 'demo/' + } + }, watch: { - files: "lib/*.js", - tasks: "concat" + files: "src/*.js", + tasks: "compile" } }); -}; \ No newline at end of file +}; diff --git a/README.md b/README.md index 11f8c1ba..21fa1485 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,25 @@ -textAngular v1.3.0-pre14 +textAngular v1.5.16 =========== [![Build Status](https://travis-ci.org/fraywing/textAngular.png?branch=master)](https://travis-ci.org/fraywing/textAngular) [![Coverage Status](https://coveralls.io/repos/fraywing/textAngular/badge.png)](https://coveralls.io/r/fraywing/textAngular) -Demo is available at: http://www.textangular.com (Or editable [Plunkr Demo](http://plnkr.co/edit/tpl:iwVyu2?p=preview)) +Demo is available at: http://www.textangular.com (Or editable [Plunkr Demo](http://plnkr.co/edit/hz3x2f?p=preview)) -#### This readme is for the v1.3.x release, if you are looking for the v1.2.2 readme go here: https://github.com/fraywing/textAngular/tree/v1.2.2 +#### Upgrading From 1.2.2 or earlier -## Requirements +To upgrade from version 1.2.2 or earlier you need to follow these steps: -1. `AngularJS` ≥ `1.2.x` -2. `Rangy` ≥ `1.2.x`, Both rangy-core and rangy-saveselection are required. (There is a minified combination of these two included in the dist folder) +1. The styling for textAngular is now in the `dist/textAngular.css` file, you will need to include this or a copy of it with your own modifications. +2. The rangy library is now required, you will need both the `rangy-core` and `rangy-selectionsaverestore` modules, alternatively you can include the compressed version (`textAngular-rangy.min.js`) in the dist folder -### Optional Recommended requirements +## Requirements -1. [Bootstrap 3.x](http://getbootstrap.com/) for the default styles -2. [Font-Awesome 4.x](http://fortawesome.github.io/Font-Awesome/) for the default icons on the toolbar +1. `AngularJS` ≥ `1.3.x` +2. `Rangy` ≥ `1.3.x`, Both rangy-core and rangy-selectionsaverestore are required. (There is a minified combination of these two included in the dist folder) +3. `Font-Awesome` ≥ `4.x` for the default icons on the toolbar +1. `Bootstrap` ≥ `3.x` for the default styles (Can use `bootstrap-css-only`, you must add this to your bower or include this manually) +5. NOTE: please check the requirements for earlier releases, if these are an issue. ### Where to get it @@ -27,32 +30,59 @@ Demo is available at: http://www.textangular.com (Or editable [Plunkr Demo](http Run `bower install textAngular` from the command line. Include script tags similar to the following: ```html - + ``` +**Via NPM:** + +Run `npm install textangular` from the command line. +Include script tags similar to the following: +```html + + + + +``` +Install using commonjs (eg componentjs, Webpack, Browserify): +``` +angular.module('myModule', [require('angular-sanitize'), require('textAngular')]); +``` +Optionally, install textAngular-sanitize.min.js by requiring it BEFORE requring textAngular: +``` +require('textangular/dist/textAngular-sanitize.min'); +angular.module('myModule', [require('textAngular')]); +``` +For CSS support with Webpack, install the style-loader, css-loader (and postcss-loader) and configure the loader in your webpack.config.js similar to the following: +``` +loaders: [ + {test: /\.css$/, loader: 'style!css!postcss'} +] +``` + **Via CDNJS:** Include script tags similar to the following: ```html - - + + + ``` **Via jsDelivr:** Include script tag similar to the following: (For details on how this works see: [https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request](https://github.com/jsdelivr/jsdelivr#load-multiple-files-with-single-http-request)) ```html - + ``` **Via Github** Download the code from [https://github.com/fraywing/textAngular/releases/latest](https://github.com/fraywing/textAngular/releases/latest), unzip the files then add script tags similar to the following: ```html - + @@ -60,7 +90,7 @@ Download the code from [https://github.com/fraywing/textAngular/releases/latest] ### Usage -1. Include (`rangy-core.js` and `rangy-saveselection.js`) or `textAngular-rangy.min.js` in your project using script tags +1. Include (`rangy-core.js` and `rangy-selectionsaverestore.js`) or `textAngular-rangy.min.js` in your project using script tags 2. Include `textAngular-sanitize.js` or `textAngular-sanitize.min.js` in your project using script tags 3. Include (`textAngularSetup.js` and `textAngular.js`) or `textAngular.min.js` (textAngularSetup.js is included inside textAngular.min.js) 4. Add a dependency to `textAngular` in your app module, for example: ```angular.module('myModule', ['textAngular'])```. @@ -75,29 +105,50 @@ OR This acts similar to a regular AngularJS / form input if you give it a name attribute, allowing for form submission and AngularJS form validation. Have fun! - + **Important Note:** Though textAngular supports the use of all attributes in it's input, please note that angulars ng-bind-html **WILL** strip out all of your style attributes if you are using `angular-sanitize.js`. For Additional options see the [github Wiki](https://github.com/fraywing/textAngular/wiki). ### Issues? -textAngular uses ```execCommand``` for the rich-text functionality. +textAngular uses ```execCommand``` for the rich-text functionality. That being said, its still a fairly experimental browser feature-set, and may not behave the same in all browsers - see http://tifftiff.de/contenteditable/compliance_test.html for a full compliance list. It has been tested to work on Chrome, Safari, Opera, Firefox and Internet Explorer 8+. -If you find something, please let me know - throw me a message, or submit a issue request! +If you find something, please let me know - throw me a message, or submit an issue request! ### FAQ +1. **Toolbar shows up with some being blank instead of icons**
+You need to include font-awesome on your page or nothing will show up. 1. **Youtube Insert embeds a `````` tag and aren't showing the video.**
The problems with iFrames are that they are a security risk so the sanitizer by default strips them out. Instead of changing the sanitizer to allow iFrames we use a placeholder for youtube videos which has the added advantage of allowing you to edit their size and placement in the editor. To display the youtube videos when you aren't in the editor use the following html: ```
```. This invokes our custom renderers to convert the `````` tags back into the youtube video you expect. +2. **But I want to use Youtube outside of angular**
+You'll have to apply the renderers manually, see comment in issue [#469](https://github.com/fraywing/textAngular/issues/469#issuecomment-68650506) for details. +3. **IE Is automatically converting typed links to `` tags**
+This is a known issue with IE, to prevent this run the following javascript after page load: `document.execCommand("AutoUrlDetect", false, false)`. See [#475](https://github.com/fraywing/textAngular/issues/475) for details. +4. **Error `"textAngular Error: An editor with the name already exists"` occurs**
+See Issue [#240](https://github.com/fraywing/textAngular/issues/240) for specific details on why this occurs and how to resolve it. ## Developer Notes -When checking out, you need a node.js installation, running `npm install` will get you setup with everything to run the unit tests and minification. -All changes should be done in the lib folder, running `grunt compile` to compile the app or use `grunt watch` to compile the files as you save them. +When checking out, you need a node.js installation, running `npm install` and then `bower install` will get you setup with everything to run the unit tests and minification. +All changes should be done in the src folder, running `grunt compile` to compile the app or use `grunt watch` to compile the files as you save them. When you are ready to create A PR check that `grunt` passes without errors and you have created tests for your feature if necessary. +## Customization + +It is possible to override the toolbar by using a decorator in the module's .config block. Simply set the taOptions.toolbar to an array of arrays comprised of button names. Each array of button names represents a button group. The default toolbar can be represented like so: +```html + taOptions.toolbar = [ + ['h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'p', 'pre', 'quote'], + ['bold', 'italics', 'underline', 'strikeThrough', 'ul', 'ol', 'redo', 'undo', 'clear'], + ['justifyLeft', 'justifyCenter', 'justifyRight', 'indent', 'outdent'], + ['html', 'insertImage','insertLink', 'insertVideo', 'wordcount', 'charcount'] + ]; +``` +New buttons can be created using taRegisterTool. Examples can be found inside demo/static-demo.html + ## License This project is licensed under the [MIT license](http://opensource.org/licenses/MIT). @@ -105,6 +156,6 @@ This project is licensed under the [MIT license](http://opensource.org/licenses/ ## Contributers -Special thanks to all the contributions thus far! +Special thanks to all the contributions thus far! For a full list see: https://github.com/fraywing/textAngular/graphs/contributors diff --git a/bower.json b/bower.json index eab0c1cd..b81d43bc 100644 --- a/bower.json +++ b/bower.json @@ -1,13 +1,17 @@ { "name": "textAngular", - "version": "1.3.0-pre14", - "main": ["./src/textAngular.js", "./src/textAngular-sanitize.js", "./src/textAngularSetup.js", "./src/textAngular.css", "../rangy/rangy-selectionsaverestore.js"], + "version": "1.5.16", + "main": [ + "./dist/textAngular.js", + "./dist/textAngular-sanitize.js", + "./dist/textAngularSetup.js", + "./dist/textAngular.css" + ], "description": "A radically powerful Text-Editor/Wysiwyg editor for Angular.js", "keywords": [ "editor", "angular", - "wysiwyg", - "jquery" + "wysiwyg" ], "ignore": [ "**/.*", @@ -19,14 +23,13 @@ "package.json" ], "dependencies": { - "angular": "^1.2.x", - "rangy": "^1.2.0" + "angular": ">=1.3.x", + "font-awesome": ">=4.0.x", + "rangy": "~1.3.0" }, "devDependencies": { - "angular-mocks": "~1.2.x", - "jquery": "1.9.x", - "bootstrap": "3.0.x", - "font-awesome": "4.0.x" + "angular-mocks": ">=1.3.x", + "jquery": "1.9.x" }, "license": "MIT", "homepage": "https://github.com/fraywing/textAngular" diff --git a/changelog.md b/changelog.md index 038c67db..c98fafa9 100644 --- a/changelog.md +++ b/changelog.md @@ -1,3 +1,645 @@ +
+## [1.5.16](https://github.com/fraywing/textAngular/compare/v1.5.15...v1.5.16) (2016-12-05) + + +### Bug Fixes + +* **taFixChrome, taFixChrome.spec:** corrected a bug introduced when correcting pasted html (see PR [#1411](https://github.com/fraywing/textAngular/issues/1411)) ([35be0a0](https://github.com/fraywing/textAngular/commit/35be0a0)) + + + + +## [1.5.15](https://github.com/fraywing/textAngular/compare/v1.5.14...v1.5.15) (2016-12-04) + + +### Bug Fixes + +* **taBind:** (from damien-otis) Add code to handle pasting text in IE [#1410](https://github.com/fraywing/textAngular/issues/1410) ([b9863c2](https://github.com/fraywing/textAngular/commit/b9863c2)) +* **taBind:** corrected bug [#1379](https://github.com/fraywing/textAngular/issues/1379) where the paste from word was broken for lists ([c11765d](https://github.com/fraywing/textAngular/commit/c11765d)) +* **taFixChrome, taFixChrom.spec:** fixed bug where the html was being damaged on pasted html ([425396d](https://github.com/fraywing/textAngular/commit/425396d)) +* Note: with this release we shift from tab's in the source code to 4 spaces! + + + +## [1.5.14](https://github.com/fraywing/textAngular/compare/v1.5.13...v1.5.14) (2016-11-30) + + +### Bug Fixes + +* **DOM:** corrected a bug where we could not insertHTML when the document was empty. ([ba156c4](https://github.com/fraywing/textAngular/commit/ba156c4)) +* **taBind:** corrected a bug where we attempted to restore the selection in element.on('input') when the + document was empty after a delete. +* **textAngularSetup):** corrected a bug where we would throw an error in taRegisterTool('justifyFull'), + taRegisterTool('justifyRight'), and taRegisterTool('justifyLeft') when it was illegal to call + .css('text-align). We now catch and suppress those errors. + + + +## [1.5.13](https://github.com/fraywing/textAngular/compare/v1.5.12...v1.5.13) (2016-11-10) + + +### Bug Fixes + +* **main:** Corrected issue [#1353](https://github.com/fraywing/textAngular/issues/1353) where the dropEvent.target was not being used. ([be038c2](https://github.com/fraywing/textAngular/commit/be038c2)) +* **main:** Corrected issue [#1359](https://github.com/fraywing/textAngular/issues/1359) and some older issues around refesh of popover display ([4ef827e](https://github.com/fraywing/textAngular/commit/4ef827e)) +* **taBind:** Corrected issue [#1361](https://github.com/fraywing/textAngular/issues/1361) can't paste word document with tables ([f27d444](https://github.com/fraywing/textAngular/commit/f27d444)) +* **taBind:** Corrected issue where Apple ignores Shift+Enter on Safari ([cd9de24](https://github.com/fraywing/textAngular/commit/cd9de24)) +* **taBind, textAngular-sanitize:** Corrected and enhanced formating comming from Word and OneNote ([fbcd381](https://github.com/fraywing/textAngular/commit/fbcd381)) +* **main:** Cleanup event handlers that are placed on the window (from Bret Little) +* **textAngularSetup:** Fix clear formatting functionality when used with ta-default-wrap=br #1374 - thanks to damien-otis for this fix. 0e45059062fadf2499b4d4d4f78621a49cb89968 +* **taBind:** Fix don't deselect after 1000ms after applying styling #1381 - thanks to damien-otis for this fix + + + +## [1.5.12](https://github.com/fraywing/textAngular/compare/v1.5.11...v1.5.12) (2016-10-03) + + +### Bug Fixes + +* **DOM:** Issue [#754](https://github.com/fraywing/textAngular/issues/754) is not corrected. Now wrapSelection('insertHtml', embed, true) can insert '\n' ([424ac59](https://github.com/fraywing/textAngular/commit/424ac59)) +* **main:** added a click monitor to the resize.background to shift the focus back to editor when closed. ([a3133ca](https://github.com/fraywing/textAngular/commit/a3133ca)) +* **main:** Corrected issue editor only focuses when files are dropped - drop text behavior, Schamelhout +* **main:** Fix multi-deselect problem [#1334](https://github.com/fraywing/textAngular/issues/1334) from mikolawannabe ([64d0c4a](https://github.com/fraywing/textAngular/commit/64d0c4a)) +* **taBind:** Corrected console errors caused by #text nodes - damien-otis. ([6dd1556](https://github.com/fraywing/textAngular/commit/6dd1556)) +* **main:** Corrected issue [#299](https://github.com/fraywing/textAngular/issues/299) around the positioning of the popover on scrolling ([53f9529](https://github.com/fraywing/textAngular/commit/53f9529)) +* **main:** Corrected Issue: [#1326](https://github.com/fraywing/textAngular/issues/1326) ([f9715de](https://github.com/fraywing/textAngular/commit/f9715de)) No reflowPopover() when window resized or scrolled. +* **taBind:** Corrected 'MS Word, some word spaces get lost (line break issue?)' [#598](https://github.com/fraywing/textAngular/issues/598) ([e29e463](https://github.com/fraywing/textAngular/commit/e29e463)) + + + + +## [1.5.11](https://github.com/fraywing/textAngular/compare/v1.5.10...v1.5.11) (2016-10-01) + + +### Bug Fixes + +* **demo:** improved the style usage ([58f7f8d](https://github.com/fraywing/textAngular/commit/58f7f8d)) +* **demo/textAngular.com.html:** fixed issue [#611](https://github.com/fraywing/textAngular/issues/611) by adding a 'clearfix' to the ta-text-editor-class attribute. ([3683747](https://github.com/fraywing/textAngular/commit/3683747)) +* **DOM:** corrected bug [#1343](https://github.com/fraywing/textAngular/issues/1343) where we were incorrectly setting the link on a
  • element ([44d5c56](https://github.com/fraywing/textAngular/commit/44d5c56)) +* **factories:** small fix for undefined unsafe.replace [#1335](https://github.com/fraywing/textAngular/issues/1335) ([12a7b27](https://github.com/fraywing/textAngular/commit/12a7b27)) + + + + +## [1.5.10](https://github.com/fraywing/textAngular/compare/v1.5.9...v1.5.10) (2016-09-19) + + +### Bug Fixes + +* **DOM, globals, main, taBind:** Fix for [#1205](https://github.com/fraywing/textAngular/issues/1205) Duplicating content inside

    ([581e050](https://github.com/fraywing/textAngular/commit/581e050)) +* **DOM, taBind, taBind.spec:** added test for ShiftKey being pressed and released ([1b94314](https://github.com/fraywing/textAngular/commit/1b94314)) +* **globals, taBind:** small code clean up and re-org ([19cfe7e](https://github.com/fraywing/textAngular/commit/19cfe7e)) +* **main:** fix for [#655](https://github.com/fraywing/textAngular/issues/655) activeState seemingly not firing after the first click after a highlight [#655](https://github.com/fraywing/textAngular/issues/655) ([6ecc1c1](https://github.com/fraywing/textAngular/commit/6ecc1c1)) +* **main:** fixed an invalid error in rare conditions ([8772907](https://github.com/fraywing/textAngular/commit/8772907)) +* **taBind:** Browser spelling correction not setting the control to dirty [#1120](https://github.com/fraywing/textAngular/issues/1120) ([5473d01](https://github.com/fraywing/textAngular/commit/5473d01)) +* **taBind:** corrected issue #607 - catching Ctrl+Return ([438e060](https://github.com/fraywing/textAngular/commit/438e060)) +* **DOM, globals, main, taBind:** Fix for #1205 Duplicating content in ... (https://github.com/fraywing/textAngular/commit/581e050a3ed5bb4f21d59e4a59856f1d4a859770) + + + +## [1.5.9](https://github.com/fraywing/textAngular/compare/v1.5.8...v1.5.9) (2016-09-05) + + +### Bug Fixes + +* **factories.js:** removed the extra > and ([76a31e2](https://github.com/fraywing/textAngular/commit/76a31e2)) +* **main:** We now properly update the toolbar when we tab into the editor. ([d930538](https://github.com/fraywing/textAngular/commit/d930538)) +* **DOM, textAngularSetup, taExecCommand.formatBlock.spec, taTools.spec) + - removed a rare element.parentNode === null condition + - fixed a rare bug during 'CLEAR' formatic where we could see a rangy error + 'The given range isn't in document' + - enhanced the 'CLEAR' format function to properly handle nested