-
Notifications
You must be signed in to change notification settings - Fork 351
/
configuration.rb
190 lines (157 loc) · 6.17 KB
/
configuration.rb
1
2
3
4
5
6
7
8
9
10
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
# frozen_string_literal: true
require "securerandom"
module GitHubPages
# Sets and manages Jekyll configuration defaults and overrides
class Configuration
# Backward compatability of constants
DEFAULT_PLUGINS = GitHubPages::Plugins::DEFAULT_PLUGINS
PLUGIN_WHITELIST = GitHubPages::Plugins::PLUGIN_WHITELIST
DEVELOPMENT_PLUGINS = GitHubPages::Plugins::DEVELOPMENT_PLUGINS
THEMES = GitHubPages::Plugins::THEMES
# Default, user overwritable options
DEFAULTS = {
"jailed" => false,
"plugins" => GitHubPages::Plugins::DEFAULT_PLUGINS,
"future" => true,
"theme" => "jekyll-theme-primer",
"markdown" => "kramdown",
"kramdown" => {
"input" => "GFM",
"hard_wrap" => false,
"gfm_quirks" => "paragraph_end",
"syntax_highlighter_opts" => {
"default_lang" => "plaintext",
},
},
"exclude" => ["CNAME"],
}.freeze
# User-overwritable defaults used only in production for practical reasons
PRODUCTION_DEFAULTS = Jekyll::Utils.deep_merge_hashes DEFAULTS, {
"sass" => {
"style" => "compressed",
},
}.freeze
# Options which GitHub Pages sets, regardless of the user-specified value
#
# The following values are also overridden by GitHub Pages, but are not
# overridden locally, for practical purposes:
# * source
# * destination
# * jailed
# * verbose
# * incremental
# * GH_ENV
OVERRIDES = {
"lsi" => false,
"safe" => true,
"plugins_dir" => SecureRandom.hex,
"whitelist" => GitHubPages::Plugins::PLUGIN_WHITELIST,
"highlighter" => "rouge",
"kramdown" => {
"template" => "",
"math_engine" => "mathjax",
"syntax_highlighter" => "rouge",
},
"gist" => {
"noscript" => false,
},
}.freeze
class << self
def processed?(site)
site.instance_variable_get(:@_github_pages_processed) == true
end
def processed(site)
site.instance_variable_set :@_github_pages_processed, true
end
def disable_whitelist?
development? && !ENV["DISABLE_WHITELIST"].to_s.empty?
end
def development?
Jekyll.env == "development"
end
def defaults_for_env
defaults = development? ? DEFAULTS : PRODUCTION_DEFAULTS
Jekyll::Utils.deep_merge_hashes Jekyll::Configuration::DEFAULTS, defaults
end
# Given a user's config, determines the effective configuration by building a user
# configuration sandwhich with our overrides overriding the user's specified
# values which themselves override our defaults.
#
# Returns the effective Configuration
#
# Note: this is a highly modified version of Jekyll#configuration
def effective_config(user_config)
# Merge user config into defaults
config = Jekyll::Utils.deep_merge_hashes(defaults_for_env, user_config)
.fix_common_issues
.add_default_collections
# Allow theme to be explicitly disabled via "theme: null"
config["theme"] = user_config["theme"] if user_config.key?("theme")
migrate_theme_to_remote_theme(config)
exclude_cname(config)
# Merge overwrites into user config
config = Jekyll::Utils.deep_merge_hashes config, OVERRIDES
restrict_and_config_markdown_processor(config)
configure_plugins(config)
config
end
# Set the site's configuration. Implemented as an `after_reset` hook.
# Equivalent #set! function contains the code of interest. This function
# guards against double-processing via the value in #processed.
def set(site)
return if processed? site
debug_print_versions
set!(site)
processed(site)
end
# Set the site's configuration with all the proper defaults and overrides.
# Should be called by #set to protect against multiple processings.
def set!(site)
site.config = effective_config(site.config)
end
private
# Ensure we're using Kramdown or GFM. Force to Kramdown if
# neither of these.
#
# This can get called multiply on the same config, so try to
# be idempotentish.
def restrict_and_config_markdown_processor(config)
config["markdown"] = "kramdown" unless \
%w(kramdown gfm commonmarkghpages).include?(config["markdown"].to_s.downcase)
return unless config["markdown"].to_s.casecmp("gfm").zero?
config["markdown"] = "CommonMarkGhPages"
config["commonmark"] = {
"extensions" => %w(table strikethrough autolink tagfilter),
"options" => %w(unsafe footnotes),
}
end
# If the user has set a 'theme', then see if we can automatically use remote theme instead.
def migrate_theme_to_remote_theme(config)
# This functionality has been rolled back due to complications with jekyll-remote-theme.
end
# If the user's 'exclude' config is the default, also exclude the CNAME
def exclude_cname(config)
return unless config["exclude"].eql? Jekyll::Configuration::DEFAULTS["exclude"]
config["exclude"].concat(DEFAULTS["exclude"])
end
# Requires default plugins and configures whitelist in development
def configure_plugins(config)
# Ensure we have those gems we want.
config["plugins"] = Array(config["plugins"]) | DEFAULT_PLUGINS
# To minimize errors, lazy-require jekyll-remote-theme if requested by the user
config["plugins"].push("jekyll-remote-theme") if config.key? "remote_theme"
return unless development?
if disable_whitelist?
config["whitelist"] = config["whitelist"] | config["plugins"]
end
config["whitelist"] = config["whitelist"] | DEVELOPMENT_PLUGINS
end
# Print the versions for github-pages and jekyll to the debug
# stream for debugging purposes. See by running Jekyll with '--verbose'
def debug_print_versions
Jekyll.logger.debug "GitHub Pages:", "github-pages v#{GitHubPages::VERSION}"
Jekyll.logger.debug "GitHub Pages:", "jekyll v#{Jekyll::VERSION}"
end
end
end
end