markdown_record 0.1.3 → 0.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.
- 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
|