rich_cms 2.0.7 → 2.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/CHANGELOG +10 -1
  2. data/README.textile +58 -16
  3. data/Rakefile +3 -3
  4. data/VERSION +1 -1
  5. data/{lib/app → app}/controllers/rich/cms_controller.rb +7 -7
  6. data/{lib/app → app}/views/rich/cms/_dock.html.erb +1 -1
  7. data/{lib/app → app}/views/rich/cms/dock/_menu.html.erb +1 -1
  8. data/{lib/app → app}/views/rich/cms/dock/_panel.html.erb +1 -1
  9. data/app/views/rich/cms/dock/panel/_edit.html.erb +1 -0
  10. data/app/views/rich/cms/dock/panel/_login.html.erb +1 -0
  11. data/app/views/rich/cms/dock/panel/edit/_rails3.html.erb +10 -0
  12. data/{lib/app/views/rich/cms/dock/panel/_login.html.erb → app/views/rich/cms/dock/panel/login/_rails2.html.erb} +4 -4
  13. data/app/views/rich/cms/dock/panel/login/_rails3.html.erb +15 -0
  14. data/{lib/app → app}/views/rich_cms.html.erb +1 -1
  15. data/{lib/assets → assets}/jzip/jquery/cleditor.js +14 -14
  16. data/assets/jzip/jquery/extensions/ajaxify.js +26 -0
  17. data/{lib/assets → assets}/jzip/jquery/raccoon_tip.js +22 -22
  18. data/assets/jzip/jquery/ui/components/draggable.js +797 -0
  19. data/assets/jzip/jquery/ui/components/mouse.js +151 -0
  20. data/assets/jzip/jquery/ui/components/widget.js +237 -0
  21. data/{lib/assets → assets}/jzip/rich/cms/dock.js +5 -5
  22. data/{lib/assets → assets}/jzip/rich/cms/editor.js +21 -21
  23. data/{lib/assets → assets}/jzip/rich/cms/menu.js +3 -3
  24. data/{lib/assets → assets}/jzip/rich/cms.js +1 -1
  25. data/{lib/assets → assets}/sass/rich_cms/_dock.sass +2 -2
  26. data/{lib/assets → assets}/sass/rich_cms/_menu.sass +2 -2
  27. data/{lib/assets → assets}/sass/rich_cms/_panel.sass +2 -2
  28. data/{lib/assets → assets}/sass/tools/_mixins.sass +5 -5
  29. data/config/routes.rb +36 -0
  30. data/lib/generators/rich/authlogic_user/authlogic_user_generator.rb +63 -0
  31. data/lib/generators/rich/authlogic_user/templates/migration.rb +25 -0
  32. data/lib/generators/rich/authlogic_user/templates/model.rb +12 -0
  33. data/lib/generators/rich/authlogic_user/templates/session.rb +7 -0
  34. data/lib/generators/rich/cms_content/cms_content_generator.rb +59 -0
  35. data/lib/generators/rich/cms_content/templates/migration.rb +15 -0
  36. data/lib/generators/rich.rb +25 -0
  37. data/lib/rich/cms/actionpack/action_controller/base.rb +8 -8
  38. data/lib/rich/cms/actionpack/action_view/base.rb +14 -14
  39. data/lib/rich/cms/activesupport/active_support/dependencies.rb +12 -0
  40. data/lib/rich/cms/activesupport.rb +1 -0
  41. data/lib/rich/cms/content/group.rb +13 -13
  42. data/lib/rich/cms/content/item.rb +17 -17
  43. data/lib/rich/cms/core/string/html_safe.rb +18 -0
  44. data/lib/rich/cms/core/string.rb +6 -0
  45. data/lib/rich/cms/core.rb +1 -0
  46. data/lib/rich/cms/engine.rb +85 -74
  47. data/lib/rich/cms/rails/engine.rb +5 -0
  48. data/lib/rich/cms/rails.rb +1 -0
  49. data/lib/rich_cms.rb +8 -6
  50. data/rails_generators/rich_authlogic_user/rich_authlogic_user_generator.rb +4 -4
  51. data/rails_generators/rich_authlogic_user/templates/migration.rb +1 -1
  52. data/rails_generators/rich_authlogic_user/templates/model.rb +1 -1
  53. data/rails_generators/rich_authlogic_user/templates/session.rb +4 -0
  54. data/rails_generators/rich_cms_content/rich_cms_content_generator.rb +3 -3
  55. data/rails_generators/rich_cms_content/templates/migration.rb +1 -1
  56. data/rich_cms.gemspec +69 -60
  57. data/test/test_helper.rb +4 -1
  58. metadata +73 -62
  59. data/lib/app/controllers/rich/._cms_controller.rb +0 -0
  60. data/lib/app/views/._rich_cms.html.erb +0 -0
  61. data/lib/app/views/rich/cms/dock/.__menu.html.erb +0 -0
  62. data/lib/app/views/rich/cms/dock/.__panel.html.erb +0 -0
  63. data/lib/app/views/rich/cms/dock/panel/.__login.html.erb +0 -0
  64. data/lib/assets/jzip/jquery/extensions/ajaxify.js +0 -26
  65. data/lib/assets/jzip/jquery/ui/components/draggable.js +0 -797
  66. data/lib/assets/jzip/jquery/ui/components/mouse.js +0 -151
  67. data/lib/assets/jzip/jquery/ui/components/widget.js +0 -237
  68. data/lib/config/routes.rb +0 -19
  69. data/lib/rich/cms/actionpack/action_controller/._base.rb +0 -0
  70. data/lib/rich/cms/actionpack/action_view/._base.rb +0 -0
  71. data/test/engine_test.rb +0 -15
  72. /data/{lib/app/views/rich/cms/dock/panel/_edit.html.erb → app/views/rich/cms/dock/panel/edit/_rails2.html.erb} +0 -0
  73. /data/{lib/assets → assets}/images/cleditor/buttons.gif +0 -0
  74. /data/{lib/assets → assets}/images/cleditor/toolbar.gif +0 -0
  75. /data/{lib/assets → assets}/jzip/jquery/core.jz +0 -0
  76. /data/{lib/assets → assets}/jzip/jquery/extensions/browser_detect.js +0 -0
  77. /data/{lib/assets → assets}/jzip/jquery/extensions/modules.js +0 -0
  78. /data/{lib/assets → assets}/jzip/jquery/extensions/object.js +0 -0
  79. /data/{lib/assets → assets}/jzip/jquery/ui/components/core.js +0 -0
  80. /data/{lib/assets → assets}/jzip/jquery/ui/rich_cms/core.jz +0 -0
  81. /data/{lib/assets → assets}/jzip/jquery/ui/rich_cms/draggable.jz +0 -0
  82. /data/{lib/assets → assets}/jzip/jquery/ui/rich_cms/mouse.jz +0 -0
  83. /data/{lib/assets → assets}/jzip/jquery/ui/rich_cms/widget.jz +0 -0
  84. /data/{lib/assets → assets}/jzip/rich.js +0 -0
  85. /data/{lib/assets → assets}/jzip/rich_cms.jz +0 -0
  86. /data/{lib/assets → assets}/sass/rich_cms/_content.sass +0 -0
  87. /data/{lib/assets → assets}/sass/rich_cms/_reset.sass +0 -0
  88. /data/{lib/assets → assets}/sass/rich_cms.sass +0 -0
  89. /data/{lib/assets → assets}/sass/tools/_css3.sass +0 -0
