jekyll-js-converter 0.0.1 → 0.0.6
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 +4 -4
- data/lib/jekyll-js-converter.rb +26 -0
- data/lib/jekyll-js-converter/version.rb +3 -0
- data/lib/jekyll/converters/js.rb +159 -0
- data/lib/jekyll/js_source_map_page.rb +29 -0
- metadata +7 -17
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f975186d3b4d088fb3ee18595c6b6f43b1226defb8f44d06e2683663c60a611
|
4
|
+
data.tar.gz: fd7abf2439a6a69133cdd2c0e55ed3f30fa8d8e2dc95698d1b1314cb934e4a60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: '086d6cef9f35f63debb0ff5a0bfead0c11cc69e45f1e543ba3191cd6a619a7d3f7a45b8ebe465348de2ee2bec04b3d2d1155f7f52645fbca394ce589f91f1941'
|
7
|
+
data.tar.gz: ee944a5a249415e7308a67488a6d2e0bc44a7f2a71153301444da9dd18265c03d0529be0b2d02125acc751dd06c08b3973c1aa39a2df0ea0b1888ccd51636a82
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'jekyll-js-converter/version'
|
2
|
+
require 'jekyll/converters/js'
|
3
|
+
|
4
|
+
module JekyllJsConverter
|
5
|
+
class Jekyll::Theme
|
6
|
+
def javascript_path
|
7
|
+
@javascript_path ||= path_for '_javascript'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
Jekyll::Hooks.register :pages, :pre_render do |page|
|
12
|
+
if page.is_a?(Jekyll::Page)
|
13
|
+
page.converters.each do |converter|
|
14
|
+
converter.associate_page(page) if converter.is_a?(Jekyll::Converters::Js)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
Jekyll::Hooks.register :pages, :post_render do |page|
|
20
|
+
if page.is_a?(Jekyll::Page)
|
21
|
+
page.converters.each do |converter|
|
22
|
+
converter.dissociate_page(page) if converter.is_a?(Jekyll::Converters::Js)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,159 @@
|
|
1
|
+
require 'uglifier'
|
2
|
+
require 'jekyll/js_source_map_page'
|
3
|
+
|
4
|
+
module Jekyll
|
5
|
+
module Converters
|
6
|
+
class Js < Converter
|
7
|
+
DIRECTIVES = %w(import import_directory import_tree)
|
8
|
+
|
9
|
+
safe true
|
10
|
+
priority :low
|
11
|
+
|
12
|
+
def associate_page(page)
|
13
|
+
@page = page
|
14
|
+
@site = @page.site
|
15
|
+
@source_map_page = JsSourceMapPage.new(@page)
|
16
|
+
end
|
17
|
+
|
18
|
+
def dissociate_page(page)
|
19
|
+
@page = nil
|
20
|
+
@site = nil
|
21
|
+
@source_map_page = nil
|
22
|
+
end
|
23
|
+
|
24
|
+
def javascript_config
|
25
|
+
@javascript_config ||= @config['javascript'] || {}
|
26
|
+
end
|
27
|
+
|
28
|
+
def javascript_dir
|
29
|
+
javascript_config['javascript_dir'].to_s.empty? ? '_javascript' : javascript_config['javascript_dir']
|
30
|
+
end
|
31
|
+
|
32
|
+
def load_paths
|
33
|
+
@load_paths ||= begin
|
34
|
+
paths = [Jekyll.sanitized_path(@site.source, javascript_dir)]
|
35
|
+
paths += javascript_config['load_paths'].map { |load_path| File.expand_path(load_path) } rescue []
|
36
|
+
|
37
|
+
if safe?
|
38
|
+
paths.map! { |path| Jekyll.sanitized_path(@site.source, path) }
|
39
|
+
end
|
40
|
+
|
41
|
+
Dir.chdir(@site.source) do
|
42
|
+
paths = paths.flat_map { |path| Dir.glob(path) }
|
43
|
+
|
44
|
+
paths.map! do |path|
|
45
|
+
if safe?
|
46
|
+
Jekyll.sanitized_path(site_source, path)
|
47
|
+
else
|
48
|
+
File.expand_path(path)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
paths.uniq!
|
54
|
+
paths << @site.theme.javascript_path
|
55
|
+
paths.select { |path| File.directory?(path) }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def matches(ext)
|
60
|
+
ext =~ /^\.js$/i
|
61
|
+
end
|
62
|
+
|
63
|
+
def output_ext(ext)
|
64
|
+
'.js'
|
65
|
+
end
|
66
|
+
|
67
|
+
def safe?
|
68
|
+
!!@config['safe']
|
69
|
+
end
|
70
|
+
|
71
|
+
def convert(content)
|
72
|
+
if generate_source_map?
|
73
|
+
config = Jekyll::Utils.symbolize_hash_keys(
|
74
|
+
Jekyll::Utils.deep_merge_hashes(
|
75
|
+
{ :uglifer => {
|
76
|
+
:source_map => {
|
77
|
+
:map_url => @source_map_page.name,
|
78
|
+
:sources_content => true,
|
79
|
+
:filename => @page.name
|
80
|
+
}
|
81
|
+
}
|
82
|
+
},
|
83
|
+
javascript_config
|
84
|
+
)
|
85
|
+
)
|
86
|
+
|
87
|
+
uglified, source_map = Uglifier.new(config[:uglifer]).compile_with_map(insert_imports(content))
|
88
|
+
|
89
|
+
@source_map_page.source_map(source_map)
|
90
|
+
@site.pages << @source_map_page
|
91
|
+
|
92
|
+
uglified
|
93
|
+
else
|
94
|
+
config = Jekyll::Utils.symbolize_hash_keys(
|
95
|
+
Jekyll::Utils.deep_merge_hashes(
|
96
|
+
{ :uglifer => {} },
|
97
|
+
javascript_config
|
98
|
+
)
|
99
|
+
)
|
100
|
+
|
101
|
+
Uglifier.new(config[:uglifer]).compile(insert_imports(content))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
private
|
106
|
+
|
107
|
+
def generate_source_map?
|
108
|
+
if @page.nil? || source_map_option.eql?(:never)
|
109
|
+
false
|
110
|
+
elsif source_map_option.eql?(:always)
|
111
|
+
true
|
112
|
+
else
|
113
|
+
:development == source_map_option == Jekyll.env.to_sym
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
def insert_imports(content)
|
118
|
+
content.enum_for(:scan, /^\/\/=\s*(\w+)\s+([\w\/\\\-\.:]+)\W*$/).map {
|
119
|
+
{ directive: Regexp.last_match[1],
|
120
|
+
path: Regexp.last_match[2],
|
121
|
+
insert_at: Regexp.last_match.end(0) }
|
122
|
+
}.sort { |a, b|
|
123
|
+
# start inserting at the end of the file so the insert_at's remain accurate as the content's length changes
|
124
|
+
b[:insert_at] <=> a[:insert_at]
|
125
|
+
}.each { |match|
|
126
|
+
if DIRECTIVES.include?(match[:directive])
|
127
|
+
import_content = load_paths.reduce([]) { |files, load_path|
|
128
|
+
glob = case match[:directive]
|
129
|
+
when 'import'
|
130
|
+
if (match[:path] =~ URI::regexp).nil?
|
131
|
+
match[:path] += '.js' unless match[:path].end_with?('.js')
|
132
|
+
Dir.glob(File.join(load_path, '**', match[:path]))
|
133
|
+
else
|
134
|
+
[match[:path]]
|
135
|
+
end
|
136
|
+
when 'import_directory'
|
137
|
+
Dir.glob(File.join(load_path, '**', match[:path], '*.js'))
|
138
|
+
when 'import_tree'
|
139
|
+
Dir.glob(File.join(load_path, '**', match[:path], '**', '*.js'))
|
140
|
+
end
|
141
|
+
|
142
|
+
files + glob
|
143
|
+
}.uniq.reduce('') { |import_content, file|
|
144
|
+
import_content += (file =~ URI::regexp).nil? ? File.read(file) : Net::HTTP.get(URI(file))
|
145
|
+
}
|
146
|
+
|
147
|
+
content.insert(match[:insert_at], "\n#{insert_imports(import_content)}")
|
148
|
+
end
|
149
|
+
}
|
150
|
+
|
151
|
+
content
|
152
|
+
end
|
153
|
+
|
154
|
+
def source_map_option
|
155
|
+
javascript_config.fetch('source_map', :always).to_sym
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Jekyll
|
2
|
+
class JsSourceMapPage < Page
|
3
|
+
def initialize(js_page)
|
4
|
+
@site = js_page.site
|
5
|
+
@dir = js_page.dir
|
6
|
+
@data = js_page.data
|
7
|
+
@name = js_page.basename + '.js.map'
|
8
|
+
|
9
|
+
process(@name)
|
10
|
+
Jekyll::Hooks.trigger :pages, :post_init, self
|
11
|
+
end
|
12
|
+
|
13
|
+
def source_map(map)
|
14
|
+
self.content = map
|
15
|
+
end
|
16
|
+
|
17
|
+
def ext
|
18
|
+
'.map'
|
19
|
+
end
|
20
|
+
|
21
|
+
def asset_file?
|
22
|
+
true
|
23
|
+
end
|
24
|
+
|
25
|
+
def inspect
|
26
|
+
"#<#{self.class} @name=#{name.inspect}>"
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
metadata
CHANGED
@@ -1,29 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-js-converter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Susco
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-03-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
-
- !ruby/object:Gem::Dependency
|
14
|
-
name: jekyll
|
15
|
-
requirement: !ruby/object:Gem::Requirement
|
16
|
-
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: 4.2.0
|
20
|
-
type: :runtime
|
21
|
-
prerelease: false
|
22
|
-
version_requirements: !ruby/object:Gem::Requirement
|
23
|
-
requirements:
|
24
|
-
- - "~>"
|
25
|
-
- !ruby/object:Gem::Version
|
26
|
-
version: 4.2.0
|
27
13
|
- !ruby/object:Gem::Dependency
|
28
14
|
name: uglifier
|
29
15
|
requirement: !ruby/object:Gem::Requirement
|
@@ -99,7 +85,11 @@ email:
|
|
99
85
|
executables: []
|
100
86
|
extensions: []
|
101
87
|
extra_rdoc_files: []
|
102
|
-
files:
|
88
|
+
files:
|
89
|
+
- lib/jekyll-js-converter.rb
|
90
|
+
- lib/jekyll-js-converter/version.rb
|
91
|
+
- lib/jekyll/converters/js.rb
|
92
|
+
- lib/jekyll/js_source_map_page.rb
|
103
93
|
homepage: https://github.com/dsusco/jekyll-js-converter
|
104
94
|
licenses:
|
105
95
|
- MIT
|