markdown_record 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +63 -43
- data/app/helpers/markdown_record/application_helper.rb +23 -0
- data/app/helpers/markdown_record/controller_helpers.rb +1 -1
- data/app/helpers/markdown_record/view_helpers.rb +9 -3
- data/{lib → app/models}/markdown_record/base.rb +10 -0
- data/{lib → app/models}/markdown_record/content_fragment.rb +17 -2
- data/lib/generators/markdown_record_generator.rb +6 -0
- data/lib/markdown_record/configuration.rb +4 -0
- data/lib/markdown_record/file_sorting/base.rb +25 -0
- data/lib/markdown_record/file_sorting/date_sorter.rb +14 -0
- data/lib/markdown_record/file_sorting/sem_ver_sorter.rb +47 -0
- data/lib/markdown_record/{association.rb → models/association.rb} +20 -3
- data/lib/markdown_record/{associations.rb → models/associations.rb} +17 -9
- data/lib/markdown_record/{content_associations.rb → models/content_associations.rb} +4 -2
- data/lib/markdown_record/models/filtering.rb +13 -0
- data/lib/markdown_record/models/filters/array_filter.rb +11 -0
- data/lib/markdown_record/models/filters/base_filter.rb +35 -0
- data/lib/markdown_record/models/filters/hash_filter.rb +81 -0
- data/lib/markdown_record/models/filters/nil_filter.rb +11 -0
- data/lib/markdown_record/models/filters/range_filter.rb +11 -0
- data/lib/markdown_record/models/filters/regexp_filter.rb +11 -0
- data/lib/markdown_record/models/filters/symbol_filter.rb +14 -0
- data/lib/markdown_record/models/filters.rb +22 -0
- data/lib/markdown_record/models/model_inflator.rb +65 -0
- data/lib/markdown_record/path_utilities.rb +20 -11
- data/lib/markdown_record/rendering/content_dsl/attribute.rb +22 -0
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/directory_fragment.rb +3 -3
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/disable.rb +2 -2
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/enable.rb +2 -2
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/end_attribute.rb +3 -3
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/end_model.rb +3 -3
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/fragment.rb +3 -3
- data/lib/markdown_record/rendering/content_dsl/model.rb +22 -0
- data/lib/markdown_record/rendering/content_dsl/scope.rb +22 -0
- data/lib/markdown_record/{content_dsl → rendering/content_dsl}/use_layout.rb +3 -3
- data/lib/markdown_record/rendering/content_dsl.rb +45 -0
- data/lib/markdown_record/rendering/html_renderer.rb +22 -0
- data/lib/markdown_record/{indexer.rb → rendering/indexer.rb} +0 -10
- data/lib/markdown_record/rendering/json_renderer.rb +20 -0
- data/lib/markdown_record/rendering/nodes/html_base.rb +95 -0
- data/lib/markdown_record/rendering/nodes/html_directory.rb +51 -0
- data/lib/markdown_record/rendering/nodes/html_file.rb +48 -0
- data/lib/markdown_record/rendering/nodes/json_base.rb +55 -0
- data/lib/markdown_record/rendering/nodes/json_directory.rb +69 -0
- data/lib/markdown_record/rendering/nodes/json_file.rb +172 -0
- data/lib/markdown_record/{rendering.rb → rendering/rendering.rb} +1 -1
- data/lib/markdown_record/{validator.rb → rendering/validator.rb} +4 -4
- data/lib/markdown_record/version.rb +1 -1
- data/lib/markdown_record.rb +21 -14
- data/templates/demo/content/10_custom_models_and_associations.md.erb +27 -7
- data/templates/demo/content/11_controller_helpers.md.erb +2 -2
- data/templates/demo/content/12_configuration.md.erb +22 -3
- data/templates/demo/content/13_sandbox/1_foo.md +2 -1
- data/templates/demo/content/13_sandbox/2_sandbox_nested/1_bar.md +4 -1
- data/templates/demo/content/1_home.md.erb +30 -13
- data/templates/demo/content/2_installation.md.erb +61 -46
- data/templates/demo/content/3_rendering_basics.md.erb +3 -3
- data/templates/demo/content/4_content_dsl.md.erb +22 -11
- data/templates/demo/content/5_routes.md.erb +10 -7
- data/templates/demo/content/6_model_basics.md.erb +11 -11
- data/templates/demo/content/7_content_frags.md.erb +9 -6
- data/templates/demo/content/8_erb_syntax_and_view_helpers.md.erb +32 -11
- data/templates/demo/content/9_layouts.md.erb +3 -3
- data/templates/demo/layouts/_global_layout.html.erb +1 -0
- data/templates/demo/models/dsl_command.rb +6 -0
- data/templates/demo/models/section.rb +5 -0
- data/templates/render_content.thor +2 -1
- data/templates/tests/assets/images/ruby-logo.png +0 -0
- data/templates/tests/content/1_test_files_home.md.erb +31 -0
- data/templates/tests/content/2_content_dsl_tests/1_content_dsl.md.erb +162 -0
- data/templates/tests/content/2_content_dsl_tests/2_nested_directory/1_associations.md.erb +83 -0
- data/templates/tests/layouts/_concatenated_layout.html.erb +12 -0
- data/templates/tests/layouts/_custom_layout.html.erb +14 -0
- data/templates/tests/layouts/_file_layout.html.erb +15 -0
- data/templates/tests/layouts/_global_layout.html.erb +116 -0
- metadata +53 -34
- data/app/models/markdown_record/demo/dsl_command.rb +0 -10
- data/app/models/markdown_record/demo/section.rb +0 -9
- data/app/models/markdown_record/tests/child_model.rb +0 -15
- data/app/models/markdown_record/tests/fake_active_record_model.rb +0 -13
- data/app/models/markdown_record/tests/model.rb +0 -15
- data/app/models/markdown_record/tests/other_child_model.rb +0 -15
- data/lib/markdown_record/cli.rb +0 -54
- data/lib/markdown_record/content_dsl/attribute.rb +0 -22
- data/lib/markdown_record/content_dsl/model.rb +0 -23
- data/lib/markdown_record/content_dsl/render_format.rb +0 -22
- data/lib/markdown_record/content_dsl/render_strategy.rb +0 -22
- data/lib/markdown_record/content_dsl.rb +0 -37
- data/lib/markdown_record/html_renderer.rb +0 -194
- data/lib/markdown_record/json_renderer.rb +0 -270
- data/lib/markdown_record/model_inflator.rb +0 -107
- data/lib/markdown_record/routes_renderer.rb +0 -0
- /data/lib/markdown_record/{file_saver.rb → rendering/file_saver.rb} +0 -0
@@ -0,0 +1,35 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module Models
|
3
|
+
module Filters
|
4
|
+
class BaseFilter
|
5
|
+
|
6
|
+
def initialize(filter_value, attribute_value)
|
7
|
+
@filter_value = filter_value
|
8
|
+
@attribute_value = attribute_value
|
9
|
+
end
|
10
|
+
|
11
|
+
def passes_filter?
|
12
|
+
case @attribute_value.class.name
|
13
|
+
when Integer.name
|
14
|
+
@filter_value.to_i == @attribute_value
|
15
|
+
when Float
|
16
|
+
@filter_value.to_f == @attribute_value
|
17
|
+
when String.name
|
18
|
+
@filter_value.to_s == @attribute_value
|
19
|
+
when TrueClass.name
|
20
|
+
[:true, "true", true].include?(@filter_value)
|
21
|
+
when FalseClass.name
|
22
|
+
[:false, "false", false].include?(@filter_value)
|
23
|
+
else
|
24
|
+
@filter_value == @attribute_value
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def filter_for(filter_value, attribute_value)
|
29
|
+
klass = MarkdownRecord::Models::Filters::FILTER_MAPPING[filter_value.class.name] || MarkdownRecord::Models::Filters::BaseFilter
|
30
|
+
klass.new(filter_value, attribute_value)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module Models
|
3
|
+
module Filters
|
4
|
+
class HashFilter < MarkdownRecord::Models::Filters::BaseFilter
|
5
|
+
|
6
|
+
class SubHashFilter < MarkdownRecord::Models::Filters::BaseFilter
|
7
|
+
def passes_filter?
|
8
|
+
return true if @filter_value.nil?
|
9
|
+
|
10
|
+
passes = true
|
11
|
+
@filter_value.each do |key, value|
|
12
|
+
passes &&= filter_for(value, @attribute_value[key]).passes_filter?
|
13
|
+
end
|
14
|
+
passes
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class SubArrayfilter < MarkdownRecord::Models::Filters::BaseFilter
|
19
|
+
def passes_filter?
|
20
|
+
return false if @filter_value.nil?
|
21
|
+
return false unless @filter_value[:__include__].present?
|
22
|
+
|
23
|
+
@attribute_value.include?(@filter_value[:__include__])
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class SubNotFilter < MarkdownRecord::Models::Filters::BaseFilter
|
28
|
+
def passes_filter?
|
29
|
+
return true if @filter_value.nil?
|
30
|
+
|
31
|
+
passes = true
|
32
|
+
@filter_value.each do |key, value|
|
33
|
+
passes &&= !filter_for(value, @attribute_value[key]).passes_filter?
|
34
|
+
end
|
35
|
+
passes
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
class SubOrFilter < MarkdownRecord::Models::Filters::BaseFilter
|
40
|
+
def passes_filter?
|
41
|
+
return true if @filter_value.nil?
|
42
|
+
|
43
|
+
passes = false
|
44
|
+
@filter_value.each do |filters|
|
45
|
+
passes ||= filter_for(filters, @attribute_value).passes_filter?
|
46
|
+
end
|
47
|
+
passes
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
HASH_FILTER_MAPPING = {
|
52
|
+
ActiveSupport::HashWithIndifferentAccess => SubHashFilter,
|
53
|
+
Array => SubArrayfilter
|
54
|
+
}
|
55
|
+
|
56
|
+
def passes_filter?
|
57
|
+
not_filters = @filter_value.delete(:__not__)
|
58
|
+
or_filters = @filter_value.delete(:__or__)
|
59
|
+
and_filters = @filter_value.delete(:__and__)
|
60
|
+
|
61
|
+
if @attribute_value.is_a?(Hash)
|
62
|
+
@attribute_value = @attribute_value.with_indifferent_access
|
63
|
+
end
|
64
|
+
|
65
|
+
passes = true
|
66
|
+
passes &&= sub_filter&.passes_filter?
|
67
|
+
|
68
|
+
passes &&= SubNotFilter.new(not_filters, @attribute_value).passes_filter?
|
69
|
+
passes &&= SubOrFilter.new(or_filters, @attribute_value).passes_filter?
|
70
|
+
passes &&= SubHashFilter.new(and_filters, @attribute_value).passes_filter?
|
71
|
+
|
72
|
+
passes
|
73
|
+
end
|
74
|
+
|
75
|
+
def sub_filter
|
76
|
+
HASH_FILTER_MAPPING[@attribute_value.class]&.new(@filter_value, @attribute_value)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module Models
|
3
|
+
module Filters
|
4
|
+
class SymbolFilter < MarkdownRecord::Models::Filters::BaseFilter
|
5
|
+
def passes_filter?
|
6
|
+
passes = false
|
7
|
+
passes ||= @filter_value == :not_null && !@attribute_value.nil?
|
8
|
+
passes ||= @filter_value == :null && @attribute_value.nil?
|
9
|
+
passes
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "markdown_record/models/filters/base_filter"
|
2
|
+
require "markdown_record/models/filters/array_filter"
|
3
|
+
require "markdown_record/models/filters/hash_filter"
|
4
|
+
require "markdown_record/models/filters/nil_filter"
|
5
|
+
require "markdown_record/models/filters/range_filter"
|
6
|
+
require "markdown_record/models/filters/regexp_filter"
|
7
|
+
require "markdown_record/models/filters/symbol_filter"
|
8
|
+
|
9
|
+
module MarkdownRecord
|
10
|
+
module Models
|
11
|
+
module Filters
|
12
|
+
FILTER_MAPPING = {
|
13
|
+
Array.name => MarkdownRecord::Models::Filters::ArrayFilter,
|
14
|
+
Symbol.name => MarkdownRecord::Models::Filters::SymbolFilter,
|
15
|
+
Hash.name => MarkdownRecord::Models::Filters::HashFilter,
|
16
|
+
nil.class.name => MarkdownRecord::Models::Filters::NilFilter,
|
17
|
+
Regexp.name => MarkdownRecord::Models::Filters::RegexpFilter,
|
18
|
+
Range.name => MarkdownRecord::Models::Filters::RangeFilter,
|
19
|
+
}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require "markdown_record/path_utilities"
|
2
|
+
|
3
|
+
module MarkdownRecord
|
4
|
+
class ModelInflator
|
5
|
+
include ::MarkdownRecord::PathUtilities
|
6
|
+
include ::MarkdownRecord::Models::Filtering
|
7
|
+
|
8
|
+
def initialize(force_render = false)
|
9
|
+
@force_render = force_render
|
10
|
+
end
|
11
|
+
|
12
|
+
def where(filters, subdirectory = nil)
|
13
|
+
models = constantized_models(filters, subdirectory)
|
14
|
+
|
15
|
+
models.select do |model|
|
16
|
+
passes_filters?(filters.dup, model.attributes.with_indifferent_access)
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def json_source(path)
|
21
|
+
if Pathname.new(path).exist? && !@force_render
|
22
|
+
json_hash = JSON.parse(File.read(path))
|
23
|
+
return json_hash
|
24
|
+
end
|
25
|
+
|
26
|
+
json_hash = ::MarkdownRecord::JsonRenderer.new.render_models_for_subdirectory(subdirectory: "",:concat => true, :deep => true, :save => false, :render_content_fragment_json => true)
|
27
|
+
|
28
|
+
json_hash
|
29
|
+
end
|
30
|
+
|
31
|
+
def json(filters, subdirectory)
|
32
|
+
path = json_path(filters, subdirectory)
|
33
|
+
json_hash = json_source(path)
|
34
|
+
|
35
|
+
json_hash.delete(::MarkdownRecord::ContentFragment.json_klass) if filters.delete(:exclude_fragments)
|
36
|
+
json_hash = filters[:klass].present? ? json_hash[filters.delete(:klass).json_klass] : json_hash.values.flatten
|
37
|
+
json_hash ||= []
|
38
|
+
json_hash
|
39
|
+
end
|
40
|
+
|
41
|
+
def json_path(filters, subdirectory)
|
42
|
+
if subdirectory.nil?
|
43
|
+
file_path = base_rendered_path
|
44
|
+
file_path = "#{file_path}_fragments" if filters[:klass] == ::MarkdownRecord::ContentFragment
|
45
|
+
"#{file_path}.json"
|
46
|
+
else
|
47
|
+
file_path = subdirectory
|
48
|
+
file_path = "#{file_path}_fragments" if filters[:klass] == ::MarkdownRecord::ContentFragment
|
49
|
+
"#{base_rendered_path}/#{file_path}.json"
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def constantized_models(filters, subdirectory)
|
54
|
+
json_hash = json(filters, subdirectory)
|
55
|
+
|
56
|
+
json_hash.map do |model|
|
57
|
+
model["type"].camelize.safe_constantize&.new(model)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
def passes_filters?(filters, attributes)
|
62
|
+
filter_for(filters, attributes).passes_filter?
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -7,17 +7,17 @@ module MarkdownRecord
|
|
7
7
|
rendered_path = Pathname.new("/").join(full_path)
|
8
8
|
|
9
9
|
filename = clean_path(rendered_path.basename)
|
10
|
-
filename =
|
10
|
+
filename = remove_prefix(filename)
|
11
11
|
|
12
12
|
subdirectory = clean_path(rendered_path.parent)
|
13
|
-
subdirectory =
|
13
|
+
subdirectory = remove_prefix(subdirectory)
|
14
14
|
|
15
15
|
[filename, subdirectory, full_path.to_s.split(".").last]
|
16
16
|
end
|
17
17
|
|
18
18
|
def rendered_path(full_path)
|
19
19
|
rendered_path = clean_path(full_path.to_s)
|
20
|
-
rendered_path =
|
20
|
+
rendered_path = remove_prefix(rendered_path)
|
21
21
|
Pathname.new(rendered_path)
|
22
22
|
end
|
23
23
|
|
@@ -25,7 +25,17 @@ module MarkdownRecord
|
|
25
25
|
rendered_path(full_path).to_s
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def to_scoped_id(scope, id)
|
29
|
+
return id.to_s unless scope.present?
|
30
|
+
|
31
|
+
"#{scope}:s:#{id}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def scoped_id_to_parts(scoped_id)
|
35
|
+
scoped_id.split(":s:")
|
36
|
+
end
|
37
|
+
|
38
|
+
def base_content_root_name
|
29
39
|
basename = ::MarkdownRecord.config.content_root.basename
|
30
40
|
|
31
41
|
# must use "/" so that `.parent` returns correctly
|
@@ -38,13 +48,14 @@ module MarkdownRecord
|
|
38
48
|
|
39
49
|
frag_id = path_to_fragment_id(full_path)
|
40
50
|
|
41
|
-
fragment = ::MarkdownRecord::ContentFragment.
|
51
|
+
fragment = ::MarkdownRecord::ContentFragment.force_render_find(frag_id)
|
42
52
|
|
43
53
|
{
|
44
54
|
filename: filename,
|
45
55
|
subdirectory: subdirectory,
|
46
56
|
frag_id: frag_id,
|
47
|
-
fragment: fragment
|
57
|
+
fragment: fragment,
|
58
|
+
scope: fragment.__scope__
|
48
59
|
}
|
49
60
|
end
|
50
61
|
|
@@ -55,7 +66,7 @@ module MarkdownRecord
|
|
55
66
|
|
56
67
|
{
|
57
68
|
id: frag_id,
|
58
|
-
type: MarkdownRecord::ContentFragment.name.underscore,
|
69
|
+
type: ::MarkdownRecord::ContentFragment.name.underscore,
|
59
70
|
subdirectory: subdirectory,
|
60
71
|
filename: filename
|
61
72
|
}.stringify_keys
|
@@ -73,11 +84,9 @@ module MarkdownRecord
|
|
73
84
|
clean_path(::MarkdownRecord.config.rendered_content_root.to_s)
|
74
85
|
end
|
75
86
|
|
76
|
-
def
|
87
|
+
def remove_prefix(filename_or_id)
|
77
88
|
if MarkdownRecord.config.ignore_numeric_prefix
|
78
|
-
|
79
|
-
parts = parts.map { |p| p.gsub(/^\d+_/,"")}
|
80
|
-
parts.join("/")
|
89
|
+
MarkdownRecord.config.filename_sorter.remove_prefix(filename_or_id)
|
81
90
|
else
|
82
91
|
filename_or_id
|
83
92
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module ContentDsl
|
3
|
+
module Attribute
|
4
|
+
REGEX = /<!--\s*attribute\s*:\s*(\w+)\s*(?::((?:html|md|int|float|string)?))?-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*attribute\s*:\s*(\w+)\s*(?::((?:html|md|int|float|string)?))?-->/
|
6
|
+
|
7
|
+
def attribute_dsl(text)
|
8
|
+
match = text.match(REGEX)
|
9
|
+
|
10
|
+
if match
|
11
|
+
[match[1].strip, match[2]&.strip]
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.remove_dsl(text)
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MarkdownRecord
|
2
2
|
module ContentDsl
|
3
3
|
module DirectoryFragment
|
4
|
-
REGEX =
|
5
|
-
ENCODED_REGEX =
|
4
|
+
REGEX = /<!--\s*directory_fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*directory_fragment\s+({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
6
6
|
|
7
7
|
def directory_fragment_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -2,7 +2,7 @@ module MarkdownRecord
|
|
2
2
|
module ContentDsl
|
3
3
|
module Disable
|
4
4
|
REGEX = /<!--\s*disable\s*-->/
|
5
|
-
ENCODED_REGEX =
|
5
|
+
ENCODED_REGEX = /<!--\s*disable\s*-->/
|
6
6
|
|
7
7
|
def disable_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -2,7 +2,7 @@ module MarkdownRecord
|
|
2
2
|
module ContentDsl
|
3
3
|
module Enable
|
4
4
|
REGEX = /<!--\s*enable\s*-->/
|
5
|
-
ENCODED_REGEX =
|
5
|
+
ENCODED_REGEX = /<!--\s*enable\s*-->/
|
6
6
|
|
7
7
|
def enable_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MarkdownRecord
|
2
2
|
module ContentDsl
|
3
3
|
module EndAttribute
|
4
|
-
REGEX =
|
5
|
-
ENCODED_REGEX =
|
4
|
+
REGEX = /<!--\s*end_attribute\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*end_attribute\s*-->/
|
6
6
|
|
7
7
|
def end_attribute_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MarkdownRecord
|
2
2
|
module ContentDsl
|
3
3
|
module EndModel
|
4
|
-
REGEX =
|
5
|
-
ENCODED_REGEX =
|
4
|
+
REGEX = /<!--\s*end_model\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*end_model\s*-->/
|
6
6
|
|
7
7
|
def end_model_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MarkdownRecord
|
2
2
|
module ContentDsl
|
3
3
|
module Fragment
|
4
|
-
REGEX =
|
5
|
-
ENCODED_REGEX =
|
4
|
+
REGEX = /<!--\s*fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*fragment\s+({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
6
6
|
|
7
7
|
def fragment_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module ContentDsl
|
3
|
+
module Model
|
4
|
+
REGEX = /<!--\s*model\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*model\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
|
6
|
+
|
7
|
+
def model_dsl(text)
|
8
|
+
match = text.match(REGEX)
|
9
|
+
|
10
|
+
if match
|
11
|
+
JSON.parse(match[1])
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.remove_dsl(text)
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module MarkdownRecord
|
2
|
+
module ContentDsl
|
3
|
+
module Scope
|
4
|
+
REGEX = /<!--\s*scope\s*:\s*(.*)\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*scope\s*:\s*(.*)\s*-->/
|
6
|
+
|
7
|
+
def scope_dsl(text)
|
8
|
+
match = text.match(REGEX)
|
9
|
+
|
10
|
+
if match
|
11
|
+
match[1].strip
|
12
|
+
else
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.remove_dsl(text)
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
module MarkdownRecord
|
2
2
|
module ContentDsl
|
3
3
|
module UseLayout
|
4
|
-
REGEX =
|
5
|
-
ENCODED_REGEX =
|
4
|
+
REGEX = /<!--\s*use_layout\s*:\s*(.*)\s*-->/
|
5
|
+
ENCODED_REGEX = /<!--\s*use_layout\s*:\s*(.*)\s*-->/
|
6
6
|
|
7
7
|
def use_layout_dsl(text)
|
8
8
|
match = text.match(REGEX)
|
@@ -15,7 +15,7 @@ module MarkdownRecord
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.remove_dsl(text)
|
18
|
-
text.gsub(ENCODED_REGEX, "")
|
18
|
+
text.gsub(REGEX, "").gsub(ENCODED_REGEX, "")
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require "markdown_record/rendering/content_dsl/scope"
|
2
|
+
require "markdown_record/rendering/content_dsl/model"
|
3
|
+
require "markdown_record/rendering/content_dsl/attribute"
|
4
|
+
require "markdown_record/rendering/content_dsl/end_attribute"
|
5
|
+
require "markdown_record/rendering/content_dsl/end_model"
|
6
|
+
require "markdown_record/rendering/content_dsl/fragment"
|
7
|
+
require "markdown_record/rendering/content_dsl/directory_fragment"
|
8
|
+
require "markdown_record/rendering/content_dsl/use_layout"
|
9
|
+
require "markdown_record/rendering/content_dsl/disable"
|
10
|
+
require "markdown_record/rendering/content_dsl/enable"
|
11
|
+
|
12
|
+
module MarkdownRecord
|
13
|
+
module ContentDsl
|
14
|
+
include Scope
|
15
|
+
include Model
|
16
|
+
include Attribute
|
17
|
+
include EndAttribute
|
18
|
+
include EndModel
|
19
|
+
include DirectoryFragment
|
20
|
+
include Fragment
|
21
|
+
include UseLayout
|
22
|
+
include Disable
|
23
|
+
include Enable
|
24
|
+
|
25
|
+
HTML_COMMENT_REGEX = /(<!--(?:(?:\s|.)(?!-->))*(?:.|\s)-->)/
|
26
|
+
|
27
|
+
def remove_json_dsl_commands(text)
|
28
|
+
text = Scope.remove_dsl(text)
|
29
|
+
text = Model.remove_dsl(text)
|
30
|
+
text = Attribute.remove_dsl(text)
|
31
|
+
text = EndAttribute.remove_dsl(text)
|
32
|
+
text = EndModel.remove_dsl(text)
|
33
|
+
text = DirectoryFragment.remove_dsl(text)
|
34
|
+
text = Fragment.remove_dsl(text)
|
35
|
+
text = Disable.remove_dsl(text)
|
36
|
+
text = Enable.remove_dsl(text)
|
37
|
+
text
|
38
|
+
end
|
39
|
+
|
40
|
+
def remove_html_dsl_command(text)
|
41
|
+
text = UseLayout.remove_dsl(text)
|
42
|
+
text
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require "redcarpet"
|
2
|
+
require "htmlbeautifier"
|
3
|
+
|
4
|
+
module MarkdownRecord
|
5
|
+
class HtmlRenderer < ::Redcarpet::Render::HTML
|
6
|
+
|
7
|
+
def initialize(
|
8
|
+
file_saver: ::MarkdownRecord::FileSaver.new)
|
9
|
+
super(::MarkdownRecord.config.html_render_options)
|
10
|
+
@markdown = ::Redcarpet::Markdown.new(self, ::MarkdownRecord.config.markdown_extensions)
|
11
|
+
@file_saver = file_saver
|
12
|
+
end
|
13
|
+
|
14
|
+
def render_html_for_subdirectory(subdirectory: "", **options)
|
15
|
+
|
16
|
+
start_path = ::MarkdownRecord.config.content_root.join(subdirectory)
|
17
|
+
node = MarkdownRecord::Rendering::Nodes::HtmlDirectory.new(start_path, @markdown, options)
|
18
|
+
|
19
|
+
node.render(@file_saver)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -8,16 +8,6 @@ module MarkdownRecord
|
|
8
8
|
index
|
9
9
|
end
|
10
10
|
|
11
|
-
def file(path)
|
12
|
-
file_path = ::MarkdownRecord.config.content_root.join(path)
|
13
|
-
|
14
|
-
if Pathname.new(path).extname == ".md" && file_path.exist?
|
15
|
-
File.read(file_path)
|
16
|
-
else
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
11
|
def recursive_index(parent_dir_path, index)
|
22
12
|
parent_root = Dir.new(parent_dir_path)
|
23
13
|
parent_root.children.each do |child|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "redcarpet"
|
2
|
+
require "redcarpet/render_strip"
|
3
|
+
|
4
|
+
module MarkdownRecord
|
5
|
+
class JsonRenderer
|
6
|
+
include ::MarkdownRecord::PathUtilities
|
7
|
+
include ::MarkdownRecord::ContentDsl
|
8
|
+
|
9
|
+
def initialize(file_saver: ::MarkdownRecord::FileSaver.new)
|
10
|
+
@file_saver = file_saver
|
11
|
+
end
|
12
|
+
|
13
|
+
def render_models_for_subdirectory(subdirectory: "", **options)
|
14
|
+
start_path = ::MarkdownRecord.config.content_root.join(subdirectory)
|
15
|
+
node = MarkdownRecord::Rendering::Nodes::JsonDirectory.new(start_path, options, true)
|
16
|
+
node.render(@file_saver)
|
17
|
+
node.json_models
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|