data/config/routes.rb ADDED
@@ -0,0 +1,36 @@
1
+ if Rails::VERSION::MAJOR >= 3
2
+
3
+ Rails.application.routes.draw do
4
+ scope :module => "rich" do
5
+ %w(login logout update).each do |action|
6
+ match "/cms/#{action}" => "cms##{action}", :as => "rich_cms_#{action}"
7
+ end
8
+ match "/cms/" => "cms#display", :as => "rich_cms" , :display => true
9
+ match "/cms/hide" => "cms#display", :as => "rich_cms_hide", :display => false
10
+ match "/cms/position" => "cms#position"
11
+ end
12
+ end
13
+
14
+ else
15
+
16
+ # TODO: add routes the right way as this is evil
17
+ class << ActionController::Routing::Routes;self;end.class_eval do
18
+ define_method :clear!, lambda {}
19
+ end
20
+ # END
21
+
22
+ ActionController::Routing::Routes.draw do |map|
23
+ map.namespace :rich, :path_prefix => "" do |rich|
24
+
25
+ %w(login logout update).each do |action|
26
+ rich.send "cms_#{action}", "cms/#{action}", :controller => "cms", :action => action
27
+ end
28
+
29
+ rich.cms "cms" , :controller => "cms", :action => "display", :display => true
30
+ rich.cms_hide "cms/hide" , :controller => "cms", :action => "display", :display => false
31
+ rich.connect "cms/position", :controller => "cms", :action => "position"
32
+
33
+ end
34
+ end
35
+
36
+ end
@@ -0,0 +1,63 @@
1
+ require "generators/rich"
2
+
3
+ module Rich
4
+ module Generators
5
+
6
+ class AuthlogicUserGenerator < Base
7
+
8
+ include Rails::Generators::Migration
9
+ include Rich::Generators::Migration
10
+
11
+ desc "Creates Authlogic model and migration and also registers authenticated model to Rich-CMS."
12
+ argument :model_name, :type => :string , :default => "user"
13
+ class_option :migrate , :type => :boolean, :default => false, :aliases => "-m", :desc => "Run 'rake db:migrate' after generating model and migration"
14
+
15
+ def register_authentication
16
+ filename = "config/initializers/enrichments.rb"
17
+ line = "\nRich::Cms::Engine.authenticate(:authlogic, {:class_name => \"#{model_class_name}\", :identifier => :email})"
18
+
19
+ return if File.open(filename, "a+").readlines.include? line.strip
20
+
21
+ File.open(filename, "a+") do |file|
22
+ file << line
23
+ end
24
+ end
25
+
26
+ def generate_model
27
+ template "model.rb", "app/models/#{model_file_name}.rb"
28
+ end
29
+
30
+ def generate_session
31
+ template "session.rb", "app/models/#{model_file_name}_session.rb"
32
+ end
33
+
34
+ def generate_migration
35
+ migration_template "migration.rb", "db/migrate/create_#{table_name}"
36
+ end
37
+
38
+ def migrate
39
+ rake "db:migrate" if options[:migrate]
40
+ end
41
+
42
+ protected
43
+
44
+ def model_file_name
45
+ model_name.underscore
46
+ end
47
+
48
+ def model_class_name
49
+ model_name.classify
50
+ end
51
+
52
+ def migration_class_name
53
+ migration_file_name.pluralize.camelize
54
+ end
55
+
56
+ def table_name
57
+ model_file_name.underscore.gsub("/", "_").pluralize
58
+ end
59
+
60
+ end
61
+
62
+ end
63
+ end
@@ -0,0 +1,25 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ t.string :name
5
+ t.string :email
6
+ t.string :crypted_password
7
+ t.string :password_salt
8
+ t.datetime :created_at
9
+ t.string :persistence_token , :default => "", :null => false
10
+ t.string :single_access_token, :default => "", :null => false
11
+ t.string :perishable_token , :default => "", :null => false
12
+ t.integer :login_count
13
+ t.datetime :last_request_at
14
+ t.datetime :current_login_at
15
+ t.datetime :last_login_at
16
+ t.timestamps
17
+ end
18
+
19
+ add_index :<%= table_name %>, :email
20
+ end
21
+
22
+ def self.down
23
+ drop_table :<%= table_name %>
24
+ end
25
+ end
@@ -0,0 +1,12 @@
1
+ class <%= model_class_name %> < ActiveRecord::Base
2
+
3
+ acts_as_authentic do |c|
4
+ c.login_field = :email
5
+ c.crypted_password_field = :crypted_password
6
+ end
7
+
8
+ def to_key
9
+ new_record? ? nil : [self.send self.class.primary_key]
10
+ end
11
+
12
+ end
@@ -0,0 +1,7 @@
1
+ class <%= model_class_name %>Session < Authlogic::Session::Base
2
+
3
+ authenticate_with <%= model_class_name %>
4
+ generalize_credentials_error_messages true
5
+ params_key "user_credentials"
6
+
7
+ end
@@ -0,0 +1,59 @@
1
+ require "generators/rich"
2
+
3
+ module Rich
4
+ module Generators
5
+
6
+ class CmsContentGenerator < Base
7
+
8
+ include Rails::Generators::Migration
9
+ include Rich::Generators::Migration
10
+
11
+ desc "Creates Rich-CMS content model and migration and also registers content to Rich-CMS."
12
+ argument :model_name, :type => :string , :default => "cms_content"
13
+ class_option :migrate , :type => :boolean, :default => false, :aliases => "-m", :desc => "Run 'rake db:migrate' after generating model and migration"
14
+
15
+ def register_content
16
+ filename = "config/initializers/enrichments.rb"
17
+ line = "\nRich::Cms::Engine.register(\".#{model_file_name}\", {:class_name => \"#{model_class_name}\"})"
18
+
19
+ return if File.open(filename, "a+").readlines.include? line.strip
20
+
21
+ File.open(filename, "a+") do |file|
22
+ file << line
23
+ end
24
+ end
25
+
26
+ def generate_model
27
+ invoke "active_record:model", [model_file_name], :migration => false
28
+ end
29
+
30
+ def generate_migration
31
+ migration_template "migration.rb", "db/migrate/create_#{table_name}"
32
+ end
33
+
34
+ def migrate
35
+ rake "db:migrate" if options[:migrate]
36
+ end
37
+
38
+ protected
39
+
40
+ def model_file_name
41
+ model_name.underscore
42
+ end
43
+
44
+ def model_class_name
45
+ model_name.classify
46
+ end
47
+
48
+ def migration_class_name
49
+ migration_file_name.pluralize.camelize
50
+ end
51
+
52
+ def table_name
53
+ model_file_name.underscore.gsub("/", "_").pluralize
54
+ end
55
+
56
+ end
57
+
58
+ end
59
+ end
@@ -0,0 +1,15 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration
2
+ def self.up
3
+ create_table :<%= table_name %> do |t|
4
+ t.string :key
5
+ t.text :value
6
+ t.timestamps
7
+ end
8
+
9
+ add_index :<%= table_name %>, :key
10
+ end
11
+
12
+ def self.down
13
+ drop_table :<%= table_name %>
14
+ end
15
+ end
@@ -0,0 +1,25 @@
1
+ require "rails/generators/named_base"
2
+
3
+ module Rich
4
+ module Generators
5
+
6
+ class Base < Rails::Generators::Base
7
+ def self.source_root
8
+ File.expand_path File.join(File.dirname(__FILE__), "rich", generator_name, "templates")
9
+ end
10
+ end
11
+
12
+ module Migration
13
+ def self.included(base)
14
+ base.extend ClassMethods
15
+ end
16
+
17
+ module ClassMethods
18
+ def next_migration_number(dirname)
19
+ Time.now.strftime "%Y%m%d%H%M%S"
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+ end
@@ -3,21 +3,21 @@ module ActionController
3
3
  class Base
