tinymce-rails-webmely 5.1.4

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 (172) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +19 -0
  3. data/README.md +181 -0
  4. data/Rakefile +55 -0
  5. data/app/assets/javascripts/tinymce-jquery.js +2 -0
  6. data/app/assets/javascripts/tinymce.js +3 -0
  7. data/app/assets/javascripts/tinymce/preinit.js.erb +4 -0
  8. data/app/assets/javascripts/tinymce/rails.js +51 -0
  9. data/app/assets/source/tinymce/tinymce.js +28251 -0
  10. data/lib/tasks/tinymce-assets.rake +16 -0
  11. data/lib/tinymce-rails.rb +1 -0
  12. data/lib/tinymce/rails.rb +27 -0
  13. data/lib/tinymce/rails/asset_installer.rb +64 -0
  14. data/lib/tinymce/rails/asset_installer/compile.rb +44 -0
  15. data/lib/tinymce/rails/asset_installer/copy.rb +54 -0
  16. data/lib/tinymce/rails/asset_installer/copy_no_preserve.rb +14 -0
  17. data/lib/tinymce/rails/asset_manifest.rb +141 -0
  18. data/lib/tinymce/rails/configuration.rb +157 -0
  19. data/lib/tinymce/rails/configuration_file.rb +49 -0
  20. data/lib/tinymce/rails/engine.rb +76 -0
  21. data/lib/tinymce/rails/environment.rb +23 -0
  22. data/lib/tinymce/rails/helper.rb +75 -0
  23. data/lib/tinymce/rails/version.rb +6 -0
  24. data/vendor/assets/images/fa-utube.svg +1 -0
  25. data/vendor/assets/javascripts/tinymce/jquery.tinymce.js +91 -0
  26. data/vendor/assets/javascripts/tinymce/langs/ar.js +178 -0
  27. data/vendor/assets/javascripts/tinymce/langs/az.js +177 -0
  28. data/vendor/assets/javascripts/tinymce/langs/be.js +177 -0
  29. data/vendor/assets/javascripts/tinymce/langs/bg_BG.js +177 -0
  30. data/vendor/assets/javascripts/tinymce/langs/bs.js +177 -0
  31. data/vendor/assets/javascripts/tinymce/langs/ca.js +177 -0
  32. data/vendor/assets/javascripts/tinymce/langs/cs.js +177 -0
  33. data/vendor/assets/javascripts/tinymce/langs/cy.js +177 -0
  34. data/vendor/assets/javascripts/tinymce/langs/da.js +177 -0
  35. data/vendor/assets/javascripts/tinymce/langs/de.js +177 -0
  36. data/vendor/assets/javascripts/tinymce/langs/de_AT.js +177 -0
  37. data/vendor/assets/javascripts/tinymce/langs/dv.js +177 -0
  38. data/vendor/assets/javascripts/tinymce/langs/el.js +177 -0
  39. data/vendor/assets/javascripts/tinymce/langs/en_CA.js +177 -0
  40. data/vendor/assets/javascripts/tinymce/langs/en_GB.js +177 -0
  41. data/vendor/assets/javascripts/tinymce/langs/es.js +177 -0
  42. data/vendor/assets/javascripts/tinymce/langs/et.js +177 -0
  43. data/vendor/assets/javascripts/tinymce/langs/eu.js +176 -0
  44. data/vendor/assets/javascripts/tinymce/langs/fa.js +178 -0
  45. data/vendor/assets/javascripts/tinymce/langs/fi.js +177 -0
  46. data/vendor/assets/javascripts/tinymce/langs/fo.js +156 -0
  47. data/vendor/assets/javascripts/tinymce/langs/fr_FR.js +177 -0
  48. data/vendor/assets/javascripts/tinymce/langs/gl.js +177 -0
  49. data/vendor/assets/javascripts/tinymce/langs/he_IL.js +178 -0
  50. data/vendor/assets/javascripts/tinymce/langs/hr.js +175 -0
  51. data/vendor/assets/javascripts/tinymce/langs/hu_HU.js +177 -0
  52. data/vendor/assets/javascripts/tinymce/langs/hy.js +177 -0
  53. data/vendor/assets/javascripts/tinymce/langs/id.js +71 -0
  54. data/vendor/assets/javascripts/tinymce/langs/is_IS.js +177 -0
  55. data/vendor/assets/javascripts/tinymce/langs/it.js +176 -0
  56. data/vendor/assets/javascripts/tinymce/langs/ja.js +174 -0
  57. data/vendor/assets/javascripts/tinymce/langs/ka_GE.js +172 -0
  58. data/vendor/assets/javascripts/tinymce/langs/kk.js +177 -0
  59. data/vendor/assets/javascripts/tinymce/langs/km_KH.js +177 -0
  60. data/vendor/assets/javascripts/tinymce/langs/ko_KR.js +175 -0
  61. data/vendor/assets/javascripts/tinymce/langs/lb.js +175 -0
  62. data/vendor/assets/javascripts/tinymce/langs/lt.js +83 -0
  63. data/vendor/assets/javascripts/tinymce/langs/lv.js +175 -0
  64. data/vendor/assets/javascripts/tinymce/langs/ml_IN.js +177 -0
  65. data/vendor/assets/javascripts/tinymce/langs/nb_NO.js +177 -0
  66. data/vendor/assets/javascripts/tinymce/langs/nl.js +177 -0
  67. data/vendor/assets/javascripts/tinymce/langs/pl.js +177 -0
  68. data/vendor/assets/javascripts/tinymce/langs/pt_BR.js +177 -0
  69. data/vendor/assets/javascripts/tinymce/langs/pt_PT.js +173 -0
  70. data/vendor/assets/javascripts/tinymce/langs/readme.md +3 -0
  71. data/vendor/assets/javascripts/tinymce/langs/ro.js +177 -0
  72. data/vendor/assets/javascripts/tinymce/langs/ru.js +177 -0
  73. data/vendor/assets/javascripts/tinymce/langs/si_LK.js +156 -0
  74. data/vendor/assets/javascripts/tinymce/langs/sk.js +177 -0
  75. data/vendor/assets/javascripts/tinymce/langs/sl_SI.js +177 -0
  76. data/vendor/assets/javascripts/tinymce/langs/sr.js +177 -0
  77. data/vendor/assets/javascripts/tinymce/langs/sv_SE.js +177 -0
  78. data/vendor/assets/javascripts/tinymce/langs/ta.js +177 -0
  79. data/vendor/assets/javascripts/tinymce/langs/ta_IN.js +177 -0
  80. data/vendor/assets/javascripts/tinymce/langs/tg.js +177 -0
  81. data/vendor/assets/javascripts/tinymce/langs/th_TH.js +177 -0
  82. data/vendor/assets/javascripts/tinymce/langs/tr_TR.js +177 -0
  83. data/vendor/assets/javascripts/tinymce/langs/ug.js +159 -0
  84. data/vendor/assets/javascripts/tinymce/langs/uk.js +177 -0
  85. data/vendor/assets/javascripts/tinymce/langs/uk_UA.js +177 -0
  86. data/vendor/assets/javascripts/tinymce/langs/vi.js +137 -0
  87. data/vendor/assets/javascripts/tinymce/langs/vi_VN.js +173 -0
  88. data/vendor/assets/javascripts/tinymce/langs/zh_CN.js +177 -0
  89. data/vendor/assets/javascripts/tinymce/langs/zh_TW.js +177 -0
  90. data/vendor/assets/javascripts/tinymce/license.txt +504 -0
  91. data/vendor/assets/javascripts/tinymce/plugins/advlist/plugin.js +9 -0
  92. data/vendor/assets/javascripts/tinymce/plugins/anchor/plugin.js +9 -0
  93. data/vendor/assets/javascripts/tinymce/plugins/autolink/plugin.js +9 -0
  94. data/vendor/assets/javascripts/tinymce/plugins/autoresize/plugin.js +9 -0
  95. data/vendor/assets/javascripts/tinymce/plugins/autosave/plugin.js +9 -0
  96. data/vendor/assets/javascripts/tinymce/plugins/bbcode/plugin.js +9 -0
  97. data/vendor/assets/javascripts/tinymce/plugins/charmap/plugin.js +9 -0
  98. data/vendor/assets/javascripts/tinymce/plugins/code/plugin.js +9 -0
  99. data/vendor/assets/javascripts/tinymce/plugins/codesample/plugin.js +9 -0
  100. data/vendor/assets/javascripts/tinymce/plugins/colorpicker/plugin.js +9 -0
  101. data/vendor/assets/javascripts/tinymce/plugins/contextmenu/plugin.js +9 -0
  102. data/vendor/assets/javascripts/tinymce/plugins/directionality/plugin.js +9 -0
  103. data/vendor/assets/javascripts/tinymce/plugins/emoticons/js/emojis.js +2 -0
  104. data/vendor/assets/javascripts/tinymce/plugins/emoticons/plugin.js +9 -0
  105. data/vendor/assets/javascripts/tinymce/plugins/fullpage/plugin.js +9 -0
  106. data/vendor/assets/javascripts/tinymce/plugins/fullscreen/plugin.js +9 -0
  107. data/vendor/assets/javascripts/tinymce/plugins/help/plugin.js +9 -0
  108. data/vendor/assets/javascripts/tinymce/plugins/hr/plugin.js +9 -0
  109. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.js +2453 -0
  110. data/vendor/assets/javascripts/tinymce/plugins/image/plugin.min.js +9 -0
  111. data/vendor/assets/javascripts/tinymce/plugins/image/styles.css +27 -0
  112. data/vendor/assets/javascripts/tinymce/plugins/imagetools/plugin.js +9 -0
  113. data/vendor/assets/javascripts/tinymce/plugins/importcss/plugin.js +9 -0
  114. data/vendor/assets/javascripts/tinymce/plugins/insertdatetime/plugin.js +9 -0
  115. data/vendor/assets/javascripts/tinymce/plugins/legacyoutput/plugin.js +9 -0
  116. data/vendor/assets/javascripts/tinymce/plugins/link/plugin.js +9 -0
  117. data/vendor/assets/javascripts/tinymce/plugins/lists/plugin.js +9 -0
  118. data/vendor/assets/javascripts/tinymce/plugins/media/plugin.js +9 -0
  119. data/vendor/assets/javascripts/tinymce/plugins/nonbreaking/plugin.js +9 -0
  120. data/vendor/assets/javascripts/tinymce/plugins/noneditable/plugin.js +9 -0
  121. data/vendor/assets/javascripts/tinymce/plugins/pagebreak/plugin.js +9 -0
  122. data/vendor/assets/javascripts/tinymce/plugins/paste/plugin.js +9 -0
  123. data/vendor/assets/javascripts/tinymce/plugins/preview/plugin.js +9 -0
  124. data/vendor/assets/javascripts/tinymce/plugins/print/plugin.js +9 -0
  125. data/vendor/assets/javascripts/tinymce/plugins/quickbars/plugin.js +9 -0
  126. data/vendor/assets/javascripts/tinymce/plugins/save/plugin.js +9 -0
  127. data/vendor/assets/javascripts/tinymce/plugins/searchreplace/plugin.js +9 -0
  128. data/vendor/assets/javascripts/tinymce/plugins/spellchecker/plugin.js +9 -0
  129. data/vendor/assets/javascripts/tinymce/plugins/tabfocus/plugin.js +9 -0
  130. data/vendor/assets/javascripts/tinymce/plugins/table/plugin.js +9 -0
  131. data/vendor/assets/javascripts/tinymce/plugins/template/plugin.js +9 -0
  132. data/vendor/assets/javascripts/tinymce/plugins/textcolor/plugin.js +9 -0
  133. data/vendor/assets/javascripts/tinymce/plugins/textpattern/plugin.js +9 -0
  134. data/vendor/assets/javascripts/tinymce/plugins/toc/plugin.js +9 -0
  135. data/vendor/assets/javascripts/tinymce/plugins/visualblocks/plugin.js +9 -0
  136. data/vendor/assets/javascripts/tinymce/plugins/visualchars/plugin.js +9 -0
  137. data/vendor/assets/javascripts/tinymce/plugins/wordcount/plugin.js +9 -0
  138. data/vendor/assets/javascripts/tinymce/plugins/yt-upload/plugin.js +722 -0
  139. data/vendor/assets/javascripts/tinymce/skins/content/dark/content.css +7 -0
  140. data/vendor/assets/javascripts/tinymce/skins/content/dark/content.min.css +7 -0
  141. data/vendor/assets/javascripts/tinymce/skins/content/default/content.css +7 -0
  142. data/vendor/assets/javascripts/tinymce/skins/content/default/content.min.css +7 -0
  143. data/vendor/assets/javascripts/tinymce/skins/content/document/content.css +7 -0
  144. data/vendor/assets/javascripts/tinymce/skins/content/document/content.min.css +7 -0
  145. data/vendor/assets/javascripts/tinymce/skins/content/writer/content.css +7 -0
  146. data/vendor/assets/javascripts/tinymce/skins/content/writer/content.min.css +7 -0
  147. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.css +7 -0
  148. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.css +7 -0
  149. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.inline.min.css +7 -0
  150. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.min.css +7 -0
  151. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.mobile.css +7 -0
  152. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/content.mobile.min.css +7 -0
  153. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/fonts/tinymce-mobile.woff +0 -0
  154. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.css +7 -0
  155. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.min.css +7 -0
  156. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.mobile.css +7 -0
  157. data/vendor/assets/javascripts/tinymce/skins/ui/oxide-dark/skin.mobile.min.css +7 -0
  158. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.css +7 -0
  159. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.css +7 -0
  160. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.inline.min.css +7 -0
  161. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.min.css +7 -0
  162. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.mobile.css +7 -0
  163. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/content.mobile.min.css +7 -0
  164. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/fonts/tinymce-mobile.woff +0 -0
  165. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.css +7 -0
  166. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.min.css +7 -0
  167. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.mobile.css +7 -0
  168. data/vendor/assets/javascripts/tinymce/skins/ui/oxide/skin.mobile.min.css +7 -0
  169. data/vendor/assets/javascripts/tinymce/themes/mobile/theme.js +9 -0
  170. data/vendor/assets/javascripts/tinymce/themes/silver/theme.js +9 -0
  171. data/vendor/assets/javascripts/tinymce/tinymce.js +9 -0
  172. metadata +227 -0
