ckeditor 3.2.1 → 3.2.3
Sign up to get free protection for your applications and to get access to all the features.
- data/README.rdoc +136 -0
- data/app/controllers/ckeditor_controller.rb +5 -4
- data/app/helpers/ckeditor_helper.rb +2 -18
- data/app/views/ckeditor/_asset.html.erb +15 -0
- data/app/views/ckeditor/files.html.erb +1 -1
- data/app/views/ckeditor/images.html.erb +1 -1
- data/app/views/layouts/ckeditor.html.erb +0 -1
- data/lib/ckeditor.rb +20 -0
- data/lib/ckeditor/engine.rb +11 -0
- data/lib/ckeditor/formtastic.rb +12 -0
- data/lib/ckeditor/middleware.rb +18 -0
- data/lib/ckeditor/version.rb +1 -1
- data/lib/ckeditor/view_helper.rb +40 -63
- data/lib/generators/USAGE +17 -0
- data/lib/generators/{ckeditor_generator.rb → ckeditor_core_generator.rb} +2 -7
- data/lib/generators/ckeditor_models_generator.rb +41 -0
- data/lib/generators/templates/ckeditor.rb +3 -2
- data/lib/generators/templates/ckeditor/swfupload/fileprogress.js +2 -20
- data/lib/generators/templates/ckeditor/swfupload/swfupload.js +1 -980
- data/lib/generators/templates/ckeditor/swfupload/swfupload.queue.js +1 -98
- data/lib/generators/templates/ckeditor/swfupload/swfupload.swf +0 -0
- data/lib/generators/templates/models/attachment_fu/asset.rb +32 -0
- data/lib/generators/templates/models/attachment_fu/attachment_file.rb +24 -0
- data/lib/generators/templates/models/attachment_fu/migration.rb +30 -0
- data/lib/generators/templates/models/attachment_fu/picture.rb +25 -0
- data/lib/generators/templates/models/paperclip/asset.rb +86 -0
- data/lib/generators/templates/models/paperclip/attachment_file.rb +40 -0
- data/lib/generators/templates/models/paperclip/migration.rb +31 -0
- data/lib/generators/templates/models/paperclip/picture.rb +23 -0
- metadata +21 -13
- data/README.textile +0 -225
- data/TODO +0 -3
- data/app/views/ckeditor/_file.html.erb +0 -15
- data/app/views/ckeditor/_image.html.erb +0 -15
- data/lib/ckeditor/file_storage.rb +0 -178
data/README.textile
DELETED
@@ -1,225 +0,0 @@
|
|
1
|
-
h1. Rails CKEditor integration plugin with SWFUpload support
|
2
|
-
|
3
|
-
CKEditor is a text editor to be used inside web pages. It's a WYSIWYG editor, which means that the text being edited on it looks as similar as possible to
|
4
|
-
the results users have when publishing it. It brings to the web common editing features found on desktop editing applications like Microsoft Word and OpenOffice.
|
5
|
-
|
6
|
-
Because CKEditor is licensed under flexible Open Source and commercial licenses, you'll be able to integrate and use it inside any kind of application.
|
7
|
-
This is the ideal editor for developers, created to provide easy and powerful solutions to their users.
|
8
|
-
|
9
|
-
CKEditor version: 3.2.1
|
10
|
-
SWFUpload version: 2.2.0
|
11
|
-
Rails version: 2.3.x
|
12
|
-
|
13
|
-
"ckeditor.com":http://ckeditor.com/
|
14
|
-
"swfupload.org":http://swfupload.org/
|
15
|
-
|
16
|
-
Demo appication:
|
17
|
-
"rails-ckeditor-demo-app":http://github.com/galetahub/rails-ckeditor-demo-app
|
18
|
-
|
19
|
-
h2. Install
|
20
|
-
|
21
|
-
h3. Rails 3.0
|
22
|
-
|
23
|
-
@gem install ckeditor@
|
24
|
-
|
25
|
-
In "Gemfile":
|
26
|
-
@gem 'ckeditor', '3.2.1'@
|
27
|
-
|
28
|
-
@rails generate ckeditor [options]@
|
29
|
-
|
30
|
-
Runtime options:
|
31
|
-
-f, [--force] # Overwrite files that already exist
|
32
|
-
-p, [--pretend] # Run but do not make any changes
|
33
|
-
-q, [--quiet] # Supress status output
|
34
|
-
-s, [--skip] # Skip files that already exist
|
35
|
-
|
36
|
-
Check @config/initializers/ckeditor.rb@ for more configuration options
|
37
|
-
|
38
|
-
h3. Rails 2.x
|
39
|
-
|
40
|
-
@./script/plugin install git://github.com/galetahub/rails-ckeditor.git@
|
41
|
-
|
42
|
-
@rake ckeditor:install@
|
43
|
-
|
44
|
-
@rake ckeditor:config@
|
45
|
-
|
46
|
-
Last rake generated file config/ckeditor.yml:
|
47
|
-
|
48
|
-
For attachment_fu: @swf_file_post_name: "uploaded_data"@
|
49
|
-
|
50
|
-
h2. Usage
|
51
|
-
|
52
|
-
Basically include this in the page you wish to use the editor in
|
53
|
-
<pre><code>
|
54
|
-
<%= javascript_include_tag :ckeditor %>
|
55
|
-
</code></pre>
|
56
|
-
|
57
|
-
Then instead of the normal textarea helper from Rails use this one
|
58
|
-
<pre><code>
|
59
|
-
<%= ckeditor_textarea("object", "field", :width => '100%', :height => '200px') %>
|
60
|
-
</code></pre>
|
61
|
-
|
62
|
-
FormBuilder helper for more usefully
|
63
|
-
|
64
|
-
<pre><code>
|
65
|
-
<%= form_for :page, :url => pages_path do |form| -%>
|
66
|
-
...
|
67
|
-
<%= form.cktext_area :notes, :toolbar=>'Full', :width=>'400px', :heigth=>'200px' %>
|
68
|
-
...
|
69
|
-
<%= form.cktext_area :content, :swf_params=>{:assetable_type=>'User', :assetable_id=>current_user.id} %>
|
70
|
-
...
|
71
|
-
<% end -%>
|
72
|
-
</code></pre>
|
73
|
-
|
74
|
-
h3. Support options
|
75
|
-
<pre><code>
|
76
|
-
:cols # Textarea cols
|
77
|
-
:rows # Textarea rows
|
78
|
-
:width # Editor width
|
79
|
-
:height # Editor height
|
80
|
-
:class # Textarea css class name
|
81
|
-
:toolbar # Toolbar name
|
82
|
-
:skin # Editor skin
|
83
|
-
:language # Editor language
|
84
|
-
:swf_params # SWFUpload additional params
|
85
|
-
</code></pre>
|
86
|
-
|
87
|
-
Check @public/javascripts/ckeditor/config.js@ for config default options.
|
88
|
-
Modify @public/javascripts/ckeditor/contents.css@ - this stylesheet use editor
|
89
|
-
|
90
|
-
h3. AJAX
|
91
|
-
|
92
|
-
To use a remote form you need to do something like this
|
93
|
-
<pre><code>
|
94
|
-
<%= form_remote_tag :url => @options.merge(:controller => @scaffold_controller),
|
95
|
-
:before => Ckeditor_before_js('note', 'text') %>
|
96
|
-
|
97
|
-
<%= ckeditor_textarea( "note", "text", :ajax => true ) %>
|
98
|
-
|
99
|
-
<%= end_form_tag %>
|
100
|
-
</code></pre>
|
101
|
-
|
102
|
-
If you forget to put in the :before it won't work, you can also use the Ckeditor_form_remote_tag described below
|
103
|
-
|
104
|
-
h3. Multiple Editors in a form
|
105
|
-
|
106
|
-
To create a form using multiple editors use the Ckeditor_form_remote_tag helper and pass the :editors option. This takes an hash of model symbol keys with each having
|
107
|
-
an array as its value. The array should contain the list of fields that will have editors attached to them.
|
108
|
-
<pre><code>
|
109
|
-
<%= ckeditor_form_remote_tag :url => @options.merge(:controller => @scaffold_controller),
|
110
|
-
:editors => { :multinote => ['text1', 'text2'] } %>
|
111
|
-
|
112
|
-
<%= ckeditor_textarea( "multinote", "text1", :ajax => true ) %>
|
113
|
-
<%= ckeditor_textarea( "multinote", "text2", :ajax => true ) %>
|
114
|
-
|
115
|
-
<%= end_form_tag %>
|
116
|
-
</code></pre>
|
117
|
-
|
118
|
-
h3. File uploads
|
119
|
-
|
120
|
-
We recommend using a paperclip plugin for file storage and processing images. Controller @../rails-ckeditor/app/controllers/ckeditor_controller.rb@ has actions
|
121
|
-
for displaying and uploading files. It uses classes Picture and AttachmentFile, who are descendants of the Asset class. So, your project must have these classes.
|
122
|
-
|
123
|
-
"http://github.com/thoughtbot/paperclip":http://github.com/thoughtbot/paperclip
|
124
|
-
|
125
|
-
For S3 storage look at @../rails-ckeditor/examples/s3@
|
126
|
-
|
127
|
-
For paperclip:
|
128
|
-
ActiveRecord model Asset (asset.rb):
|
129
|
-
<pre><code>
|
130
|
-
class Asset < ActiveRecord::Base
|
131
|
-
belongs_to :user
|
132
|
-
belongs_to :assetable, :polymorphic => true
|
133
|
-
|
134
|
-
def url(*args)
|
135
|
-
data.url(*args)
|
136
|
-
end
|
137
|
-
alias :public_filename :url
|
138
|
-
|
139
|
-
def filename
|
140
|
-
data_file_name
|
141
|
-
end
|
142
|
-
|
143
|
-
def content_type
|
144
|
-
data_content_type
|
145
|
-
end
|
146
|
-
|
147
|
-
def size
|
148
|
-
data_file_size
|
149
|
-
end
|
150
|
-
|
151
|
-
def path
|
152
|
-
data.path
|
153
|
-
end
|
154
|
-
|
155
|
-
def styles
|
156
|
-
data.styles
|
157
|
-
end
|
158
|
-
|
159
|
-
def format_created_at
|
160
|
-
I18n.l(self.created_at, :format=>"%d.%m.%Y %H:%M")
|
161
|
-
end
|
162
|
-
|
163
|
-
def to_xml(options = {})
|
164
|
-
xml = options[:builder] ||= Builder::XmlMarkup.new(:indent => options[:indent])
|
165
|
-
|
166
|
-
xml.tag!(self.type.to_s.downcase) do
|
167
|
-
xml.filename{ xml.cdata!(self.filename) }
|
168
|
-
xml.size self.size
|
169
|
-
xml.path{ xml.cdata!(self.url) }
|
170
|
-
|
171
|
-
xml.styles do
|
172
|
-
self.styles.each do |style|
|
173
|
-
xml.tag!(style.first, self.url(style.first))
|
174
|
-
end
|
175
|
-
end unless self.styles.empty?
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|
179
|
-
</pre></code>
|
180
|
-
|
181
|
-
ActiveRecord model AttachmentFile (attachment_file.rb):
|
182
|
-
<pre><code>
|
183
|
-
class AttachmentFile < Asset
|
184
|
-
has_attached_file :data,
|
185
|
-
:url => "/assets/attachments/:id/:filename",
|
186
|
-
:path => ":rails_root/public/assets/attachments/:id/:filename"
|
187
|
-
|
188
|
-
validates_attachment_size :data, :less_than => 10.megabytes
|
189
|
-
end
|
190
|
-
</pre></code>
|
191
|
-
|
192
|
-
ActiveRecord model Picture (picture.rb):
|
193
|
-
<pre><code>
|
194
|
-
class Picture < Asset
|
195
|
-
has_attached_file :data,
|
196
|
-
:url => "/assets/pictures/:id/:style_:basename.:extension",
|
197
|
-
:path => ":rails_root/public/assets/pictures/:id/:style_:basename.:extension",
|
198
|
-
:styles => { :content => '575>', :thumb => '100x100' }
|
199
|
-
|
200
|
-
validates_attachment_size :data, :less_than => 2.megabytes
|
201
|
-
|
202
|
-
def url_content
|
203
|
-
url(:content)
|
204
|
-
end
|
205
|
-
|
206
|
-
def url_thumb
|
207
|
-
url(:thumb)
|
208
|
-
end
|
209
|
-
|
210
|
-
def to_json(options = {})
|
211
|
-
options[:methods] ||= []
|
212
|
-
options[:methods] << :url_content
|
213
|
-
options[:methods] << :url_thumb
|
214
|
-
super options
|
215
|
-
end
|
216
|
-
end
|
217
|
-
</code></pre>
|
218
|
-
|
219
|
-
More info in @../rails-ckeditor/examples/models@.
|
220
|
-
Do not forget about migration @../rails-ckeditor/examples/migrations@.
|
221
|
-
|
222
|
-
h2. TODOs
|
223
|
-
|
224
|
-
1. Add support for choose filemanager storage
|
225
|
-
2. More integration upload system
|
data/TODO
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
<div class="FCKThumb">
|
2
|
-
<table border="0" cellpadding="0" cellspacing="0" height="100" width="100">
|
3
|
-
<tbody>
|
4
|
-
<tr>
|
5
|
-
<td align="center" valign="middle">
|
6
|
-
<%= file_image_tag(file.filename, file.url) %>
|
7
|
-
</td>
|
8
|
-
</tr>
|
9
|
-
</tbody>
|
10
|
-
</table>
|
11
|
-
|
12
|
-
<div class="FCKFileName"><%= file.filename %></div>
|
13
|
-
<div class="FCKFileDate"><%= file.format_created_at %></div>
|
14
|
-
<div class="FCKFileSize"><%= number_to_human_size(file.size, :precision => 2) %></div>
|
15
|
-
</div>
|
@@ -1,15 +0,0 @@
|
|
1
|
-
<div class="FCKThumb">
|
2
|
-
<table border="0" cellpadding="0" cellspacing="0" height="100" width="100">
|
3
|
-
<tbody>
|
4
|
-
<tr>
|
5
|
-
<td align="center" valign="middle">
|
6
|
-
<%= image_tag(image.url(:thumb), :alt=>image.url(:content), :title=>image.filename, :onerror=>"this.src='/javascripts/ckeditor/images/ckfnothumb.gif'", :class=>'image' ) %>
|
7
|
-
</td>
|
8
|
-
</tr>
|
9
|
-
</tbody>
|
10
|
-
</table>
|
11
|
-
|
12
|
-
<div class="FCKFileName"><%= image.filename %></div>
|
13
|
-
<div class="FCKFileDate"><%= image.format_created_at %></div>
|
14
|
-
<div class="FCKFileSize"><%= number_to_human_size(image.size, :precision => 2) %></div>
|
15
|
-
</div>
|
@@ -1,178 +0,0 @@
|
|
1
|
-
module Ckeditor
|
2
|
-
class CkeditorFileStorage
|
3
|
-
UPLOAD_FOLDER = "/uploads"
|
4
|
-
UPLOAD_ROOT = RAILS_ROOT + "/public" + UPLOAD_FOLDER
|
5
|
-
|
6
|
-
MIME_TYPES = [
|
7
|
-
"image/jpg",
|
8
|
-
"image/jpeg",
|
9
|
-
"image/pjpeg",
|
10
|
-
"image/gif",
|
11
|
-
"image/png",
|
12
|
-
"application/x-shockwave-flash"
|
13
|
-
]
|
14
|
-
|
15
|
-
def get_folders_and_files(include_files = true)
|
16
|
-
@folders = Array.new
|
17
|
-
@files = {}
|
18
|
-
begin
|
19
|
-
@ck_url = upload_directory_path
|
20
|
-
@current_folder = current_directory_path
|
21
|
-
Dir.entries(@current_folder).each do |entry|
|
22
|
-
next if entry =~ /^\./
|
23
|
-
path = @current_folder + entry
|
24
|
-
@folders.push entry if FileTest.directory?(path)
|
25
|
-
@files[entry] = (File.size(path) / 1024) if (include_files and FileTest.file?(path))
|
26
|
-
end
|
27
|
-
rescue => e
|
28
|
-
@errorNumber = 110 if @errorNumber.nil?
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def create_folder
|
33
|
-
begin
|
34
|
-
@ck_url = current_directory_path
|
35
|
-
path = @ck_url + params[:newFolderName]
|
36
|
-
if !(File.stat(@ck_url).writable?)
|
37
|
-
@errorNumber = 103
|
38
|
-
elsif params[:newFolderName] !~ /[\w\d\s]+/
|
39
|
-
@errorNumber = 102
|
40
|
-
elsif FileTest.exists?(path)
|
41
|
-
@errorNumber = 101
|
42
|
-
else
|
43
|
-
Dir.mkdir(path,0775)
|
44
|
-
@errorNumber = 0
|
45
|
-
end
|
46
|
-
rescue => e
|
47
|
-
@errorNumber = 110 if @errorNumber.nil?
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def upload_file
|
52
|
-
begin
|
53
|
-
load_file_from_params
|
54
|
-
copy_tmp_file(@new_file) if mime_types_ok(@ftype)
|
55
|
-
rescue => e
|
56
|
-
@errorNumber = 110 if @errorNumber.nil?
|
57
|
-
end
|
58
|
-
|
59
|
-
render :text => %Q'
|
60
|
-
<script>
|
61
|
-
window.parent.OnUploadCompleted(#{@errorNumber}, "#{uploaded_file_path}");
|
62
|
-
</script>'
|
63
|
-
end
|
64
|
-
|
65
|
-
def upload
|
66
|
-
self.upload_file
|
67
|
-
end
|
68
|
-
|
69
|
-
#################################################################################
|
70
|
-
#
|
71
|
-
private
|
72
|
-
|
73
|
-
def load_file_from_params
|
74
|
-
@new_file = check_file(params[:newFile])
|
75
|
-
@ck_url = upload_directory_path
|
76
|
-
@ftype = @new_file.content_type.strip
|
77
|
-
log_upload
|
78
|
-
end
|
79
|
-
|
80
|
-
##############################################################################
|
81
|
-
# Chek if mime type is included in the MIME_TYPES
|
82
|
-
#
|
83
|
-
def mime_types_ok(ftype)
|
84
|
-
mime_type_ok = MIME_TYPES.include?(ftype) ? true : false
|
85
|
-
if mime_type_ok
|
86
|
-
@errorNumber = 0
|
87
|
-
else
|
88
|
-
@errorNumber = 202
|
89
|
-
raise_mime_type_and_show_msg(ftype)
|
90
|
-
end
|
91
|
-
mime_type_ok
|
92
|
-
end
|
93
|
-
|
94
|
-
##############################################################################
|
95
|
-
# Raise and exception, log the msg error and show msg
|
96
|
-
#
|
97
|
-
def raise_mime_type_and_show_msg(ftype)
|
98
|
-
msg = "#{ftype} is invalid MIME type"
|
99
|
-
puts msg;
|
100
|
-
raise msg;
|
101
|
-
log msg
|
102
|
-
end
|
103
|
-
|
104
|
-
##############################################################################
|
105
|
-
# Copy tmp file to current_directory_path/tmp_file.original_filename
|
106
|
-
#
|
107
|
-
def copy_tmp_file(tmp_file)
|
108
|
-
path = current_directory_path + "/" + tmp_file.original_filename
|
109
|
-
File.open(path, "wb", 0664) do |fp|
|
110
|
-
FileUtils.copy_stream(tmp_file, fp)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
##############################################################################
|
115
|
-
# Puts a messgae info in the current log, only if RAILS_ENV is 'development'
|
116
|
-
#
|
117
|
-
def log(str)
|
118
|
-
RAILS_DEFAULT_LOGGER.info str if RAILS_ENV == 'development'
|
119
|
-
end
|
120
|
-
|
121
|
-
##############################################################################
|
122
|
-
# Puts some data in the current log
|
123
|
-
#
|
124
|
-
def log_upload
|
125
|
-
log "CKEDITOR - #{params[:newFile]}"
|
126
|
-
log "CKEDITOR - UPLOAD_FOLDER: #{UPLOAD_FOLDER}"
|
127
|
-
log "CKEDITOR - #{File.expand_path(RAILS_ROOT)}/public#{UPLOAD_FOLDER}/" +
|
128
|
-
"#{@new_file.original_filename}"
|
129
|
-
end
|
130
|
-
|
131
|
-
##############################################################################
|
132
|
-
# Returns the filesystem folder with the current folder
|
133
|
-
#
|
134
|
-
def current_directory_path
|
135
|
-
base_dir = "#{UPLOAD_ROOT}/#{UPLOAD_FOLDER}/#{params[:type]}"
|
136
|
-
Dir.mkdir(base_dir,0775) unless File.exists?(base_dir)
|
137
|
-
check_path("#{base_dir}#{params[:currentFolder]}")
|
138
|
-
end
|
139
|
-
|
140
|
-
##############################################################################
|
141
|
-
# Returns the upload url folder with the current folder
|
142
|
-
#
|
143
|
-
def upload_directory_path
|
144
|
-
url_root = ActionController::Base.relative_url_root.to_s
|
145
|
-
uploaded = url_root + "#{UPLOAD_FOLDER}/#{params[:Type]}"
|
146
|
-
"#{uploaded}#{params[:currentFolder]}"
|
147
|
-
end
|
148
|
-
|
149
|
-
##############################################################################
|
150
|
-
# Current uploaded file path
|
151
|
-
#
|
152
|
-
def uploaded_file_path
|
153
|
-
"#{upload_directory_path}/#{@new_file.original_filename}"
|
154
|
-
end
|
155
|
-
|
156
|
-
##############################################################################
|
157
|
-
# check that the file is a tempfile object
|
158
|
-
#
|
159
|
-
def check_file(file)
|
160
|
-
log "CKEDITOR ---- CLASS OF UPLOAD OBJECT: #{file.class}"
|
161
|
-
|
162
|
-
unless "#{file.class}" == "Tempfile" || "StringIO"
|
163
|
-
@errorNumber = 403
|
164
|
-
throw Exception.new
|
165
|
-
end
|
166
|
-
file
|
167
|
-
end
|
168
|
-
|
169
|
-
def check_path(path)
|
170
|
-
exp_path = File.expand_path path
|
171
|
-
if exp_path !~ %r[^#{File.expand_path(UPLOAD_ROOT)}]
|
172
|
-
@errorNumber = 403
|
173
|
-
throw Exception.new
|
174
|
-
end
|
175
|
-
path
|
176
|
-
end
|
177
|
-
end
|
178
|
-
end
|