4
4
 
5
5
  around_filter :prepare_rich_cms
6
-
6
+
7
7
  def prepare_rich_cms
8
8
  ::Rich::Cms::Engine.current_controller = self
9
9
  yield
10
10
  ensure
11
11
  ::Rich::Cms::Engine.current_controller = nil
12
12
  end
13
-
14
- view_path = File.join File.dirname(__FILE__), "..", "..", "..", "..", "app", "views"
13
+
14
+ view_path = File.expand_path "../../../../../../app/views", __FILE__
15
15
  if respond_to? :append_view_path
16
16
  self.append_view_path view_path
17
17
  elsif respond_to? :view_paths
18
18
  self.view_paths << view_path
19
19
  end
20
-
20
+
21
21
  helper_method :current_rich_cms_admin, :current_rich_cms_admin_name, :rich_cms_authenticated_class, :rich_cms_authentication_inputs
22
22
 
23
23
  def require_current_rich_cms_admin
@@ -39,24 +39,24 @@ module ActionController
39
39
  def current_rich_cms_admin_name
40
40
  current_rich_cms_admin[rich_cms_auth.specs[:identifier]] if current_rich_cms_admin
41
41
  end
42
-
42
+
43
43
  def rich_cms_auth
44
44
  ::Rich::Cms::Engine.authentication
