redactor-rails 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. data/.gitignore +18 -0
  2. data/Gemfile +25 -0
  3. data/LICENSE +22 -0
  4. data/README.md +63 -0
  5. data/Rakefile +3 -0
  6. data/app/controller/redactor_rails/pictures_controller.rb +21 -0
  7. data/config/routes.rb +3 -0
  8. data/lib/generators/redactor/install_generator.rb +70 -0
  9. data/lib/generators/redactor/templates/active_record/carrierwave/migration.rb +27 -0
  10. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/asset.rb +5 -0
  11. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/attachment_file.rb +7 -0
  12. data/lib/generators/redactor/templates/active_record/carrierwave/redactor/picture.rb +7 -0
  13. data/lib/generators/redactor/templates/base/carrierwave/uploaders/redactor_rails_attachment_file_uploader.rb +42 -0
  14. data/lib/generators/redactor/templates/base/carrierwave/uploaders/redactor_rails_picture_uploader.rb +53 -0
  15. data/lib/redactor-rails.rb +30 -0
  16. data/lib/redactor-rails/backend/carrierwave.rb +64 -0
  17. data/lib/redactor-rails/configuration.rb +53 -0
  18. data/lib/redactor-rails/engine.rb +10 -0
  19. data/lib/redactor-rails/helper.rb +13 -0
  20. data/lib/redactor-rails/http.rb +89 -0
  21. data/lib/redactor-rails/orm/active_record.rb +26 -0
  22. data/lib/redactor-rails/orm/base.rb +37 -0
  23. data/lib/redactor-rails/version.rb +3 -0
  24. data/redactor-rails.gemspec +21 -0
  25. data/vendor/assets/javascripts/redactor-rails/css/docstyle.css +123 -0
  26. data/vendor/assets/javascripts/redactor-rails/css/style.css +119 -0
  27. data/vendor/assets/javascripts/redactor-rails/css/wym.css +136 -0
  28. data/vendor/assets/javascripts/redactor-rails/index.js +1 -0
  29. data/vendor/assets/javascripts/redactor-rails/langs/by.js +72 -0
  30. data/vendor/assets/javascripts/redactor-rails/langs/de.js +75 -0
  31. data/vendor/assets/javascripts/redactor-rails/langs/en.js +76 -0
  32. data/vendor/assets/javascripts/redactor-rails/langs/es.js +76 -0
  33. data/vendor/assets/javascripts/redactor-rails/langs/fr.js +74 -0
  34. data/vendor/assets/javascripts/redactor-rails/langs/hu.js +76 -0
  35. data/vendor/assets/javascripts/redactor-rails/langs/it.js +76 -0
  36. data/vendor/assets/javascripts/redactor-rails/langs/ja.js +76 -0
  37. data/vendor/assets/javascripts/redactor-rails/langs/lv.js +74 -0
  38. data/vendor/assets/javascripts/redactor-rails/langs/nl.js +76 -0
  39. data/vendor/assets/javascripts/redactor-rails/langs/pl.js +75 -0
  40. data/vendor/assets/javascripts/redactor-rails/langs/pt_br.js +81 -0
  41. data/vendor/assets/javascripts/redactor-rails/langs/ru.js +75 -0
  42. data/vendor/assets/javascripts/redactor-rails/langs/sq.js +76 -0
  43. data/vendor/assets/javascripts/redactor-rails/langs/tr.js +76 -0
  44. data/vendor/assets/javascripts/redactor-rails/langs/ua.js +75 -0
  45. data/vendor/assets/javascripts/redactor-rails/langs/zh_cn.js +77 -0
  46. data/vendor/assets/javascripts/redactor-rails/langs/zh_tw.js +76 -0
  47. data/vendor/assets/javascripts/redactor-rails/plugins/file.html +3 -0
  48. data/vendor/assets/javascripts/redactor-rails/plugins/image.html +39 -0
  49. data/vendor/assets/javascripts/redactor-rails/plugins/image_edit.html +35 -0
  50. data/vendor/assets/javascripts/redactor-rails/plugins/link.html +74 -0
  51. data/vendor/assets/javascripts/redactor-rails/plugins/table.html +25 -0
  52. data/vendor/assets/javascripts/redactor-rails/plugins/video.html +15 -0
  53. data/vendor/assets/javascripts/redactor-rails/redactor.js +2259 -0
  54. data/vendor/assets/javascripts/redactor-rails/redactor.min.js +1 -0
  55. data/vendor/assets/javascripts/redactor-rails/toolbars/default.js +214 -0
  56. data/vendor/assets/javascripts/redactor-rails/toolbars/mini.js +103 -0
  57. data/vendor/assets/stylesheets/redactor-rails/css/redactor.css +368 -0
  58. data/vendor/assets/stylesheets/redactor-rails/img/icons.png +0 -0
  59. data/vendor/assets/stylesheets/redactor-rails/index.css +1 -0
  60. metadata +136 -0
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,25 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in redactor-rails.gemspec
4
+ gemspec
5
+ gem "rails", "3.2.3"
6
+
7
+
8
+ platforms :ruby do
9
+ gem "sqlite3"
10
+
11
+ group :development do
12
+ gem "unicorn", "~> 4.0.1"
13
+ end
14
+
15
+ group :development, :test do
16
+ gem "capybara", ">= 0.4.0"
17
+ gem "mynyml-redgreen", "~> 0.7.1", :require => 'redgreen'
18
+ end
19
+
20
+ group :active_record do
21
+ gem "carrierwave"
22
+ gem "mini_magick"
23
+ end
24
+
25
+ end
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Sammy
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,63 @@
1
+ # Rails 3.2 Integration for Redactor
2
+
3
+ The redactor-rails gem integrates the [Redactor](http://redactorjs.com/) editor with the Rails 3.2 asset pipeline.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'redactor-rails'
10
+
11
+ And then execute:
12
+
13
+ $ bundle install
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install redactor-rails
18
+
19
+ ### Now generate models for store uploading files
20
+
21
+ #### ActiveRecord + carrierwave
22
+
23
+ gem "carrierwave"
24
+ gem "mini_magick"
25
+
26
+ $ rails generate redactor:install
27
+
28
+ $ rake db:migrate
29
+ Create a `config/redactor.yml` file with your global configuration options:
30
+
31
+ lang: 'zh_tw'
32
+ autoresize: true
33
+
34
+ See the [Redactor Documentation](http://redactorjs.com/docs/settings/) for a full list of configuration options.
35
+
36
+ ### Include the Redactor assets
37
+
38
+ Add to your `application.js`:
39
+
40
+ //= require redactor-rails
41
+
42
+ Add to your `application.css`:
43
+
44
+ *= require redactor-rails
45
+
46
+ ### Initialize Redactor
47
+
48
+ For each textarea that you want to use with Redactor, add the "redactor" class and ensure it has a unique ID:
49
+
50
+ <%= text_area_tag :editor, "", :class => "redactor", :rows => 40, :cols => 120 %>
51
+
52
+ Then invoke the `redactor` helper to initialize Redactor:
53
+
54
+ <%= redactor %>
55
+
56
+
57
+ ## Contributing
58
+
59
+ 1. Fork it
60
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
61
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
62
+ 4. Push to the branch (`git push origin my-new-feature`)
63
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env rake
2
+ require "bundler"
3
+ Bundler::GemHelper.install_tasks
@@ -0,0 +1,21 @@
1
+ class RedactorRails::PicturesController < ApplicationController
2
+ def index
3
+ #@pictures = RedactorRails.picture_model.find_all.map {|picture| {"thumb" => picture.url_thumb, "image" => picture.url} }
4
+ @pictures = RedactorRails.picture_model.find_all
5
+ render :json => @pictures.to_json
6
+
7
+ end
8
+ def create
9
+ @picture = RedactorRails::Picture.new
10
+
11
+ file = params[:file]
12
+ @picture.data = RedactorRails::Http.normalize_param(file, request)
13
+
14
+ if @picture.save
15
+ render :text => "<img src=#{@picture.url}/>"
16
+ else
17
+ render :nothing => true
18
+ end
19
+ end
20
+
21
+ end
data/config/routes.rb ADDED
@@ -0,0 +1,3 @@
1
+ RedactorRails::Engine.routes.draw do
2
+ resources :pictures, :only => [:index, :create, :destroy]
3
+ end
@@ -0,0 +1,70 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+ module Redactor
4
+ module Generators
5
+ class InstallGenerator < ::Rails::Generators::Base
6
+ include ::Rails::Generators::Migration
7
+ desc "Generates migration for Tag and Tagging models"
8
+
9
+ class_option :orm, :type => :string, :default => "active_record",
10
+ :desc => "Backend processor for upload support"
11
+
12
+ class_option :backend, :type => :string, :default => 'carrierwave',
13
+ :desc => "carrierwave(default)"
14
+
15
+ def self.source_root
16
+ @source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
17
+ end
18
+
19
+ def self.next_migration_number(dirname)
20
+ Time.now.strftime("%Y%m%d%H%M%S")
21
+ end
22
+
23
+ def mount_engine
24
+ route "mount RedactorRails::Engine => '/redactor_rails'"
25
+ end
26
+
27
+ def create_models
28
+ [:asset, :picture, :attachment_file].each do |filename|
29
+ template "#{generator_dir}/redactor/#{filename}.rb",
30
+ File.join('app/models', redactor_dir, "#{filename}.rb")
31
+ end
32
+
33
+ if backend == "carrierwave"
34
+ template "#{uploaders_dir}/uploaders/redactor_rails_attachment_file_uploader.rb",
35
+ File.join("app/uploaders", "redactor_rails_attachment_file_uploader.rb")
36
+
37
+ template "#{uploaders_dir}/uploaders/redactor_rails_picture_uploader.rb",
38
+ File.join("app/uploaders", "redactor_rails_picture_uploader.rb")
39
+ end
40
+ end
41
+
42
+ def create_migration
43
+ migration_template "#{generator_dir}/migration.rb", File.join('db/migrate', "create_redactor_assets.rb")
44
+ end
45
+
46
+ protected
47
+
48
+ def redactor_dir
49
+ 'redactor_rails'
50
+ end
51
+
52
+ def generator_dir
53
+ @generator_dir ||= [orm, backend].join('/')
54
+ end
55
+
56
+ def uploaders_dir
57
+ @uploaders_dir ||= ['base', 'carrierwave'].join('/')
58
+ end
59
+
60
+ def orm
61
+ options[:orm] || "active_record"
62
+ end
63
+
64
+ def backend
65
+ options[:backend] || "carrierwave"
66
+ end
67
+
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,27 @@
1
+ class CreateRedactorAssets < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :redactor_assets do |t|
4
+ t.string :data_file_name, :null => false
5
+ t.string :data_content_type
6
+ t.integer :data_file_size
7
+
8
+ t.integer :assetable_id
9
+ t.string :assetable_type, :limit => 30
10
+ t.string :type, :limit => 30
11
+
12
+ # Uncomment it to save images dimensions, if your need it
13
+ t.integer :width
14
+ t.integer :height
15
+
16
+ t.timestamps
17
+ end
18
+
19
+ add_index "redactor_assets", ["assetable_type", "type", "assetable_id"], :name => "idx_redactor_assetable_type"
20
+ add_index "redactor_assets", ["assetable_type", "assetable_id"], :name => "idx_redactor_assetable"
21
+ end
22
+
23
+ def self.down
24
+ drop_table :redactor_assets
25
+ end
26
+ end
27
+
@@ -0,0 +1,5 @@
1
+ class RedactorRails::Asset < ActiveRecord::Base
2
+ include RedactorRails::Orm::ActiveRecord::AssetBase
3
+ delegate :url, :current_path, :size, :content_type, :filename, :to => :data
4
+ validates_presence_of :data
5
+ end
@@ -0,0 +1,7 @@
1
+ class RedactorRails::AttachmentFile < RedactorRails::Asset
2
+ mount_uploader :data, RedactorRailsAttachmentFileUploader, :mount_on => :data_file_name
3
+
4
+ def url_thumb
5
+ @url_thumb ||= RedactorRails::Utils.filethumb(filename)
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ class RedactorRails::Picture < RedactorRails::Asset
2
+ mount_uploader :data, RedactorRailsPictureUploader, :mount_on => :data_file_name
3
+
4
+ def url_content
5
+ url(:content)
6
+ end
7
+ end
@@ -0,0 +1,42 @@
1
+ # encoding: utf-8
2
+ class RedactorRailsAttachmentFileUploader < CarrierWave::Uploader::Base
3
+ include RedactorRails::Backend::CarrierWave
4
+
5
+ # Include RMagick or ImageScience support:
6
+ # include CarrierWave::RMagick
7
+ # include CarrierWave::MiniMagick
8
+ # include CarrierWave::ImageScience
9
+
10
+ # Choose what kind of storage to use for this uploader:
11
+ storage :file
12
+
13
+ # Override the directory where uploaded files will be stored.
14
+ # This is a sensible default for uploaders that are meant to be mounted:
15
+ def store_dir
16
+ "system/redactor_assets/attachments/#{model.id}"
17
+ end
18
+
19
+ # Provide a default URL as a default if there hasn't been a file uploaded:
20
+ # def default_url
21
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
22
+ # end
23
+
24
+ # Process files as they are uploaded:
25
+ # process :scale => [200, 300]
26
+ #
27
+ # def scale(width, height)
28
+ # # do something
29
+ # end
30
+
31
+ # Add a white list of extensions which are allowed to be uploaded.
32
+ # For images you might use something like this:
33
+ def extension_white_list
34
+ RedactorRails.attachment_file_types
35
+ end
36
+
37
+ # Override the filename of the uploaded files:
38
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
39
+ # def filename
40
+ # "something.jpg" if original_filename
41
+ # end
42
+ end
@@ -0,0 +1,53 @@
1
+ # encoding: utf-8
2
+ class RedactorRailsPictureUploader < CarrierWave::Uploader::Base
3
+ include RedactorRails::Backend::CarrierWave
4
+
5
+ # Include RMagick or ImageScience support:
6
+ # include CarrierWave::RMagick
7
+ include CarrierWave::MiniMagick
8
+ # include CarrierWave::ImageScience
9
+
10
+ # Choose what kind of storage to use for this uploader:
11
+ storage :file
12
+
13
+ # Override the directory where uploaded files will be stored.
14
+ # This is a sensible default for uploaders that are meant to be mounted:
15
+ def store_dir
16
+ "system/redactor_assets/pictures/#{model.id}"
17
+ end
18
+
19
+ # Provide a default URL as a default if there hasn't been a file uploaded:
20
+ # def default_url
21
+ # "/images/fallback/" + [version_name, "default.png"].compact.join('_')
22
+ # end
23
+
24
+ # Process files as they are uploaded:
25
+ # process :scale => [200, 300]
26
+ #
27
+ # def scale(width, height)
28
+ # # do something
29
+ # end
30
+
31
+ process :read_dimensions
32
+
33
+ # Create different versions of your uploaded files:
34
+ version :thumb do
35
+ process :resize_to_fill => [118, 100]
36
+ end
37
+
38
+ version :content do
39
+ process :resize_to_limit => [800, 800]
40
+ end
41
+
42
+ # Add a white list of extensions which are allowed to be uploaded.
43
+ # For images you might use something like this:
44
+ def extension_white_list
45
+ RedactorRails.image_file_types
46
+ end
47
+
48
+ # Override the filename of the uploaded files:
49
+ # Avoid using model.id or version_name here, see uploader/store.rb for details.
50
+ # def filename
51
+ # "something.jpg" if original_filename
52
+ # end
53
+ end
@@ -0,0 +1,30 @@
1
+ require "orm_adapter"
2
+ require "redactor-rails/version"
3
+
4
+ module RedactorRails
5
+ IMAGE_TYPES = ['image/jpeg', 'image/png', 'image/gif', 'image/jpg', 'image/pjpeg', 'image/tiff', 'image/x-png']
6
+
7
+ autoload :Http, 'redactor-rails/http'
8
+
9
+ module Backend
10
+ autoload :CarrierWave, 'redactor-rails/backend/carrierwave'
11
+ end
12
+ require 'redactor-rails/orm/base'
13
+ require 'redactor-rails/orm/active_record'
14
+ require 'redactor-rails/engine'
15
+ require 'redactor-rails/helper'
16
+ require 'redactor-rails/configuration'
17
+
18
+ mattr_accessor :image_file_types
19
+ @@image_file_types = ["jpg", "jpeg", "png", "gif", "tiff"]
20
+
21
+ def self.configuration
22
+ @configuration ||= Configuration.load(::Rails.root.join("config/redactor.yml"))
23
+ end
24
+
25
+
26
+ def self.picture_model
27
+ RedactorRails::Picture.to_adapter
28
+ end
29
+
30
+ end
@@ -0,0 +1,64 @@
1
+ require 'mime/types'
2
+ require 'mini_magick'
3
+
4
+ module RedactorRails
5
+ module Backend
6
+ module CarrierWave
7
+ def self.included(base)
8
+ base.send(:include, InstanceMethods)
9
+ base.send(:extend, ClassMethods)
10
+ end
11
+
12
+ module ClassMethods
13
+ def self.extended(base)
14
+ base.class_eval do
15
+ process :extract_content_type
16
+ process :set_size
17
+ end
18
+ end
19
+ end
20
+
21
+ module InstanceMethods
22
+ # process :strip
23
+ def strip
24
+ manipulate! do |img|
25
+ img.strip
26
+ img = yield(img) if block_given?
27
+ img
28
+ end
29
+ end
30
+
31
+ # process :quality => 85
32
+ def quality(percentage)
33
+ manipulate! do |img|
34
+ img.quality(percentage)
35
+ img = yield(img) if block_given?
36
+ img
37
+ end
38
+ end
39
+
40
+ def extract_content_type
41
+ if file.content_type == 'application/octet-stream' || file.content_type.blank?
42
+ content_type = MIME::Types.type_for(original_filename).first
43
+ else
44
+ content_type = file.content_type
45
+ end
46
+
47
+ model.data_content_type = content_type.to_s
48
+ end
49
+
50
+ def set_size
51
+ model.data_file_size = file.size
52
+ end
53
+
54
+ def read_dimensions
55
+ if model.image? && model.has_dimensions?
56
+ magick = ::MiniMagick::Image.new(current_path)
57
+ model.width, model.height = magick[:width], magick[:height]
58
+ end
59
+ end
60
+
61
+ end
62
+ end
63
+ end
64
+ end