hyde-page-css 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47a306a1505adce319c2e7e2c872029f0ae792feab9d164163a74b5933166267
4
- data.tar.gz: 84b56ab510348dd9b2c0401e9cb3f0d6c332cec97f5d4ca5aa78222412b7c5f2
3
+ metadata.gz: cc880fee97ad3433edc18d4b84618e59b02dc1962081092bb3651b790dc22d6d
4
+ data.tar.gz: 1387955f0999508ce4b6ae49c5f2b93fd5b9140e0154722cd68e0dd323b8345e
5
5
  SHA512:
6
- metadata.gz: 4c3da3407955bd07c45d39f2e1b0c033a2e25b6812d4e7f95ae590e45cb4baeb7d5447720355b1cc230ed078542b3990e4a5dbe45f2ff5af1afe564543e5b812
7
- data.tar.gz: 80ceca52abdde3699e55e025cdc39350ed0f7ce84aa96417614ac512b659857709ddf5f315b5f0d429712425250175646b47af851fa70cd0871811b4e61d0e06
6
+ metadata.gz: 82f6f01f1b2bf89a25c0ba414e2af744d6818e720ad69479180766380573b83cfd433f6062537657ec181135c5b6c42ca34f0d3a1bbb115454fff3f5016f2c68
7
+ data.tar.gz: 00a05f045fc9aefe54d1d1f18cccc7d33aeee6fa4a266c1956176cdd1d845b1ac7f4a63ad8a2cc45826b09a37f1f7cbdfd3614b753bbff2ac1920cc7cb6c9415
data/lib/hyde-page-css.rb CHANGED
@@ -1,11 +1,212 @@
1
+ require 'jekyll'
2
+ require 'digest'
3
+
4
+ Jekyll::Hooks.register :pages, :pre_render do |page, payload|
5
+ Hyde::Page::Css.new(page).run
6
+ end
7
+
1
8
  module Hyde
2
9
  module Page
3
10
  class Css
