11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
|
# File 'lib/jekyll/document_writer.rb', line 11
def self.included(base)
base.class_eval do
def save
return unless data.fetch('save', true)
if File.exist?(path)
file_digest = Digest::SHA2.file(path).hexdigest
content_digest = Digest::SHA2.hexdigest(writable_content)
return if file_digest == content_digest
Jekyll.logger.debug 'Writing:', real_path
else
Jekyll.logger.debug 'Creating:', path
end
file = File.open(path, File::RDWR | File::CREAT, 0o640) do |f|
f.flock(File::LOCK_EX)
f.rewind
f.write(writable_content)
f.flush
f.truncate(f.pos)
end
site.staged_files << real_path if file.zero?
file.zero?
end
def sanitized_data
data.slice(*attributes).transform_values do |value|
case value
when Jekyll::Document, Jekyll::Convertible
value.data['uuid']
when Array, Set
value.map do |v|
v.respond_to?(:data) ? v.data['uuid'] : v
end
when Hash
value.transform_values do |v|
v.respond_to?(:data) ? v.data['uuid'] : v
end
else
value
end
end
end
private
def real_path
@real_path ||= Pathname.new(relative_path).realpath.relative_path_from(site.source).to_s
rescue Errno::ENOENT
relative_path
end
def attributes
@attributes ||= data.keys - EXCLUDED_ATTRIBUTES
end
def layout?
layout.is_a? Hash
end
def layout
@layout ||= site.data.dig('layouts', data['layout'])
end
def fields
@fields ||= (layout.keys + SUTTY_FIELDS).uniq
end
def writable_content
@writable_content ||=
begin
dumpable_data = sanitized_data
dumpable_data = dumpable_data.slice(*fields) if layout?
<<~CONTENT
#{dumpable_data.to_yaml.chomp}
---
#{content.chomp}
CONTENT
end
end
end
end
|