mercury-rails 0.2.0 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/POST_INSTALL +15 -0
  2. data/README.md +27 -6
  3. data/VERSION +1 -1
  4. data/app/controllers/mercury_controller.rb +4 -4
  5. data/app/views/layouts/mercury.html.erb +14 -3
  6. data/app/views/mercury/panels/snippets.html +1 -1
  7. data/app/views/mercury/snippets/{example_options.html.erb → example/options.html.erb} +0 -0
  8. data/app/views/mercury/snippets/{example.html.erb → example/preview.html.erb} +0 -0
  9. data/config/routes.rb +2 -2
  10. data/features/loading/loading.feature +22 -0
  11. data/features/loading/navigating.feature +77 -0
  12. data/features/loading/user_interface.feature +67 -0
  13. data/features/regions/editable/advanced_editing.feature +0 -0
  14. data/features/regions/editable/basic_editing.feature +195 -0
  15. data/features/regions/editable/inserting_links.feature +98 -0
  16. data/features/regions/editable/inserting_media.feature +110 -0
  17. data/features/regions/editable/inserting_snippets.feature +103 -0
  18. data/features/regions/editable/inserting_special_characters.feature +24 -0
  19. data/features/regions/editable/inserting_tables.feature +109 -0
  20. data/features/regions/editable/pasting.feature +0 -0
  21. data/features/regions/editable/uploading_images.feature +0 -0
  22. data/features/regions/markupable/advanced_editing.feature +0 -0
  23. data/features/regions/markupable/basic_editing.feature +0 -0
  24. data/features/regions/markupable/inserting_links.feature +0 -0
  25. data/features/regions/markupable/inserting_media.feature +0 -0
  26. data/features/regions/markupable/inserting_snippets.feature +0 -0
  27. data/features/regions/markupable/inserting_special_characters.feature +0 -0
  28. data/features/regions/markupable/inserting_tables.feature +0 -0
  29. data/features/regions/markupable/uploading_images.feature +0 -0
  30. data/features/regions/snippetable/advanced_editing.feature +0 -0
  31. data/features/regions/snippetable/basic_editing.feature +0 -0
  32. data/features/regions/snippetable/inserting_snippets.feature +0 -0
  33. data/features/saving/saving.feature +33 -0
  34. data/features/step_definitions/debug_steps.rb +2 -2
  35. data/features/step_definitions/mercury_steps.rb +441 -0
  36. data/features/support/env.rb +3 -3
  37. data/features/support/mercury_contents.rb +25 -0
  38. data/features/support/mercury_selectors.rb +147 -0
  39. data/features/support/paths.rb +20 -18
  40. data/features/support/selectors.rb +5 -3
  41. data/lib/generators/mercury/install/install_generator.rb +14 -0
  42. data/mercury-rails.gemspec +50 -20
  43. data/spec/javascripts/mercury/lightview_spec.js.coffee +55 -27
  44. data/spec/javascripts/mercury/mercury_spec.js.coffee +3 -3
  45. data/spec/javascripts/mercury/modal_spec.js.coffee +2 -2
  46. data/spec/javascripts/mercury/native_extensions_spec.js.coffee +0 -24
  47. data/spec/javascripts/mercury/page_editor_spec.js.coffee +148 -67
  48. data/spec/javascripts/mercury/panel_spec.js.coffee +2 -2
  49. data/spec/javascripts/mercury/region_spec.js.coffee +10 -7
  50. data/spec/javascripts/mercury/regions/editable_spec.js.coffee +0 -20
  51. data/spec/javascripts/mercury/snippet_toolbar_spec.js.coffee +2 -2
  52. data/spec/javascripts/mercury/toolbar.button_group_spec.js.coffee +1 -1
  53. data/spec/javascripts/mercury/toolbar.expander_spec.js.coffee +1 -1
  54. data/spec/javascripts/templates/mercury/page_editor.html +3 -3
  55. data/vendor/assets/images/mercury/close.png +0 -0
  56. data/vendor/assets/javascripts/mercury.js +140 -73
  57. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery-1.6.js +0 -0
  58. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery-ui-1.8.13.custom.js +0 -0
  59. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/jquery.additions.js +0 -0
  60. data/vendor/assets/javascripts/mercury/dependencies/jquery.htmlClean.js +527 -0
  61. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/liquidmetal.js +0 -0
  62. data/vendor/assets/javascripts/{mercury_dependencies → mercury/dependencies}/showdown.js +0 -0
  63. data/vendor/assets/javascripts/mercury/lightview.js.coffee +5 -2
  64. data/vendor/assets/javascripts/mercury/mercury.js.coffee +9 -8
  65. data/vendor/assets/javascripts/mercury/modals/htmleditor.js.coffee +3 -1
  66. data/vendor/assets/javascripts/mercury/modals/inserttable.js.coffee +2 -2
  67. data/vendor/assets/javascripts/mercury/native_extensions.js.coffee +6 -17
  68. data/vendor/assets/javascripts/mercury/page_editor.js.coffee +29 -8
  69. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/mercury/page_editor.js.coffee +27 -0
  70. data/vendor/assets/javascripts/mercury/plugins/save_as_xml/plugin.js +9 -0
  71. data/vendor/assets/javascripts/mercury/region.js.coffee +2 -2
  72. data/vendor/assets/javascripts/mercury/regions/editable.js.coffee +89 -93
  73. data/vendor/assets/javascripts/mercury/regions/markupable.js.coffee +1 -1
  74. data/vendor/assets/javascripts/mercury/support/history.js +1 -0
  75. data/vendor/assets/javascripts/mercury/uploader.js.coffee +0 -1
  76. data/vendor/assets/javascripts/mercury_loader.js +4 -4
  77. data/vendor/assets/stylesheets/mercury/lightview.css +8 -0
  78. data/vendor/assets/stylesheets/mercury/mercury.css +12 -0
  79. data/vendor/assets/stylesheets/mercury/modal.css +0 -12
  80. data/vendor/assets/stylesheets/mercury/toolbar.css +1 -0
  81. data/vendor/assets/stylesheets/mercury_overrides.css +17 -0
  82. metadata +73 -45
  83. data/app/views/mercury/lightviews/imageprocessor.html +0 -3
  84. data/app/views/mercury/modals/sanitizer.html +0 -9
  85. data/features/editing/basic.feature +0 -11
  86. data/vendor/assets/images/mercury/clippy.png +0 -0