4
- VERSION = "0.3.0"
11
+ VERSION = "0.4.0"
12
+ end
13
+
14
+ class GeneratedCssFile < Jekyll::StaticFile
15
+ attr_accessor :file_contents
16
+ attr_reader :generator
17
+
18
+ def initialize(site, dir, name)
19
+ @site = site
20
+ @dir = dir
21
+ @name = name
22
+ @relative_path = File.join(*[@dir, @name].compact)
23
+ @extname = File.extname(@name)
24
+ @type = @collection&.label&.to_sym
25
+ @generator = "hyde-page-css"
26
+ end
27
+
28
+ def write(dest)
29
+ dest_path = destination(dest)
30
+ return false if File.exist?(dest_path)
31
+
32
+ FileUtils.mkdir_p(File.dirname(dest_path))
33
+ FileUtils.rm(dest_path) if File.exist?(dest_path)
34
+
35
+ File.open(dest_path, "w") do |output_file|
36
+ output_file << file_contents
37
+ end
38
+
39
+ true
40
+ end
41
+ end
42
+
43
+ class Css
44
+ @@config = {
45
+ "source" => "assets/css",
46
+ "destination" => "assets/css",
47
+ "minify" => true,
48
+ "enable" => true,
49
+ "keep_files" => true,
50
+ "dev_mode" => false
51
+ }
52
+
53
+ def initialize(page)
54
+ @page = page
55
+ @site = page.site
56
+ @config = fetch_config
57
+ @site.data['_hyde_pages_cache'] ||= {}
58
+
59
+ if keep_files? && !dev_mode?
60
+ @site.config.fetch("keep_files").push(destination)
61
+ end
62
+ end
63
+
64
+ def run
65
+ css = fetch_css(@page)
66
+ layout = fetch_layout(fetch_layout_name(@page))
67
+ results = parent_layout_css(layout, css).reverse
68
+ return if results.empty?
69
+
70
+ lookup_name = names_to_key(results)
71
+ return unless @site.data['_hyde_pages_cache'].fetch(lookup_name, nil).nil?
72
+
73
+ data = concatenate_files(results)
74
+ return if data == ""
75
+
76
+ data = minify(data)
77
+ return if data == ""
78
+
79
+ generated_file = generate_file(results, data)
80
+
81
+ # file already exists, so skip writing out the data to disk
82
+ return unless @site.static_files.find { |static_file| static_file.name == generated_file.name }.nil?
83
+
84
+ # place file data into the new file
85
+ generated_file.file_contents = data
86
+
87
+ # assign static file to list for jekyll to render
88
+ @site.static_files << generated_file
89
+
90
+ # assign to site.data.css_files for liquid output
91
+ add_to_urls(generated_file.url)
92
+
93
+ # add to cache
94
+ @site.data['_hyde_pages_cache'][lookup_name] = data
95
+ end
96
+
97
+ private
98
+
99
+ def names_to_key(names)
100
+ names.join('-')
101
+ end
102
+
103
+ def add_to_urls(url)
104
+ @site.data['css_files'] ||= []
105
+ @site.data['css_files'].push(url)
106
+ end
107
+
108
+ def fetch_config
109
+ @@config.merge(@site.config.fetch("hyde_page_css", {}))
110
+ end
111
+
112
+ def keep_files?
113
+ @config.fetch("keep_files") == true
114
+ end
115
+
116
+ def dev_mode?
117
+ @config.fetch("dev_mode") == true
118
+ end
119
+
120
+ def minify?
121
+ @config.fetch("minify") == true
122
+ end
123
+
124
+ def destination
125
+ @config.fetch("destination")
126
+ end
127
+
128
+ def source
129
+ @config.fetch("source")
130
+ end
131
+
132
+ def qualified_source
133
+ File.join(*[@site.source, source].compact)
134
+ end
135
+
136
+ def fetch_layout_name(obj_with_data, default = nil)
137
+ obj_with_data.data.fetch('layout', default)
138
+ end
139
+
140
+ def fetch_css(obj_with_data, default = [])
141
+ obj_with_data.data.fetch('css', []).reverse
142
+ end
143
+
144
+ def fetch_layout(layout_name, default = nil)
145
+ @site.layouts.fetch(layout_name, default)
146
+ end
147
+
148
+ def parent_layout_css(layout, css)
149
+ if layout.nil?
150
+ return css.uniq.compact
151
+ end
152
+
153
+ layout_name = fetch_layout_name(layout)
154
+ parent_layout = fetch_layout(layout_name)
155
+ css = css.concat(fetch_css(layout))
156
+
157
+ parent_layout_css(parent_layout, css)
158
+ end
159
+
160
+ def concatenate_files(files, data = [])
161
+ files.each do |file_name|
162
+ # tmp page required to handle anything with frontmatter/yaml header
163
+ tmp_page = Jekyll::PageWithoutAFile.new(@site, nil, source, file_name)
164
+ path = File.join([qualified_source, file_name])
165
+
166
+ begin
167
+ tmp_page.content = File.read(path)
168
+ data.push(Jekyll::Renderer.new(@site, tmp_page).run)
169
+ rescue
170
+ Jekyll.logger.warn("Page CSS Warning:", "Unable to find #{path}")
171
+ end
172
+ end
173
+
174
+ data.join("\n")
175
+ end
176
+
177
+ def style
178
+ if dev_mode?
179
+ "expanded"
180
+ elsif !minify?
181
+ "expanded"
182
+ else
183
+ "compressed"
184
+ end
185
+ end
186
+
187
+ def minify(data)
188
+ return data unless minify?
189
+
190
+ converter_config = {"sass" => {"style" => style}}
191
+ Jekyll::Converters::Scss.new(converter_config).convert(data)
192
+ end
193
+
194
+ def generate_file(files, data)
195
+ file_name = generate_file_name(files, data)
196
+ Hyde::Page::GeneratedCssFile.new(@site, source, file_name)
197
+ end
198
+
199
+ def generate_file_name(files, data, prefix: nil)
200
+ file_names = [prefix]
201
+
202
+ if dev_mode?
203
+ files.each { |file| file_names.push(file.gsub(".css", "")) }
204
+ end
205
+
206
+ file_names.push(Digest::MD5.hexdigest(data)[0, 6])
207
+
208
+ file_names.compact.join("-") + ".css"
209
+ end
5
210
  end
6
211
  end
7
212
  end
8
-
9
- require_relative "hyde/renderer.rb"
10
- require_relative "hyde/page/css.rb"
11
- require_relative "hyde/page/generated_page_css_file.rb"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hyde-page-css
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gregory Daynes
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-24 00:00:00.000000000 Z
11
+ date: 2023-12-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll
@@ -38,9 +38,6 @@ extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
40
  - lib/hyde-page-css.rb
41
- - lib/hyde/page/css.rb
42
- - lib/hyde/page/generated_page_css_file.rb
43
- - lib/hyde/renderer.rb
44
41
  homepage: https://github.com/gregdaynes/hyde-page-css
45
42
  licenses:
46
43
  - MIT
@@ -60,7 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
60
57
  - !ruby/object:Gem::Version
61
58
  version: '0'
62
59
  requirements: []
63
- rubygems_version: 3.4.10
60
+ rubygems_version: 3.5.3
64
61
  signing_key:
65
62
  specification_version: 4
66
63
  summary: Plugin for jekyll to enable per page css files
