tinymce-rails 4.6.7 → 4.7.0

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 (64) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/source/tinymce/tinymce.js +29238 -42942
  3. data/lib/tinymce/rails/asset_installer.rb +9 -9
  4. data/lib/tinymce/rails/asset_installer/compile.rb +6 -6
  5. data/lib/tinymce/rails/asset_installer/copy.rb +8 -8
  6. data/lib/tinymce/rails/asset_manifest.rb +25 -25
  7. data/lib/tinymce/rails/configuration.rb +29 -15
  8. data/lib/tinymce/rails/configuration_file.rb +11 -11
  9. data/lib/tinymce/rails/version.rb +2 -2
  10. data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +1 -1
  11. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +1 -1
  12. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +1 -1
  13. data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +1 -1
  14. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +1 -1
  15. data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +1 -1
  16. data/vendor/assets/javascripts/tinymce/plugins/bbcode/plugin.js +1 -1
  17. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +1 -1
  18. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.js +1 -1
  19. data/vendor/assets/javascripts/tinymce/plugins/codesample/plugin.js +1 -1
  20. data/vendor/assets/javascripts/tinymce/plugins/colorpicker/plugin.js +1 -1
  21. data/vendor/assets/javascripts/tinymce/plugins/contextmenu/plugin.js +1 -1
  22. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +1 -1
  23. data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +1 -1
  24. data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +1 -1
  25. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +1 -1
  26. data/vendor/assets/javascripts/tinymce/plugins/help/plugin.js +1 -1
  27. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.js +1 -1
  28. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +1 -1
  29. data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +2 -2
  30. data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +1 -1
  31. data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +1 -1
  32. data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +1 -1
  33. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +1 -1
  34. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +1 -1
  35. data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +1 -1
  36. data/vendor/assets/javascripts/tinymce/plugins/nonbreaking/plugin.js +1 -1
  37. data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +1 -1
  38. data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +1 -1
  39. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +1 -1
  40. data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +1 -1
  41. data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +1 -1
  42. data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +1 -1
  43. data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +1 -1
  44. data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +1 -1
  45. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.js +1 -1
  46. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +2 -2
  47. data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +1 -1
  48. data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +1 -1
  49. data/vendor/assets/javascripts/tinymce/plugins/textpattern/plugin.js +1 -1
  50. data/vendor/assets/javascripts/tinymce/plugins/toc/plugin.js +1 -1
  51. data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +1 -1
  52. data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +1 -1
  53. data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +1 -1
  54. data/vendor/assets/javascripts/tinymce/skins/lightgray/content.inline.min.css +1 -1
  55. data/vendor/assets/javascripts/tinymce/skins/lightgray/content.min.css +1 -1
  56. data/vendor/assets/javascripts/tinymce/skins/lightgray/content.mobile.min.css +1 -0
  57. data/vendor/assets/javascripts/tinymce/skins/lightgray/fonts/tinymce-mobile.woff +0 -0
  58. data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.min.css +1 -1
  59. data/vendor/assets/javascripts/tinymce/skins/lightgray/skin.mobile.min.css +2 -0
  60. data/vendor/assets/javascripts/tinymce/themes/inlite/theme.js +5 -1
  61. data/vendor/assets/javascripts/tinymce/themes/mobile/theme.js +8 -0
  62. data/vendor/assets/javascripts/tinymce/themes/modern/theme.js +5 -1
  63. data/vendor/assets/javascripts/tinymce/tinymce.js +13 -17
  64. metadata +6 -2
@@ -9,20 +9,20 @@ module TinyMCE
9
9
  class AssetInstaller
10
10
  attr_reader :assets, :target, :strategy
11
11
  attr_accessor :logger
12
-
12
+
13
13
  def initialize(assets, target, manifest_path)
14
14
  @assets = assets
15
15
  @target = target
16
16
  @manifest_path = manifest_path || target
17
-
17
+
18
18
  @logger = Logger.new($stderr)
19
19
  @logger.level = Logger::INFO
20
20
  end
21
-
21
+
22
22
  def install
23
23
  (strategy || Copy).new(self).call
24
24
  end
25
-
25
+
26
26
  def log_level
27
27
  @logger.level
28
28
  end
@@ -34,7 +34,7 @@ module TinyMCE
34
34
  @logger.level = Logger.const_get(level.to_s.upcase)