data/POST_INSTALL ADDED
@@ -0,0 +1,15 @@
1
+ +============================================================================+
2
+ Congratulations, Mercury was successfully installed in your app. Documentation
3
+ and other useful info can be found at: https://github.com/jejacks0n/mercury
4
+
5
+ Here's a post install checklist:
6
+
7
+ * Setup the database for image processing (if you haven't already) by running
8
+
9
+ rake mercury_engine:install:migrations
10
+ rake db:migrate
11
+
12
+ * Learn about, and make your configuration adjustments in the mercury.js file
13
+
14
+ * If installed, check out mercury.html.erb and mercury_overrides.css for more
15
+ customization info.
data/README.md CHANGED
@@ -8,6 +8,28 @@ block elements, instead of iframes, which allows for CSS to be applied in ways t
8
8
  Mercury has been written using CoffeeScript and jQuery for the Javascript portions, and is written on top of Rails 3.1.
9
9
 
10
10
 
11
+ ## Translations
12
+
13
+ Hey international open source contributors, want to contribute to the Mercury Editor project without having to do much
14
+ coding? We're looking for good translations. If you have a good grasp of english, another common language, and have
15
+ the desire and time to do a translation for the project it would be awesome to hear from you. Just shoot me a message
16
+ or email and I'll provide more details. While any translation would be a good thing, the languages that seem like they
17
+ would give the most value are:
18
+
19
+ - French
20
+ - German
21
+ - Spanish
22
+ - Japanese
23
+ - Chinese
24
+ - Dutch
25
+
26
+
27
+ ## Awesomeness
28
+
29
+ Mercury has been added as a Featured Project on Pivotal Tracker! If you're interested in what's planned, check out the
30
+ public project at: https://www.pivotaltracker.com/projects/295823
31
+
32
+
11
33
  ## Browser Support
12
34
 
13
35
  Mercury has been written for the future, and thus doesn't support legacy browsers or browsers that don't follow the W3C
@@ -62,7 +84,6 @@ The feature list is actually pretty long, so here's a short list that need highl
62
84
  - Table Editing: Advanced table editing and creation.
63
85
  - Snippets: Insert and edit predefined and reusable bits of markup/code using drag and drop.
64
86
  - Notes: Attach notes to any page and communicate with other content authors.
65
- - Colaborative Editing: Edit any page that others are editing at the same time and see their changes in real time.
66
87
 
67
88
 
68
89
  ## Installation
@@ -108,10 +129,10 @@ the Usage portion of this documentation.
108
129
  ## Usage
109
130
 
110
131
  Mercury has an expectation that content regions will be on the page (not required, but probably useful). To define
111
- content regions that Mercury will make editable you need to add a `mercury-region` class attribute to a div. Then
112
- specify what region type by using the `data-type` attribute -- which can be *editable*, *markupable*, or *snippetable*.
113
- It's important for saving that an id attribute be set on regions, you should always include. Region types are outlined
114
- below.
132
+ content regions that Mercury will make editable you need to add a `mercury-region` class attribute to a div (this is
133
+ configurable). Then specify what region type by using the `data-type` attribute -- which can be *editable*,
134
+ *markupable*, or *snippetable*. It's important for saving that an id attribute be set on regions, you should always
135
+ include. Region types are outlined below.
115
136
 
116
137
  <div id="primary" class="mercury-region" data-type="editable">
117
138
  default content
@@ -202,7 +223,7 @@ default it will use JSON, that JSON looks like:
202
223
  }
