bootsy 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/MIT-LICENSE +1 -1
  3. data/README.md +37 -27
  4. data/Rakefile +1 -6
  5. data/app/assets/javascripts/bootsy.js +8 -7
  6. data/app/assets/javascripts/bootsy/area.js +91 -0
  7. data/app/assets/javascripts/bootsy/editor_options.js +8 -53
  8. data/app/assets/javascripts/bootsy/image_template.js.erb +45 -0
  9. data/app/assets/javascripts/bootsy/locales/en.js +59 -0
  10. data/app/assets/javascripts/bootsy/locales/pt-BR.js +59 -0
  11. data/app/assets/javascripts/bootsy/modal.js +167 -0
  12. data/app/assets/javascripts/bootsy/{bootstrap.file-input.js → vendor/bootstrap.file-input.js} +0 -0
  13. data/app/assets/javascripts/bootsy/vendor/bootstrap3-wysihtml5.all.js +14975 -0
  14. data/app/assets/javascripts/bootsy/{polyfill.js → vendor/polyfill.js} +0 -0
  15. data/app/assets/stylesheets/bootsy.css +14 -0
  16. data/app/helpers/bootsy/application_helper.rb +0 -6
  17. data/app/views/bootsy/images/_image.html.erb +3 -1
  18. data/config/locales/bootsy.en.yml +0 -2
  19. data/config/locales/bootsy.pt-BR.yml +0 -2
  20. data/lib/bootsy.rb +5 -4
  21. data/lib/bootsy/form_helper.rb +23 -17
  22. data/lib/bootsy/version.rb +1 -1
  23. data/lib/generators/bootsy/templates/bootsy.rb +5 -4
  24. metadata +14 -17
  25. data/app/assets/javascripts/bootsy/bootstrap-wysihtml5.js +0 -530
  26. data/app/assets/javascripts/bootsy/bootsy.js +0 -320
  27. data/app/assets/javascripts/bootsy/locales/bootstrap-wysihtml5.pt-BR.js +0 -50
  28. data/app/assets/javascripts/bootsy/locales/bootsy.pt-BR.js +0 -9
  29. data/app/assets/javascripts/bootsy/translations.js +0 -8
  30. data/app/assets/javascripts/bootsy/wysihtml5.js +0 -9565
  31. data/app/views/bootsy/images/_modal.html.erb +0 -30
  32. data/config/cucumber.yml +0 -8
  33. data/lib/tasks/cucumber.rake +0 -65
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ecb062c39cbffa271dda6803ef4bcaa1a302d88d
4
- data.tar.gz: c5afb0b14abb89b4ee1091b79c2907144fd597f8
3
+ metadata.gz: 9463b3fee7ada8af86752ace7357e85e4119395b
4
+ data.tar.gz: 0afa483188a2bcfe9d8faa324df42f6df0273dbd
5
5
  SHA512:
6
- metadata.gz: e9cf8f084c8eadd962250214c5e7a9da48242c879bf443bfd64fd27120dbcf6ec593b71a0fcfe2934df5106a889b3fbcfb3334710b546d2724650c88531a7315
7
- data.tar.gz: b172836a39271c1534adbb592757547467ff365536f58973411004bad06762a306837f8b5864e6f99762478ce6ed76eb17828c70f780609bbab24c04b08fe858
6
+ metadata.gz: a58b44fd911cd208badf20ac5c2938a16a958261fbd558677a8280bdb5ff4491eb7b050bd66cde7d881034af7c26717be772e2d31ef9275ee707fcbc28bba291
7
+ data.tar.gz: 5fa37fac75e6344089fa76a327589622642e8399fa02054bd4016af23fc3d7fe3f67b7c1704ea92109575a0512e15fac5c90cde9782f5b8c879dbc637f488680
@@ -1,4 +1,4 @@
1
- Copyright 2012-2014 Volmer Soares
1
+ Copyright 2012-2015 Volmer Soares
2
2
 
3
3
  Permission is hereby granted, free of charge, to any person obtaining