data/lib/hyde/page/css.rb DELETED
@@ -1,130 +0,0 @@
1
- require 'jekyll'
2
- require_relative "generated_page_css_file"
3
-
4
- module Hyde
5
- module Page
6
- class Css
7
- @@config = {
8
- "asset_path" => "assets/css",
9
- "file_output_path" => "assets/css",
10
- "css_minify" => true,
11
- "enable" => true,
12
- "keep_files" => true,
13
- "dev_mode" => false
14
- }
15
-
16
- def initialize(layout, info)
17
- @site = info[:registers][:site]
18
- @page = info[:registers][:page]
19
- @data = layout.data
20
- @config = @@config.merge(@site.config.dig("hyde_page_css") || {})
21
-
22
- @qualified_asset_path = File.join(*[@site.source, @config["asset_path"]].compact)
23
-
24
- if config("keep_files") == true && config("dev_mode") == false
25
- @site.config["keep_files"].push(config("file_output_path"))
26
- end
27
-
28
- @page["css"] = if @page["css"].nil?
29
- []
30
- else
31
- [@page["css"]]
32
- end
33
- end
34
-
35
- def generate
36
- return unless config("enable") == true
37
- @page["css"].unshift(@data["css"])
38
-
39
- file_groups = flatten_group(@page["css"])
40
-
41
- css_files = []
42
-
43
- for files in file_groups do
44
- break if !files&.length
45
-
46
- data = concatenate_files(files.compact)
47
- data = minify(data)
48
- next if data == ""
49
-
50
- file = generate_file(files, data)
51
- css_files << file.url
52
-
53
- # file already exists, so skip writing out the data to disk
54
- next if @site.static_files.find { |x| x.name == file.name }
55
-
56
- # place file data into the new file
57
- file.file_contents = data
58
-
59
- # assign static file to list for jekyll to render
60
- @site.static_files << file
61
- end
62
-
63
- # the recursive nature of this will sometimes have duplicate css files
64
- @page["css_files"] = css_files.uniq
65
- end
66
-
67
- private
68
-
69
- def config(*)
70
- @config.dig(*)
71
- end
72
-
73
- def flatten_group(arr, acc = [])
74
- return [arr] if !arr.last.is_a?(Array)
75
-
76
- acc += [arr.first]
77
- acc += flatten_group(arr.last)
78
- end
79
-
80
- def concatenate_files(files, data = "")
81
- for file in files do
82
- # tmp page required to handle anything with frontmatter/yaml header
83
- tmp_page = Jekyll::PageWithoutAFile.new(@site, nil, config("asset_path"), file)
84
- path = File.join([@qualified_asset_path, file])
85
-
86
- begin
87
- file_contents = File.read(path)
88
- tmp_page.content = file_contents
89
- data << Jekyll::Renderer.new(@site, tmp_page).run
90
- rescue
91
- Jekyll.logger.warn("Page CSS Warning:", "Unable to find #{path}")
92
- end
93
- end
94
-
95
- data
96
- end
97
-
98
- def minify(data)
99
- style = if config("dev_mode") == true
100
- "expanded"
101
- elsif config("css_minify") == false
102
- "expanded"
103
- else
104
- "compressed"
105
- end
106
-
107
- converter_config = {"sass" => {"style" => style}}
108
- Jekyll::Converters::Scss.new(converter_config).convert(data)
109
- end
110
-
111
- def generate_file(files, data)
112
- file_name = generate_file_name(files, data)
113
-
114
- Hyde::Page::GeneratedPageCssFile.new(@site, config("asset_path"), file_name)
115
- end
116
-
117
- def generate_file_name(files, data, prefix: nil)
118
- file_names = [prefix]
119
-
120
- if config("dev_mode")
121
- files.each { |file| file_names.push(file.gsub(".css", "")) }
122
- end
123
-
124
- file_names.push(Digest::MD5.hexdigest(data)[0, 6])
125
-
126
- file_names.compact.join("-") + ".css"
127
- end
128
- end
129
- end
130
- end
@@ -1,35 +0,0 @@
1
- module Hyde
2
- module Page
3
- # Alternative class for jekyll's static files
4
- # this allows the creation of files without a source file
5
-
6
- class GeneratedPageCssFile < Jekyll::StaticFile
7
- attr_accessor :file_contents
8
- attr_reader :generator
9
-
10
- def initialize(site, dir, name)
11
- @site = site
12
- @dir = dir
13
- @name = name
14
- @relative_path = File.join(*[@dir, @name].compact)
15
- @extname = File.extname(@name)
16
- @type = @collection&.label&.to_sym
17
- @generator = "hyde-page-css"
18
- end
19
-
20
- def write(dest)
21
- dest_path = destination(dest)
22
- return false if File.exist?(dest_path)
23
-
24
- FileUtils.mkdir_p(File.dirname(dest_path))
25
- FileUtils.rm(dest_path) if File.exist?(dest_path)
26
-
27
- File.open(dest_path, "w") do |output_file|
28
- output_file << file_contents
29
- end
30
-
31
- true
32
- end
33
- end
34
- end
35
- end
data/lib/hyde/renderer.rb DELETED
@@ -1,18 +0,0 @@
1
- module Jekyll
2
- class Renderer
3
- def render_layout(output, layout, info)
4
- Hyde::Page::Css.new(layout, info).generate
5
-
6
- # TODO Would be nice to call super here instead of cloned logic from Jekyll internals
7
- payload["content"] = output
8
- payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
9
-
10
- render_liquid(
11
- layout.content,
12
- payload,
13
- info,
14
- layout.path
15
- )
16
- end
17
- end
18
- end