203
224
  }
204
225
  }
205
- },
226
+ }
206
227
  }
207
228
 
208
229
  Where it gets saved to is also up to you.. by default it submits a post to the current url, but you can adjust this by
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.2.0
1
+ 0.2.3
@@ -10,15 +10,15 @@ class MercuryController < ActionController::Base
10
10
  end
11
11
 
12
12
  def snippet_options
13
- render :action => "/snippets/#{params[:name]}_options", :layout => false
13
+ render :action => "/snippets/#{params[:name]}/options", :layout => false
14
14
  end
15
15
 
16
16
  def snippet_preview
17
- render :action => "/snippets/#{params[:name]}", :layout => false
17
+ render :action => "/snippets/#{params[:name]}/preview", :layout => false
18
18
  end
19
19
 
20
- def post
21
- render :json => params
20
+ def test_page
21
+ render :text => params
22
22
  end
23
23
 
24
24
  end
@@ -1,14 +1,25 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <meta name="viewport" content="width=device-width, maximum-scale=1.0, initial-scale=1.0">
4
5
  <%= csrf_meta_tags %>
5
6
  <title>Mercury Editor</title>
6
- <link href="/assets/mercury.css" media="screen" rel="stylesheet" type="text/css" />
7
- <script src="/assets/mercury.js" type="text/javascript"></script>
7
+ <%= stylesheet_link_tag 'mercury', 'mercury_overrides' %>
8
+ <%= javascript_include_tag 'mercury' %>
8
9
  </head>
9
10
  <body>
11
+ <% if Rails.application.config.respond_to?(:mercury_config) %>
12
+ <%= javascript_tag("jQuery.extend(Mercury.config, #{Rails.application.config.mercury_config});") %>
13
+ <% end -%>
14
+
10
15
  <script type="text/javascript">
