hyde-page-css 0.2.3 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
-