45
45
  end
46
-
46
+
47
47
  def rich_cms_authenticated_class
48
48
  case rich_cms_auth.logic
49
49
  when :authlogic
50
50
  "#{rich_cms_auth.specs[:class_name]}Session".constantize
51
51
  end
52
52
  end
53
-
53
+
54
54
  def rich_cms_authentication_inputs
55
55
  case rich_cms_auth.logic
56
56
  when :authlogic
57
57
  rich_cms_auth.specs[:inputs] || [:email, :password]
58
58
  end
59
59
  end
60
-
60
+
61
61
  end
62
62
  end
@@ -1,23 +1,23 @@
1
1
 
2
2
  module ActionView
3
3
  class Base
4
-
5
- def rich_cms
6
- render :file => File.join(File.dirname(__FILE__), "..", "..", "..", "..", "app", "views", "rich_cms.html.erb") if display_rich_cms?
7
- end
8
-
4
+
5
+ def rich_cms
6
+ render :file => File.expand_path("../../../../../../app/views/rich_cms.html.erb", __FILE__) if display_rich_cms?
7
+ end
8
+
9
9
  def display_rich_cms?
10
10
  !!session[:rich_cms].try(:fetch, :display, nil)
11
11
  end
12
-
13
- def link(name, options = nil)
14
- options = {:class => options || name.underscore} unless options.is_a?(Hash)
15
- link_to name, "#", options
16
- end
17
-
18
- def rich_cms_tag(*args)
19
- Rich::Cms::Engine.to_content_tag *args
20
- end
12
+
13
+ def link(name, options = nil)
14
+ options = {:class => options || name.underscore} unless options.is_a?(Hash)
15
+ link_to name, "#", options
16
+ end
17
+
18
+ def rich_cms_tag(*args)
19
+ Rich::Cms::Engine.to_content_tag *args
20
+ end
21
21
 