35
35
  end
36
36
  end
37
-
37
+
38
38
  def strategy=(strategy)
39
39
  if strategy.is_a?(Class)
40
40
  @strategy = strategy
@@ -42,20 +42,20 @@ module TinyMCE
42
42
  @strategy = self.class.const_get(strategy.to_s.classify)
43
43
  end
44
44
  end
45
-
45
+
46
46
  def manifest
47
47
  @manifest ||= AssetManifest.load(@manifest_path)
48
48
  end
49
-
49
+
50
50
  def logical_path(file)
51
51
  file.relative_path_from(@assets.parent).to_s
52
52
  end
53
-
53
+
54
54
  def with_asset(src, dest)
55
55
  if src != dest
56
56
  src = File.join(@target, src)
57
57
  dest = File.join(@target, dest)
58
-
58
+
59
59
  yield src, dest if File.exists?(src)
60
60
  end
61
61
  end
@@ -3,15 +3,15 @@ module TinyMCE
3
3
  class AssetInstaller
4
4
  class Compile
5
5
  delegate :target, :manifest, :logger, :logical_path, :with_asset, :to => :@installer
6
-
6
+
7
7
  def initialize(installer)
8
8
  @installer = installer
9
9
  end
10
-
10
+
11
11
  def call
12
12
  symlink_assets
13
13
  end
14
-
14
+
15
15
  private
16
16
  def symlink_assets
