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.
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