yarrow 0.9.0 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/lib/yarrow/content/expansion/aggregator.rb +9 -6
- data/lib/yarrow/content/expansion/basename_merge.rb +3 -3
- data/lib/yarrow/content/expansion/directory_map.rb +3 -3
- data/lib/yarrow/content/expansion/directory_merge.rb +3 -3
- data/lib/yarrow/content/expansion/filename_map.rb +3 -3
- data/lib/yarrow/content/expansion/traversal.rb +13 -13
- data/lib/yarrow/content/policy.rb +1 -1
- data/lib/yarrow/format/markdown.rb +1 -1
- data/lib/yarrow/format/methods/front_matter.rb +59 -2
- data/lib/yarrow/format.rb +1 -1
- data/lib/yarrow/symbols.rb +6 -0
- data/lib/yarrow/version.rb +1 -1
- data/lib/yarrow/web/generator.rb +2 -1
- data/lib/yarrow/web/manifest.rb +8 -0
- data/lib/yarrow.rb +1 -0
- data/yarrow.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8f774a7c3013a183129ba27e6929cb1d9cb65f784121f61d3df2c1ffba8a4fb
|
4
|
+
data.tar.gz: 7f94b3a971a5fb00d089b6bbad8c12cb724d35f3e00497091130c4731534b275
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: de66835c7de07c4c84802a8adf75e57d637c4865f7a7e2f1f42f06ac0a22adbadfd067c812a6ba8a5be7e8fa03f116173f1a47777c550d38004e0683c6395685
|
7
|
+
data.tar.gz: a7aff55ba63ed7cc2b493b28dd27f415c985bd55730de71732411c2d3500ee0beb0dd21a599b7110599dfb80253bef6b4204a70276b4ed794cf0f2884d3149a1
|
data/.gitignore
CHANGED
@@ -12,13 +12,13 @@ module Yarrow
|
|
12
12
|
def before_traversal(policy)
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def expand_source(container, policy)
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
18
|
+
def expand_directory(collection, policy)
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def expand_file(entity, policy)
|
22
22
|
end
|
23
23
|
|
24
24
|
def after_traversal(policy)
|
@@ -53,13 +53,16 @@ module Yarrow
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def create_entity(source_node, parent_path, type, entity_const)
|
56
|
+
contents = Yarrow::Format.read(source_node.props[:path])
|
57
|
+
|
56
58
|
# Create an entity node with attached resource model
|
57
59
|
entity = graph.create_node do |entity_node|
|
58
60
|
attributes = {
|
59
61
|
name: source_node.props[:basename],
|
60
|
-
title: source_node.props[:basename]
|
61
|
-
body:
|
62
|
-
}
|
62
|
+
title: Yarrow::Symbols.to_text(source_node.props[:basename]),
|
63
|
+
body: contents.document.to_s
|
64
|
+
}.merge(contents.metadata)
|
65
|
+
|
63
66
|
entity_node.label = :entity
|
64
67
|
entity_node.props[:type] = type
|
65
68
|
entity_node.props[:resource] = entity_const.new(attributes)
|
@@ -9,18 +9,18 @@ module Yarrow
|
|
9
9
|
@entity_collections = {}
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
12
|
+
def expand_source(container, policy)
|
13
13
|
puts "create_node label=:collection type=:#{policy.collection} name='#{container.props[:basename]}'"
|
14
14
|
@container_collection = container.props[:basename]
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def expand_directory(collection, policy)
|
18
18
|
if @container_collection == collection.props[:entry].parent.to_s
|
19
19
|
puts "create_node label=:collection type=:#{policy.entity} name='#{collection.props[:basename]}' collection='#{@container_collection}'"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def
|
23
|
+
def expand_file(entity, policy)
|
24
24
|
unless @entity_bundles.key?(entity.props[:basename])
|
25
25
|
@entity_bundles[entity.props[:basename]] = []
|
26
26
|
end
|
@@ -2,17 +2,17 @@ module Yarrow
|
|
2
2
|
module Content
|
3
3
|
module Expansion
|
4
4
|
class DirectoryMap < Aggregator
|
5
|
-
def
|
5
|
+
def expand_source(container, policy)
|
6
6
|
puts "create_node label=:collection type=:#{policy.container} name='#{container.props[:basename]}'"
|
7
7
|
@current_collection = container.props[:basename]
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def expand_directory(collection, policy)
|
11
11
|
puts "create_node label=:collection type=:#{policy.collection} name='#{collection.props[:basename]}' collection=#{@current_collection}"
|
12
12
|
@current_collection = collection.props[:basename]
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def expand_file(entity, policy)
|
16
16
|
puts "create_node label=:entity type=:#{policy.entity} name='#{entity.props[:basename]}' collection='#{@current_collection}"
|
17
17
|
end
|
18
18
|
end
|
@@ -8,16 +8,16 @@ module Yarrow
|
|
8
8
|
@current_entity = nil
|
9
9
|
end
|
10
10
|
|
11
|
-
def
|
11
|
+
def expand_source(container, policy)
|
12
12
|
create_collection(container, policy.container, policy.container_const)
|
13
13
|
@current_collection = container.props[:path]
|
14
14
|
end
|
15
15
|
|
16
|
-
def
|
16
|
+
def expand_directory(collection, policy)
|
17
17
|
@current_entity = collection.props[:basename]
|
18
18
|
end
|
19
19
|
|
20
|
-
def
|
20
|
+
def expand_file(entity, policy)
|
21
21
|
if entity.props[:basename] == @current_entity && entity.props[:ext] == ".md"
|
22
22
|
create_entity(entity, @current_collection, policy.entity, policy.entity_const)
|
23
23
|
else
|
@@ -2,17 +2,17 @@ module Yarrow
|
|
2
2
|
module Content
|
3
3
|
module Expansion
|
4
4
|
class FilenameMap < Aggregator
|
5
|
-
def
|
5
|
+
def expand_source(container, policy)
|
6
6
|
create_collection(container, policy.container, policy.container_const)
|
7
7
|
@current_collection = container.props[:path]
|
8
8
|
end
|
9
9
|
|
10
|
-
def
|
10
|
+
def expand_directory(collection, policy)
|
11
11
|
create_collection(collection, policy.collection, policy.collection_const)
|
12
12
|
@current_collection = collection.props[:path]
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def expand_file(entity, policy)
|
16
16
|
if policy.match_by_extension(entity.props[:ext])
|
17
17
|
parent_path = entity.incoming(:directory).first.props[:path]
|
18
18
|
create_entity(entity, parent_path, policy.entity, policy.entity_const)
|
@@ -21,45 +21,45 @@ module Yarrow
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
|
24
|
-
def
|
25
|
-
aggregator.
|
24
|
+
def visit_source(root_node)
|
25
|
+
aggregator.expand_source(root_node, policy)
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def visit_directory(dir_node)
|
29
29
|
# TODO: match on potential directory extension/filter
|
30
|
-
aggregator.
|
30
|
+
aggregator.expand_directory(dir_node, policy)
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
33
|
+
def visit_file(file_node)
|
34
34
|
# TODO: dispatch underscore prefix or index files separately
|
35
35
|
# TODO: match on file extension
|
36
|
-
aggregator.
|
36
|
+
aggregator.expand_file(file_node, policy)
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def start_traversal
|
40
40
|
aggregator.before_traversal(policy)
|
41
41
|
end
|
42
42
|
|
43
|
-
def
|
43
|
+
def complete_traversal
|
44
44
|
aggregator.after_traversal(policy)
|
45
45
|
end
|
46
46
|
|
47
47
|
def expand
|
48
|
-
|
48
|
+
start_traversal
|
49
49
|
|
50
50
|
traversal = source_node.depth_first.each
|
51
51
|
|
52
|
-
|
52
|
+
visit_source(traversal.next)
|
53
53
|
|
54
54
|
loop do
|
55
55
|
node = traversal.next
|
56
56
|
case node.label
|
57
|
-
when :directory then
|
58
|
-
when :file then
|
57
|
+
when :directory then visit_directory(node)
|
58
|
+
when :file then visit_file(node)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
62
|
-
|
62
|
+
complete_traversal
|
63
63
|
end
|
64
64
|
end
|
65
65
|
end
|
@@ -109,7 +109,7 @@ module Yarrow
|
|
109
109
|
@container = container
|
110
110
|
@collection = collection
|
111
111
|
@entity = entity
|
112
|
-
@expansion = expansion
|
112
|
+
@expansion = expansion.to_sym
|
113
113
|
@extensions = extensions
|
114
114
|
@source_path = source_path
|
115
115
|
@module_prefix = module_prefix.split(MODULE_SEPARATOR)
|
@@ -3,18 +3,75 @@ module Yarrow
|
|
3
3
|
module Methods
|
4
4
|
# Utility methods for working with text formats containing frontmatter separators.
|
5
5
|
module FrontMatter
|
6
|
+
module Syntax
|
7
|
+
YAML = "-"
|
8
|
+
YAML_DOC_END = "."
|
9
|
+
TOML = "+"
|
10
|
+
MM_JSON = ";"
|
11
|
+
JSON_START = "{"
|
12
|
+
JSON_END = "}"
|
13
|
+
|
14
|
+
PATTERN = /\A
|
15
|
+
(?<start>[\-]{3}|[\+]{3}|[;]{3}|[\{]{1})\s*\r?\n
|
16
|
+
(?<meta>.*?)\r?\n?
|
17
|
+
^(?<stop>[\-]{3}|[\+]{3}|[;]{3}|[\.]{3}|[\}]{1})\s*\r?\n?
|
18
|
+
\r?\n?
|
19
|
+
(?<body>.*)
|
20
|
+
/mx
|
21
|
+
end
|
22
|
+
|
6
23
|
module ClassMethods
|
7
24
|
def read(path)
|
8
25
|
text = File.read(path, :encoding => "utf-8")
|
9
|
-
source, metadata =
|
26
|
+
source, metadata = parse(text)
|
10
27
|
Yarrow::Format::Contents.new(new(source), metadata)
|
11
28
|
end
|
12
29
|
|
30
|
+
def parse(text)
|
31
|
+
result = Syntax::PATTERN.match(text)
|
32
|
+
|
33
|
+
return [text, nil] if result.nil?
|
34
|
+
|
35
|
+
start_chr = result[:start].chr
|
36
|
+
stop_chr = result[:stop].chr
|
37
|
+
input = result[:meta]
|
38
|
+
|
39
|
+
meta = if start_chr == stop_chr
|
40
|
+
case start_chr
|
41
|
+
when Syntax::YAML then parse_yaml(input)
|
42
|
+
when Syntax::TOML then parse_toml(input)
|
43
|
+
when Syntax::MM_JSON then parse_json(input)
|
44
|
+
end
|
45
|
+
else
|
46
|
+
if start_chr == Syntax::YAML && stop_chr == Syntax::YAML_DOC_END
|
47
|
+
parse_yaml(input)
|
48
|
+
elsif start_chr == Syntax::JSON_START && stop_chr == Syntax::JSON_END
|
49
|
+
parse_json(input)
|
50
|
+
else
|
51
|
+
raise "Unsupported frontmatter delimiters"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
[result[:body], meta]
|
56
|
+
end
|
57
|
+
|
58
|
+
def parse_yaml(raw)
|
59
|
+
YAML.load(raw, symbolize_names: true)
|
60
|
+
end
|
61
|
+
|
62
|
+
def parse_toml(raw)
|
63
|
+
TOML::Parser.new(raw).parsed
|
64
|
+
end
|
65
|
+
|
66
|
+
def parse_json(raw)
|
67
|
+
JSON.parse("{#{raw}}", symbolize_names: true)
|
68
|
+
end
|
69
|
+
|
13
70
|
def read_yfm(path)
|
14
71
|
text = File.read(path, :encoding => 'utf-8')
|
15
72
|
extract_yfm(text, symbolize_keys: true)
|
16
73
|
end
|
17
|
-
|
74
|
+
|
18
75
|
def extract_yfm(text, options={})
|
19
76
|
pattern = /^(---\s*\n.*?\n?)^(---\s*$\n?)/m
|
20
77
|
if text =~ pattern
|
data/lib/yarrow/format.rb
CHANGED
data/lib/yarrow/symbols.rb
CHANGED
@@ -30,5 +30,11 @@ module Yarrow
|
|
30
30
|
def self.to_plural(atom)
|
31
31
|
Strings::Inflection.pluralize(atom.to_s).to_sym
|
32
32
|
end
|
33
|
+
|
34
|
+
# @param [Symbol, String] atom
|
35
|
+
# @return [String]
|
36
|
+
def self.to_text(identifier)
|
37
|
+
identifier.to_s.gsub(/\A[^[:alnum:]]+/, "").gsub(/[\-_]+/, " ").capitalize
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
data/lib/yarrow/version.rb
CHANGED
data/lib/yarrow/web/generator.rb
CHANGED
data/lib/yarrow/web/manifest.rb
CHANGED
@@ -56,10 +56,18 @@ module Yarrow
|
|
56
56
|
end
|
57
57
|
|
58
58
|
def self.collection_context(collection)
|
59
|
+
# TODO: debug log
|
60
|
+
# puts "collection_context"
|
61
|
+
# p collection.props[:resource].title
|
62
|
+
# p collection
|
59
63
|
IndexDocument.new(collection, nil, true)
|
60
64
|
end
|
61
65
|
|
62
66
|
def self.collection_index_context(collection, entity)
|
67
|
+
# TODO: debug log
|
68
|
+
# puts "collection_index_context"
|
69
|
+
# p collection.props[:resource].title
|
70
|
+
# p entity.props[:resource].title
|
63
71
|
IndexDocument.new(collection, entity, false)
|
64
72
|
end
|
65
73
|
|
data/lib/yarrow.rb
CHANGED
data/yarrow.gemspec
CHANGED
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_runtime_dependency 'parallel', '~> 1.22.1'
|
25
25
|
spec.add_runtime_dependency 'strings-inflection', '~> 0.1'
|
26
26
|
spec.add_runtime_dependency 'strings-case', '~> 0.3'
|
27
|
+
spec.add_runtime_dependency 'toml', '~> 0.3.0'
|
27
28
|
# https://github.com/joeldrapper/phlex
|
28
29
|
spec.add_runtime_dependency 'kramdown', '~> 2.4.0'
|
29
30
|
spec.add_development_dependency 'rake', '~> 13.0'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yarrow
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Rickerby
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: addressable
|
@@ -164,6 +164,20 @@ dependencies:
|
|
164
164
|
- - "~>"
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0.3'
|
167
|
+
- !ruby/object:Gem::Dependency
|
168
|
+
name: toml
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
170
|
+
requirements:
|
171
|
+
- - "~>"
|
172
|
+
- !ruby/object:Gem::Version
|
173
|
+
version: 0.3.0
|
174
|
+
type: :runtime
|
175
|
+
prerelease: false
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
177
|
+
requirements:
|
178
|
+
- - "~>"
|
179
|
+
- !ruby/object:Gem::Version
|
180
|
+
version: 0.3.0
|
167
181
|
- !ruby/object:Gem::Dependency
|
168
182
|
name: kramdown
|
169
183
|
requirement: !ruby/object:Gem::Requirement
|