22
22
  end
23
23
  end
@@ -0,0 +1,12 @@
1
+ module ActiveSupport
2
+ module Dependencies
3
+
4
+ extend self
5
+
6
+ unless respond_to? :autoload_paths
7
+ alias_method :autoload_paths , :load_paths
8
+ alias_method :autoload_once_paths, :load_once_paths
9
+ end
10
+
11
+ end
12
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), "activesupport", "active_support", "dependencies.rb")
@@ -2,13 +2,13 @@
2
2
  module Rich
3
3
  module Cms
4
4
  module Content
5
-
5
+
6
6
  class Group < Struct.new(:selector, :tag, :class_name, :key, :value, :add, :before_edit, :after_update)
7
-
7
+
8
8
  def self.build(selector, specs)
9
9
  self.new *{:selector => selector, :key => :key, :value => :value}.merge(specs).stringify_keys.values_at(*self.members)
10
10
  end
11
-
11
+
12
12
  def fetch(ref, as_content_item = true)
13
13
  reference = if ref.is_a?(Hash)
14
14
  ref
@@ -16,24 +16,24 @@ module Rich
16
16
  {identifiers.first => ref}
17
17
  end
18
18
  reference.stringify_keys! if reference.is_a?(Hash)
19
-
19
+
20
20
  unless valid_reference?(reference)
21
21
  raise ArgumentError, "Invalid reference #{reference.inspect} (#{reference.values_at(*identifiers).inspect}) passed for #{identifiers.inspect}"
22
22
  end
23
-
23
+
24
24
  object = self.class_name.constantize.send :"find_or_initialize_by_#{identifiers.join "_and_"}", *reference.values_at(*identifiers)
25
-
25
+
26
26
  as_content_item ? Cms::Content::Item.new(self, object) : object
27
27
  end
28
-
28
+
29
29
  def keys
30
30
  (identifiers + [self.add || []].flatten.collect(&:to_s)).sort
31
31
  end
32
-
32
+
33
33
  def identifiers
34
34
  @identifiers ||= [self.key].flatten.collect(&:to_s).sort
35
35
  end
36
-
36
+
37
37
  def to_javascript_hash
38
38
  "#{self.selector.inspect}: {#{
39
39
  members.collect do |k|
@@ -54,15 +54,15 @@ module Rich
54
54
  end.compact.join(", ")
55
55
  }}"
56
56
  end
57
-
57
+
58
58
  private
59
-
59
+
60
60
  def valid_reference?(reference)
61
61
  reference.is_a?(Hash) && (identifiers - reference.keys).empty? && reference.values_at(*identifiers).compact!.nil?
62
62
  end
63
-
63
+
64
64
  end
