mbrao 1.5.0 → 1.6.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.
- checksums.yaml +4 -4
- data/.gitignore +2 -4
- data/.rubocop.yml +51 -3
- data/.travis-gemfile +5 -5
- data/.travis.yml +5 -3
- data/CHANGELOG.md +5 -0
- data/Gemfile +10 -9
- data/README.md +1 -2
- data/Rakefile +22 -6
- data/doc/ActionView.html +3 -3
- data/doc/ActionView/Template.html +3 -3
- data/doc/ActionView/Template/Handlers.html +3 -3
- data/doc/ActionView/Template/Handlers/MbraoTemplate.html +3 -3
- data/doc/HTML.html +3 -3
- data/doc/HTML/Pipeline.html +3 -3
- data/doc/HTML/Pipeline/KramdownFilter.html +3 -3
- data/doc/Mbrao.html +5 -5
- data/doc/Mbrao/Author.html +10 -10
- data/doc/Mbrao/Content.html +825 -844
- data/doc/Mbrao/ContentInterface.html +5 -5
- data/doc/Mbrao/ContentInterface/ClassMethods.html +4 -4
- data/doc/Mbrao/Exceptions.html +3 -3
- data/doc/Mbrao/Exceptions/InvalidDate.html +3 -3
- data/doc/Mbrao/Exceptions/InvalidMetadata.html +3 -3
- data/doc/Mbrao/Exceptions/Parsing.html +3 -3
- data/doc/Mbrao/Exceptions/Rendering.html +3 -3
- data/doc/Mbrao/Exceptions/UnavailableLocalization.html +3 -3
- data/doc/Mbrao/Exceptions/Unimplemented.html +3 -3
- data/doc/Mbrao/Exceptions/UnknownEngine.html +3 -3
- data/doc/Mbrao/Parser.html +3 -3
- data/doc/Mbrao/ParserInterface.html +3 -3
- data/doc/Mbrao/ParserInterface/ClassMethods.html +35 -95
- data/doc/Mbrao/ParserValidations.html +3 -3
- data/doc/Mbrao/ParserValidations/ClassMethods.html +3 -3
- data/doc/Mbrao/ParsingEngines.html +3 -3
- data/doc/Mbrao/ParsingEngines/Base.html +3 -3
- data/doc/Mbrao/ParsingEngines/PlainText.html +11 -17
- data/doc/Mbrao/RenderingEngines.html +3 -3
- data/doc/Mbrao/RenderingEngines/Base.html +3 -3
- data/doc/Mbrao/RenderingEngines/HtmlPipeline.html +24 -92
- data/doc/Mbrao/Version.html +4 -4
- data/doc/_index.html +8 -8
- data/doc/class_list.html +5 -1
- data/doc/file.README.html +5 -6
- data/doc/file_list.html +5 -1
- data/doc/frames.html +1 -1
- data/doc/index.html +5 -6
- data/doc/js/full_list.js +4 -1
- data/doc/method_list.html +75 -53
- data/doc/top-level-namespace.html +3 -3
- data/lib/mbrao/author.rb +1 -1
- data/lib/mbrao/content.rb +47 -65
- data/lib/mbrao/content_interface.rb +5 -17
- data/lib/mbrao/parser.rb +4 -10
- data/lib/mbrao/parser_interface.rb +9 -19
- data/lib/mbrao/parsing_engines/plain_text.rb +22 -58
- data/lib/mbrao/rendering_engines/html_pipeline.rb +9 -26
- data/lib/mbrao/version.rb +1 -1
- data/mbrao.gemspec +9 -9
- data/spec/mbrao/content_spec.rb +4 -4
- data/spec/mbrao/integrations/rails_spec.rb +4 -4
- data/spec/mbrao/parser_spec.rb +15 -15
- data/spec/spec_helper.rb +19 -5
- metadata +17 -19
- data/spec/coverage_helper.rb +0 -20
@@ -6,7 +6,7 @@
|
|
6
6
|
<title>
|
7
7
|
Top Level Namespace
|
8
8
|
|
9
|
-
— Documentation by YARD 0.8.7.
|
9
|
+
— Documentation by YARD 0.8.7.6
|
10
10
|
|
11
11
|
</title>
|
12
12
|
|
@@ -103,9 +103,9 @@
|
|
103
103
|
</div>
|
104
104
|
|
105
105
|
<div id="footer">
|
106
|
-
Generated on
|
106
|
+
Generated on Tue Mar 29 12:47:22 2016 by
|
107
107
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
108
|
-
0.8.7.
|
108
|
+
0.8.7.6 (ruby-2.3.0).
|
109
109
|
</div>
|
110
110
|
|
111
111
|
</body>
|
data/lib/mbrao/author.rb
CHANGED
@@ -39,7 +39,7 @@ module Mbrao
|
|
39
39
|
@email = Mbrao::Parser.email?(email) ? email : nil
|
40
40
|
@website = Mbrao::Parser.url?(website) ? website : nil
|
41
41
|
@image = Mbrao::Parser.url?(image) ? image : nil
|
42
|
-
@metadata = metadata.ensure_hash(:indifferent)
|
42
|
+
@metadata = metadata.ensure_hash(accesses: :indifferent)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Returns the author as an Hash.
|
data/lib/mbrao/content.rb
CHANGED
@@ -56,7 +56,7 @@ module Mbrao
|
|
56
56
|
#
|
57
57
|
# @param value [Array] The new value for the attribute. A empty or "*" will be the default value.
|
58
58
|
def locales=(value)
|
59
|
-
@locales = value.ensure_array(
|
59
|
+
@locales = value.ensure_array(no_duplicates: true, compact: true, flatten: true) { |l| l.ensure_string.strip }
|
60
60
|
end
|
61
61
|
|
62
62
|
# Sets the `title` attribute.
|
@@ -64,7 +64,7 @@ module Mbrao
|
|
64
64
|
# @param new_title [String|Hash] The new value for the attribute. If an Hash, keys must be a string with one or locale separated by commas.
|
65
65
|
# A empty or "*" will be the default value.
|
66
66
|
def title=(new_title)
|
67
|
-
@title = hash?(new_title) ? new_title.ensure_hash(:indifferent, nil, :ensure_string) : new_title.ensure_string
|
67
|
+
@title = hash?(new_title) ? new_title.ensure_hash(accesses: :indifferent, default: nil, sanitizer: :ensure_string) : new_title.ensure_string
|
68
68
|
end
|
69
69
|
|
70
70
|
# Sets the `summary` attribute.
|
@@ -72,7 +72,7 @@ module Mbrao
|
|
72
72
|
# @param new_summary [String|Hash] The new value for the attribute. If an Hash, keys must be a string with one or locale separated by commas.
|
73
73
|
# A empty or "*" will be the default value.
|
74
74
|
def summary=(new_summary)
|
75
|
-
@summary = hash?(new_summary) ? new_summary.ensure_hash(:indifferent, nil, :ensure_string) : new_summary.ensure_string
|
75
|
+
@summary = hash?(new_summary) ? new_summary.ensure_hash(accesses: :indifferent, default: nil, sanitizer: :ensure_string) : new_summary.ensure_string
|
76
76
|
end
|
77
77
|
|
78
78
|
# Sets the `body` attribute.
|
@@ -87,7 +87,7 @@ module Mbrao
|
|
87
87
|
# @param new_tags [Array|Hash] The new value for the attribute. If an Hash, keys must be a string with one or locale separated by commas.
|
88
88
|
# A empty or "*" will be the default value. Tags can also be comma-separated.
|
89
89
|
def tags=(new_tags)
|
90
|
-
@tags = hash?(new_tags) ? new_tags.ensure_hash(:indifferent) { |v| parse_tags(v) } : parse_tags(new_tags)
|
90
|
+
@tags = hash?(new_tags) ? new_tags.ensure_hash(accesses: :indifferent) { |v| parse_tags(v) } : parse_tags(new_tags)
|
91
91
|
end
|
92
92
|
|
93
93
|
# Sets the `more` attribute.
|
@@ -95,7 +95,7 @@ module Mbrao
|
|
95
95
|
# @param new_more [String|Hash] The new value for the attribute. If an Hash, keys must be a string with one or locale separated by commas.
|
96
96
|
# A empty or "*" will be the default value.
|
97
97
|
def more=(new_more)
|
98
|
-
@more = hash?(new_more) ? new_more.ensure_hash(:indifferent, nil, :ensure_string) : new_more.ensure_string
|
98
|
+
@more = hash?(new_more) ? new_more.ensure_hash(accesses: :indifferent, default: nil, sanitizer: :ensure_string) : new_more.ensure_string
|
99
99
|
end
|
100
100
|
|
101
101
|
# Sets the `author` attribute.
|
@@ -105,8 +105,8 @@ module Mbrao
|
|
105
105
|
@author =
|
106
106
|
if new_author.is_a?(Mbrao::Author)
|
107
107
|
new_author
|
108
|
-
elsif hash?(new_author)
|
109
|
-
Mbrao::Author.create(new_author.ensure_hash(:indifferent))
|
108
|
+
elsif hash?(new_author)
|
109
|
+
Mbrao::Author.create(new_author.ensure_hash(accesses: :indifferent))
|
110
110
|
else
|
111
111
|
new_author ? Mbrao::Author.new(new_author.ensure_string) : nil
|
112
112
|
end
|
@@ -130,15 +130,44 @@ module Mbrao
|
|
130
130
|
#
|
131
131
|
# @param new_metadata [Hash] The new value for the attribute.
|
132
132
|
def metadata=(new_metadata)
|
133
|
-
@metadata = hash?(new_metadata) ? new_metadata.ensure_hash(:indifferent) : @metadata = HashWithIndifferentAccess.new({raw: new_metadata})
|
133
|
+
@metadata = hash?(new_metadata) ? new_metadata.ensure_hash(accesses: :indifferent) : @metadata = HashWithIndifferentAccess.new({raw: new_metadata})
|
134
134
|
end
|
135
135
|
|
136
|
-
|
136
|
+
# Assigns metadata to a content
|
137
|
+
#
|
138
|
+
# @param content [Content] The content to manipulate.
|
139
|
+
# @param metadata [Hash] The metadata to assign.
|
140
|
+
# @return [Content] The content with metadata.
|
141
|
+
def self.assign_metadata(content, metadata)
|
142
|
+
[:uid, :title, :summary, :tags, :more, :created_at, :updated_at].each do |field|
|
143
|
+
content.send("#{field}=", metadata.delete(field))
|
144
|
+
end
|
137
145
|
|
138
|
-
|
146
|
+
content.author = Mbrao::Author.create(metadata.delete(:author))
|
147
|
+
content.locales = extract_locales(metadata.delete(:locales))
|
148
|
+
content.metadata = metadata
|
149
|
+
end
|
150
|
+
|
151
|
+
# Extracts locales from metadata.
|
139
152
|
#
|
140
|
-
# @param
|
141
|
-
# @return [
|
153
|
+
# @param locales [String] The list of locales.
|
154
|
+
# @return [Array] The locales.
|
155
|
+
def self.extract_locales(locales)
|
156
|
+
locales = locales.ensure_string.split(/\s*,\s*/) unless locales.is_a?(::Array)
|
157
|
+
normalize_locales(locales)
|
158
|
+
end
|
159
|
+
|
160
|
+
# Normalizes locales for further usage.
|
161
|
+
#
|
162
|
+
# @param locales [Array] The locales to normalize.
|
163
|
+
# @return [Array] The normalized locales.
|
164
|
+
def self.normalize_locales(locales)
|
165
|
+
locales.flatten.map(&:ensure_string).map(&:strip).uniq
|
166
|
+
end
|
167
|
+
|
168
|
+
private
|
169
|
+
|
170
|
+
# :nodoc:
|
142
171
|
def extract_datetime(value)
|
143
172
|
value = parse_datetime(value) if value
|
144
173
|
value ? value.utc : nil
|
@@ -146,10 +175,7 @@ module Mbrao
|
|
146
175
|
raise Mbrao::Exceptions::InvalidDate
|
147
176
|
end
|
148
177
|
|
149
|
-
#
|
150
|
-
#
|
151
|
-
# @param value [String|DateTime|Fixnum] The value to parse.
|
152
|
-
# @return [DateTime] The extracted value.
|
178
|
+
# :nodoc:
|
153
179
|
def parse_datetime(value)
|
154
180
|
rv =
|
155
181
|
case value.class.to_s
|
@@ -163,19 +189,13 @@ module Mbrao
|
|
163
189
|
rv
|
164
190
|
end
|
165
191
|
|
166
|
-
#
|
167
|
-
#
|
168
|
-
# @param value [String] The value to parse.
|
169
|
-
# @return [Float|Fixnum] The extracted value.
|
192
|
+
# :nodoc:
|
170
193
|
def parse_datetime_number(value)
|
171
194
|
number = value.to_float
|
172
195
|
number > 0 ? Time.at(number).to_datetime : nil
|
173
196
|
end
|
174
197
|
|
175
|
-
#
|
176
|
-
#
|
177
|
-
# @param value [String] The value to parse.
|
178
|
-
# @return [DateTime] The extracted value.
|
198
|
+
# :nodoc:
|
179
199
|
def parse_datetime_string(value)
|
180
200
|
value = value.ensure_string
|
181
201
|
|
@@ -190,52 +210,14 @@ module Mbrao
|
|
190
210
|
end
|
191
211
|
end
|
192
212
|
|
193
|
-
#
|
194
|
-
#
|
195
|
-
# @param value [String|Array] The string or array to parse.
|
196
|
-
# @return [Array] The list of tags.
|
213
|
+
# :nodoc:
|
197
214
|
def parse_tags(value)
|
198
|
-
value.ensure_array(
|
215
|
+
value.ensure_array(no_duplicates: true, compact: true, flatten: true) { |v| v.ensure_string.split(/\s*,\s*/) }
|
199
216
|
end
|
200
217
|
|
201
|
-
#
|
202
|
-
#
|
203
|
-
# @param value [Object] The object to check.
|
204
|
-
# @return [Boolean] `true` if value is an Hash, `false` otherwise
|
218
|
+
# :nodoc:
|
205
219
|
def hash?(value)
|
206
220
|
value.is_a?(Hash)
|
207
221
|
end
|
208
|
-
|
209
|
-
# Assigns metadata to a content
|
210
|
-
#
|
211
|
-
# @param content [Content] The content to manipulate.
|
212
|
-
# @param metadata [Hash] The metadata to assign.
|
213
|
-
# @return [Content] The content with metadata.
|
214
|
-
def self.assign_metadata(content, metadata)
|
215
|
-
[:uid, :title, :summary, :tags, :more, :created_at, :updated_at].each do |field|
|
216
|
-
content.send("#{field}=", metadata.delete(field))
|
217
|
-
end
|
218
|
-
|
219
|
-
content.author = Mbrao::Author.create(metadata.delete(:author))
|
220
|
-
content.locales = extract_locales(metadata.delete(:locales))
|
221
|
-
content.metadata = metadata
|
222
|
-
end
|
223
|
-
|
224
|
-
# Extracts locales from metadata.
|
225
|
-
#
|
226
|
-
# @param locales [String] The list of locales.
|
227
|
-
# @return [Array] The locales.
|
228
|
-
def self.extract_locales(locales)
|
229
|
-
locales = locales.ensure_string.split(/\s*,\s*/) unless locales.is_a?(::Array)
|
230
|
-
normalize_locales(locales)
|
231
|
-
end
|
232
|
-
|
233
|
-
# Normalizes locales for further usage.
|
234
|
-
#
|
235
|
-
# @param locales [Array] The locales to normalize.
|
236
|
-
# @return [Array] The normalized locales.
|
237
|
-
def self.normalize_locales(locales)
|
238
|
-
locales.flatten.map(&:ensure_string).map(&:strip).uniq
|
239
|
-
end
|
240
222
|
end
|
241
223
|
end
|
@@ -19,7 +19,7 @@ module Mbrao
|
|
19
19
|
|
20
20
|
"%F %T.%L", "%F %T", "%F %H:%M", "%F",
|
21
21
|
"%d/%m/%Y %T.%L", "%d/%m/%Y %T", "%d/%m/%Y %H:%M", "%d/%m/%Y"
|
22
|
-
]
|
22
|
+
].freeze
|
23
23
|
|
24
24
|
# Class methods.
|
25
25
|
module ClassMethods
|
@@ -30,7 +30,7 @@ module Mbrao
|
|
30
30
|
# @param content [Content|nil] An optional content to check for availability
|
31
31
|
# @return [Array] The validated list of locales.
|
32
32
|
def validate_locales(locales, content = nil)
|
33
|
-
locales = locales.ensure_array(
|
33
|
+
locales = locales.ensure_array(no_duplicates: true, compact: true, flatten: true) { |l| l.ensure_string.strip }
|
34
34
|
locales = (locales.empty? ? [Mbrao::Parser.locale] : locales)
|
35
35
|
raise Mbrao::Exceptions::UnavailableLocalization if content && !content.enabled_for_locales?(locales)
|
36
36
|
locales
|
@@ -54,7 +54,7 @@ module Mbrao
|
|
54
54
|
# @param locales [Array] The desired locales. Can include `*` to match all. If none are specified, the default mbrao locale will be used.
|
55
55
|
# @return [Boolean] `true` if the content is available for at least one of the desired locales, `false` otherwise.
|
56
56
|
def enabled_for_locales?(*locales)
|
57
|
-
locales = locales.flatten.ensure_array(
|
57
|
+
locales = locales.flatten.ensure_array(flatten: true) { |l| l.ensure_string.strip }.reject { |l| l == "*" }
|
58
58
|
@locales.blank? || locales.blank? || (@locales & locales).present?
|
59
59
|
end
|
60
60
|
|
@@ -110,12 +110,7 @@ module Mbrao
|
|
110
110
|
|
111
111
|
private
|
112
112
|
|
113
|
-
#
|
114
|
-
#
|
115
|
-
# @param attribute [Object|HashWithIndifferentAccess] The desired attribute.
|
116
|
-
# @param locales [String|Array] The desired locales. Can include `*` to match all. If none are specified, the default mbrao locale will be used.
|
117
|
-
# @return [String|HashWithIndifferentAccess] Return the object for desired locales. If only one locale is available, then only a object is returned,
|
118
|
-
# else a `HashWithIndifferentAccess` with locales as keys.
|
113
|
+
# :nodoc:
|
119
114
|
def filter_attribute_for_locales(attribute, locales)
|
120
115
|
locales = ::Mbrao::Content.validate_locales(locales, self)
|
121
116
|
|
@@ -127,14 +122,7 @@ module Mbrao
|
|
127
122
|
end
|
128
123
|
end
|
129
124
|
|
130
|
-
#
|
131
|
-
#
|
132
|
-
# @param hash [Hash] The hash to handle.
|
133
|
-
# @param locale [String] The list of locale (separated by commas) for which the value is available.
|
134
|
-
# @param locales [Array] The list of locale for which this value is requested. Can include `*` to match all. If none are specified, the default mbrao
|
135
|
-
# locale will be used.
|
136
|
-
# @param value [Object] The value to add.
|
137
|
-
# @return [Hash] Return the original hash.
|
125
|
+
# :nodoc:
|
138
126
|
def append_value_for_locale(hash, locale, locales, value)
|
139
127
|
locale.split(/\s*,\s*/).map(&:strip).each do |l|
|
140
128
|
hash[l] = value if locales.include?("*") || locales.include?(l)
|
data/lib/mbrao/parser.rb
CHANGED
@@ -35,12 +35,9 @@ module Mbrao
|
|
35
35
|
|
36
36
|
private
|
37
37
|
|
38
|
-
#
|
39
|
-
#
|
40
|
-
# @param options [Hash] The options to sanitize.
|
41
|
-
# @return [HashWithIndifferentAccess] The sanitized options.
|
38
|
+
# :nodoc:
|
42
39
|
def sanitize_parsing_options(options)
|
43
|
-
options = options.ensure_hash(:symbols)
|
40
|
+
options = options.ensure_hash(accesses: :symbols)
|
44
41
|
|
45
42
|
options[:engine] ||= Mbrao::Parser.parsing_engine
|
46
43
|
options[:metadata] = options.fetch(:metadata, true).to_boolean
|
@@ -49,12 +46,9 @@ module Mbrao
|
|
49
46
|
HashWithIndifferentAccess.new(options)
|
50
47
|
end
|
51
48
|
|
52
|
-
#
|
53
|
-
#
|
54
|
-
# @param options [Hash] The options to sanitize.
|
55
|
-
# @return [HashWithIndifferentAccess] The sanitized options.
|
49
|
+
# :nodoc:
|
56
50
|
def sanitize_rendering_options(options)
|
57
|
-
options = options.ensure_hash(:symbols)
|
51
|
+
options = options.ensure_hash(accesses: :symbols)
|
58
52
|
|
59
53
|
options[:engine] ||= Mbrao::Parser.rendering_engine
|
60
54
|
|
@@ -75,8 +75,8 @@ module Mbrao
|
|
75
75
|
# @return [Hash] An hash with all attributes.
|
76
76
|
def as_json(target, keys, options = {})
|
77
77
|
include_empty = !options[:exclude_empty].to_boolean
|
78
|
-
exclude = options[:exclude].ensure_array(
|
79
|
-
keys = keys.ensure_array(
|
78
|
+
exclude = options[:exclude].ensure_array(no_duplicates: true, compact: true, flatten: true, sanitizer: :ensure_string)
|
79
|
+
keys = keys.ensure_array(no_duplicates: true, compact: true, flatten: true, sanitizer: :ensure_string)
|
80
80
|
|
81
81
|
map_to_json(target, (keys - exclude), include_empty)
|
82
82
|
end
|
@@ -104,35 +104,25 @@ module Mbrao
|
|
104
104
|
|
105
105
|
private
|
106
106
|
|
107
|
-
#
|
108
|
-
#
|
109
|
-
# @param attr [Object ]The attribute to return.
|
110
|
-
# @param default_value [Object] The value to return if `attr` is blank.
|
111
|
-
# @param sanitizer [Symbol] An optional method to sanitize the returned value.
|
107
|
+
# :nodoc:
|
112
108
|
def attribute_or_default(attr, default_value = nil, sanitizer = :ensure_string)
|
113
109
|
rv = attr.present? ? attr : default_value
|
114
110
|
rv = rv.send(sanitizer) if sanitizer
|
115
111
|
rv
|
116
112
|
end
|
117
113
|
|
118
|
-
#
|
119
|
-
#
|
120
|
-
# @param target [Object] The target to serialize.
|
121
|
-
# @param keys [Array] The attributes to include in the serialization.
|
122
|
-
# @param include_empty [Boolean], if to include nil values.
|
123
|
-
# @return [Hash] An hash with all attributes.
|
114
|
+
# :nodoc:
|
124
115
|
def map_to_json(target, keys, include_empty)
|
125
|
-
keys.reduce({})
|
116
|
+
json = keys.reduce({}) do |rv, key|
|
126
117
|
value = get_json_field(target, key)
|
127
118
|
rv[key] = value if include_empty || value.present?
|
128
119
|
rv
|
129
|
-
|
120
|
+
end
|
121
|
+
|
122
|
+
json.deep_stringify_keys
|
130
123
|
end
|
131
124
|
|
132
|
-
#
|
133
|
-
#
|
134
|
-
# @param target [Object] The object containing the value.
|
135
|
-
# @param method [Symbol] The method containing the value.
|
125
|
+
# :nodoc:
|
136
126
|
def get_json_field(target, method)
|
137
127
|
value = target.send(method)
|
138
128
|
value = value.as_json if value && value.respond_to?(:as_json) && !value.is_a?(Symbol)
|
@@ -40,11 +40,8 @@ module Mbrao
|
|
40
40
|
raise ArgumentError unless rv.is_a?(Hash)
|
41
41
|
rv
|
42
42
|
rescue => e
|
43
|
-
|
44
|
-
|
45
|
-
else
|
46
|
-
raise ::Mbrao::Exceptions::InvalidMetadata, e.to_s
|
47
|
-
end
|
43
|
+
raise(::Mbrao::Exceptions::InvalidMetadata, e.to_s) unless options[:default]
|
44
|
+
options[:default]
|
48
45
|
end
|
49
46
|
|
50
47
|
# Filters content of a post by locale.
|
@@ -68,11 +65,7 @@ module Mbrao
|
|
68
65
|
|
69
66
|
private
|
70
67
|
|
71
|
-
#
|
72
|
-
#
|
73
|
-
# @param content [String] The content to separate.
|
74
|
-
# @param options [Hash] The options to sanitize.
|
75
|
-
# @return [Array] The sanitized arguments.
|
68
|
+
# :nodoc:
|
76
69
|
def prepare_for_separation(content, options)
|
77
70
|
content = content.ensure_string.strip
|
78
71
|
meta_tags = sanitize_tags(options[:meta_tags], ["{{metadata}}", "{{/metadata}}"])
|
@@ -80,21 +73,13 @@ module Mbrao
|
|
80
73
|
[nil, content.ensure_string.strip, StringScanner.new(content), meta_tags.first, meta_tags.last]
|
81
74
|
end
|
82
75
|
|
83
|
-
#
|
84
|
-
#
|
85
|
-
# @param tag [Array|String] The tag to sanitize.
|
86
|
-
# @return [Array] Sanitized tags.
|
76
|
+
# :nodoc:
|
87
77
|
def sanitize_tags(tag, default = ["---"])
|
88
78
|
tag = tag.ensure_string.split(/\s*,\s*/).map(&:strip) if tag && !tag.is_a?(Array)
|
89
79
|
(tag.present? ? tag : default).slice(0, 2).map { |t| /#{Regexp.quote(t).gsub("%ARGS%", "\\s*(?<args>[^\\n\\}]+,?)*")}/ }
|
90
80
|
end
|
91
81
|
|
92
|
-
#
|
93
|
-
#
|
94
|
-
# @param content [String] The string to scan
|
95
|
-
# @param start_tag [Regexp] The tag to match for starting section.
|
96
|
-
# @param end_tag [Regexp] The tag to match for ending section.
|
97
|
-
# @return [String] The result of the scan.
|
82
|
+
# :nodoc:
|
98
83
|
def scan_content(content, start_tag, end_tag)
|
99
84
|
rv = []
|
100
85
|
scanner = StringScanner.new(content)
|
@@ -105,12 +90,7 @@ module Mbrao
|
|
105
90
|
rv
|
106
91
|
end
|
107
92
|
|
108
|
-
#
|
109
|
-
#
|
110
|
-
# @param rv [String] The string where to put the results.
|
111
|
-
# @param scanner [StringScanner] The scanner to use.
|
112
|
-
# @param start_tag [Regexp] The tag to match for starting section.
|
113
|
-
# @param end_tag [Regexp] The tag to match for ending section.
|
93
|
+
# :nodoc:
|
114
94
|
def perform_scan(rv, scanner, start_tag, end_tag)
|
115
95
|
if scanner.exist?(start_tag) # It may start an embedded content
|
116
96
|
# Scan until the start tag, remove the tag from the match and then store to results.
|
@@ -130,24 +110,13 @@ module Mbrao
|
|
130
110
|
end
|
131
111
|
end
|
132
112
|
|
133
|
-
#
|
134
|
-
#
|
135
|
-
# @param [String] starting The match starting expression.
|
136
|
-
# @param [String] embedded The embedded contents.
|
137
|
-
# @param start_tag [Regexp] The tag to match for starting section.
|
138
|
-
# @param end_tag [Regexp] The tag to match for ending section.
|
139
|
-
# @return [Array] An array which the first element is the list of valid contents and second is the list of valid locales.
|
113
|
+
# :nodoc:
|
140
114
|
def get_embedded_content(starting, embedded, start_tag, end_tag)
|
141
115
|
# Either we have some content or the content was not closed and therefore we ignore this tag.
|
142
116
|
embedded.present? ? [scan_content(embedded, start_tag, end_tag), starting.match(start_tag)["args"]] : [starting, "*"]
|
143
117
|
end
|
144
118
|
|
145
|
-
#
|
146
|
-
#
|
147
|
-
# @param scanner [StringScanner] The scanner to use.
|
148
|
-
# @param start_tag [Regexp] The tag to match for starting section.
|
149
|
-
# @param end_tag [Regexp] The tag to match for ending section.
|
150
|
-
# @return [String] The embedded content or `nil`, if the content was never closed.
|
119
|
+
# :nodoc:
|
151
120
|
def parse_embedded_content(scanner, start_tag, end_tag)
|
152
121
|
rv = ""
|
153
122
|
balance = 1
|
@@ -155,7 +124,7 @@ module Mbrao
|
|
155
124
|
|
156
125
|
while balance > 0 && embedded_part
|
157
126
|
balance += embedded_part.scan(start_tag).count - 1 # -1 Because there is a closure
|
158
|
-
embedded_part = embedded_part
|
127
|
+
embedded_part = extract_embedded_part(scanner, embedded_part, end_tag, balance) # This is the last occurrence.
|
159
128
|
rv << embedded_part
|
160
129
|
embedded_part = scanner.scan_until(end_tag) if balance > 0
|
161
130
|
end
|
@@ -163,28 +132,27 @@ module Mbrao
|
|
163
132
|
rv
|
164
133
|
end
|
165
134
|
|
166
|
-
#
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
135
|
+
# :nodoc:
|
136
|
+
def extract_embedded_part(scanner, embedded_part, end_tag, balance)
|
137
|
+
embedded_part = embedded_part.partition(end_tag).first if balance == 0 || !scanner.exist?(end_tag)
|
138
|
+
embedded_part
|
139
|
+
end
|
140
|
+
|
141
|
+
# :nodoc:
|
171
142
|
def perform_filter_content(content, locales)
|
172
|
-
content.map
|
143
|
+
rv = content.map do |part|
|
173
144
|
part_content = part[0]
|
174
145
|
part_locales = parse_locales(part[1])
|
175
146
|
|
176
147
|
if locales_valid?(locales, part_locales)
|
177
148
|
part_content.is_a?(Array) ? perform_filter_content(part_content, locales) : part_content
|
178
|
-
else
|
179
|
-
nil
|
180
149
|
end
|
181
|
-
|
150
|
+
end
|
151
|
+
|
152
|
+
rv.compact.join("")
|
182
153
|
end
|
183
154
|
|
184
|
-
#
|
185
|
-
#
|
186
|
-
# @param locales [String] The desired locales. Can include `*` to match all. Note that `!*` is ignored.
|
187
|
-
# @return [Hash] An hash with valid and invalid locales.
|
155
|
+
# :nodoc:
|
188
156
|
def parse_locales(locales)
|
189
157
|
types = locales.split(/\s*,\s*/).map(&:strip).group_by { |l| l !~ /^!/ ? "valid" : "invalid" }
|
190
158
|
types["valid"] ||= []
|
@@ -192,11 +160,7 @@ module Mbrao
|
|
192
160
|
types
|
193
161
|
end
|
194
162
|
|
195
|
-
#
|
196
|
-
#
|
197
|
-
# @param locales [Array] The desired locales. Can include `*` to match all.
|
198
|
-
# @param part_locales[Hash] An hash with valid and invalid locales.
|
199
|
-
# @return [Boolean] `true` if the locales are valid, `false` otherwise.
|
163
|
+
# :nodoc:
|
200
164
|
def locales_valid?(locales, part_locales)
|
201
165
|
valid = part_locales["valid"]
|
202
166
|
invalid = part_locales["invalid"]
|