@@ -0,0 +1,16 @@
1
+ assets_task = Rake::Task.task_defined?('assets:precompile:primary') ? 'assets:precompile:primary' : 'assets:precompile'
2
+
3
+ Rake::Task[assets_task].enhance do
4
+ require "tinymce/rails/asset_installer"
5
+
6
+ assets = Pathname.new(File.expand_path(File.dirname(__FILE__) + "/../../vendor/assets/javascripts/tinymce"))
7
+
8
+ config = Rails.application.config
9
+ target = File.join(Rails.public_path, config.assets.prefix)
10
+ manifest = config.assets.manifest
11
+
12
+ installer = TinyMCE::Rails::AssetInstaller.new(assets, target, manifest)
13
+ installer.log_level = Logger::INFO
14
+ installer.strategy = config.tinymce.install
15
+ installer.install
16
+ end
@@ -0,0 +1 @@
1
+ require "tinymce/rails"
@@ -0,0 +1,27 @@
1
+ module TinyMCE
2
+ module Rails
3
+ require 'tinymce/rails/engine'
4
+ require 'tinymce/rails/version'
5
+ require "tinymce/rails/configuration"
6
+ require "tinymce/rails/configuration_file"
7
+ require "tinymce/rails/helper"
8
+ require "tinymce/rails/environment" if defined?(Sprockets::Rails::Environment)
9
+
10
+ def self.configuration
11
+ @configuration ||= ConfigurationFile.new(Engine.config_path)
12
+ @configuration.respond_to?(:configuration) ? @configuration.configuration : @configuration
13
+ end
14
+
15
+ def self.configuration=(configuration)
16
+ @configuration = configuration
17
+ end
18
+
19
+ def self.each_configuration(&block)
20
+ if configuration.is_a?(MultipleConfiguration)
21
+ configuration.each(&block)
22
+ else
23
+ yield :default, configuration
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,64 @@
1
+ require "tinymce/rails/asset_manifest"
2
+
3
+ require "tinymce/rails/asset_installer/copy"
4
+ require "tinymce/rails/asset_installer/copy_no_preserve"
5
+ require "tinymce/rails/asset_installer/compile"
6
+
7
+ module TinyMCE
8
+ module Rails
9
+ class AssetInstaller
10
+ attr_reader :assets, :target, :strategy
11
+ attr_accessor :logger
12
+
13
+ def initialize(assets, target, manifest_path)
14
+ @assets = assets
15
+ @target = target
16
+ @manifest_path = manifest_path || target
17
+
18
+ @logger = Logger.new($stderr)
19
+ @logger.level = Logger::INFO
20
+ end
21
+
22
+ def install
23
+ (strategy || Copy).new(self).call
24
+ end
25
+
26
+ def log_level
27
+ @logger.level
28
+ end
29
+
30
+ def log_level=(level)
31
+ if level.is_a?(Integer)
32
+ @logger.level = level
33
+ else
34
+ @logger.level = Logger.const_get(level.to_s.upcase)
35
+ end
36
+ end
37
+
38
+ def strategy=(strategy)
39
+ if strategy.is_a?(Class)
40
+ @strategy = strategy
41
+ else
42
+ @strategy = self.class.const_get(strategy.to_s.classify)
43
+ end
44
+ end
45
+
46
+ def manifest
47
+ @manifest ||= AssetManifest.load(@manifest_path)
48
+ end
49
+
50
+ def logical_path(file)
51
+ file.relative_path_from(@assets.parent).to_s
52
+ end
53
+
54
+ def with_asset(src, dest)
55
+ if src != dest
56
+ src = File.join(@target, src)
57
+ dest = File.join(@target, dest)
58
+
59
+ yield src, dest if File.exists?(src)
60
+ end
61
+ end
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,44 @@
1
+ module TinyMCE
2
+ module Rails
3
+ class AssetInstaller
4
+ class Compile
5
+ delegate :target, :manifest, :logger, :logical_path, :with_asset, :to => :@installer
6
+
7
+ def initialize(installer)
8
+ @installer = installer
9
+ end
10
+
11
+ def call
12
+ symlink_assets
13
+ end
14
+
15
+ private
16
+ def symlink_assets
17
+ manifest.each(/^tinymce\//) do |asset|
18
+ manifest.asset_path(asset) do |src, dest|
19
+ symlink_asset(src, dest)
20
+ end
21
+ end
22
+ end
23
+
24
+ def symlink_asset(src, dest)
25
+ with_asset(src, dest) do |src, dest|
26
+ create_symlink(src, dest)
27
+ create_symlink("#{src}.gz", "#{dest}.gz") if File.exists?("#{src}.gz")
28
+ end
29
+ end
30
+
31
+ def create_symlink(src, dest)
32
+ target = File.basename(src)
33
+
34
+ unless File.exists?(dest) && File.symlink?(dest) && File.readlink(dest) == target
35
+ logger.info "Creating symlink #{dest}"
36
+ FileUtils.ln_s(target, dest, :force => true)
37
+ else
38
+ logger.debug "Skipping symlink #{dest}, already exists"
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,54 @@
1
+ module TinyMCE
2
+ module Rails
3
+ class AssetInstaller
4
+ class Copy
5
+ delegate :assets, :target, :manifest, :logger, :logical_path, :with_asset, :to => :@installer
6
+
7
+ def initialize(installer)
8
+ @installer = installer
9
+ end
10
+
11
+ def call
12
+ cleanup_assets
13
+ copy_assets
14
+ append_to_manifest
15
+
16
+ manifest.write
17
+ end
18
+
19
+ private
20
+ def cleanup_assets
21
+ manifest.each(/^tinymce\//) do |asset|
22
+ manifest.remove_digest(asset) do |src, dest|
23
+ move_asset(src, dest)
24
+ end
25
+ end
26
+ end
27
+
28
+ def copy_assets
29
+ logger.info "Copying assets (preserving modes) to #{File.join(target, "tinymce")}"
30
+ FileUtils.cp_r(assets, target, :preserve => true)
31
+ end
32
+
33
+ def append_to_manifest
34
+ asset_files.each do |file|
35
+ manifest.append(logical_path(file), file)
36
+ end
37
+ end
38
+
39
+ def move_asset(src, dest)
40
+ with_asset(src, dest) do |src, dest|
41
+ logger.info "Removing digest from #{src}"
42
+
43
+ FileUtils.rm(dest) if File.exist?(dest)
44
+ FileUtils.mv(src, dest, :force => true)
45
+ end
46
+ end
47
+
48
+ def asset_files
49
+ Pathname.glob("#{assets}/**/*").select(&:file?)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,14 @@
1
+ require "tinymce/rails/asset_installer/copy"
2
+
3
+ module TinyMCE
4
+ module Rails
5
+ class AssetInstaller
6
+ class CopyNoPreserve < Copy
7
+ def copy_assets
8
+ logger.info "Copying assets (without preserving modes) to #{File.join(target, "tinymce")}"
9
+ FileUtils.cp_r(assets, target)
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,141 @@
1
+ module TinyMCE
2
+ module Rails
3
+ class AssetManifest
4
+ attr_reader :file
5
+
6
+ def self.load(manifest_path)
7
+ JsonManifest.try(manifest_path, ".sprockets-manifest*.json") ||
8
+ JsonManifest.try(manifest_path, "manifest*.json") ||
9
+ YamlManifest.try(manifest_path) ||
10
+ NullManifest.new
11
+ end
12
+
13
+ def each(pattern)
14
+ assets.each_key do |asset|
15
+ if asset =~ pattern && !index_asset?(asset)
16
+ yield asset
17
+ end
18
+ end
19
+ end
20
+
21
+ def asset_path(logical_path)
22
+ if digested = assets[logical_path]
23
+ yield digested, logical_path if block_given?
24
+ end
25
+ end
26
+
27
+ def to_s
28
+ dump
29
+ end
30
+
31
+ protected
32
+ def index_asset?(asset)
33
+ asset =~ /\/index[^\/]*\.\w+$/
34
+ end
35
+ end
36
+
37
+ class YamlManifest < AssetManifest
38
+ def self.try(manifest_path)
39
+ yaml_file = File.join(manifest_path, "manifest.yml")
40
+ new(yaml_file) if File.exists?(yaml_file)
41
+ end
42
+
43
+ def initialize(file)
44
+ @file = file
45
+ @manifest = YAML.load_file(file)
46
+ end
47
+
48
+ def append(logical_path, file)
49
+ assets[logical_path] = logical_path
50
+ end
51
+
52
+ def remove(logical_path)
53
+ assets.delete(logical_path)
54
+ end
55
+
56
+ def remove_digest(logical_path)
57
+ asset_path(logical_path) do |digested, logical_path|
58
+ assets[logical_path] = logical_path
59
+
60
+ yield digested, logical_path if block_given?
61
+ end
62
+ end
63
+
64
+ def assets
65
+ @manifest
66
+ end
67
+
68
+ def dump(io=nil)
69
+ YAML.dump(@manifest, io)
70
+ end
71
+
72
+ def write
73
+ File.open(@file, "wb") { |f| dump(f) }
74
+ end
75
+ end
76
+
77
+ class JsonManifest < AssetManifest
78
+ def self.try(manifest_path, pattern)
79
+ paths = Dir[File.join(manifest_path, pattern)]
80
+ new(paths.first) if paths.any?
81
+ end
82
+
83
+ def initialize(file)
84
+ @file = file
85
+ @manifest = JSON.parse(File.read(file))
86
+ end
87
+
88
+ def append(logical_path, file)
89
+ stat = File.stat(file)
90
+
91
+ assets[logical_path] = logical_path
92
+ files[logical_path] = {
93
+ "logical_path" => logical_path,
94
+ "mtime" => stat.mtime.iso8601,
95
+ "size" => stat.size,
96
+ "digest" => nil
97
+ }
98
+ end
99
+
100
+ def remove(logical_path)
101
+ if digested = assets.delete(logical_path)
102
+ files.delete(digested)
103
+ end
104
+ end
105
+
106
+ def remove_digest(logical_path)
107
+ asset_path(logical_path) do |digested, logical_path|
108
+ assets[logical_path] = logical_path
109
+ files[logical_path] = files.delete(digested).tap { |f| f["digest"] = nil }
110
+
111
+ yield digested, logical_path if block_given?
112
+ end
113
+ end
114
+
115
+ def assets
116
+ @manifest["assets"]
117
+ end
118
+
119
+ def files
120
+ @manifest["files"]
121
+ end
122
+
123
+ def dump
124
+ JSON.generate(@manifest)
125
+ end
126
+
127
+ def write
128
+ File.open(@file, "wb") { |f| f.write(dump) }
129
+ end
130
+ end
131
+
132
+ class NullManifest < AssetManifest
133
+ def append(*); end
134
+ def remove(*); end
135
+ def remove_digest(*); end
136
+ def assets; {}; end
137
+ def each(*); end
138
+ def write; end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,157 @@
1
+ require "active_support/hash_with_indifferent_access"
2
+
3
+ module TinyMCE::Rails
4
+ class Configuration
5
+ class Function < String
6
+ def to_javascript
7
+ self
8
+ end
9
+ end
10
+
11
+ def self.defaults
12
+ {
13
+ "selector" => "textarea.tinymce",
14
+ "cache_suffix" => "?v=#{VERSION}"
15
+ }
16
+ end
17
+
18
+ FUNCTION_REGEX = /^function\s*\(/
19
+ RELATIVE_PATH_REGEX = /^(\/|\.{1,2})\S*/
20
+
21
+ COMMA = ",".freeze
22
+ SPACE = " ".freeze
23
+ SEMICOLON = ";".freeze
24
+
25
+ OPTION_SEPARATORS = {
26
+ "plugins" => COMMA,
27
+ "custom_elements" => COMMA,
28
+ "entities" => COMMA,
29
+ "extended_valid_elements" => COMMA,
30
+ "font_formats" => SEMICOLON,
31
+ "fontsize_formats" => COMMA,
32
+ "invalid_elements" => COMMA,
33
+ "block_formats" => SEMICOLON,
34
+ "valid_children" => COMMA,
35
+ "valid_elements" => COMMA,
36
+ "body_id" => COMMA,
37
+ "body_class" => COMMA,
38
+ "content_css" => COMMA,
39
+ "tabfocus_elements" => COMMA,
40
+ "table_clone_elements" => SPACE,
41
+ "paste_word_valid_elements" => COMMA,
42
+ "paste_webkit_styles" => SPACE,
43
+ "paste_retain_style_properties" => SPACE,
44
+ "spellchecker_languages" => COMMA
45
+ }
46
+
47
+ OPTION_TRANSFORMERS = {
48
+ # Check for files provided in the content_css option to replace them with their actual path.
49
+ # If no corresponding stylesheet is found for a file, it will remain unchanged.
50
+ "content_css" => ->(value) {
51
+ helpers = ActionView::Base.new(ActionView::LookupContext.new([]))
52
+ separator = OPTION_SEPARATORS["content_css"]
53
+
54
+ value.split(separator).map { |file|
55
+ next file if RELATIVE_PATH_REGEX =~ file
56
+ helpers.stylesheet_path(file.strip) || file
57
+ }.join(separator)
58
+ }
59
+ }
60
+
61
+ attr_reader :options
62
+
63
+ def initialize(options)
64
+ @options = options
65
+ end
66
+
67
+ def self.new_with_defaults(options={})
68
+ config = new(defaults)
69
+ config = config.merge(options) if options
70
+ config
71
+ end
72
+
73
+ # Converts options into a String representing a JavaScript object
74
+ # that can be passed directly to tinyMCE.init
75
+ def to_javascript
76
+ options_to_javascript(options_for_tinymce)
77
+ end
78
+
79
+ # Converts options into a TinyMCE-friendly format.
80
+ #
81
+ # 1. Joins array values using OPTION_SEPARATORS
82
+ # 2. Converts JavaScript function() strings to Function objects
83
+ # 3. Applies transformations from OPTION_TRANSFORMERS
84
+ def options_for_tinymce
85
+ preprocess_options(options)
86
+ end
87
+
88
+ def merge(options)
89
+ self.class.new(self.options.merge(options))
90
+ end
91
+
92
+ private
93
+ def array_option?(key, value)
94
+ value.is_a?(Array) && OPTION_SEPARATORS[key]
95
+ end
96
+
97
+ def function_option?(value)
98
+ FUNCTION_REGEX =~ value.to_s
99
+ end
100
+
101
+ def preprocess_options(options)
102
+ result = {}
103
+
104
+ options.each do |key, value|
105
+ result[key] = preprocess_option(key, value)
106
+ end
107
+
108
+ result
109
+ end
110
+
111
+ def preprocess_option(key, value)
112
+ result = value
113
+
114
+ if result.is_a?(Hash)
115
+ result = preprocess_options(value)
116
+ elsif array_option?(key, value)
117
+ result = value.join(OPTION_SEPARATORS[key])
118
+ elsif function_option?(value)
119
+ result = Function.new(value)
120
+ end
121
+
122
+ if transformer = OPTION_TRANSFORMERS[key]
123
+ result = transformer.call(result)
124
+ end
125
+
126
+ result
127
+ end
128
+
129
+ def options_to_javascript(options, indent="")
130
+ next_indent = indent + " "
131
+
132
+ pairs = options.inject([]) do |result, (k, v)|
133
+ if v.is_a?(Hash)
134
+ v = options_to_javascript(v, next_indent)
135
+ elsif v.respond_to?(:to_javascript)
136
+ v = v.to_javascript
137
+ elsif v.respond_to?(:to_json)
138
+ v = v.to_json
139
+ end
140
+
141
+ result << [k, v].join(": ")
142
+ end
143
+
144
+ "{\n#{next_indent}#{pairs.join(",\n#{next_indent}")}\n#{indent}}"
145
+ end
146
+ end
147
+
148
+ class MultipleConfiguration < ActiveSupport::HashWithIndifferentAccess
149
+ def initialize(configurations={})
150
+ configurations = configurations.each_with_object({}) { |(name, options), h|
151
+ h[name] = Configuration.new_with_defaults(options)
152
+ }
153
+
154
+ super(configurations)
155
+ end
156
+ end
157
+ end