markdown_record 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +63 -43
  3. data/app/helpers/markdown_record/application_helper.rb +23 -0
  4. data/app/helpers/markdown_record/controller_helpers.rb +1 -1
  5. data/app/helpers/markdown_record/view_helpers.rb +9 -3
  6. data/{lib → app/models}/markdown_record/base.rb +10 -0
  7. data/{lib → app/models}/markdown_record/content_fragment.rb +17 -2
  8. data/lib/generators/markdown_record_generator.rb +6 -0
  9. data/lib/markdown_record/configuration.rb +4 -0
  10. data/lib/markdown_record/file_sorting/base.rb +25 -0
  11. data/lib/markdown_record/file_sorting/date_sorter.rb +14 -0
  12. data/lib/markdown_record/file_sorting/sem_ver_sorter.rb +47 -0
  13. data/lib/markdown_record/{association.rb → models/association.rb} +20 -3
  14. data/lib/markdown_record/{associations.rb → models/associations.rb} +17 -9
  15. data/lib/markdown_record/{content_associations.rb → models/content_associations.rb} +4 -2
  16. data/lib/markdown_record/models/filtering.rb +13 -0
  17. data/lib/markdown_record/models/filters/array_filter.rb +11 -0
  18. data/lib/markdown_record/models/filters/base_filter.rb +35 -0
  19. data/lib/markdown_record/models/filters/hash_filter.rb +81 -0
  20. data/lib/markdown_record/models/filters/nil_filter.rb +11 -0
  21. data/lib/markdown_record/models/filters/range_filter.rb +11 -0
  22. data/lib/markdown_record/models/filters/regexp_filter.rb +11 -0
  23. data/lib/markdown_record/models/filters/symbol_filter.rb +14 -0
  24. data/lib/markdown_record/models/filters.rb +22 -0
  25. data/lib/markdown_record/models/model_inflator.rb +65 -0
  26. data/lib/markdown_record/path_utilities.rb +20 -11
  27. data/lib/markdown_record/rendering/content_dsl/attribute.rb +22 -0
  28. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/directory_fragment.rb +3 -3
  29. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/disable.rb +2 -2
  30. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/enable.rb +2 -2
  31. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/end_attribute.rb +3 -3
  32. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/end_model.rb +3 -3
  33. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/fragment.rb +3 -3
  34. data/lib/markdown_record/rendering/content_dsl/model.rb +22 -0
  35. data/lib/markdown_record/rendering/content_dsl/scope.rb +22 -0
  36. data/lib/markdown_record/{content_dsl → rendering/content_dsl}/use_layout.rb +3 -3
  37. data/lib/markdown_record/rendering/content_dsl.rb +45 -0
  38. data/lib/markdown_record/rendering/html_renderer.rb +22 -0
  39. data/lib/markdown_record/{indexer.rb → rendering/indexer.rb} +0 -10
  40. data/lib/markdown_record/rendering/json_renderer.rb +20 -0
  41. data/lib/markdown_record/rendering/nodes/html_base.rb +95 -0
  42. data/lib/markdown_record/rendering/nodes/html_directory.rb +51 -0
  43. data/lib/markdown_record/rendering/nodes/html_file.rb +48 -0
  44. data/lib/markdown_record/rendering/nodes/json_base.rb +55 -0
  45. data/lib/markdown_record/rendering/nodes/json_directory.rb +69 -0
  46. data/lib/markdown_record/rendering/nodes/json_file.rb +172 -0
  47. data/lib/markdown_record/{rendering.rb → rendering/rendering.rb} +1 -1
  48. data/lib/markdown_record/{validator.rb → rendering/validator.rb} +4 -4
  49. data/lib/markdown_record/version.rb +1 -1
  50. data/lib/markdown_record.rb +21 -14
  51. data/templates/demo/content/10_custom_models_and_associations.md.erb +27 -7
  52. data/templates/demo/content/11_controller_helpers.md.erb +2 -2
  53. data/templates/demo/content/12_configuration.md.erb +22 -3
  54. data/templates/demo/content/13_sandbox/1_foo.md +2 -1
  55. data/templates/demo/content/13_sandbox/2_sandbox_nested/1_bar.md +4 -1
  56. data/templates/demo/content/1_home.md.erb +30 -13
  57. data/templates/demo/content/2_installation.md.erb +61 -46
  58. data/templates/demo/content/3_rendering_basics.md.erb +3 -3
  59. data/templates/demo/content/4_content_dsl.md.erb +22 -11
  60. data/templates/demo/content/5_routes.md.erb +10 -7
  61. data/templates/demo/content/6_model_basics.md.erb +11 -11
  62. data/templates/demo/content/7_content_frags.md.erb +9 -6
  63. data/templates/demo/content/8_erb_syntax_and_view_helpers.md.erb +32 -11
  64. data/templates/demo/content/9_layouts.md.erb +3 -3
  65. data/templates/demo/layouts/_global_layout.html.erb +1 -0
  66. data/templates/demo/models/dsl_command.rb +6 -0
  67. data/templates/demo/models/section.rb +5 -0
  68. data/templates/render_content.thor +2 -1
  69. data/templates/tests/assets/images/ruby-logo.png +0 -0
  70. data/templates/tests/content/1_test_files_home.md.erb +31 -0
  71. data/templates/tests/content/2_content_dsl_tests/1_content_dsl.md.erb +162 -0
  72. data/templates/tests/content/2_content_dsl_tests/2_nested_directory/1_associations.md.erb +83 -0
  73. data/templates/tests/layouts/_concatenated_layout.html.erb +12 -0
  74. data/templates/tests/layouts/_custom_layout.html.erb +14 -0
  75. data/templates/tests/layouts/_file_layout.html.erb +15 -0
  76. data/templates/tests/layouts/_global_layout.html.erb +116 -0
  77. metadata +53 -34
  78. data/app/models/markdown_record/demo/dsl_command.rb +0 -10
  79. data/app/models/markdown_record/demo/section.rb +0 -9
  80. data/app/models/markdown_record/tests/child_model.rb +0 -15
  81. data/app/models/markdown_record/tests/fake_active_record_model.rb +0 -13
  82. data/app/models/markdown_record/tests/model.rb +0 -15
  83. data/app/models/markdown_record/tests/other_child_model.rb +0 -15
  84. data/lib/markdown_record/cli.rb +0 -54
  85. data/lib/markdown_record/content_dsl/attribute.rb +0 -22
  86. data/lib/markdown_record/content_dsl/model.rb +0 -23
  87. data/lib/markdown_record/content_dsl/render_format.rb +0 -22
  88. data/lib/markdown_record/content_dsl/render_strategy.rb +0 -22
  89. data/lib/markdown_record/content_dsl.rb +0 -37
  90. data/lib/markdown_record/html_renderer.rb +0 -194
  91. data/lib/markdown_record/json_renderer.rb +0 -270
  92. data/lib/markdown_record/model_inflator.rb +0 -107
  93. data/lib/markdown_record/routes_renderer.rb +0 -0
  94. /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,11 @@
