mercury-rails 0.2.0 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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>"