sitefs 1.0.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +7 -0
- data/.gitignore +13 -0
- data/.rspec +2 -0
- data/.travis.yml +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +101 -0
- data/LICENSE.txt +21 -0
- data/README.md +41 -0
- data/Rakefile +6 -0
- data/TODO.md +8 -0
- data/bin/sitefs +96 -0
- data/inline-site/_layout.html.erb +30 -0
- data/inline-site/_layout.md.html.erb +3 -0
- data/inline-site/advanced-md.page.md +18 -0
- data/inline-site/dir/_layout.md.html.erb +3 -0
- data/inline-site/dir/sub1/_layout.html.erb +7 -0
- data/inline-site/dir/sub1/sub2/deep-page.page.md +8 -0
- data/inline-site/ears.png +0 -0
- data/inline-site/gallery/IMG_4371.jpg +0 -0
- data/inline-site/gallery/Screen Shot 2016-04-21 at 5.57.53 PM.png +0 -0
- data/inline-site/gallery/Screen Shot 2016-04-25 at 2.06.46 PM.png +0 -0
- data/inline-site/gallery/Screen Shot 2016-04-27 at 9.31.28 PM.png +0 -0
- data/inline-site/gallery/_gallery.html.erb +1 -0
- data/inline-site/gallery/_permalink.html.erb +1 -0
- data/inline-site/gallery/photos.page.rb +23 -0
- data/inline-site/index.html +41 -0
- data/inline-site/index.page.html.erb +1 -0
- data/inline-site/single-markdown.page.md +12 -0
- data/inline-site/styles/_helper.scss +1 -0
- data/inline-site/styles/app.css +1 -0
- data/inline-site/styles/app.scss +5 -0
- data/inline-site/tagged/_tag_layout.html.erb +7 -0
- data/inline-site/tagged/public.tag-page.rb +8 -0
- data/lib/sitefs/attribute_set.rb +93 -0
- data/lib/sitefs/command_config.rb +79 -0
- data/lib/sitefs/dsl_context.rb +49 -0
- data/lib/sitefs/file_action.rb +155 -0
- data/lib/sitefs/file_action_set.rb +51 -0
- data/lib/sitefs/file_registry.rb +61 -0
- data/lib/sitefs/handler.rb +46 -0
- data/lib/sitefs/handlers/markdown.rb +102 -0
- data/lib/sitefs/handlers/noop.rb +15 -0
- data/lib/sitefs/handlers/ruby_gen.rb +33 -0
- data/lib/sitefs/handlers/scss.rb +63 -0
- data/lib/sitefs/handlers/single_erb.rb +49 -0
- data/lib/sitefs/handlers/tag_page.rb +11 -0
- data/lib/sitefs/handlers.rb +6 -0
- data/lib/sitefs/html_pipelines.rb +95 -0
- data/lib/sitefs/layout_type.rb +16 -0
- data/lib/sitefs/manifest.rb +98 -0
- data/lib/sitefs/manifest_file.rb +64 -0
- data/lib/sitefs/page.rb +44 -0
- data/lib/sitefs/page_render.rb +6 -0
- data/lib/sitefs/path_helper.rb +31 -0
- data/lib/sitefs/render_context.rb +31 -0
- data/lib/sitefs/render_result.rb +16 -0
- data/lib/sitefs/renderer.rb +65 -0
- data/lib/sitefs/renderer_pipeline.rb +94 -0
- data/lib/sitefs/servlet.rb +31 -0
- data/lib/sitefs/tag_page_dsl_context.rb +13 -0
- data/lib/sitefs/version.rb +3 -0
- data/lib/sitefs/walker.rb +94 -0
- data/lib/sitefs/watcher.rb +85 -0
- data/lib/sitefs.rb +19 -0
- data/sitefs.gemspec +47 -0
- data/test-walker.rb +20 -0
- metadata +335 -0
@@ -0,0 +1,79 @@
|
|
1
|
+
class Sitefs::CommandConfig
|
2
|
+
attr_accessor :index_format, :port, :ignore_patterns
|
3
|
+
attr_reader :root_path, :manifest
|
4
|
+
attr_writer :quiet, :force
|
5
|
+
|
6
|
+
def initialize seed
|
7
|
+
@root_path = '.'
|
8
|
+
@aws_region = 'aws_region'
|
9
|
+
@index_format = 'all-index'
|
10
|
+
@ignore_patterns = []
|
11
|
+
|
12
|
+
seed.each do |k, v|
|
13
|
+
instance_variable_set "@#{k}", v
|
14
|
+
end
|
15
|
+
|
16
|
+
self.root_path = @root_path
|
17
|
+
|
18
|
+
@manifest = Manifest.new root_path
|
19
|
+
end
|
20
|
+
|
21
|
+
def quiet?; @quiet; end
|
22
|
+
def force?; @force; end
|
23
|
+
|
24
|
+
def root_path= path
|
25
|
+
@root_path = File.join(File.expand_path(@root_path), '')
|
26
|
+
end
|
27
|
+
|
28
|
+
def aws_creds
|
29
|
+
@aws_creds ||= Aws::Credentials.new(@aws_access_key_id, @aws_secret_access_key)
|
30
|
+
end
|
31
|
+
|
32
|
+
def s3
|
33
|
+
@s3 ||= Aws::S3::Client.new credentials: aws_creds, region: @aws_region
|
34
|
+
end
|
35
|
+
|
36
|
+
def s3_bucket
|
37
|
+
@bucket ||= s3.bucket(@aws_s3_bucket)
|
38
|
+
end
|
39
|
+
|
40
|
+
def s3_pages
|
41
|
+
s3.list_objects(bucket: @aws_s3_bucket)
|
42
|
+
end
|
43
|
+
|
44
|
+
def put_s3_object path, content_type: nil, **args
|
45
|
+
if content_type
|
46
|
+
args[:content_type] = content_type
|
47
|
+
end
|
48
|
+
|
49
|
+
s3.put_object(bucket: @aws_s3_bucket, key: path, **args)
|
50
|
+
end
|
51
|
+
|
52
|
+
def s3_object_contents path
|
53
|
+
resp = s3.get_object(bucket: @aws_s3_bucket, key: path)
|
54
|
+
|
55
|
+
resp && resp.body.read
|
56
|
+
end
|
57
|
+
|
58
|
+
def s3_object path
|
59
|
+
return @s3_object[path.to_s] if @s3_object
|
60
|
+
|
61
|
+
@s3_object = {}
|
62
|
+
|
63
|
+
s3_pages.each do |request|
|
64
|
+
request.contents.each do |obj|
|
65
|
+
@s3_object[obj.key.to_s] = obj
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
@s3_object[path.to_s]
|
70
|
+
end
|
71
|
+
|
72
|
+
class << self
|
73
|
+
attr_reader :current
|
74
|
+
|
75
|
+
def from_file filename
|
76
|
+
@current = new YAML.load_file(filename)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
# To make sure that inside of the DSLs you can import yaml files
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
class Sitefs::DslContext
|
5
|
+
attr_reader :_pages_to_render, :path_helper
|
6
|
+
def initialize path_helper
|
7
|
+
@path_helper = path_helper
|
8
|
+
@_pages_to_render = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def source_file
|
12
|
+
@path_helper.source_file
|
13
|
+
end
|
14
|
+
|
15
|
+
def path_for_href href
|
16
|
+
@path_helper.pathname_for href
|
17
|
+
end
|
18
|
+
|
19
|
+
def root_path
|
20
|
+
@path_helper.root_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def _eval
|
24
|
+
instance_eval(File.read(source_file), source_file)
|
25
|
+
@_pages_to_render
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_dir
|
29
|
+
File.dirname(source_file)
|
30
|
+
end
|
31
|
+
|
32
|
+
def files_like matcher
|
33
|
+
if matcher.is_a?(Regexp)
|
34
|
+
Dir[File.join(current_dir,'**/*')].grep(matcher)
|
35
|
+
else
|
36
|
+
Dir.glob(File.join(current_dir, matcher), File::FNM_CASEFOLD)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def new_page
|
41
|
+
Page.new path_helper
|
42
|
+
end
|
43
|
+
|
44
|
+
def render page, with:, **args
|
45
|
+
page._rendering_template = @path_helper.full_path_for(with)
|
46
|
+
@_pages_to_render << page
|
47
|
+
page
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,155 @@
|
|
1
|
+
require 'digest/md5'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'diffy'
|
4
|
+
require 'mime/types'
|
5
|
+
|
6
|
+
Diffy::Diff.default_format = :color
|
7
|
+
|
8
|
+
MAP_MIME_TYPE = MIME::Type.new('application/json+sourcemap') {|type| type.add_extensions('map')}
|
9
|
+
MIME::Types.add(MAP_MIME_TYPE)
|
10
|
+
|
11
|
+
class Sitefs::FileAction
|
12
|
+
attr_accessor :render_error, :content_type, :path
|
13
|
+
|
14
|
+
POSSIBLE_ACTIONS = %i{upload write}
|
15
|
+
|
16
|
+
def initialize possible_actions: POSSIBLE_ACTIONS, path:, content: nil, content_type: nil, &blk
|
17
|
+
@content_type = content_type || content_type_for(path)
|
18
|
+
@possible_actions = possible_actions
|
19
|
+
@path = path
|
20
|
+
|
21
|
+
@content = blk || content
|
22
|
+
end
|
23
|
+
|
24
|
+
def content_type_for path
|
25
|
+
unless mtype = MIME::Types.type_for(path).first
|
26
|
+
return
|
27
|
+
end
|
28
|
+
|
29
|
+
type = mtype.to_s
|
30
|
+
case mtype
|
31
|
+
when 'text/html', 'application/javascript'
|
32
|
+
type += '; charset=utf-8'
|
33
|
+
when MAP_MIME_TYPE
|
34
|
+
type = 'application/json'
|
35
|
+
end
|
36
|
+
|
37
|
+
type
|
38
|
+
end
|
39
|
+
|
40
|
+
def content
|
41
|
+
if @content.respond_to?(:call)
|
42
|
+
@content = @content.call
|
43
|
+
end
|
44
|
+
|
45
|
+
@content
|
46
|
+
end
|
47
|
+
|
48
|
+
def content_hash
|
49
|
+
@content_hash ||= Digest::MD5.hexdigest(content)
|
50
|
+
end
|
51
|
+
|
52
|
+
def destination_hash config, action, path
|
53
|
+
case action
|
54
|
+
when :write
|
55
|
+
if File.exist? path
|
56
|
+
Digest::MD5.hexdigest(File.read(path))
|
57
|
+
end
|
58
|
+
when :upload
|
59
|
+
if manifest = config.manifest.path_uploaded_hash(path)
|
60
|
+
manifest
|
61
|
+
elsif obj = config.s3_object(path)
|
62
|
+
obj.etag[1...-1]
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
# TODO: make this return a reason instead of bool
|
68
|
+
def should_write? config, action, path
|
69
|
+
return true if config.force?
|
70
|
+
|
71
|
+
d_hash = destination_hash(config, action, path)
|
72
|
+
|
73
|
+
result = !d_hash || (content_hash != d_hash)
|
74
|
+
if result && false
|
75
|
+
puts "should_write? #{path}"
|
76
|
+
puts " dest hash: #{d_hash}"
|
77
|
+
puts " cont hash: #{content_hash}"
|
78
|
+
|
79
|
+
remote_content = config.s3_object_contents(path)
|
80
|
+
|
81
|
+
diff = Diffy::Diff.new(remote_content, content)
|
82
|
+
puts " #{diff.to_s}"
|
83
|
+
end
|
84
|
+
|
85
|
+
result
|
86
|
+
end
|
87
|
+
|
88
|
+
def write_path_for path, config
|
89
|
+
return path unless path =~ /\.html$/
|
90
|
+
|
91
|
+
case config.index_format
|
92
|
+
when 'github', 'standard'
|
93
|
+
path
|
94
|
+
when 'all-index'
|
95
|
+
if path =~ /index\.html$/i
|
96
|
+
path
|
97
|
+
else
|
98
|
+
path.sub(/\.html$/, '/index.html')
|
99
|
+
end
|
100
|
+
when 'aws'
|
101
|
+
if path =~ /index\.html$/i
|
102
|
+
path
|
103
|
+
else
|
104
|
+
path.sub(/\.html$/, '')
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def perform_action config, action
|
110
|
+
unless POSSIBLE_ACTIONS.include? action
|
111
|
+
raise ArgumentError.new("invalid action: #{action}")
|
112
|
+
end
|
113
|
+
|
114
|
+
unless @possible_actions.include? action
|
115
|
+
return
|
116
|
+
end
|
117
|
+
|
118
|
+
path = write_path_for @path, config
|
119
|
+
|
120
|
+
dirname = File.dirname path
|
121
|
+
|
122
|
+
config.manifest.set_path_content_type path, content_type if content_type
|
123
|
+
|
124
|
+
case action
|
125
|
+
when :write
|
126
|
+
if should_write? config, action, path
|
127
|
+
log :generate, path
|
128
|
+
FileUtils.mkdir_p dirname
|
129
|
+
File.open(path, 'w') { |file| file.write content }
|
130
|
+
|
131
|
+
config.manifest.generated_path path
|
132
|
+
else
|
133
|
+
log :identical, path
|
134
|
+
end
|
135
|
+
when :upload
|
136
|
+
if should_write? config, action, path
|
137
|
+
log :upload, path
|
138
|
+
|
139
|
+
config.put_s3_object path, content_type: content_type, body: content
|
140
|
+
config.manifest.uploaded_path path
|
141
|
+
config.manifest.set_path_uploaded_hash path, content_hash
|
142
|
+
else
|
143
|
+
log :identical, path
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
def log type, path
|
149
|
+
puts " #{type} - #{path}"
|
150
|
+
end
|
151
|
+
|
152
|
+
def to_s
|
153
|
+
inspect
|
154
|
+
end
|
155
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
class Sitefs::FileActionSet
|
2
|
+
include Enumerable
|
3
|
+
|
4
|
+
def initialize(file_actions)
|
5
|
+
@file_actions = file_actions
|
6
|
+
@errored_on = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def each
|
10
|
+
@file_actions.each do |file_action|
|
11
|
+
yield file_action
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
def [] i
|
16
|
+
@file_actions[i]
|
17
|
+
end
|
18
|
+
|
19
|
+
def has_errors?
|
20
|
+
!@errored_on.empty?
|
21
|
+
end
|
22
|
+
|
23
|
+
def output_paths
|
24
|
+
map(&:path)
|
25
|
+
end
|
26
|
+
|
27
|
+
def includes_path? path
|
28
|
+
path = File.expand_path(path)
|
29
|
+
|
30
|
+
output_paths.include? path
|
31
|
+
end
|
32
|
+
|
33
|
+
def call config, action
|
34
|
+
|
35
|
+
each do |file_action|
|
36
|
+
begin
|
37
|
+
file_action.perform_action config, action
|
38
|
+
rescue Exception => e
|
39
|
+
STDERR.puts "Error: file(#{file_action.inspect})"
|
40
|
+
STDERR.puts e
|
41
|
+
|
42
|
+
raise e
|
43
|
+
|
44
|
+
file_action.render_error = e
|
45
|
+
@errored_on << file_action
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
self
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class Sitefs::FileRegistry
|
2
|
+
|
3
|
+
def initialize
|
4
|
+
@handlers = []
|
5
|
+
end
|
6
|
+
|
7
|
+
def << handler
|
8
|
+
@pages = nil
|
9
|
+
|
10
|
+
if handler.respond_to? :registry=
|
11
|
+
handler.registry = self
|
12
|
+
end
|
13
|
+
|
14
|
+
@handlers << handler
|
15
|
+
end
|
16
|
+
|
17
|
+
def handlers
|
18
|
+
@handlers.select {|h| !h.delay_generation }
|
19
|
+
end
|
20
|
+
|
21
|
+
def delayed_handlers
|
22
|
+
@handlers.select {|h| h.delay_generation }
|
23
|
+
end
|
24
|
+
|
25
|
+
def pages
|
26
|
+
@pages ||= handlers.flat_map do |h|
|
27
|
+
h.pages
|
28
|
+
end.compact
|
29
|
+
end
|
30
|
+
|
31
|
+
def pages_tagged tag_str, all: false
|
32
|
+
# If it hasnt been published always sort by the same
|
33
|
+
default_time = Time.now
|
34
|
+
|
35
|
+
pages.select do |page|
|
36
|
+
is_tagged = page.tags.include? tag_str
|
37
|
+
|
38
|
+
if all
|
39
|
+
is_tagged
|
40
|
+
else
|
41
|
+
is_tagged && page.published_at
|
42
|
+
end
|
43
|
+
end.sort_by do |page|
|
44
|
+
[page.published_at || default_time, page.title]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def public_tags
|
49
|
+
pages.flat_map(&:public_tags).uniq
|
50
|
+
end
|
51
|
+
|
52
|
+
def gather_actions
|
53
|
+
all_handlers = handlers + delayed_handlers
|
54
|
+
|
55
|
+
actions = all_handlers.flat_map do |handler|
|
56
|
+
handler.file_actions self
|
57
|
+
end
|
58
|
+
|
59
|
+
FileActionSet.new(actions)
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
class Sitefs::Handler
|
2
|
+
attr_reader :root_path, :source_file
|
3
|
+
|
4
|
+
def initialize root_path, source_file
|
5
|
+
@root_path = root_path
|
6
|
+
@source_file = source_file
|
7
|
+
end
|
8
|
+
|
9
|
+
def should_generate? config
|
10
|
+
true
|
11
|
+
end
|
12
|
+
|
13
|
+
def delay_generation
|
14
|
+
false
|
15
|
+
end
|
16
|
+
|
17
|
+
def pages
|
18
|
+
[]
|
19
|
+
end
|
20
|
+
|
21
|
+
def path_helper
|
22
|
+
@path_helper ||= PathHelper.new(root_path, source_file)
|
23
|
+
end
|
24
|
+
|
25
|
+
def file_actions registry
|
26
|
+
[]
|
27
|
+
end
|
28
|
+
|
29
|
+
def tags
|
30
|
+
[]
|
31
|
+
end
|
32
|
+
|
33
|
+
def html_pipeline_result
|
34
|
+
@html_pipeline_result ||= {}
|
35
|
+
end
|
36
|
+
|
37
|
+
def attributes
|
38
|
+
@attributes ||= AttributeSet.new.tap do |attrs|
|
39
|
+
attrs['tags'] ||= tags
|
40
|
+
attrs['title'] ||= html_pipeline_result[:title]
|
41
|
+
attrs['subtitle'] ||= html_pipeline_result[:subtitle]
|
42
|
+
attrs['description'] ||= html_pipeline_result[:subtitle]
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,102 @@
|
|
1
|
+
class Sitefs::Handlers::Markdown < Sitefs::Handler
|
2
|
+
def output_path
|
3
|
+
@source_file.sub(/\.page.*$/, '.html').sub(root_path, '')
|
4
|
+
end
|
5
|
+
|
6
|
+
def path
|
7
|
+
File.join('', @source_file.gsub(/\.page.*$/, '').sub(@root_path, ''))
|
8
|
+
end
|
9
|
+
|
10
|
+
def config_strings
|
11
|
+
_read unless @config_strings
|
12
|
+
@config_strings
|
13
|
+
end
|
14
|
+
|
15
|
+
def markdown
|
16
|
+
_read unless @markdown
|
17
|
+
@markdown.join
|
18
|
+
end
|
19
|
+
|
20
|
+
MARKER_REG = /^\-{3,}$/
|
21
|
+
|
22
|
+
def _read
|
23
|
+
@config_strings = []
|
24
|
+
@markdown = []
|
25
|
+
|
26
|
+
in_config = false
|
27
|
+
|
28
|
+
File.open(@source_file).each_with_index do |line, i|
|
29
|
+
if i === 0 && line =~ MARKER_REG
|
30
|
+
in_config = true
|
31
|
+
next
|
32
|
+
end
|
33
|
+
|
34
|
+
if in_config
|
35
|
+
if line =~ MARKER_REG
|
36
|
+
in_config = false
|
37
|
+
next
|
38
|
+
else
|
39
|
+
@config_strings << line
|
40
|
+
end
|
41
|
+
else
|
42
|
+
@markdown << line
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def attributes
|
48
|
+
@attributes ||= AttributeSet.from_yaml(config_strings.join).tap do |attrs|
|
49
|
+
attrs['tags'] ||= []
|
50
|
+
attrs['title'] ||= html_pipeline_result[:title]
|
51
|
+
attrs['subtitle'] ||= html_pipeline_result[:subtitle]
|
52
|
+
attrs['description'] ||= html_pipeline_result[:subtitle]
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def pages
|
57
|
+
@pages ||= begin
|
58
|
+
page = Page.new(path_helper, attributes)
|
59
|
+
page.path = path
|
60
|
+
[page]
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def html_pipeline_result
|
65
|
+
@html_pipeline_result ||= HtmlPipelines.markdown.call(markdown)
|
66
|
+
end
|
67
|
+
|
68
|
+
def xml
|
69
|
+
html_pipeline_result[:output]
|
70
|
+
end
|
71
|
+
|
72
|
+
def output
|
73
|
+
xml.to_s
|
74
|
+
end
|
75
|
+
|
76
|
+
def markdown_pipeline
|
77
|
+
@markdown_pipeline ||= RendererPipeline.for(
|
78
|
+
root_path: root_path,
|
79
|
+
source_file: source_file,
|
80
|
+
content_text: output,
|
81
|
+
layout_name: '_layout.md.html.erb',
|
82
|
+
)
|
83
|
+
end
|
84
|
+
|
85
|
+
def render_pipleine
|
86
|
+
@render_pipleine ||= RendererPipeline.for(root_path: root_path, source_file: source_file, content_text: markdown_pipeline)
|
87
|
+
end
|
88
|
+
|
89
|
+
def _render context=nil
|
90
|
+
render_pipleine.render(context)
|
91
|
+
end
|
92
|
+
|
93
|
+
def file_actions registry
|
94
|
+
return [] unless page = pages.first
|
95
|
+
|
96
|
+
FileAction.new path: output_path do
|
97
|
+
context = RenderContext.new(registry, current_page: page)
|
98
|
+
_render(context)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
class Sitefs::Handlers::Noop < Sitefs::Handler
|
2
|
+
def output_path
|
3
|
+
@source_file.sub(root_path, '')
|
4
|
+
end
|
5
|
+
|
6
|
+
def should_generate? config
|
7
|
+
(File.basename(source_file)[0] != '_') && !config.manifest.generated?(output_path)
|
8
|
+
end
|
9
|
+
|
10
|
+
def file_actions registry
|
11
|
+
FileAction.new(path: output_path, possible_actions: %i{upload}) do
|
12
|
+
File.read(@source_file)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
class Sitefs::Handlers::RubyGen < Sitefs::Handler
|
2
|
+
def dsl
|
3
|
+
@dsl ||= DslContext.new path_helper
|
4
|
+
end
|
5
|
+
|
6
|
+
def pages
|
7
|
+
@pages ||= begin
|
8
|
+
dsl._eval
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def renderer_for page
|
13
|
+
content_path = page._rendering_template
|
14
|
+
content_text = File.read(content_path)
|
15
|
+
|
16
|
+
RendererPipeline.for(root_path: root_path, source_file: source_file, content_text: content_text)
|
17
|
+
end
|
18
|
+
|
19
|
+
def file_actions registry
|
20
|
+
pages.map do |page|
|
21
|
+
output_path = page.expanded_path + '.html'
|
22
|
+
output_path.sub!(root_path, '')
|
23
|
+
|
24
|
+
FileAction.new path: output_path do
|
25
|
+
renderer = renderer_for page
|
26
|
+
context = RenderContext.new(registry, current_page: page)
|
27
|
+
|
28
|
+
renderer.render context
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'sass'
|
2
|
+
|
3
|
+
class Sitefs::Handlers::Scss < Sitefs::Handler
|
4
|
+
|
5
|
+
def content
|
6
|
+
engine.render
|
7
|
+
end
|
8
|
+
|
9
|
+
def engine_options
|
10
|
+
{
|
11
|
+
cache: true,
|
12
|
+
syntax: :scss,
|
13
|
+
style: :compressed,
|
14
|
+
filename: source_file,
|
15
|
+
sourcemap: :inline,
|
16
|
+
load_paths: [root_path],
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def engine
|
21
|
+
@engine ||= Sass::Engine.new(File.read(source_file), engine_options)
|
22
|
+
end
|
23
|
+
|
24
|
+
def render_with_sourcemap
|
25
|
+
@render_with_sourcemap ||= engine.render_with_sourcemap(sourcemap_output_pathname)
|
26
|
+
end
|
27
|
+
|
28
|
+
# def delay_generation
|
29
|
+
# true
|
30
|
+
# end
|
31
|
+
|
32
|
+
def should_generate? config
|
33
|
+
File.basename(source_file)[0] != '_'
|
34
|
+
end
|
35
|
+
|
36
|
+
def output_path
|
37
|
+
source_file.sub(/\.scss$/, '.css').sub(root_path, '')
|
38
|
+
end
|
39
|
+
|
40
|
+
def output_pathname
|
41
|
+
File.join('', output_path)
|
42
|
+
end
|
43
|
+
|
44
|
+
def sourcemap_output_pathname
|
45
|
+
output_pathname + '.map'
|
46
|
+
end
|
47
|
+
|
48
|
+
def sourcemap_output_path
|
49
|
+
output_path + '.map'
|
50
|
+
end
|
51
|
+
|
52
|
+
def file_actions registry
|
53
|
+
sourcemap_options = {
|
54
|
+
css_path: output_path,
|
55
|
+
sourcemap_path: sourcemap_output_path,
|
56
|
+
}
|
57
|
+
|
58
|
+
[
|
59
|
+
FileAction.new(path: output_path) { render_with_sourcemap[0] },
|
60
|
+
FileAction.new(path: sourcemap_output_path) { render_with_sourcemap[1].to_json(sourcemap_options) },
|
61
|
+
]
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
class Sitefs::Handlers::SingleErb < Sitefs::Handler
|
2
|
+
def basename
|
3
|
+
File.basename(source_file)
|
4
|
+
end
|
5
|
+
|
6
|
+
def extension
|
7
|
+
if match = basename.match(/\.page(\..*)?\.erb$/)
|
8
|
+
match[1]
|
9
|
+
else
|
10
|
+
'.html'
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def output_path
|
15
|
+
source_file.sub(/\.page(\..*)?\.erb$/,'\1').sub(root_path, '')
|
16
|
+
end
|
17
|
+
|
18
|
+
def content_text
|
19
|
+
@content_text ||= File.read(source_file)
|
20
|
+
end
|
21
|
+
|
22
|
+
def renderer
|
23
|
+
RendererPipeline.for(root_path: root_path, source_file: source_file, content_text: content_text)
|
24
|
+
end
|
25
|
+
|
26
|
+
def pages
|
27
|
+
@pages ||= begin
|
28
|
+
page = Page.new path_helper, attributes
|
29
|
+
page.published_at = File.birthtime(source_file)
|
30
|
+
[page]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def page
|
35
|
+
pages.first
|
36
|
+
end
|
37
|
+
|
38
|
+
def html_pipeline_result
|
39
|
+
@html_pipeline_result ||= HtmlPipelines.content.call(content_text)
|
40
|
+
end
|
41
|
+
|
42
|
+
def file_actions registry
|
43
|
+
FileAction.new path: output_path do
|
44
|
+
context = RenderContext.new(registry, current_page: page)
|
45
|
+
|
46
|
+
renderer.render context
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|