1
+ module MarkdownRecord
2
+ module Models
3
+ module Filters
4
+ class NilFilter < MarkdownRecord::Models::Filters::BaseFilter
5
+ def passes_filter?
6
+ @attribute_value.nil?
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module MarkdownRecord
2
+ module Models
3
+ module Filters
4
+ class RangeFilter < MarkdownRecord::Models::Filters::BaseFilter
5
+ def passes_filter?
6
+ @filter_value.member?(@attribute_value)
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module MarkdownRecord
2
+ module Models
3
+ module Filters
4
+ class RegexpFilter < MarkdownRecord::Models::Filters::BaseFilter
5
+ def passes_filter?
6
+ @attribute_value =~ @filter_value
7
+ end
8
+ end
9
+ end
10
+ end
11
+ 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 = remove_numeric_prefixes(filename)
10
+ filename = remove_prefix(filename)
11
11
 
12
12
  subdirectory = clean_path(rendered_path.parent)
13
- subdirectory = remove_numeric_prefixes(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 = remove_numeric_prefixes(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 base_content_path
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.find(frag_id)
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 remove_numeric_prefixes(filename_or_id)
87
+ def remove_prefix(filename_or_id)
77
88
  if MarkdownRecord.config.ignore_numeric_prefix
78
- parts = filename_or_id.split("/")
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 = /&lt;!--\s*attribute\s*:\s*(\w+)\s*(?::((?:html|md|int|float|string)?))?--&gt;/
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 = /(?<!`|`\\n|`html\\n)<!--\s*directory_fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/]*})\s*-->(?!`|\\n`)/
5
- ENCODED_REGEX = /(?<!<code>|<code class="html">)&lt;!--\s*directory_fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/]*})\s*--&gt;(?!<\/code>)/
4
+ REGEX = /<!--\s*directory_fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
5
+ ENCODED_REGEX = /&lt;!--\s*directory_fragment\s+({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*--&gt;/
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 = /(?<!<code>|<code class="html">)&lt;!--\s*disable\s*--&gt;(?!<\/code>)/
5
+ ENCODED_REGEX = /&lt;!--\s*disable\s*--&gt;/
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 = /(?<!<code>|<code class="html">)&lt;!--\s*enable\s*--&gt;(?!<\/code>)/
5
+ ENCODED_REGEX = /&lt;!--\s*enable\s*--&gt;/
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 = /(?<!`|`\\n|`html\\n)<!--\s*end_attribute\s*-->(?!`|\\n`)/
5
- ENCODED_REGEX = /(?<!<code>|<code class="html">)&lt;!--\s*end_attribute\s*--&gt;(?!<\/code>)/
4
+ REGEX = /<!--\s*end_attribute\s*-->/
5
+ ENCODED_REGEX = /&lt;!--\s*end_attribute\s*--&gt;/
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 = /(?<!`|`\\n|`html\\n)<!--\s*end_model\s*-->(?!`|\\n`)/
5
- ENCODED_REGEX = /(?<!<code>|<code class="html">)&lt;!--\s*end_model\s*--&gt;(?!<\/code>)/
4
+ REGEX = /<!--\s*end_model\s*-->/
5
+ ENCODED_REGEX = /&lt;!--\s*end_model\s*--&gt;/
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 = /(?<!`|`\\n|`html\\n)<!--\s*fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/]*})\s*-->(?!`|\\n`)/
5
- ENCODED_REGEX = /(?<!<code>|<code class="html">)&lt;!--\s*fragment\s+({[\s"'\\\w:,.\[\]\{\}_\/]*})\s*--&gt;(?!<\/code>)/
4
+ REGEX = /<!--\s*fragment\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*-->/
5
+ ENCODED_REGEX = /&lt;!--\s*fragment\s+({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*--&gt;/
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 = /&lt;!--\s*model\s*({[\s"'\\\w:,.\[\]\{\}_\/|\-]*})\s*--&gt;/
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 = /&lt;!--\s*scope\s*:\s*(.*)\s*--&gt;/
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 = /(?<!`|`\\n|`html\\n)<!--\s*use_layout\s*:\s*(.*)\s*-->(?!`|\\n`)/
5
- ENCODED_REGEX = /(?<!<code>|<code class="html">)&lt;!--\s*use_layout\s*:\s*(.*)\s*--&gt;(?!<\/code>)/
4
+ REGEX = /<!--\s*use_layout\s*:\s*(.*)\s*-->/
5
+ ENCODED_REGEX = /&lt;!--\s*use_layout\s*:\s*(.*)\s*--&gt;/
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