65
-
65
+
66
66
  end
67
67
  end
68
68
  end
@@ -4,7 +4,7 @@ module Rich
4
4
  module Content
5
5
 
6
6
  class Item
7
-
7
+
8
8
  def initialize(*args)
9
9
  if args.size == 1 && args.first.is_a?(Hash)
10
10
  hash = args.first
@@ -13,13 +13,13 @@ module Rich
13
13
  else
14
14
  raise ArgumentError, "Invalid arguments #{args.inspect} passed for #{self.class.name}"
15
15
  end
16
-
16
+
17
17
  if hash && (selector = hash.stringify_keys["__selector__"])
18
18
  @group = Engine.editable_content[selector]
19
19
  @object = @group.fetch hash, false
20
-
20
+
21
21
  attributes, params = hash.partition{|k, v| @object.attribute_names.include? k.to_s}
22
-
22
+
23
23
  @object.attributes = Hash[*attributes.flatten]
24
24
  @params = HashWithIndifferentAccess[*params.flatten]
25
25
 
@@ -27,7 +27,7 @@ module Rich
27
27
  @group, @object = *array
28
28
  end
29
29
  end
30
-
30
+
31
31
  def save
32
32
  @object.save
33
33
 
@@ -37,38 +37,38 @@ module Rich
37
37
  keys = @group.keys << @group.value.to_s
38
38
  hash = @object.attributes.reject{|k, v| !keys.include?(k.to_s)}
39
39
  end
40
-
40
+
41
41
  selector = @group.selector
42
42
  identifier = @group.identifiers.inject({}){|h, k| h[k] = @object.send(k); h}
43
-
43
+
44
44
  hash.merge({:__selector__ => selector, :__identifier__ => identifier})
45
45
  end
46
-
46
+
47
47
  def to_tag(options = {})
48
- tag = options[:tag] || @group.tag || :div
49
- attrs = []
50
-
48
+ attrs = []
51
49
  default = @group.identifiers.size == 1 ? @object.send(@group.identifiers.first) : @object.attributes.values_at(*@group.identifiers).inspect
52
50
  value = @object.send(@group.value)
53
-
51
+
54
52
  if Engine.can_render_metadata?
55
53
  default = "< #{default} >"
56
54
  keys = @group.keys << @group.value.to_s
57
55
  data = @object.attributes.reject{|k, v| !keys.include?(k.to_s)}
58
56
 
59
57
  data[:editable_input_type] = options[:as] if %w(string text html).include? options[:as].to_s.downcase
60
-
58
+
61
59
  if class_name = @group.selector.match(/^\.\w+$/)
62
60
  (options[:html] ||= {}).store :class, [class_name.to_s.gsub(/^\./, ""), options[:html].try(:fetch, :class, nil)].compact.join(" ")
63
61
  end
64
-
62
+
65
63
  attrs << options[:html].collect{|k, v| "#{k}=\"#{::ERB::Util.html_escape v}\""}.join(" ") if options[:html]
66
64
  attrs << data .collect{|k, v| "data-#{k}=\"#{::ERB::Util.html_escape v}\""}.join(" ")
67
65
  end
68
-
69
- "<#{tag} #{attrs.join(" ")}>#{value.blank? ? default : value}</#{tag}>"
66
+
67
+ tag = options[:tag] || @group.tag || (%w(text html).include?(data.try :fetch, :editable_input_type, nil) ? :div : :span)
68
+
69
+ "<#{tag} #{attrs.join(" ")}>#{value.blank? ? default : value}</#{tag}>".html_safe
70
70
  end
71
-
71
+
72
72
  end
73
73
 
74
74
  end
@@ -0,0 +1,18 @@
1
+
2
+ module Rich
3
+ module Cms
4
+ module Core
5
+ module String
6
+ module HtmlSafe
7
+
8
+ unless ::String.new.respond_to? :html_safe
9
+ def html_safe
10
+ self
11
+ end
12
+ end
13
+
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,6 @@
1
+
2
+ require "rich/cms/core/string/html_safe"
3
+
4
+ class String
5
+ include Rich::Cms::Core::String::HtmlSafe
6
+ end
@@ -0,0 +1 @@
1
+ require File.join(File.dirname(__FILE__), "core", "string.rb")