sitepress-core 3.2.2 → 4.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/sitepress/asset.rb +8 -3
- data/lib/sitepress/asset_node_mapper.rb +2 -2
- data/lib/sitepress/asset_paths.rb +8 -8
- data/lib/sitepress/data.rb +77 -30
- data/lib/sitepress/extensions/layouts.rb +1 -1
- data/lib/sitepress/extensions/proc_manipulator.rb +1 -7
- data/lib/sitepress/node.rb +53 -40
- data/lib/sitepress/parsers/frontmatter.rb +1 -1
- data/lib/sitepress/path.rb +4 -0
- data/lib/sitepress/resource.rb +58 -13
- data/lib/sitepress/{resource_collection.rb → resource_indexer.rb} +4 -4
- data/lib/sitepress/resources.rb +73 -0
- data/lib/sitepress/site.rb +16 -15
- data/lib/sitepress/version.rb +1 -1
- data/lib/sitepress-core.rb +6 -2
- metadata +7 -7
- data/lib/sitepress/formats.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 28ce680cdd4f344d39f26ae0697f10fd24122c8e3bea5c3206da25fd0565f88e
|
4
|
+
data.tar.gz: 4526b2a2968248ce14ba65e2a09ae33764debb4001d85c1e0507f176bf18c257
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 14fbfe33e54f23887d1d3c14b5edcfb263f50277a2e4f596c059baa04ac35d41ae70bd542564e198e17453862202cec785d6debea3a6a89269946674f4cd6455
|
7
|
+
data.tar.gz: 1ae6cc0347519f583c693fffea97c1f702c6dd1fedf7146cc7dead11012c7c73d7426f086cdf16fe07542a998135dee8dabe52ae49078129cab8d60e614be89a
|
data/lib/sitepress/asset.rb
CHANGED
@@ -18,6 +18,7 @@ module Sitepress
|
|
18
18
|
DEFAULT_PARSER = Parsers::Frontmatter
|
19
19
|
|
20
20
|
attr_reader :path
|
21
|
+
attr_writer :body
|
21
22
|
|
22
23
|
extend Forwardable
|
23
24
|
def_delegators :renderer, :render
|
@@ -32,7 +33,11 @@ module Sitepress
|
|
32
33
|
end
|
33
34
|
|
34
35
|
def data
|
35
|
-
@data ||= exists? ? parse_error { parser.data } : {}
|
36
|
+
@data ||= Data.manage(exists? ? parse_error { parser.data } : {})
|
37
|
+
end
|
38
|
+
|
39
|
+
def data=(data)
|
40
|
+
@data = Data.manage(data)
|
36
41
|
end
|
37
42
|
|
38
43
|
def body
|
@@ -55,7 +60,7 @@ module Sitepress
|
|
55
60
|
!!handler
|
56
61
|
end
|
57
62
|
|
58
|
-
#
|
63
|
+
# Mmm.... that's the smell of cache busting, which means the hiearchy of this is wrong.
|
59
64
|
def parser=(parser_klass)
|
60
65
|
@parser = nil
|
61
66
|
@parser_klass = parser_klass
|
@@ -70,7 +75,7 @@ module Sitepress
|
|
70
75
|
end
|
71
76
|
|
72
77
|
def destroy
|
73
|
-
|
78
|
+
FileUtils.rm path
|
74
79
|
end
|
75
80
|
|
76
81
|
def save
|
@@ -28,12 +28,12 @@ module Sitepress
|
|
28
28
|
|
29
29
|
def process_directory(path)
|
30
30
|
node_name = File.basename path
|
31
|
-
node_mapper path: path, node: node.
|
31
|
+
node_mapper path: path, node: node.child(node_name)
|
32
32
|
end
|
33
33
|
|
34
34
|
def process_asset(path)
|
35
35
|
asset = Asset.new(path: path)
|
36
|
-
node.
|
36
|
+
node.child(asset.node_name).resources.add_asset(asset, format: asset.format)
|
37
37
|
end
|
38
38
|
|
39
39
|
private
|
@@ -6,13 +6,13 @@ module Sitepress
|
|
6
6
|
class AssetPaths
|
7
7
|
include Enumerable
|
8
8
|
|
9
|
-
# Exclude swap files created by Textmate and vim from being added
|
10
|
-
|
11
|
-
|
12
|
-
"
|
13
|
-
"
|
14
|
-
"
|
15
|
-
"
|
9
|
+
# Exclude swap files created by Textmate and vim from being added to the sitemap.
|
10
|
+
IGNORE_PATTERNS = [
|
11
|
+
"**/*~", # Created by many editors when things crash
|
12
|
+
"**/*.swp", # Created by vim
|
13
|
+
"**/.DS_Store", # Created by our friends at Apple
|
14
|
+
"**/*.orig", # Created when there's a git conflict
|
15
|
+
"**/.git*" # This is a problem when a git repo is nested in a project's `./pages` folder.
|
16
16
|
]
|
17
17
|
|
18
18
|
# Template files that start with `_user.html.erb` are partials that we want
|
@@ -43,7 +43,7 @@ module Sitepress
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def matches_ignore_file_pattern?(path)
|
46
|
-
|
46
|
+
IGNORE_PATTERNS.any? { |pattern| path.fnmatch? pattern }
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
data/lib/sitepress/data.rb
CHANGED
@@ -1,47 +1,94 @@
|
|
1
1
|
module Sitepress
|
2
|
-
|
3
|
-
def
|
4
|
-
|
2
|
+
module Data
|
3
|
+
def self.manage(value)
|
4
|
+
case value
|
5
|
+
when Hash
|
6
|
+
Record.new value
|
7
|
+
when Array
|
8
|
+
Collection.new value
|
9
|
+
else
|
10
|
+
value
|
11
|
+
end
|
5
12
|
end
|
6
13
|
|
7
|
-
def
|
8
|
-
|
14
|
+
def self.unmanage(data)
|
15
|
+
case data
|
16
|
+
when Record, Collection
|
17
|
+
data.unmanage
|
18
|
+
else
|
19
|
+
data
|
20
|
+
end
|
9
21
|
end
|
10
22
|
|
11
|
-
|
12
|
-
|
23
|
+
# Wraps an array and returns managed elements
|
24
|
+
class Collection
|
25
|
+
include Enumerable
|
26
|
+
extend Forwardable
|
27
|
+
|
28
|
+
def_delegators :@array, :each, :[]
|
29
|
+
|
30
|
+
def initialize(array)
|
31
|
+
@array = array.map { |element| Data.manage(element) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def unmanage
|
35
|
+
@array.map { |value| Data.unmanage(value) }
|
36
|
+
end
|
13
37
|
end
|
14
38
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
39
|
+
# Wraps a hash and returns managed elements
|
40
|
+
class Record
|
41
|
+
include Enumerable
|
42
|
+
extend Forwardable
|
43
|
+
|
44
|
+
def_delegators :@hash, :keys, :values, :key?
|
45
|
+
|
46
|
+
def initialize(hash)
|
47
|
+
@hash = hash
|
48
|
+
end
|
49
|
+
|
50
|
+
def fetch(key, *args, &block)
|
51
|
+
Data.manage(@hash.fetch(key.to_s, *args, &block))
|
52
|
+
end
|
53
|
+
|
54
|
+
def [](key)
|
55
|
+
Data.manage(@hash[key.to_s])
|
56
|
+
end
|
57
|
+
|
58
|
+
def []=(key, value)
|
59
|
+
Data.manage(@hash[key.to_s] = value)
|
60
|
+
end
|
61
|
+
|
62
|
+
def each
|
63
|
+
@hash.each do |key, value|
|
64
|
+
yield key, Data.manage(value)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def unmanage
|
69
|
+
@hash.transform_values { |value| Data.unmanage(value) }
|
70
|
+
end
|
71
|
+
|
72
|
+
def method_missing(name, *args, **kwargs, &block)
|
73
|
+
if respond_to? name
|
74
|
+
self.send name, *args, **kwargs, &block
|
75
|
+
else
|
76
|
+
key, modifier, _ = name.to_s.partition(/[!?]/)
|
77
|
+
|
21
78
|
case modifier
|
22
79
|
when ""
|
23
|
-
|
80
|
+
self[key]
|
24
81
|
when "!"
|
25
|
-
|
82
|
+
self.fetch(key, *args, &block)
|
83
|
+
when "?"
|
84
|
+
!!self[key]
|
26
85
|
end
|
27
86
|
end
|
28
87
|
end
|
29
|
-
end
|
30
|
-
|
31
|
-
def dig(*args, **kwargs, &block)
|
32
|
-
wrap_value { @data.dig(*args, **kwargs, &block) }
|
33
|
-
end
|
34
88
|
|
35
|
-
|
36
|
-
|
37
|
-
case value = block.call
|
38
|
-
when Hash
|
39
|
-
self.class.new value
|
40
|
-
when Array
|
41
|
-
value.map { |v| wrap_value { v } }
|
42
|
-
else
|
43
|
-
value
|
44
|
-
end
|
89
|
+
def dig(*args, **kwargs, &block)
|
90
|
+
Data.manage @hash.dig(*args, **kwargs, &block)
|
45
91
|
end
|
92
|
+
end
|
46
93
|
end
|
47
94
|
end
|
@@ -6,13 +6,7 @@ module Sitepress
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def process_resources(node)
|
9
|
-
|
10
|
-
if @block.arity == 1
|
11
|
-
@block.call resource
|
12
|
-
else # This will blow up if 0 or greater than 2.
|
13
|
-
@block.call resource, node
|
14
|
-
end
|
15
|
-
end
|
9
|
+
@block.call node
|
16
10
|
end
|
17
11
|
end
|
18
12
|
end
|
data/lib/sitepress/node.rb
CHANGED
@@ -5,28 +5,28 @@ module Sitepress
|
|
5
5
|
# a leaf node. The actual `buz.html` asset is then stored on the leaf node as a resource. This tree structure
|
6
6
|
# makes it possible to reason through path relationships from code to build out elements in a website like tree navigation.
|
7
7
|
class Node
|
8
|
-
|
8
|
+
extend Forwardable
|
9
|
+
def_delegators :resources, :formats
|
9
10
|
|
10
|
-
|
11
|
-
|
11
|
+
attr_reader :parent, :name, :default_format, :default_name, :resources
|
12
|
+
|
13
|
+
DEFAULT_FORMAT = :html
|
12
14
|
|
13
15
|
DEFAULT_NAME = "index".freeze
|
14
16
|
|
15
|
-
def initialize(parent: nil, name: nil, default_format:
|
16
|
-
@parent = parent
|
17
|
+
def initialize(parent: nil, name: nil, default_format: DEFAULT_FORMAT, default_name: DEFAULT_NAME)
|
17
18
|
@name = name.freeze
|
19
|
+
@parent = parent
|
20
|
+
@children = Hash.new
|
21
|
+
@resources = Resources.new(node: self)
|
18
22
|
@default_format = default_format
|
19
23
|
@default_name = default_name
|
20
24
|
yield self if block_given?
|
21
25
|
end
|
22
26
|
|
23
|
-
def formats
|
24
|
-
@formats ||= Formats.new(node: self)
|
25
|
-
end
|
26
|
-
|
27
27
|
# Returns the immediate children nodes.
|
28
28
|
def children
|
29
|
-
|
29
|
+
@children.values
|
30
30
|
end
|
31
31
|
|
32
32
|
# Returns sibling nodes and self.
|
@@ -36,13 +36,7 @@ module Sitepress
|
|
36
36
|
|
37
37
|
# Returns all parents up to the root node.
|
38
38
|
def parents
|
39
|
-
|
40
|
-
node = parent
|
41
|
-
while node do
|
42
|
-
parents << node
|
43
|
-
node = node.parent
|
44
|
-
end
|
45
|
-
parents
|
39
|
+
Enumerator.produce(parent, &:parent).take_while(&:itself)
|
46
40
|
end
|
47
41
|
|
48
42
|
def root?
|
@@ -50,45 +44,64 @@ module Sitepress
|
|
50
44
|
end
|
51
45
|
|
52
46
|
def leaf?
|
53
|
-
|
54
|
-
end
|
55
|
-
|
56
|
-
def
|
57
|
-
|
58
|
-
|
59
|
-
|
47
|
+
@children.empty?
|
48
|
+
end
|
49
|
+
|
50
|
+
def parent=(parent)
|
51
|
+
child = self
|
52
|
+
|
53
|
+
if parent == @parent
|
54
|
+
return
|
55
|
+
elsif parent.nil?
|
56
|
+
remove
|
57
|
+
return
|
58
|
+
# Make sure we don't change the parent of this node to one if its children; otherwise
|
59
|
+
# we'd have to jump into a time machine and do some really weird stuff with Doc Whatever-his-name-is.
|
60
|
+
elsif child.children.include? parent
|
61
|
+
raise Sitepress::Error, "Parent node can't be changed to one of its children"
|
62
|
+
# Check if the name of this node exists as a child on the new parent.
|
63
|
+
elsif parent.child? child.name
|
64
|
+
raise Sitepress::Error, "Node exists with the name #{child.name.inspect} in #{parent.inspect}. Remove existing node."
|
65
|
+
else
|
66
|
+
@parent = parent
|
67
|
+
parent.overwrite_child child
|
60
68
|
end
|
61
|
-
resources
|
62
69
|
end
|
63
70
|
|
64
71
|
def remove
|
65
|
-
|
66
|
-
parent.remove_child
|
72
|
+
return if @parent.nil?
|
73
|
+
@parent.remove_child name
|
74
|
+
@parent = nil
|
67
75
|
end
|
68
76
|
|
69
77
|
def get(path)
|
70
78
|
path = Path.new(path)
|
71
79
|
node = dig(*path.node_names)
|
72
|
-
node.
|
80
|
+
node.resources.format(path.format) if node
|
73
81
|
end
|
74
82
|
|
75
|
-
def
|
83
|
+
def child(name)
|
76
84
|
return self if name == default_name
|
77
|
-
|
78
|
-
|
85
|
+
|
86
|
+
@children.fetch(name){ @children[name] = build_child(name: name) }.tap do |child|
|
87
|
+
yield child if block_given?
|
79
88
|
end
|
80
89
|
end
|
81
90
|
|
91
|
+
def child?(name)
|
92
|
+
@children.key? name
|
93
|
+
end
|
94
|
+
|
82
95
|
def inspect
|
83
|
-
"<#{self.class}: name=#{name.inspect}, formats=#{formats.
|
96
|
+
"<#{self.class}: name=#{name.inspect}, formats=#{formats.inspect}, children=#{children.map(&:name).inspect}, resource_request_paths=#{resources.map(&:request_path)}>"
|
84
97
|
end
|
85
98
|
|
86
99
|
def dig(*args)
|
87
100
|
head, *tail = args
|
88
101
|
if (head.nil? or head.empty? or head == default_name) and tail.empty?
|
89
102
|
self
|
90
|
-
elsif
|
91
|
-
|
103
|
+
elsif child?(head)
|
104
|
+
@children[head].dig(*tail)
|
92
105
|
else
|
93
106
|
nil
|
94
107
|
end
|
@@ -96,16 +109,16 @@ module Sitepress
|
|
96
109
|
|
97
110
|
protected
|
98
111
|
def remove_child(name)
|
99
|
-
|
112
|
+
@children.delete(name)
|
100
113
|
end
|
101
114
|
|
102
|
-
|
103
|
-
|
104
|
-
Node.new(parent: self, name: name, default_format: default_format, default_name: default_name)
|
115
|
+
def overwrite_child(node)
|
116
|
+
@children[node.name] = node
|
105
117
|
end
|
106
118
|
|
107
|
-
|
108
|
-
|
119
|
+
private
|
120
|
+
def build_child(**kwargs)
|
121
|
+
Node.new(parent: self, default_format: default_format, default_name: default_name, **kwargs)
|
109
122
|
end
|
110
123
|
end
|
111
124
|
end
|
data/lib/sitepress/path.rb
CHANGED
@@ -60,6 +60,10 @@ module Sitepress
|
|
60
60
|
(handler_is_format? ? handler : @format)&.to_sym
|
61
61
|
end
|
62
62
|
|
63
|
+
def relative_path_from(target)
|
64
|
+
Pathname.new(@path).relative_path_from(target).to_s
|
65
|
+
end
|
66
|
+
|
63
67
|
private
|
64
68
|
# TODO: I don't want to look this up everytime I try to figure out the
|
65
69
|
# extension. I'll have to create an extension registry .
|
data/lib/sitepress/resource.rb
CHANGED
@@ -6,9 +6,8 @@ module Sitepress
|
|
6
6
|
# and may be altered by the resource proxy.
|
7
7
|
class Resource
|
8
8
|
extend Forwardable
|
9
|
-
def_delegators :asset, :renderable?
|
9
|
+
def_delegators :asset, :body, :data, :renderable?
|
10
10
|
|
11
|
-
attr_writer :body, :data
|
12
11
|
attr_reader :node, :asset
|
13
12
|
|
14
13
|
attr_accessor :format, :mime_type, :handler
|
@@ -28,12 +27,51 @@ module Sitepress
|
|
28
27
|
File.join("/", *lineage, request_filename)
|
29
28
|
end
|
30
29
|
|
31
|
-
|
32
|
-
|
30
|
+
# Eugh, I really don't like this because it's not a full URL. To get a full URL though this thing
|
31
|
+
# needs to be put into `url_for(request_path)` in Rails to get the hostname. I don't want to inject
|
32
|
+
# that dependency into this thing, so here it is.
|
33
|
+
alias :url :request_path
|
34
|
+
|
35
|
+
def node=(destination)
|
36
|
+
if destination.resources.format? format
|
37
|
+
raise Sitepress::Error, "#{destination.inspect} already has a resource with a #{format} format"
|
38
|
+
end
|
39
|
+
remove
|
40
|
+
destination.resources.add self
|
41
|
+
@node = destination
|
42
|
+
end
|
43
|
+
|
44
|
+
# Moves the resource to a destination node. Moving a resource to a Sitepress::Node
|
45
|
+
# is a little weird for people who are accustomed to working with files, which is pretty
|
46
|
+
# much everybody (including myself). A child node has to be created on the destination node
|
47
|
+
# with the name of the resource node.
|
48
|
+
#
|
49
|
+
# Or just ignore all of that and use the `move_to` method so you can feel like you're
|
50
|
+
# moving files around.
|
51
|
+
def move_to(destination)
|
52
|
+
raise Sitepress::Error, "#{destination.inspect} is not a Sitepress::Node" unless destination.is_a? Sitepress::Node
|
53
|
+
self.tap do |resource|
|
54
|
+
resource.node = destination.child(node.name)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Creates a duplicate of the resource and moves it to the destination.
|
59
|
+
def copy_to(destination)
|
60
|
+
raise Sitepress::Error, "#{destination.inspect} is not a Sitepress::Node" unless destination.is_a? Sitepress::Node
|
61
|
+
self.clone.tap do |resource|
|
62
|
+
resource.node = destination.child(node.name)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Clones should be initialized with a nil node. Initializing with a node would mean that multiple resources
|
67
|
+
# are pointing to the same node, which shouldn't be possible.
|
68
|
+
def clone
|
69
|
+
self.class.new(asset: @asset, node: nil, format: @format, mime_type: @mime_type, handler: @handler)
|
33
70
|
end
|
34
71
|
|
35
|
-
|
36
|
-
|
72
|
+
# Removes the resource from the node's resources list.
|
73
|
+
def remove
|
74
|
+
node.resources.remove format if node
|
37
75
|
end
|
38
76
|
|
39
77
|
def inspect
|
@@ -62,9 +100,16 @@ module Sitepress
|
|
62
100
|
|
63
101
|
# Used internally to construct paths from the current node up to the root node.
|
64
102
|
def lineage
|
65
|
-
|
103
|
+
node.parents.reject(&:root?).reverse.map(&:name)
|
66
104
|
end
|
67
105
|
|
106
|
+
class << self
|
107
|
+
attr_accessor :path_suffix_hack_that_you_should_not_use
|
108
|
+
|
109
|
+
def path_suffix_hack_that_you_should_not_use
|
110
|
+
@path_suffix_hack_that_you_should_not_use ||= ""
|
111
|
+
end
|
112
|
+
end
|
68
113
|
|
69
114
|
private
|
70
115
|
# Filters parent/child/sibling resources by a type. The default behavior is to only return
|
@@ -83,13 +128,13 @@ module Sitepress
|
|
83
128
|
|
84
129
|
case type
|
85
130
|
when :all
|
86
|
-
nodes.map{ |node| node.
|
131
|
+
nodes.map{ |node| node.resources }
|
87
132
|
when :same
|
88
|
-
nodes.map{ |n| n.
|
133
|
+
nodes.map{ |n| n.resources.format(format) }.flatten
|
89
134
|
when String, Symbol, NilClass
|
90
|
-
nodes.map{ |n| n.
|
135
|
+
nodes.map{ |n| n.resources.format(type) }.flatten
|
91
136
|
when MIME::Type
|
92
|
-
nodes.map{ |n| n.
|
137
|
+
nodes.map{ |n| n.resources.mime_type(type) }.flatten
|
93
138
|
else
|
94
139
|
raise ArgumentError, "Invalid type argument #{type}. Must be either :same, :all, an extension string, or a Mime::Type"
|
95
140
|
end
|
@@ -102,9 +147,9 @@ module Sitepress
|
|
102
147
|
elsif node.root? and format
|
103
148
|
"#{node.default_name}.#{format}"
|
104
149
|
elsif node.root?
|
105
|
-
node.default_name
|
150
|
+
"#{node.default_name}#{self.class.path_suffix_hack_that_you_should_not_use}"
|
106
151
|
elsif format.nil? or node.default_format == format
|
107
|
-
node.name
|
152
|
+
"#{node.name}#{self.class.path_suffix_hack_that_you_should_not_use}"
|
108
153
|
else
|
109
154
|
"#{node.name}.#{format}"
|
110
155
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Sitepress
|
2
|
-
#
|
3
|
-
#
|
4
|
-
class
|
2
|
+
# Flattens a tree of Sitepress::Node and Sitepress:Resource classes into a collection of
|
3
|
+
# resources that can be quickly globbed, queried, or accessed.
|
4
|
+
class ResourceIndexer
|
5
5
|
extend Forwardable
|
6
6
|
def_delegators :resources, :each, :size, :index, :[], :last, :length, :fetch, :count, :at
|
7
7
|
|
@@ -27,7 +27,7 @@ module Sitepress
|
|
27
27
|
|
28
28
|
private
|
29
29
|
def resources
|
30
|
-
@node.flatten
|
30
|
+
@node.resources.flatten
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require "forwardable"
|
2
|
+
|
3
|
+
module Sitepress
|
4
|
+
# Manages collections of resources that share the same Node. Given the files `/a.html` and `/a.gif`,
|
5
|
+
# both of these assets would be stored in the `Node#name = "a"` under `Node#formats` with
|
6
|
+
# the formats `.gif`, and `.html`.
|
7
|
+
class Resources
|
8
|
+
include Enumerable
|
9
|
+
|
10
|
+
extend Forwardable
|
11
|
+
def_delegators :@registry, :size, :clear, :empty?
|
12
|
+
def_delegators :@node, :default_format
|
13
|
+
|
14
|
+
def initialize(node:)
|
15
|
+
@node = node
|
16
|
+
@registry = Hash.new
|
17
|
+
end
|
18
|
+
|
19
|
+
def each(&block)
|
20
|
+
@registry.values.each(&block)
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove(extension)
|
24
|
+
@registry.delete symbolize(extension)
|
25
|
+
end
|
26
|
+
|
27
|
+
def format(extension)
|
28
|
+
@registry[symbolize(extension || default_format)]
|
29
|
+
end
|
30
|
+
|
31
|
+
def formats
|
32
|
+
@registry.keys
|
33
|
+
end
|
34
|
+
|
35
|
+
def format?(key)
|
36
|
+
@registry.key? key
|
37
|
+
end
|
38
|
+
|
39
|
+
def mime_type(mime_type)
|
40
|
+
find { |f| f.mime_type == mime_type }
|
41
|
+
end
|
42
|
+
|
43
|
+
def add(resource)
|
44
|
+
if @registry.key? resource.format
|
45
|
+
raise Sitepress::ExistingRequestPathError, "Resource at #{resource.request_path} already set with format #{resource.format.inspect}"
|
46
|
+
else
|
47
|
+
@registry[resource.format] = resource
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def flatten(resources: [])
|
52
|
+
each { |resource| resources << resource }
|
53
|
+
@node.children.each do |child|
|
54
|
+
child.resources.flatten.each { |resource| resources << resource }
|
55
|
+
end
|
56
|
+
resources
|
57
|
+
end
|
58
|
+
|
59
|
+
def add_asset(asset, format: nil)
|
60
|
+
format = symbolize(format || default_format)
|
61
|
+
add Resource.new(asset: asset, node: @node, format: format)
|
62
|
+
end
|
63
|
+
|
64
|
+
def inspect
|
65
|
+
"<#{self.class}: resources=#{map(&:request_path)}>"
|
66
|
+
end
|
67
|
+
|
68
|
+
private
|
69
|
+
def symbolize(format)
|
70
|
+
format&.to_sym
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/sitepress/site.rb
CHANGED
@@ -5,17 +5,10 @@ require "forwardable"
|
|
5
5
|
module Sitepress
|
6
6
|
# A collection of pages from a directory.
|
7
7
|
class Site
|
8
|
-
# Default file pattern to pick up in site
|
9
|
-
DEFAULT_GLOB = "**/**".freeze
|
10
|
-
|
11
8
|
# Default root_path for site.
|
12
9
|
DEFAULT_ROOT_PATH = Pathname.new(".").freeze
|
13
10
|
|
14
|
-
# Maps Rail-ish template files & structures into the site's node tree.
|
15
|
-
DEFAULT_NODE_MAPPER = AssetNodeMapper
|
16
|
-
|
17
11
|
attr_reader :root_path
|
18
|
-
attr_accessor :node_mapper
|
19
12
|
attr_writer :resources_pipeline
|
20
13
|
|
21
14
|
# TODO: Get rid of these so that folks have ot call site.resources.get ...
|
@@ -24,21 +17,25 @@ module Sitepress
|
|
24
17
|
|
25
18
|
def initialize(root_path: DEFAULT_ROOT_PATH)
|
26
19
|
self.root_path = root_path
|
27
|
-
self.node_mapper = DEFAULT_NODE_MAPPER
|
28
20
|
end
|
29
21
|
|
30
22
|
# A tree representation of the resourecs wthin the site. The root is a node that's
|
31
23
|
# processed by the `resources_pipeline`.
|
32
24
|
def root
|
33
|
-
@root ||= Node.new.tap do |
|
34
|
-
|
35
|
-
resources_pipeline.process
|
25
|
+
@root ||= Node.new.tap do |root|
|
26
|
+
asset_node_mapper(root).map
|
27
|
+
resources_pipeline.process root
|
36
28
|
end
|
37
29
|
end
|
38
30
|
|
31
|
+
# Maps a path of directories and files into the root node.
|
32
|
+
def asset_node_mapper(root_node)
|
33
|
+
AssetNodeMapper.new(path: pages_path, node: root_node)
|
34
|
+
end
|
35
|
+
|
39
36
|
# Returns a list of all the resources within #root.
|
40
37
|
def resources
|
41
|
-
@resources ||=
|
38
|
+
@resources ||= ResourceIndexer.new(node: root, root_path: pages_path)
|
42
39
|
end
|
43
40
|
|
44
41
|
def reload!
|
@@ -94,8 +91,8 @@ module Sitepress
|
|
94
91
|
# certain path:
|
95
92
|
#
|
96
93
|
# ```ruby
|
97
|
-
# Sitepress.site.manipulate do |
|
98
|
-
#
|
94
|
+
# Sitepress.site.manipulate do |root|
|
95
|
+
# root.get("videos").each do |resource|
|
99
96
|
# resource.data["layout"] = "video"
|
100
97
|
# end
|
101
98
|
# end
|
@@ -105,7 +102,11 @@ module Sitepress
|
|
105
102
|
# in the site:
|
106
103
|
#
|
107
104
|
# ```ruby
|
108
|
-
# Sitepress.site.manipulate do |
|
105
|
+
# Sitepress.site.manipulate do |root|
|
106
|
+
# root.get("blog").each do |post|
|
107
|
+
# post.move_to root
|
108
|
+
# end
|
109
|
+
#
|
109
110
|
# if resource.request_path == "/index"
|
110
111
|
# # Remove the HTML format of index from the current resource level
|
111
112
|
# # so we can level it up.
|
data/lib/sitepress/version.rb
CHANGED
data/lib/sitepress-core.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require "sitepress/version"
|
2
2
|
|
3
3
|
module Sitepress
|
4
|
+
# Errors raised by Sitepress
|
5
|
+
Error = Class.new(StandardError)
|
6
|
+
|
4
7
|
# Raised by Resources if a path is added that's not a valid path.
|
5
8
|
InvalidRequestPathError = Class.new(RuntimeError)
|
6
9
|
|
@@ -10,12 +13,13 @@ module Sitepress
|
|
10
13
|
autoload :Asset, "sitepress/asset"
|
11
14
|
autoload :AssetNodeMapper, "sitepress/asset_node_mapper"
|
12
15
|
autoload :AssetPaths, "sitepress/asset_paths"
|
13
|
-
autoload :
|
16
|
+
autoload :Data, "sitepress/data"
|
14
17
|
autoload :Node, "sitepress/node"
|
15
18
|
autoload :Path, "sitepress/path"
|
16
19
|
autoload :Parsers, "sitepress/parsers"
|
17
20
|
autoload :Resource, "sitepress/resource"
|
18
|
-
autoload :
|
21
|
+
autoload :Resources, "sitepress/resources"
|
22
|
+
autoload :ResourceIndexer, "sitepress/resource_indexer"
|
19
23
|
autoload :ResourcesPipeline, "sitepress/resources_pipeline"
|
20
24
|
autoload :Site, "sitepress/site"
|
21
25
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sitepress-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 4.0.0.beta1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brad Gessler
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-
|
11
|
+
date: 2023-09-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -80,7 +80,6 @@ files:
|
|
80
80
|
- lib/sitepress/data.rb
|
81
81
|
- lib/sitepress/extensions/layouts.rb
|
82
82
|
- lib/sitepress/extensions/proc_manipulator.rb
|
83
|
-
- lib/sitepress/formats.rb
|
84
83
|
- lib/sitepress/node.rb
|
85
84
|
- lib/sitepress/parsers.rb
|
86
85
|
- lib/sitepress/parsers/base.rb
|
@@ -88,7 +87,8 @@ files:
|
|
88
87
|
- lib/sitepress/parsers/notion.rb
|
89
88
|
- lib/sitepress/path.rb
|
90
89
|
- lib/sitepress/resource.rb
|
91
|
-
- lib/sitepress/
|
90
|
+
- lib/sitepress/resource_indexer.rb
|
91
|
+
- lib/sitepress/resources.rb
|
92
92
|
- lib/sitepress/resources_pipeline.rb
|
93
93
|
- lib/sitepress/site.rb
|
94
94
|
- lib/sitepress/version.rb
|
@@ -111,11 +111,11 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
111
111
|
version: '0'
|
112
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
113
|
requirements:
|
114
|
-
- - "
|
114
|
+
- - ">"
|
115
115
|
- !ruby/object:Gem::Version
|
116
|
-
version:
|
116
|
+
version: 1.3.1
|
117
117
|
requirements: []
|
118
|
-
rubygems_version: 3.4.
|
118
|
+
rubygems_version: 3.4.6
|
119
119
|
signing_key:
|
120
120
|
specification_version: 4
|
121
121
|
summary: An embeddable file-backed content management system.
|
data/lib/sitepress/formats.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require "forwardable"
|
2
|
-
|
3
|
-
module Sitepress
|
4
|
-
# Manages collections of resources that share the same Node. Given the files `/a.html` and `/a.gif`,
|
5
|
-
# both of these assets would be stored in the `Node#name = "a"` under `Node#formats` with
|
6
|
-
# the extensions `.gif`, and `.html`.
|
7
|
-
class Formats
|
8
|
-
include Enumerable
|
9
|
-
|
10
|
-
extend Forwardable
|
11
|
-
def_delegators :@formats, :size, :clear
|
12
|
-
def_delegators :@node, :default_format
|
13
|
-
|
14
|
-
def initialize(node: )
|
15
|
-
@node = node
|
16
|
-
@formats = Hash.new
|
17
|
-
end
|
18
|
-
|
19
|
-
def each(&block)
|
20
|
-
@formats.values.each(&block)
|
21
|
-
end
|
22
|
-
|
23
|
-
def remove(extension)
|
24
|
-
@formats.delete symbolize(extension)
|
25
|
-
end
|
26
|
-
|
27
|
-
def get(extension)
|
28
|
-
@formats[symbolize(extension || default_format)]
|
29
|
-
end
|
30
|
-
|
31
|
-
def extensions
|
32
|
-
@formats.keys
|
33
|
-
end
|
34
|
-
|
35
|
-
def mime_type(mime_type)
|
36
|
-
find { |f| f.mime_type == mime_type }
|
37
|
-
end
|
38
|
-
|
39
|
-
def add(asset:, format: nil)
|
40
|
-
format = symbolize(format || default_format)
|
41
|
-
|
42
|
-
resource = Resource.new(asset: asset, node: @node, format: format)
|
43
|
-
if @formats.has_key? format
|
44
|
-
raise Sitepress::ExistingRequestPathError, "Resource at #{resource.request_path} already set with format #{format.inspect}"
|
45
|
-
else
|
46
|
-
@formats[format] = resource
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def inspect
|
51
|
-
"<#{self.class}: resources=#{map(&:request_path)}>"
|
52
|
-
end
|
53
|
-
|
54
|
-
private
|
55
|
-
def symbolize(format)
|
56
|
-
format&.to_sym
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|