11
- new Mercury.PageEditor()
16
+ var saveUrl = null;
17
+ var options = {
18
+ saveStyle: null, // 'form', or 'json' (default json)
19
+ saveMethod: null, // 'POST', or 'PUT', (create, vs. update -- default POST)
20
+ visible: null // if the interface should start visible or not (default true)
21
+ };
22
+ new Mercury.PageEditor(saveUrl, options);
12
23
  </script>
13
24
  </body>
14
25
  </html>
@@ -3,7 +3,7 @@
3
3
  <input class="filter" type="text">
4
4
  </div>
5
5
  <ul>
6
- <li data-filter="example-snippet">
6
+ <li data-filter="example, snippet, favorite, beer">
7
7
  <img alt="Snippet Name" data-snippet="example" src="/assets/mercury/default-snippet.png"/>
8
8
  <h4>Snippet Name</h4>
9
9
  <div class="description">A one to two line long description of what this snippet does.</div>
data/config/routes.rb CHANGED
@@ -2,7 +2,7 @@ Rails.application.routes.draw do
2
2
 
3
3
  resources :images
4
4
 
5
- match '/editor(/*requested_uri)' => "mercury#edit"
5
+ match '/editor(/*requested_uri)' => "mercury#edit", :as => :mercury_editor
6
6
  scope '/mercury' do
7
7
  match ':type/:resource' => "mercury#resource"
8
8
  match 'snippets/:name/options' => "mercury#snippet_options"
@@ -10,6 +10,6 @@ Rails.application.routes.draw do
10
10
  end
11
11
 
12
12
  if defined?(Mercury::Application)
13
- match '/test_post' => "mercury#post"
13
+ match 'mercury/test_page' => "mercury#test_page"
14
14
  end
15
15
  end