4
4
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -6,7 +6,9 @@
6
6
  [![Code Climate](https://codeclimate.com/github/volmer/bootsy.png)](https://codeclimate.com/github/volmer/bootsy)
7
7
  [![Coverage Status](https://coveralls.io/repos/volmer/bootsy/badge.png?branch=master)](https://coveralls.io/r/volmer/bootsy)
8
8
 
9
- *Bootsy* is a WYSIWYG editor for Rails based on [Bootstrap-wysihtml5](https://github.com/jhollingworth/bootstrap-wysihtml5) with image uploads using [CarrierWave](https://github.com/carrierwaveuploader/carrierwave).
9
+ *Bootsy* is a WYSIWYG editor for Rails based on
10
+ [Bootstrap3-wysihtml5](https://github.com/bootstrap-wysiwyg/bootstrap3-wysiwyg) with image uploads using
11
+ [CarrierWave](https://github.com/carrierwaveuploader/carrierwave).
10
12
 
11
13
  ### Live demo
12
14
 
@@ -16,7 +18,6 @@
16
18
 
17
19
  ## Requirements
18
20
 
19
- * Ruby `2` or `1.9.3`;
20
21
  * ImageMagick or GraphicsMagick (for MiniMagick);
21
22
  * Rails `4`;
22
23
  * [Bootstrap `3`](http://getbootstrap.com/) fully installed in your app.
@@ -24,28 +25,32 @@
24
25
 
25
26
  ## Installation
26
27
 
27
- 1\. Add Bootsy to your Gemfile:
28
- ```ruby
29
- gem 'bootsy'
30
- ```
28
+ 1. Add Bootsy to your Gemfile:
29
+ ```ruby
30
+ gem 'bootsy'
31
+ ```
31
32
 
32
- 2\. Run the bundle command to install it:
33
- ```console
34
- bundle install
35
- ```
33
+ 2. Run the bundle command to install it:
34
+ ```console
35
+ bundle install
36
+ ```
36
37
 
37
- 3\. Run the install generator:
38
- ```console
39
- rails generate bootsy:install
40
- ```
38
+ 3. Run the install generator:
39
+ ```console
40
+ rails generate bootsy:install
41
+ ```
41
42
  It will include the javascripts and stylesheets in the assets pipeline,
42
43
  create the `bootsy.rb` initializer and add a copy of the english translations.
43
44
 
44
- 4\. Add and run migrations:
45
- ```console
46
- rake bootsy:install:migrations
47
- rake db:migrate
48
- ```
45
+ **Note:** If your project uses SASS or LESS and `application.css` does not exist,
46
+ you will be required to require bootsy manually using `*= require bootsy` or if you prefer
47
+ to import assets yourself `@import "bootsy";`
48
+
49
+ 4. Add and run migrations:
50
+ ```console
51
+ rake bootsy:install:migrations
52
+ rake db:migrate
53
+ ```
49
54
 
50
55
 
51
56
  ## Usage
@@ -110,12 +115,12 @@ You can enable and disable features as you like. For instance, if you don't want
110
115
  ```erb
111
116
  <%= f.bootsy_area :my_attribute, editor_options: { link: false, color: false } %>
112
117
  ```
113
- Available options are: `:font_styles`, `:emphasis`, `:lists`, `:html`, `:link`, `:image` and `:color`.
118
+ Available options are: `:blockquote`, `:font_styles`, `:emphasis`, `:lists`, `:html`, `:link`, `:image` and `:color`.
114
119
 
115
120
 
116
121
  ### Alert of unsaved changes
117
122
 
118
- By default Bootsy alerts the user about unsaved changes if the page is closed or reloaded. You can disable
123
+ By default Bootsy alerts the user about unsaved changes if the page is closed or reloaded. You can disable
119
124
  this feature with:
120
125
  ```erb
121
126
  <%= f.bootsy_area :my_attribute, editor_options: { alert_unsaved: false } %>
@@ -123,8 +128,8 @@ this feature with:
123
128
 
124
129
  ## Uploads
125
130
 
126
- If you don't want to have image uploads, just call `bootsy_area` in a form builder not
127
- associated to a `Bootsy::Container` model. This way users will still be able to insert
131
+ If you don't want to have image uploads, just call `bootsy_area` in a form builder not
132
+ associated to a `Bootsy::Container` model. This way users will still be able to insert
128
133
  images in the text area using an external image URL.
129
134
 
130
135
 
@@ -138,12 +143,17 @@ the options as you like.
138
143
 
139
144
  ## I18n
140
145
 
141
- Bootsy defines some i18n keys. English translations are added by default to your
146
+ Bootsy defines some I18n keys. English translations are added by default to your
142
147
  `config/locales` directory as `bootsy.en.yml`. You can use it as a template
143
- to translate Bootsy to your language. [Here are some examples](https://github.com/volmer/bootsy/tree/master/config/locales). You also need to translate Bootstrap-wysihtml5, the underlying javascript editor. Instructions [here](https://github.com/jhollingworth/bootstrap-wysihtml5#i18n). Unless you have disabled it, it's
144
- also nice to translate the alert message of unsaved changes. Just follow [this example](https://github.com/volmer/bootsy/tree/master/app/assets/bootsy/locales/bootsy.pt-BR.js).
148
+ to translate Bootsy to your language.
149
+ [Here are some examples](https://github.com/volmer/bootsy/tree/master/config/locales).
150
+
151
+ You also need to translate Bootsy on the JavaScript side. Just follow
152
+ [this example](https://github.com/volmer/bootsy/blob/master/app/assets/javascripts/bootsy/locales/en.js).
153
+ Bootsy will try to guess the locale based on the `lang` attribute of the page's `<html>` tag.
154
+ You can set the locale directly by setting a `data-bootsy-locale` attribute on your `<textarea>`.
145
155
 
146
156
 
147
157
  ## License
148
158
 
149
- MIT License. Copyright 2012-2014 Volmer Soares
159
+ MIT License. Copyright 2012-2015 Volmer Soares
data/Rakefile CHANGED
@@ -22,7 +22,6 @@ end
22
22
 
23
23
  Bundler::GemHelper.install_tasks
24
24
 
25
- require 'cucumber/rake/task'
26
25
  require 'rspec/core/rake_task'
27
26
  require 'coveralls/rake/task'
28
27
  require 'rubocop/rake_task'
@@ -32,9 +31,5 @@ RuboCop::RakeTask.new(:rubocop) do |task|
32
31
  end
33
32
  Coveralls::RakeTask.new
34
33
  RSpec::Core::RakeTask.new(:spec)
35
- Cucumber::Rake::Task.new do |_|
36
- # Uncomment this line when cucumber/multi_test work with minitest.
37
- # t.cucumber_opts = %w{--format pretty -s}
38
- end
39
34
 
40
- task default: [:rubocop, :spec, :cucumber, 'coveralls:push']
35
+ task default: [:rubocop, :spec, 'coveralls:push']
@@ -1,9 +1,10 @@
1
1
  //= require jquery.remotipart
2
- //= require bootsy/polyfill
3
- //= require bootsy/wysihtml5
4
- //= require bootsy/bootstrap-wysihtml5
5
- //= require bootsy/bootsy
6
- //= require bootsy/bootstrap.file-input
7
- //= require bootsy/init
2
+ //= require bootsy/vendor/polyfill
3
+ //= require bootsy/vendor/bootstrap3-wysihtml5.all
4
+ //= require bootsy/vendor/bootstrap.file-input
5
+ //= require bootsy/area
8
6
  //= require bootsy/editor_options
9
- //= require bootsy/translations
7
+ //= require bootsy/image_template
8
+ //= require bootsy/init
9
+ //= require bootsy/locales/en
10
+ //= require bootsy/modal
@@ -0,0 +1,91 @@
1
+ /* global Bootsy */
2
+
3
+ window.Bootsy = window.Bootsy || {};
4
+
5
+ Bootsy.Area = function($el) {
6
+ var self = this;
7
+
8
+ this.$el = $el;
9
+ this.unsavedChanges = false;
10
+ this.locale = $el.data('bootsy-locale') || $('html').attr('lang');
11
+ if (!$.fn.wysihtml5.locale.hasOwnProperty(this.locale)) this.locale = 'en';
12
+
13
+ this.options = {
14
+ locale: this.locale,
15
+ alertUnsavedChanges: $el.data('bootsy-alert-unsaved'),
16
+ uploader: $el.data('bootsy-uploader'),
17
+ toolbar: {
18
+ 'color': $el.data('bootsy-color'),
19
+ 'emphasis': $el.data('bootsy-emphasis'),
20
+ 'font-styles': $el.data('bootsy-font-styles'),
21
+ 'html': $el.data('bootsy-html'),
22
+ 'image': $el.data('bootsy-image'),
23
+ 'link': $el.data('bootsy-link'),
24
+ 'lists': $el.data('bootsy-lists')
25
+ },
26
+ events: {
27
+ load: function() {
28
+ self.editor = this;
29
+ self.onEditorLoad();
30
+ },
31
+ change: function() {
32
+ self.unsavedChanges = true;
33
+ }
34
+ }
35
+ };
36
+ };
37
+
38
+ // Alert for unsaved changes
39
+ Bootsy.Area.prototype.unsavedChangesAlert = function () {
40
+ if (this.unsavedChanges) {
41
+ return $.fn.wysihtml5.locale[this.locale].bootsy.alertUnsaved;
42
+ }
43
+ };
44
+
45
+ // Clear everything
46
+ Bootsy.Area.prototype.clear = function () {
47
+ this.editor.clear();
48
+ this.setImageGalleryId('');
49
+ this.modal.$el.data('gallery-loaded', false);
50
+ };
51
+
52
+ Bootsy.Area.prototype.setImageGalleryId = function(id) {
53
+ this.$el.data('gallery-id', id);
54
+ this.$el.siblings('.bootsy_image_gallery_id').val(id);
55
+ };
56
+
57
+ Bootsy.Area.prototype.onEditorLoad = function() {};
58
+
59
+ Bootsy.Area.prototype.setupModal = function() {
60
+ this.modal = new Bootsy.Modal(
61
+ this.editor.toolbar.commandMapping['insertImage:null'].dialog.container, this
62
+ );
63
+ };
64
+
65
+ // Init components
66
+ Bootsy.Area.prototype.init = function() {
67
+ if (!this.$el.data('bootsy-initialized')) {
68
+ if ((this.options.toolbar.image === true) && (this.options.uploader === true)) {
69
+ this.options.customTemplates = {
70
+ image: Bootsy.imageTemplate
71
+ };
72
+
73
+ this.onEditorLoad = this.setupModal;
74
+ }
75
+
76
+ this.$el.wysihtml5($.extend(true, Bootsy.options, this.options));
77
+
78
+ // Mechanism for unsaved changes alert
79
+ if (this.options.alertUnsavedChanges !== false) {
80
+ window.onbeforeunload = this.unsavedChangesAlert.bind(this);
81
+ }
82
+
83
+ this.$el.closest('form').submit(function() {
84
+ this.unsavedChanges = false;
85
+
86
+ return true;
87
+ }.bind(this));
88
+
89
+ this.$el.data('bootsy-initialized', true);
90
+ }
91
+ };
@@ -5,43 +5,14 @@ $('link[rel="stylesheet"]').each(function () {
5
5
  pageStylesheets.push($(this).attr('href'));
6
6
  });
7
7
 
8
- window.Bootsy.options = {
8
+ window.Bootsy.options = $.extend(true, $.fn.wysihtml5.defaultOptions, {
9
9
  parserRules: {
10
10
  classes: {
11
- "wysiwyg-color-silver" : 1,
12
- "wysiwyg-color-gray" : 1,
13
- "wysiwyg-color-white" : 1,
14
- "wysiwyg-color-maroon" : 1,
15
- "wysiwyg-color-red" : 1,
16
- "wysiwyg-color-purple" : 1,
17
- "wysiwyg-color-fuchsia" : 1,
18
- "wysiwyg-color-green" : 1,
19
- "wysiwyg-color-lime" : 1,
20
- "wysiwyg-color-olive" : 1,
21
- "wysiwyg-color-yellow" : 1,
22
- "wysiwyg-color-navy" : 1,
23
- "wysiwyg-color-blue" : 1,
24
- "wysiwyg-color-teal" : 1,
25
- "wysiwyg-color-aqua" : 1,
26
- "wysiwyg-color-orange" : 1,
27
11
  "wysiwyg-float-left": 1,
28
- "wysiwyg-float-right": 1
12
+ "wysiwyg-float-right": 1,
13
+ "wysiwyg-float-inline": 1
29
14
  },
30
-
31
15
  tags: {
32
- "b": {},
33
- "i": {},
34
- "br": {},
35
- "ol": {},
36
- "ul": {},
37
- "li": {},
38
- "h1": {},
39
- "h2": {},
40
- "h3": {},
41
- "small": {},
42
- "p": {},
43
- "blockquote": {},
44
- "u": 1,
45
16
  "cite": {
46
17
  "check_attributes": {
47
18
  "title": "alt"
@@ -49,30 +20,12 @@ window.Bootsy.options = {
49
20
  },
50
21
  "img": {
51
22
  "check_attributes": {
52
- "width": "numbers",
53
- "alt": "alt",
54
- "src": "src",
55
- "height": "numbers"
23
+ "src": "src"
56
24
  },
57
25
  "add_class": {
58
26
  "align": "align_img"
59
27
  }
60
28
  },
61
-
62
- "a": {
63
- set_attributes: {
64
- target: "_blank",
65
- rel: "nofollow"
66
- },
67
- check_attributes: {
68
- href: "url" // important to avoid XSS
69
- }
70
- },
71
- "span": 1,
72
- "div": 1,
73
- // to allow save and edit files with code tag hacks
74
- "code": 1,
75
- "pre": 1,
76
29
  // this allows youtube embed codes
77
30
  "iframe": {
78
31
  set_attributes: {
@@ -87,6 +40,8 @@ window.Bootsy.options = {
87
40
  }
88
41
  }
89
42
  },
90
- color: true,
43
+ toolbar: {
44
+ color: true
45
+ },
91
46
  stylesheets: pageStylesheets
92
- };
47
+ });
@@ -0,0 +1,45 @@
1
+ window.Bootsy = window.Bootsy || {};
2
+
3
+ window.Bootsy.imageTemplate = function(context) {
4
+ var locale = context.locale;
5
+ var size = (context.options.toolbar.size) ? ' btn-' + context.options.toolbar.size : '';
6
+ var icon = '<span class="glyphicon glyphicon-picture"></span>';
7
+
8
+ if (context.options.toolbar.fa) {
9
+ icon = '<span class="fa fa-file-image-o"></span>';
10
+ }
11
+
12
+ return '<li>' +
13
+ '<div class="modal fade bootsy-modal" tabindex="-1" role="dialog" data-wysihtml5-dialog="insertImage" data-no-turbolink>'+
14
+ '<div class="modal-dialog" role="document">'+
15
+ '<div class="modal-content">'+
16
+ '<div class="modal-header">'+
17
+ '<button type="button" class="close" data-dismiss="modal" data-wysihtml5-dialog-action="cancel">' +
18
+ '<span aria-hidden="true">&times;</span>' +
19
+ '</button>' +
20
+ '<h4 class="modal-title">' + locale.image.insert + '</h4>' +
21
+ '</div>' +
22
+
23
+ '<div class="modal-body">' +
24
+ '<div class="alert alert-info bootsy-empty-alert">' +
25
+ locale.bootsy.empty +
26
+ '</div>' +
27
+
28
+ '<div class="row bootsy-gallery"></div>' +
29
+
30
+ '<img src="<%= image_path "bootsy/gallery-loader.gif" %>" class="bootsy-gallery-loader" />' +
31
+
32
+ '<a href="#refresh-gallery" class="btn btn-default btn-sm refresh-btn">' + locale.bootsy.refresh + '</a>' +
33
+ '</div>' +
34
+ '<input type="hidden" data-wysihtml5-dialog-field="src" value="" />' +
35
+ '<input type="hidden" data-wysihtml5-dialog-field="className" value="" />' +
36
+ '<div class="modal-footer"></div>' +
37
+ '</div>' +
38
+ '</div>' +
39
+ '</div>' +
40
+
41
+ '<a class="btn btn-default ' + size + '" data-wysihtml5-command="insertImage" title="' + locale.image.insert + '" tabindex="-1">' +
42
+ icon +
43
+ '</a>' +
44
+ '</li>';
45
+ };
@@ -0,0 +1,59 @@
1
+ /**
2
+ * English translations for bootstrap-wysihtml5 and Bootsy
3
+ */
4
+ (function($){
5
+ $.fn.wysihtml5.locale['en'] = {
6
+ font_styles: {
7
+ normal: 'Normal text',
8
+ h1: 'Heading 1',
9
+ h2: 'Heading 2',
10
+ h3: 'Heading 3',
11
+ h4: 'Heading 4',
12
+ h5: 'Heading 5',
13
+ h6: 'Heading 6'
14
+ },
15
+ emphasis: {
16
+ bold: 'Bold',
17
+ italic: 'Italic',
18
+ underline: 'Underline',
19
+ small: 'Small'
20
+ },
21
+ lists: {
22
+ unordered: 'Unordered list',
23
+ ordered: 'Ordered list',
24
+ outdent: 'Outdent',
25
+ indent: 'Indent'
26
+ },
27
+ link: {
28
+ insert: 'Insert link',
29
+ cancel: 'Cancel',
30
+ target: 'Open link in new window'
31
+ },
32
+ image: {
33
+ insert: 'Insert image',
34
+ cancel: 'Cancel'
35
+ },
36
+ html: {
37
+ edit: 'Edit HTML'
38
+ },
39
+ colours: {
40
+ black: 'Black',
41
+ silver: 'Silver',
42
+ gray: 'Grey',
43
+ maroon: 'Maroon',
44
+ red: 'Red',
45
+ purple: 'Purple',
46
+ green: 'Green',
47
+ olive: 'Olive',
48
+ navy: 'Navy',
49
+ blue: 'Blue',
50
+ orange: 'Orange'
51
+ },
52
+ bootsy: {
53
+ empty: 'There are currently no uploaded images.',
54
+ refresh: 'Refresh',
55
+ alertUnsaved: 'You have unsaved changes.',
56
+ error: 'Something went wrong. Please try again later.'
57
+ }
58
+ };
59
+ }(jQuery));