hyde-page-css 0.2.3 → 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: 51563246edbe4869d4b25ebe8f9b0776f0a284d7654aa08528e9303c7266ef7e
4
- data.tar.gz: 22072719d33191180958636099f9b028c33d90d9620a8622868145f20189d4a7
3
+ metadata.gz: cc880fee97ad3433edc18d4b84618e59b02dc1962081092bb3651b790dc22d6d
4
+ data.tar.gz: 1387955f0999508ce4b6ae49c5f2b93fd5b9140e0154722cd68e0dd323b8345e
5
5
  SHA512:
6
- metadata.gz: 8f55167a8b0a7d9f4c26c223f8346e286222811358aa648a89efc8cfdabfe06b1e1fa929a30e54b3919b7b721020e203ae6a3b972e47083d005ad87222f240a9
7
- data.tar.gz: 865741a9b1e794f16014236e7a6bd086e54776752af4d43d0793e9f582373e76b1ec916dfe9603c76dade2baf49f3f0f393010847c908bc87855460ba1a12356
6
+ metadata.gz: 82f6f01f1b2bf89a25c0ba414e2af744d6818e720ad69479180766380573b83cfd433f6062537657ec181135c5b6c42ca34f0d3a1bbb115454fff3f5016f2c68
7
+ data.tar.gz: 00a05f045fc9aefe54d1d1f18cccc7d33aeee6fa4a266c1956176cdd1d845b1ac7f4a63ad8a2cc45826b09a37f1f7cbdfd3614b753bbff2ac1920cc7cb6c9415
@@ -0,0 +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
+
8
+ module Hyde
9
+ module Page
10
+ class Css
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
210
+ end
211
+ end
212
+ end
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.2.3
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-17 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
@@ -37,9 +37,7 @@ executables: []
37
37
  extensions: []
38
38
  extra_rdoc_files: []
39
39
  files:
40
- - lib/hyde_page_css.rb
41
- - lib/hyde_page_css/generated_page_css_file.rb
42
- - lib/hyde_page_css/hyde_page_css.rb
40
+ - lib/hyde-page-css.rb
43
41
  homepage: https://github.com/gregdaynes/hyde-page-css
44
42
  licenses:
45
43
  - MIT
@@ -59,7 +57,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
59
57
  - !ruby/object:Gem::Version
60
58
  version: '0'
61
59
  requirements: []
62
- rubygems_version: 3.4.22
60
+ rubygems_version: 3.5.3
63
61
  signing_key:
64
62
  specification_version: 4
65
63
  summary: Plugin for jekyll to enable per page css files
@@ -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
@@ -1,149 +0,0 @@
1
- require 'jekyll'
2
- require_relative 'generated_page_css_file.rb'
3
-
4
- module Jekyll
5
- class Renderer
6
- def render_layout(output, layout, info)
7
- Hyde::Page::Css.new(layout, info).generate
8
-
9
- # TODO Would be nice to call super here instead of cloned logic from Jekyll internals
10
- payload["content"] = output
11
- payload["layout"] = Utils.deep_merge_hashes(layout.data, payload["layout"] || {})
12
-
13
- render_liquid(
14
- layout.content,
15
- payload,
16
- info,
17
- layout.path
18
- )
19
- end
20
- end
21
- end
22
-
23
- module Hyde
24
- module Page
25
- class Css
26
- @@config = {
27
- "asset_path" => 'assets/css',
28
- "file_output_path" => 'assets/css',
29
- "css_minify" => true,
30
- "enable" => true,
31
- "keep_files" => true,
32
- "dev_mode" => false
33
- }
34
-
35
- def initialize(layout, info)
36
- @site = info[:registers][:site]
37
- @page = info[:registers][:page]
38
- @data = layout.data
39
- @config = @@config.merge(@site.config.dig('hyde_page_css') || {})
40
-
41
- @qualified_asset_path = File.join(*[@site.source, @config['asset_path']].compact)
42
-
43
- if config('keep_files') == true && config('dev_mode') == false
44
- @site.config['keep_files'].push(config('file_output_path'))
45
- end
46
-
47
- if @page["css"].nil?
48
- @page["css"] = []
49
- else
50
- @page["css"] = [@page["css"]]
51
- end
52
- end
53
-
54
- def generate
55
- return unless config('enable') == true
56
- @page["css"].unshift(@data['css'])
57
-
58
- file_groups = flatten_group(@page["css"])
59
-
60
- css_files = []
61
-
62
- for files in file_groups do
63
- break if !files&.length
64
-
65
- data = concatenate_files(files.compact)
66
- data = minify(data)
67
- next if data == ""
68
-
69
- file = generate_file(files, data)
70
- css_files << file.url
71
-
72
- # file already exists, so skip writing out the data to disk
73
- next if @site.static_files.find { |x| x.name == file.name }
74
-
75
- # place file data into the new file
76
- file.file_contents = data
77
-
78
- # assign static file to list for jekyll to render
79
- @site.static_files << file
80
- end
81
-
82
- # the recursive nature of this will sometimes have duplicate css files
83
- @page['css_files'] = css_files.uniq
84
- end
85
-
86
- private
87
-
88
- def config(*keys)
89
- @config.dig(*keys)
90
- end
91
-
92
- def flatten_group(arr, acc = [])
93
- return [arr] if !arr.last.is_a?(Array)
94
-
95
- acc += [arr.first]
96
- acc += flatten_group(arr.last)
97
- end
98
-
99
- def concatenate_files(files, data = '')
100
- for file in files do
101
- # tmp page required to handle anything with frontmatter/yaml header
102
- tmp_page = Jekyll::PageWithoutAFile.new(@site, nil, config('asset_path'), file)
103
- path = File.join([@qualified_asset_path, file])
104
-
105
- begin
106
- file_contents = File.read(path)
107
- tmp_page.content = file_contents
108
- data << Jekyll::Renderer.new(@site, tmp_page).run()
109
- rescue
110
- Jekyll.logger.warn('Page CSS Warning:', "Unable to find #{path}")
111
- end
112
- end
113
-
114
- data
115
- end
116
-
117
- def minify(data)
118
- if config('dev_mode') == true
119
- style = 'expanded'
120
- elsif config('css_minify') == false
121
- style = 'expanded'
122
- else
123
- style = 'compressed'
124
- end
125
-
126
- converter_config = { 'sass' => { 'style' => style } }
127
- Jekyll::Converters::Scss.new(converter_config).convert(data)
128
- end
129
-
130
- def generate_file(files, data)
131
- file_name = generate_file_name(files, data)
132
-
133
- Hyde::Page::GeneratedPageCssFile.new(@site, config('asset_path'), file_name)
134
- end
135
-
136
- def generate_file_name(files, data, prefix: nil)
137
- file_names = [prefix]
138
-
139
- if config('dev_mode')
140
- files.each { |file| file_names.push(file.gsub('.css', '')) }
141
- end
142
-
143
- file_names.push(Digest::MD5.hexdigest(data)[0,6])
144
-
145
- file_names.compact.join('-') + '.css'
146
- end
147
- end
148
- end
149
- end
data/lib/hyde_page_css.rb DELETED
@@ -1,10 +0,0 @@
1
- module Hyde
2
- module Page
3
- class Css
4
- VERSION = "0.2.3"
5
- end
6
- end
7
- end
8
-
9
- require_relative './hyde_page_css/hyde_page_css.rb'
10
-