@@ -0,0 +1,22 @@
1
+ @javascript
2
+ Feature:
3
+ As a content editor type person
4
+ In order to manage content
5
+ I should be able to expect the editor to load properly
6
+
7
+ Background:
8
+ Given I am on an editable page
9
+
10
+
11
+ Scenario: A user can expect to see the toolbar
12
+ Then I should see "Save" within the toolbar
13
+ And I should see "Preview" within the toolbar
14
+ And I should see "Bold" within the toolbar
15
+
16
+
17
+ Scenario: A user can expect to see the contents of the iframe
18
+ Then I should see "Editable region" in the content frame
19
+
20
+
21
+ Scenario: A user can expect to see the status bar
22
+ Then I should see "Mercury Editor v0.2.1" within the statusbar
@@ -0,0 +1,77 @@
1
+ @javascript
2
+ Feature:
3
+ As a content editor type person
4
+ In order to manage content
5
+ I should be able to expect the editor to not get in the way when I navigate and submit forms
6
+
7
+ Background:
8
+ Given I adjust the configuration to have: "{nonHijackableClasses: ['lightview']}"
9
+ And am on an editable page
10
+
11
+
12
+ Scenario: A user can navigate links targeting _top
13
+ When I follow "_top" in the content frame
14
+ Then I should be on the test page
15
+
16
+
17
+ Scenario: A user can navigate links targeting _blank
18
+ When I follow "_blank" in the content frame
19
+ Then I should be on the editable page
20
+ And I should see "test_page" in the "/mercury/test_page" window
21
+
22
+
23
+ Scenario: A user can navigate links targeting _self
24
+ When I follow "_self" in the content frame
25
+ Then I should be on the test page
26
+
27
+
28
+ Scenario: A user can navigate links with no target set
29
+ When I follow "[none]" in the content frame
30
+ Then I should be on the test page
31
+
32
+
33
+ Scenario: A user can navigate links that are ignored by configuration
34
+ When I follow "_self .lightview" in the content frame
35
+ Then I should be on the editable page
36
+
37
+
38
+ Scenario: A user can navigate links targeting random windows
39
+ When I follow "foo" in the content frame
40
+ Then I should be on the editable page
41
+ Then I should see "test_page" in the "foo" window
42
+
43
+
44
+ Scenario: A user can submit forms targeting _top
45
+ When I press "post _top" in the content frame
46
+ Then I should be on the test page
47
+ And I should see "post _top"
48
+
49
+
50
+ # todo: intermittent failure
51
+ # Scenario: A user can submit forms targeting _blank
52
+ # When I press "post _blank" in the content frame
53
+ # Then I should be on the editable page
54
+ # And I should see "post _blank" in the "/mercury/test_page" window
55
+
56
+
57
+ Scenario: A user can submit forms targeting _self
58
+ When I press "post _self" in the content frame
59
+ Then I should be on the test page
60
+ And I should see "post _self"
61
+
62
+
63
+ Scenario: A user can submit forms with no target set
64
+ When I press "get [none]" in the content frame
65
+ Then I should be on the test page
66
+ And I should see "get [none]"
67
+
68
+
69
+ Scenario: A user can submit forms that are ignored by configuration
70
+ When I press "post _self .lightview" in the content frame
71
+ Then I should be on the editable page
72
+
73
+
74
+ Scenario: A user can submit forms targeting random windows
75
+ When I press "get foo" in the content frame
76
+ Then I should be on the editable page
77
+ And I should see "get foo" in the "foo" window
@@ -0,0 +1,67 @@
1
+ @javascript
2
+ Feature:
3
+ As a content editor type person
4
+ In order to manage content
5
+ I should be able to interact with various user interface aspects of the editor
6
+
7
+ Background:
8
+ Given I am on an editable page
9
+
10
+ Scenario: A user can expect all this!
11
+
12
+
13
+ # Scenario: A user can view and close the about dialog
14
+ When I click on the about the editor link
15
+ Then I should see "About Mercury Editor" within the lightview title
16
+ And I should see "Mercury Editor is an open source project written by Jeremy Jackson" within the lightview window
17
+ And I should see "Project Home" within the lightview window
18
+ And I should see "Project Source" within the lightview window
19
+
20
+ When I click on the lightview overlay
21
+ Then the lightview window should not be visible
22
+ And the lightview overlay should not be visible
23
+
24
+
25
+ # Scenario: A user can open and close select dropdowns
26
+ When I click on the formatblock editor dropdown
27
+ Then the formatblock select should be visible
28
+ And I should see "Heading 1 <h1>" within the formatblock select
29
+
30
+ When I click on the style editor dropdown
31
+ Then the style select should be visible
32
+ And the formatblock select should not be visible
33
+
34
+
35
+ # Scenario: A user can open and close palette dialogs
36
+ When I click on the background color editor button
37
+ Then the background color palette should be visible
38
+
39
+ When I click on the foreground color editor button
40
+ Then the foreground color palette should be visible
41
+ And the background color palette should not be visible
42
+
43
+
44
+ # Scenario: A user can open and close a panel
45
+ When I click on the "View History" button
46
+ Then the history panel should be visible
47
+ And I should see "Page Version History" within the history panel
48
+
49
+ When I click on the "View History" button
50
+ Then the history panel should not be visible
51
+
52
+
53
+ # Scenario: A user can open and close a modal window
54
+ When I click on the "Insert Link" button
55
+ Then the modal window should be visible
56
+ And the modal overlay should be visible
57
+ And I should see "Insert Link" within the modal title
58
+ And I should see "Standard Links" within the insert link modal
59
+
60
+ When I click on the modal close button
61
+ Then the modal window should not be visible
62
+ And the modal overlay should not be visible
63
+
64
+ When I click on the "Insert Link" button
65
+ And click on the modal overlay
66
+ Then the modal window should not be visible
67
+ And the modal overlay should not be visible
@@ -0,0 +1,195 @@
1
+ @javascript
2
+ Feature:
3
+ As a content editor type person
4
+ In order to manage content
5
+ I should be able to manipulate it in various ways (eg. bold, add italics, set headers, colors, etc.)
6
+
7
+ Background:
8
+ Given I am on an editable page
9
+ And the editor won't prompt when leaving the page
10
+
11
+ Scenario: A user can expect all this!
12
+
13
+
14
+ # Scenario: A user can set and unset bold content
15
+ Given the content of the editable region is simple content
16
+ And I make a selection
17
+
18
+ When I click on the bold editor button
19
+ Then the contents of the editable region should be "this is <b><span>simple</span></b> <b>content</b>"
20
+
21
+ When I click on the bold editor button
22
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
23
+
24
+
25
+ # Scenario: A user can italicize content
26
+ Given the content of the editable region is simple content
27
+ And I make a selection
28
+
29
+ When I click on the italicize editor button
30
+ Then the contents of the editable region should be "this is <i><span>simple</span></i> <b>content</b>"
31
+
32
+ When I click on the italicize editor button
33
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
34
+
35
+
36
+ # Scenario: A user can overline content
37
+ Given the content of the editable region is simple content
38
+ And I make a selection
39
+
40
+ When I click on the overline editor button
41
+ Then the contents of the editable region should be "this is <span style='text-decoration:overline'><span>simple</span></span> <b>content</b>"
42
+ # doesn't remove overlines
43
+
44
+
45
+ # Scenario: A user can strikeout content
46
+ Given the content of the editable region is simple content
47
+ And I make a selection
48
+
49
+ When I click on the strikethrough editor button
50
+ Then the contents of the editable region should be "this is <strike><span>simple</span></strike> <b>content</b>"
51
+
52
+ When I click on the strikethrough editor button
53
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
54
+
55
+ # Scenario: A user can underline content
56
+ Given the content of the editable region is simple content
57
+ And I make a selection
58
+
59
+ When I click on the underline editor button
60
+ Then the contents of the editable region should be "this is <u><span>simple</span></u> <b>content</b>"
61
+
62
+ When I click on the underline editor button
63
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
64
+
65
+
66
+ # Scenario: A user can make content superscript
67
+ Given the content of the editable region is simple content
68
+ And I make a selection
69
+
70
+ When I click on the superscript editor button
71
+ Then the contents of the editable region should be "this is <sup><span>simple</span></sup> <b>content</b>"
72
+
73
+ When I click on the superscript editor button
74
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
75
+
76
+
77
+ # Scenario: A user can make content subscript
78
+ Given the content of the editable region is simple content
79
+ And I make a selection
80
+
81
+ When I click on the subscript editor button
82
+ Then the contents of the editable region should be "this is <sub><span>simple</span></sub> <b>content</b>"
83
+
84
+ When I click on the subscript editor button
85
+ Then the contents of the editable region should be "this is <span>simple</span> <b>content</b>"
86
+
87
+
88
+ # Scenario: A user can justify content to the left, center, right, or fully justified
89
+ # firefox: this isn't possible on the first line due to a bug in gecko, so we have special content for it
90
+ Given the content of the editable region has justifiable content
91
+ And I make a selection
92
+
93
+ When I click on the justify left editor button
94
+ Then the contents of the editable region should be "<div>first line</div><br><div align='left'>this is <span>justifiable</span> <b>content</b></div>"
95
+
96
+ When I click on the justify center editor button
97
+ Then the contents of the editable region should be "<div>first line</div><br><div align='center'>this is <span>justifiable</span> <b>content</b></div>"
98
+
99
+ When I click on the justify right editor button
100
+ Then the contents of the editable region should be "<div>first line</div><br><div align='right'>this is <span>justifiable</span> <b>content</b></div>"
101
+
102
+ When I click on the full justification editor button
103
+ Then the contents of the editable region should be "<div>first line</div><br><div align='justify'>this is <span>justifiable</span> <b>content</b></div>"
104
+
105
+
106
+ # Scenario: A user can make an unordered list
107
+ Given the content of the editable region is simple content
108
+ And I make a selection
109
+
110
+ When I click on the insert unordered list editor button
111
+ Then the contents of the editable region should be "<ul><li>this is <span>simple</span> <b>content</b></li></ul>"
112
+
113
+ # todo: we should test enter and tab, and shift+tab in advanced editing
114
+
115
+ # Scenario: A user can make an ordered list
116
+ Given the content of the editable region is simple content
117
+ And I make a selection
118
+
119
+ When I click on the insert ordered list editor button
120
+ Then the contents of the editable region should be "<ol><li>this is <span>simple</span> <b>content</b></li></ol>"
121
+
122
+ # todo: we should test enter and tab, and shift+tab in advanced editing
123
+
124
+
125
+ # Scenario: A user can indent and outdent content
126
+ # firefox: this isn't possible on the first line due to a bug in gecko, so we have special content for it
127
+ Given the content of the editable region has justifiable content
128
+ And I make a selection
129
+
130
+ When I click on the indent editor button
131
+ Then the contents of the editable region should be "<div>first line</div><br><blockquote>this is <span>justifiable</span> <b>content</b></blockquote>"
132
+
133
+ When I click on the indent editor button
134
+ Then the contents of the editable region should be "<div>first line</div><br><blockquote><blockquote>this is <span>justifiable</span> <b>content</b></blockquote></blockquote>"
135
+
136
+ When I click on the outdent editor button
137
+ Then the contents of the editable region should be "<div>first line</div><br><blockquote>this is <span>justifiable</span> <b>content</b></blockquote>"
138
+
139
+ When I click on the outdent editor button
140
+ Then the contents of the editable region should be "<div>first line</div><br>this is <span>justifiable</span> <b>content</b>"
141
+
142
+
143
+ # Scenario: A user can insert horizontal rules
144
+ Given the content of the editable region is simple content
145
+ And I make a selection
146
+
147
+ When I click on the insert hr editor button
148
+ Then the contents of the editable region should be "this is&nbsp;<hr size='2' width='100%'> <b>content</b>"
149
+
150
+ When I click on the insert hr editor button
151
+ Then the contents of the editable region should be "this is&nbsp;<hr size='2' width='100%'><hr size='2' width='100%'> <b>content</b>"
152
+
153
+
154
+ # Scenario: A user can clean/remove formatting on their selection
155
+ Given the content of the editable region has wrapped content
156
+ And I make a selection
157
+
158
+ When I click on the remove formatting editor button
159
+ Then the contents of the editable region should be "this is wrapped content"
160
+
161
+
162
+ # Scenario: A user can wrap content within predefined styles
163
+ Given the content of the editable region is simple content
164
+ And I make a selection
165
+
166
+ When I click on the style editor dropdown
167
+ And select the red style from the dropdown
168
+ Then the contents of the editable region should be "this is <span class='red'><span>simple</span></span> <b>content</b>"
169
+
170
+
171
+ # Scenario: A user can wrap content in formatted block tags
172
+ Given the content of the editable region is simple content
173
+ And I make a selection
174
+
175
+ When I click on the block format editor dropdown
176
+ And select the heading 2 block from the dropdown
177
+ Then the contents of the editable region should be "<h2>this is <span>simple</span> <b>content</b></h2>"
178
+
179
+
180
+ # Scenario: A user can set the background color of a selection
181
+ Given the content of the editable region is simple content
182
+ And I make a selection
183
+
184
+ When I click on the background color editor palette
185
+ And click on the color red
186
+ Then the contents of the editable region should be "this is <span style='background-color:#FF0000'><span>simple</span></span> <b>content</b>"
187
+
188
+
189
+ # Scenario: A user can set the foreground color
190
+ Given the content of the editable region is simple content
191
+ And I make a selection
192
+
193
+ When I click on the foreground color editor palette
194
+ And click on the color red
195
+ Then the contents of the editable region should be "this is <font color='rgb(255, 0, 0)'><span>simple</span></font> <b>content</b>"