From 623afa8b624da0dcde8c88471e9b83126c938dbb Mon Sep 17 00:00:00 2001 From: Christopher Blum Date: Wed, 13 Jul 2011 16:34:24 +0200 Subject: [PATCH] wysihtml5 v0.2.0 - now library agnostic --- LICENSE | 2 +- Makefile | 82 +- README.textile | 24 +- build/minify.js | 82 + ...{wysihtml5-0.1.0.js => wysihtml5-0.2.0.js} | 7965 +++++++++-------- dist/wysihtml5-0.2.0.min.js | 242 + examples/advanced.html | 27 +- examples/css/stylesheet.css | 130 +- examples/rules/spec.json | 1 - examples/simple.html | 30 +- lib/base/base.js | 139 + lib/rangy/rangy-cssclassapplier-wysihtml5.js | 461 - parser_rules/advanced.js | 563 ++ parser_rules/simple.js | 32 + src/assert/html_equals.js | 18 +- src/browser.js | 318 + src/browser_support.js | 267 - src/commands.js | 7 +- src/commands/bold.js | 43 +- src/commands/createLink.js | 111 +- src/commands/fontSize.js | 34 +- src/commands/foreColor.js | 35 +- src/commands/formatBlock.js | 194 +- src/commands/formatInline.js | 89 +- src/commands/insertHTML.js | 38 +- src/commands/insertImage.js | 193 +- src/commands/insertLineBreak.js | 44 +- src/commands/insertOrderedList.js | 114 +- src/commands/insertUnorderedList.js | 116 +- src/commands/italic.js | 42 +- src/commands/justifyCenter.js | 32 +- src/commands/justifyLeft.js | 32 +- src/commands/justifyRight.js | 32 +- src/commands/underline.js | 32 +- src/{utils => dom}/auto_link.js | 47 +- src/dom/class.js | 31 + src/{utils => dom}/contains.js | 4 +- .../convert_to_list.js} | 12 +- src/{utils => dom}/copy_attributes.js | 22 +- src/dom/copy_styles.js | 73 + src/dom/delegate.js | 26 + .../get_as_dom.js} | 7 +- src/{utils => dom}/get_parent_element.js | 12 +- src/dom/get_style.js | 69 + .../has_element_with_class_name.js | 18 +- .../has_element_with_tag_name.js | 6 +- src/dom/insert.js | 15 + .../insert_rules.js => dom/insert_css.js} | 20 +- src/dom/observe.js | 53 + src/{utils/sanitize_html.js => dom/parse.js} | 79 +- src/{utils => dom}/remove_empty_text_nodes.js | 8 +- src/{utils => dom}/rename_element.js | 6 +- .../replace_with_child_nodes.js} | 4 +- src/{utils => dom}/resolve_list.js | 12 +- src/dom/sandbox.js | 258 + src/dom/set_attributes.js | 14 + src/dom/set_styles.js | 19 + src/dom/simulate_placeholder.js | 42 + src/dom/text_content.js | 29 + src/editor.js | 97 +- src/lang/array.js | 58 + src/lang/dispatcher.js | 40 + src/lang/object.js | 42 + src/lang/string.js | 42 + src/quirks/clean_pasted_html.js | 4 +- src/quirks/ensure_proper_clearing.js | 131 +- src/quirks/get_correct_inner_html.js | 30 + src/quirks/insert_line_break_on_return.js | 39 +- src/quirks/redraw.js | 11 +- src/selection/html_applier.js | 434 + src/selection/selection.js | 450 + src/toolbar/dialog.js | 281 +- src/toolbar/speech.js | 71 +- src/toolbar/toolbar.js | 433 +- src/utils/auto_focus.js | 16 - src/utils/caret.js | 451 - src/utils/copy_styles.js | 76 - src/utils/get_style.js | 50 - src/utils/observe.js | 46 - src/utils/sandbox.js | 240 - src/utils/simulate_placeholder.js | 39 - src/utils/synchronizer.js | 102 - src/utils/text_content.js | 25 - src/views/composer.js | 534 +- src/views/composer.observe.js | 285 +- src/views/composer.style.js | 329 +- src/views/synchronizer.js | 97 + src/views/textarea.js | 19 +- src/views/view.js | 28 +- src/wysihtml5.js | 38 +- test/assert/html_equals_test.js | 12 +- ...rowser_support_test.js => browser_test.js} | 50 +- test/{utils => dom}/auto_link_test.js | 8 +- test/dom/contains_test.js | 18 + test/dom/convert_to_list_test.js | 86 + test/{utils => dom}/copy_attributes_test.js | 36 +- test/dom/copy_styles_test.js | 111 + test/dom/delegate_test.js | 62 + .../get_as_dom_test.js} | 25 +- .../{utils => dom}/get_parent_element_test.js | 73 +- test/{utils => dom}/get_style_test.js | 16 +- test/dom/has_element_with_class_name_test.js | 30 + test/dom/has_element_with_tag_name_test.js | 26 + test/dom/insert_css_test.js | 56 + test/dom/observe_test.js | 83 + .../parse_test.js} | 41 +- test/{utils => dom}/rename_element_test.js | 6 +- test/{utils => dom}/resolve_list_test.js | 21 +- test/{utils => dom}/sandbox_test.js | 124 +- test/dom/set_attributes_test.js | 15 + test/dom/set_styles_test.js | 19 + test/editor_test.js | 403 +- test/incompatible_test.js | 61 + test/index.html | 56 +- test/lang/array_test.js | 22 + test/lang/object_test.js | 22 + test/lang/string_test.js | 19 + test/quirks/clean_pasted_html_test.js | 2 +- test/utils/convert_into_list_test.js | 95 - test/utils/copy_styles_test.js | 110 - .../utils/has_element_with_class_name_test.js | 27 - test/utils/has_element_with_tag_name_test.js | 23 - test/utils/insert_rules_test.js | 53 - test/utils/observe_test.js | 75 - version.txt | 2 +- 125 files changed, 10554 insertions(+), 8329 deletions(-) create mode 100644 build/minify.js rename dist/{wysihtml5-0.1.0.js => wysihtml5-0.2.0.js} (57%) create mode 100644 dist/wysihtml5-0.2.0.min.js delete mode 100644 examples/rules/spec.json create mode 100644 lib/base/base.js delete mode 100644 lib/rangy/rangy-cssclassapplier-wysihtml5.js create mode 100644 parser_rules/advanced.js create mode 100644 parser_rules/simple.js create mode 100644 src/browser.js delete mode 100644 src/browser_support.js rename src/{utils => dom}/auto_link.js (74%) create mode 100644 src/dom/class.js rename src/{utils => dom}/contains.js (83%) rename src/{utils/convert_into_list.js => dom/convert_to_list.js} (86%) rename src/{utils => dom}/copy_attributes.js (58%) create mode 100644 src/dom/copy_styles.js create mode 100644 src/dom/delegate.js rename src/{utils/get_in_dom_element.js => dom/get_as_dom.js} (92%) rename src/{utils => dom}/get_parent_element.js (80%) create mode 100644 src/dom/get_style.js rename src/{utils => dom}/has_element_with_class_name.js (73%) rename src/{utils => dom}/has_element_with_tag_name.js (79%) create mode 100644 src/dom/insert.js rename src/{utils/insert_rules.js => dom/insert_css.js} (56%) create mode 100644 src/dom/observe.js rename src/{utils/sanitize_html.js => dom/parse.js} (88%) rename src/{utils => dom}/remove_empty_text_nodes.js (58%) rename src/{utils => dom}/rename_element.js (78%) rename src/{utils/unwrap.js => dom/replace_with_child_nodes.js} (84%) rename src/{utils => dom}/resolve_list.js (90%) create mode 100644 src/dom/sandbox.js create mode 100644 src/dom/set_attributes.js create mode 100644 src/dom/set_styles.js create mode 100644 src/dom/simulate_placeholder.js create mode 100644 src/dom/text_content.js create mode 100644 src/lang/array.js create mode 100644 src/lang/dispatcher.js create mode 100644 src/lang/object.js create mode 100644 src/lang/string.js create mode 100644 src/quirks/get_correct_inner_html.js create mode 100644 src/selection/html_applier.js create mode 100644 src/selection/selection.js delete mode 100644 src/utils/auto_focus.js delete mode 100644 src/utils/caret.js delete mode 100644 src/utils/copy_styles.js delete mode 100644 src/utils/get_style.js delete mode 100644 src/utils/observe.js delete mode 100644 src/utils/sandbox.js delete mode 100644 src/utils/simulate_placeholder.js delete mode 100644 src/utils/synchronizer.js delete mode 100644 src/utils/text_content.js create mode 100644 src/views/synchronizer.js rename test/{browser_support_test.js => browser_test.js} (56%) rename test/{utils => dom}/auto_link_test.js (94%) create mode 100644 test/dom/contains_test.js create mode 100644 test/dom/convert_to_list_test.js rename test/{utils => dom}/copy_attributes_test.js (51%) create mode 100644 test/dom/copy_styles_test.js create mode 100644 test/dom/delegate_test.js rename test/{utils/get_in_dom_element_test.js => dom/get_as_dom_test.js} (56%) rename test/{utils => dom}/get_parent_element_test.js (56%) rename test/{utils => dom}/get_style_test.js (64%) create mode 100644 test/dom/has_element_with_class_name_test.js create mode 100644 test/dom/has_element_with_tag_name_test.js create mode 100644 test/dom/insert_css_test.js create mode 100644 test/dom/observe_test.js rename test/{utils/sanitize_html_test.js => dom/parse_test.js} (91%) rename test/{utils => dom}/rename_element_test.js (76%) rename test/{utils => dom}/resolve_list_test.js (69%) rename test/{utils => dom}/sandbox_test.js (55%) create mode 100644 test/dom/set_attributes_test.js create mode 100644 test/dom/set_styles_test.js create mode 100644 test/incompatible_test.js create mode 100644 test/lang/array_test.js create mode 100644 test/lang/object_test.js create mode 100644 test/lang/string_test.js delete mode 100644 test/utils/convert_into_list_test.js delete mode 100644 test/utils/copy_styles_test.js delete mode 100644 test/utils/has_element_with_class_name_test.js delete mode 100644 test/utils/has_element_with_tag_name_test.js delete mode 100644 test/utils/insert_rules_test.js delete mode 100644 test/utils/observe_test.js diff --git a/LICENSE b/LICENSE index 5adcdb5a..f5d8e500 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) 2009 XING AG +Copyright (C) 2011 XING AG This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or any later version. diff --git a/Makefile b/Makefile index 217cc540..f704e66b 100644 --- a/Makefile +++ b/Makefile @@ -2,41 +2,51 @@ VERSION = $(shell cat version.txt) JS_OUTPUT = "dist/wysihtml5-${VERSION}.js" -JS_FILES = lib/rangy/rangy-core.js \ - lib/rangy/rangy-cssclassapplier-wysihtml5.js \ - src/wysihtml5.js \ - src/browser_support.js \ - src/utils/auto_focus.js \ - src/utils/auto_link.js \ - src/utils/caret.js \ - src/utils/contains.js \ - src/utils/convert_into_list.js \ - src/utils/copy_styles.js \ - src/utils/copy_attributes.js \ - src/utils/get_in_dom_element.js \ - src/utils/get_parent_element.js \ - src/utils/get_style.js \ - src/utils/has_element_with_tag_name.js \ - src/utils/has_element_with_class_name.js \ - src/utils/insert_rules.js \ - src/utils/observe.js \ - src/utils/resolve_list.js \ - src/utils/rename_element.js \ - src/utils/remove_empty_text_nodes.js \ - src/utils/sandbox.js \ - src/utils/sanitize_html.js \ - src/utils/simulate_placeholder.js \ - src/utils/synchronizer.js \ - src/utils/text_content.js \ - src/utils/unwrap.js \ +JS_FILES = src/wysihtml5.js \ + lib/rangy/rangy-core.js \ + lib/base/base.js \ + src/browser.js \ + src/lang/array.js \ + src/lang/dispatcher.js \ + src/lang/object.js \ + src/lang/string.js \ + src/dom/auto_link.js \ + src/dom/class.js \ + src/dom/contains.js \ + src/dom/convert_to_list.js \ + src/dom/copy_attributes.js \ + src/dom/copy_styles.js \ + src/dom/delegate.js \ + src/dom/get_as_dom.js \ + src/dom/get_parent_element.js \ + src/dom/get_style.js \ + src/dom/has_element_with_tag_name.js \ + src/dom/has_element_with_class_name.js \ + src/dom/insert.js \ + src/dom/insert_css.js \ + src/dom/observe.js \ + src/dom/parse.js \ + src/dom/remove_empty_text_nodes.js \ + src/dom/rename_element.js \ + src/dom/replace_with_child_nodes.js \ + src/dom/resolve_list.js \ + src/dom/sandbox.js \ + src/dom/set_attributes.js \ + src/dom/set_styles.js \ + src/dom/simulate_placeholder.js \ + src/dom/text_content.js \ src/quirks/clean_pasted_html.js \ src/quirks/ensure_proper_clearing.js \ + src/quirks/get_correct_inner_html.js \ src/quirks/insert_line_break_on_return.js \ src/quirks/redraw.js \ + src/selection/selection.js \ + src/selection/html_applier.js \ src/views/view.js \ src/views/composer.js \ src/views/composer.style.js \ src/views/composer.observe.js \ + src/views/synchronizer.js \ src/views/textarea.js \ src/toolbar/dialog.js \ src/toolbar/speech.js \ @@ -60,6 +70,20 @@ JS_FILES = lib/rangy/rangy-core.js \ src/commands/underline.js \ src/editor.js -all: +all: bundle minify + +bundle: + @@echo "Bundling..." + @@touch ${JS_OUTPUT} @@rm ${JS_OUTPUT} - @@cat ${JS_FILES} >> ${JS_OUTPUT} \ No newline at end of file + @@cat ${JS_FILES} >> ${JS_OUTPUT} + @@cat ${JS_OUTPUT} | sed "s/@VERSION/${VERSION}/" > "${JS_OUTPUT}.tmp" + @@mv "${JS_OUTPUT}.tmp" ${JS_OUTPUT} + +minify: + @@echo "Minifying... (this requires node.js)" + @@node build/minify.js ${JS_OUTPUT} + @@echo "Done." + +unittest: + @@open test/index.html diff --git a/README.textile b/README.textile index 22d19ada..a47820a6 100644 --- a/README.textile +++ b/README.textile @@ -1,8 +1,9 @@ -h1. wysihtml5 0.1.0 +h1. wysihtml5 0.2.0 wysihtml5 is an open source rich text editor based on HTML5 technology and the progressive-enhancement approach. -It uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag-soups and inline-styles. -The editor is already in production use on "XING.com":https://www.xing.com - a social network with more than 10 million members. +It uses a sophisticated security concept and aims to generate fully valid HTML5 markup by preventing unmaintainable tag soups and inline styles. +The code is completely library agnostic: No jQuery, Prototype or similar is required. +The editor is already in use on "XING.com":https://www.xing.com - a social network with more than 10 million members. h2. Features: @@ -15,6 +16,7 @@ h2. Features: * Source code view for users with HTML skills * Uses sandboxed iframes in order to prevent identity theft through XSS * Editor inherits styles and attributes (placeholder, autofocus, ...) from original textarea (you only have to style one element) +* Speech-input for Chrome 11+ h2. Browser Support @@ -44,7 +46,7 @@ Following is a list of all configuration options with their corresponding defaul // Object which includes parser rules (set this to examples/rules/spec.json or your own spec, otherwise only span tags are allowed!) parserRules: null, // Parser method to use when the user inserts content via copy & paste - parser: wysihtml5.utils.sanitizeHTML || Prototype.K, + parser: wysihtml5.dom.parse || Prototype.K, // Class name which should be set on the contentEditable element in the created sandbox iframe, can be styled via the 'stylesheets' option composerClassName: "wysihtml5-editor", // Class name to add to the body when the wysihtml5 editor is supported @@ -113,6 +115,20 @@ copied to the hidden