1# frozen_string_literal: true
2
3module Jekyll
4 class LayoutReader
5 attr_reader :site
6 def initialize(site)
7 @site = site
8 @layouts = {}
9 end
10
11 def read
12 layout_entries.each do |layout_file|
13 @layouts[layout_name(layout_file)] = \
14 Layout.new(site, layout_directory, layout_file)
15 end
16
17 theme_layout_entries.each do |layout_file|
18 @layouts[layout_name(layout_file)] ||= \
19 Layout.new(site, theme_layout_directory, layout_file)
20 end
21
22 @layouts
23 end
24
25 def layout_directory
26 @layout_directory ||= site.in_source_dir(site.config["layouts_dir"])
27 end
28
29 def theme_layout_directory
30 @theme_layout_directory ||= site.theme.layouts_path if site.theme
31 end
32
33 private
34
35 def layout_entries
36 entries_in layout_directory
37 end
38
39 def theme_layout_entries
40 theme_layout_directory ? entries_in(theme_layout_directory) : []
41 end
42
43 def entries_in(dir)
44 entries = []
45 within(dir) do
46 entries = EntryFilter.new(site).filter(Dir["**/*.*"])
47 end
48 entries
49 end
50
51 def layout_name(file)
52 file.split(".")[0..-2].join(".")
53 end
54
55 def within(directory)
56 return unless File.exist?(directory)
57
58 Dir.chdir(directory) { yield }
59 end
60 end
61end
62