acts_as_formatted 0.0.1

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.
@@ -0,0 +1,126 @@
1
+ module ActsAsFormatted
2
+ mattr_accessor :default_options
3
+ self.default_options = {
4
+ :fields => :text,
5
+ :formatters => :simple
6
+ }
7
+
8
+ module ActsMethods
9
+ def acts_as_formatted(options = {})
10
+ return if acts_as_formatted?
11
+
12
+ initialize_format_configuration
13
+ set_format_configuration(options)
14
+
15
+ define_format_hooks
16
+ extend_class_for_acts_as_formatted
17
+ end
18
+
19
+ def acts_as_formatted?
20
+ self.included_modules.include?(ActsAsFormatted::InstanceMethods)
21
+ end
22
+
23
+ private
24
+ def initialize_format_configuration
25
+ cattr_accessor :format_configuration
26
+ self.format_configuration = {}
27
+ end
28
+
29
+ def set_format_configuration(options)
30
+ self.format_configuration[:fields] = normalized_format_configuration(options)
31
+ end
32
+
33
+ def normalized_format_configuration(options)
34
+ config_options = ActsAsFormatted.default_options.merge(options)
35
+ fields = convert_fields_option_to_array(config_options[:fields])
36
+ [fields].flatten.inject({}) do |hash, field|
37
+ key, value = normalized_format_configuration_for(field, config_options)
38
+ hash[key] = value
39
+ hash
40
+ end
41
+ end
42
+
43
+ def normalized_format_configuration_for(field, options)
44
+ field_name = field.is_a?(Hash) ? field.keys.first.to_sym : field.to_sym
45
+ field_options = field.is_a?(Hash) ? field[field_name] : (ActsAsFormatted.default_options.merge(options)).without(:fields)
46
+ formatters = field_options.is_a?(Hash) ? field_options[:formatters] : field_options
47
+ formatters ||= options[:formatters]
48
+ formatters = [formatters].flatten
49
+
50
+ return field_name, {
51
+ :formatters => formatters,
52
+ :formatted_field => options[:formatted_field] || :"formatted_#{field_name}"
53
+ }
54
+ end
55
+
56
+ def convert_fields_option_to_array(option)
57
+ if option.is_a?(Hash)
58
+ option.collect { |key, value| { key => value } }
59
+ else
60
+ option
61
+ end
62
+ end
63
+
64
+ def define_format_hooks
65
+ self.before_save :update_formatted_content
66
+ end
67
+
68
+ def extend_class_for_acts_as_formatted
69
+ self.extend ActsAsFormatted::ClassMethods
70
+ self.send :include, ActsAsFormatted::InstanceMethods
71
+ end
72
+ end
73
+
74
+ module ClassMethods
75
+ def update_all_formatted_content!(timestamps = false)
76
+ timestamps ? update_all_formatted_content_with_timestamps! : update_all_formatted_content_without_timestamps!
77
+ end
78
+
79
+ private
80
+
81
+ def update_all_formatted_content_with_timestamps!
82
+ all.each do |instance|
83
+ instance.update_formatted_content!
84
+ end
85
+ end
86
+
87
+ def update_all_formatted_content_without_timestamps!
88
+ without_timestamps do
89
+ update_all_formatted_content_with_timestamps!
90
+ end
91
+ end
92
+ end
93
+
94
+ module InstanceMethods
95
+ def formatters_for(field_name)
96
+ @formatters ||= {}
97
+ @formatters[field_name] ||= begin
98
+ formatters = self.class.format_configuration[:fields][field_name][:formatters]
99
+ formatters.collect { |formatter| "#{formatter}_formatter".camelize.constantize.new }
100
+ end
101
+ end
102
+
103
+ def reformat(field_name)
104
+ text = attributes[field_name.to_s]
105
+ formatters_for(field_name).each do |formatter|
106
+ text = formatter.format_text(text)
107
+ end unless text.nil?
108
+ text
109
+ end
110
+
111
+ def update_formatted_content
112
+ self.class.format_configuration[:fields].each do |field_name, field_options|
113
+ send(:"#{field_options[:formatted_field]}=", reformat(field_name))
114
+ end
115
+ end
116
+
117
+ def update_formatted_content!
118
+ update_formatted_content
119
+ save
120
+ end
121
+ end
122
+
123
+ def self.included(receiver)
124
+ receiver.extend(ActsAsFormatted::ActsMethods)
125
+ end
126
+ end
@@ -0,0 +1,9 @@
1
+ class LinkFormatter
2
+ include ActionView::Helpers::TagHelper
3
+ include ActionView::Helpers::TextHelper
4
+ include ActionView::Helpers::UrlHelper
5
+
6
+ def format_text(text)
7
+ auto_link(text)
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ class NoopFormatter
2
+ def format_text(text)
3
+ text
4
+ end
5
+ end
@@ -0,0 +1,7 @@
1
+ require 'hpricot'
2
+
3
+ class RepairHtmlFormatter
4
+ def format_text(text)
5
+ Hpricot(text).inner_html
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ class SimpleFormatter
2
+ include ActionView::Helpers::TagHelper
3
+ include ActionView::Helpers::TextHelper
4
+
5
+ def format_text(text)
6
+ simple_format(text)
7
+ end
8
+ end
@@ -0,0 +1,5 @@
1
+ class Hash
2
+ def without(*keys)
3
+ inject({}) { |hash, pair| hash[pair.first] = pair.last unless keys.include?(pair.first); hash }
4
+ end
5
+ end
@@ -0,0 +1,15 @@
1
+ module ActiveRecord::Timestamps
2
+ def without_timestamps(&block)
3
+ rec_ts = ActiveRecord::Base.record_timestamps
4
+ applied_to = self.is_a?(Class) ? self : self.class
5
+ applied_to.record_timestamps = false
6
+ begin
7
+ yield
8
+ ensure
9
+ applied_to.record_timestamps = rec_ts
10
+ end
11
+ end
12
+ end
13
+
14
+ ActiveRecord::Base.send(:extend, ActiveRecord::Timestamps)
15
+ ActiveRecord::Base.send(:include, ActiveRecord::Timestamps)
@@ -0,0 +1,10 @@
1
+ # Include hook code here
2
+ require 'acts_as_formatted/timestamps'
3
+ require 'acts_as_formatted/acts_as_formatted'
4
+ require 'acts_as_formatted/hash'
5
+
6
+ Dir.glob(File.dirname(__FILE__) + '/acts_as_formatted//formatters/*.rb').sort.each do |formatter|
7
+ require formatter
8
+ end
9
+
10
+ ActiveRecord::Base.send :include, ActsAsFormatted
metadata ADDED
@@ -0,0 +1,74 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: acts_as_formatted
3
+ version: !ruby/object:Gem::Version
4
+ hash: 29
5
+ prerelease: false
6
+ segments:
7
+ - 0
8
+ - 0
9
+ - 1
10
+ version: 0.0.1
11
+ platform: ruby
12
+ authors:
13
+ - imedo GmbH
14
+ autorequire:
15
+ bindir: bin
16
+ cert_chain: []
17
+
18
+ date: 2010-08-25 00:00:00 +02:00
19
+ default_executable:
20
+ dependencies: []
21
+
22
+ description:
23
+ email: entwickler@imedo.de
24
+ executables: []
25
+
26
+ extensions: []
27
+
28
+ extra_rdoc_files: []
29
+
30
+ files:
31
+ - lib/acts_as_formatted/acts_as_formatted.rb
32
+ - lib/acts_as_formatted/formatters/link_formatter.rb
33
+ - lib/acts_as_formatted/formatters/noop_formatter.rb
34
+ - lib/acts_as_formatted/formatters/repair_html_formatter.rb
35
+ - lib/acts_as_formatted/formatters/simple_formatter.rb
36
+ - lib/acts_as_formatted/hash.rb
37
+ - lib/acts_as_formatted/timestamps.rb
38
+ - lib/acts_as_formatted.rb
39
+ has_rdoc: true
40
+ homepage: http://www.imedo.de
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ hash: 3
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ required_rubygems_version: !ruby/object:Gem::Requirement
58
+ none: false
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ hash: 3
63
+ segments:
64
+ - 0
65
+ version: "0"
66
+ requirements: []
67
+
68
+ rubyforge_project:
69
+ rubygems_version: 1.3.7
70
+ signing_key:
71
+ specification_version: 3
72
+ summary: Save processed version of a text in the database.
73
+ test_files: []
74
+