17
17
  manifest.each(/^tinymce\//) do |asset|
@@ -20,17 +20,17 @@ module TinyMCE
20
20
  end
21
21
  end
22
22
  end
23
-
23
+
24
24
  def symlink_asset(src, dest)
25
25
  with_asset(src, dest) do |src, dest|
26
26
  create_symlink(src, dest)
27
27
  create_symlink("#{src}.gz", "#{dest}.gz") if File.exists?("#{src}.gz")
28
28
  end
29
29
  end
30
-
30
+
31
31
  def create_symlink(src, dest)
32
32
  target = File.basename(src)
33
-
33
+
34
34
  unless File.exists?(dest) && File.symlink?(dest) && File.readlink(dest) == target
35
35
  logger.info "Creating symlink #{dest}"
36
36
  FileUtils.ln_s(target, dest, :force => true)
@@ -3,19 +3,19 @@ module TinyMCE
3
3
  class AssetInstaller
4
4
  class Copy
5
5
  delegate :assets, :target, :manifest, :logger, :logical_path, :with_asset, :to => :@installer
6
-
6
+
7
7
  def initialize(installer)
8
8
  @installer = installer
9
9
  end
10
-
10
+
11
11
  def call
12
12
  cleanup_assets
13
13
  copy_assets
14
14
  append_to_manifest
15
-
15
+
16
16
  manifest.write
17
17
  end
18
-
18
+
19
19
  private
20
20
  def cleanup_assets
21
21
  manifest.each(/^tinymce\//) do |asset|
@@ -24,25 +24,25 @@ module TinyMCE
24
24
  end
25
25
  end
26
26
  end
27
-
27
+
28
28
  def copy_assets
29
29
  logger.info "Copying assets (preserving modes) to #{File.join(target, "tinymce")}"
30
30
  FileUtils.cp_r(assets, target, :preserve => true)
31
31
  end
32
-
32
+
33
33
  def append_to_manifest
34
34
  asset_files.each do |file|
35
35
  manifest.append(logical_path(file), file)
36
36
  end
37
37
  end
38
-
38
+
39
39
  def move_asset(src, dest)
40
40
  with_asset(src, dest) do |src, dest|
41
41
  logger.info "Removing digest from #{src}"
42
42
  FileUtils.mv(src, dest, :force => true)
43
43
  end
44
44
  end
45
-
45
+
46
46
  def asset_files
47
47
  Pathname.glob("#{assets}/**/*").select(&:file?)
48
48
  end
@@ -9,7 +9,7 @@ module TinyMCE
9
9
  YamlManifest.try(manifest_path) ||
10
10
  NullManifest.new
11
11
  end
12
-
12
+
13
13
  def each(pattern)
14
14
  assets.each_key do |asset|
15
15
  if asset =~ pattern && !index_asset?(asset)
@@ -17,77 +17,77 @@ module TinyMCE
17
17
  end
18
18
  end
19
19
  end
20
-
20
+
21
21
  def asset_path(logical_path)
22
22
  if digested = assets[logical_path]
23
23
  yield digested, logical_path if block_given?
24
24
  end
25
25
  end
26
-
26
+
27
27
  def to_s
28
28
  dump
29
29
  end
30
-
30
+
31
31
  protected
32
32
  def index_asset?(asset)
33
33
  asset =~ /\/index[^\/]*\.\w+$/
34
34
  end
35
35
  end
36
-
36
+
37
37
  class YamlManifest < AssetManifest
38
38
  def self.try(manifest_path)
39
39
  yaml_file = File.join(manifest_path, "manifest.yml")
40
40
  new(yaml_file) if File.exists?(yaml_file)
41
41
  end
42
-
42
+
43
43
  def initialize(file)
44
44
  @file = file
45
45
  @manifest = YAML.load_file(file)
46
46
  end
47
-
47
+
48
48
  def append(logical_path, file)
49
49
  assets[logical_path] = logical_path
50
50
  end
51
-
51
+
52
52
  def remove(logical_path)
53
53
  assets.delete(logical_path)
54
54
  end
55
-
55
+
56
56
  def remove_digest(logical_path)
57
57
  asset_path(logical_path) do |digested, logical_path|
58
58
  assets[logical_path] = logical_path
59
-
59
+
60
60
  yield digested, logical_path if block_given?
61
61
  end
62
62
  end
63
-
63
+
64
64
  def assets
65
65
  @manifest
66
66
  end
67
-
67
+
68
68
  def dump(io=nil)
69
69
  YAML.dump(@manifest, io)
70
70
  end
71
-
71
+
72
72
  def write
73
73
  File.open(@file, "wb") { |f| dump(f) }
74
74
  end
75
75
  end
76
-
76
+
77
77
  class JsonManifest < AssetManifest
78
78
  def self.try(manifest_path, pattern)
79
79
  paths = Dir[File.join(manifest_path, pattern)]
80
80
  new(paths.first) if paths.any?
81
81
  end
82
-
82
+
83
83
  def initialize(file)
84
84
  @file = file
85
85
  @manifest = JSON.parse(File.read(file))
86
86
  end
87
-
87
+
88
88
  def append(logical_path, file)
89
89
  stat = File.stat(file)
90
-
90
+
91
91
  assets[logical_path] = logical_path
92
92
  files[logical_path] = {
93
93
  "logical_path" => logical_path,
@@ -96,39 +96,39 @@ module TinyMCE
96
96
  "digest" => nil
97
97
  }
98
98
  end
99
-
99
+
100
100
  def remove(logical_path)
101
101
  if digested = assets.delete(logical_path)
102
102
  files.delete(digested)
103
103
  end
104
104
  end
105
-
105
+
106
106
  def remove_digest(logical_path)
107
107
  asset_path(logical_path) do |digested, logical_path|
108
108
  assets[logical_path] = logical_path
109
109
  files[logical_path] = files.delete(digested).tap { |f| f["digest"] = nil }
110
-
110
+
111
111
  yield digested, logical_path if block_given?
112
112
  end
113
113
  end
114
-
114
+
115
115
  def assets
116
116
  @manifest["assets"]
117
117
  end
118
-
118
+
119
119
  def files
120
120
  @manifest["files"]
121
121
  end
122
-
122
+
123
123
  def dump
124
124
  JSON.generate(@manifest)
125
125
  end
126
-
126
+
127
127
  def write
128
128
  File.open(@file, "wb") { |f| f.write(dump) }
129
129
  end
130
130
  end
131
-
131
+
132
132
  class NullManifest < AssetManifest
133
133
  def append(*); end
134
134
  def remove(*); end
@@ -7,17 +7,17 @@ module TinyMCE::Rails
7
7
  self
8
8
  end
9
9
  end
10
-
10
+
11
11
  def self.defaults
12
12
  {
13
13
  "selector" => "textarea.tinymce"
14
14
  }
15
15
  end
16
-
16
+
17
17
  COMMA = ",".freeze
18
18
  SPACE = " ".freeze
19
19
  SEMICOLON = ";".freeze
20
-
20
+
21
21
  OPTION_SEPARATORS = {
22
22
  "plugins" => COMMA,
23
23
  "custom_elements" => COMMA,
@@ -39,22 +39,32 @@ module TinyMCE::Rails
39
39
  "paste_retain_style_properties" => SPACE,
40
40
  "spellchecker_languages" => COMMA
41
41
  }
42
-
42
+
43
+ OPTION_TRANSFORMERS = {
44
+ # Check for files provided in the content_css option to replace them with their actual path.
45
+ # If no corresponding stylesheet is found for a file, it will remain unchanged.
46
+ "content_css" => ->(value) {
47
+ value.split(OPTION_SEPARATORS["content_css"]).map do |file|
48
+ ActionController::Base.helpers.stylesheet_path(file.strip) || file
49
+ end.join(OPTION_SEPARATORS["content_css"])
50
+ }
51
+ }
52
+
43
53
  attr_reader :options
44
-
54
+
45
55
  def initialize(options)
46
56
  @options = options
47
57
  end
48
-
58
+
49
59
  def self.new_with_defaults(options={})
50
60
  config = new(defaults)
51
61
  config = config.merge(options) if options
52
62
  config
53
63
  end
54
-
64
+
55
65
  def options_for_tinymce
56
66
  result = {}
57
-
67
+
58
68
  options.each do |key, value|
59
69
  if OPTION_SEPARATORS[key] && value.is_a?(Array)
60
70
  result[key] = value.join(OPTION_SEPARATORS[key])
@@ -63,11 +73,15 @@ module TinyMCE::Rails
63
73
  else
64
74
  result[key] = value
65
75
  end
76
+
77
+ if OPTION_TRANSFORMERS[key]
78
+ result[key] = OPTION_TRANSFORMERS[key].call result[key]
79
+ end
66
80
  end
67
-
81
+
68
82
  result
69
83
  end
70
-
84
+
71
85
  def to_javascript
72
86
  pairs = options_for_tinymce.inject([]) do |result, (k, v)|
73
87
  if v.respond_to?(:to_javascript)
@@ -75,24 +89,24 @@ module TinyMCE::Rails
75
89
  elsif v.respond_to?(:to_json)
76
90
  v = v.to_json
77
91
  end
78
-
92
+
79
93
  result << [k, v].join(": ")
80
94
  end
81
-
95
+
82
96
  "{\n #{pairs.join(",\n ")}\n}"
83
97
  end
84
-
98
+
85
99
  def merge(options)
86
100
  self.class.new(self.options.merge(options))
87
101
  end
88
102
  end
89
-
103
+
90
104
  class MultipleConfiguration < ActiveSupport::HashWithIndifferentAccess
91
105
  def initialize(configurations={})
92
106
  configurations = configurations.each_with_object({}) { |(name, options), h|
93
107
  h[name] = Configuration.new_with_defaults(options)
94
108
  }
95
-
109
+
96
110
  super(configurations)
97
111
  end
98
112
  end
@@ -1,47 +1,47 @@
1
1
  module TinyMCE::Rails
2
2
  class ConfigurationFile
3
3
  attr_reader :path
4
-
4
+
5
5
  def initialize(path)
6
6
  @path = path
7
7
  end
8
-
8
+
9
9
  def configuration
10
10
  @configuration = load_configuration if reload?
11
11
  @configuration
12
12
  end
13
-
13
+
14
14
  def reload?
15
15
  @configuration.nil? || (reloadable? && changed?)
16
16
  end
17
-
17
+
18
18
  def changed?
19
19
  @last_loaded != last_updated
20
20
  end
21
-
21
+
22
22
  private
23
23
  def reloadable?
24
24
  !::Rails.application.config.cache_classes
25
25
  end
26
-
26
+
27
27
  def last_updated
28
28
  File.exists?(path) && File.mtime(path)
29
29
  end
30
-
30
+
31
31
  def load_configuration
32
32
  @last_loaded = last_updated
33
-
33
+
34
34
  return Configuration.new_with_defaults if !File.exists?(path)
35
-
35
+
36
36
  options = load_yaml(path)
37
-
37
+
38
38
  if options && options.has_key?('default')
39
39
  MultipleConfiguration.new(options)
40
40
  else
41
41
  Configuration.new_with_defaults(options)
42
42
  end
43
43
  end
44
-
44
+
45
45
  def load_yaml(path)
46
46
  YAML::load(ERB.new(IO.read(path)).result)
47
47
  end