4
4
require "fileutils"
5
5
require "nokogiri"
6
6
require "securerandom"
7
+ require "digest"
7
8
8
9
require "active_support/core_ext/string/output_safety"
9
10
require "active_support/core_ext/object/blank"
@@ -19,15 +20,16 @@ class Generator
19
20
GUIDES_RE = /\. (?:erb|md)\z /
20
21
21
22
def initialize ( edge :, version :, all :, only :, epub :, language :, direction : nil , lint :)
22
- @edge = edge
23
- @version = version
24
- @all = all
25
- @only = only
26
- @epub = epub
27
- @language = language
28
- @direction = direction || "ltr"
29
- @lint = lint
30
- @warnings = [ ]
23
+ @edge = edge
24
+ @version = version
25
+ @all = all
26
+ @only = only
27
+ @epub = epub
28
+ @language = language
29
+ @direction = direction || "ltr"
30
+ @digest_paths = { }
31
+ @lint = lint
32
+ @warnings = [ ]
31
33
32
34
if @epub
33
35
register_special_mime_types
@@ -39,6 +41,14 @@ def initialize(edge:, version:, all:, only:, epub:, language:, direction: nil, l
39
41
end
40
42
41
43
def generate
44
+ if !dry_run?
45
+ # First copy assets and add digests to make sure digest_paths are
46
+ # present in generate_guides.
47
+ process_scss
48
+ copy_assets
49
+ add_digests
50
+ end
51
+
42
52
generate_guides
43
53
44
54
if @lint && @warnings . any?
@@ -47,8 +57,6 @@ def generate
47
57
end
48
58
49
59
if !dry_run?
50
- process_scss
51
- copy_assets
52
60
generate_epub if @epub
53
61
end
54
62
end
@@ -122,16 +130,33 @@ def select_only(guides)
122
130
123
131
def process_scss
124
132
system "bundle exec dartsass \
125
- #{ @guides_dir } /assets/stylesrc/style.scss:#{ @output_dir } /stylesheets/style-v2 .css \
126
- #{ @guides_dir } /assets/stylesrc/highlight.scss:#{ @output_dir } /stylesheets/highlight-v2 .css \
127
- #{ @guides_dir } /assets/stylesrc/print.scss:#{ @output_dir } /stylesheets/print-v2 .css"
133
+ #{ @guides_dir } /assets/stylesrc/style.scss:#{ @output_dir } /stylesheets/style.css \
134
+ #{ @guides_dir } /assets/stylesrc/highlight.scss:#{ @output_dir } /stylesheets/highlight.css \
135
+ #{ @guides_dir } /assets/stylesrc/print.scss:#{ @output_dir } /stylesheets/print.css"
128
136
end
129
137
130
138
def copy_assets
131
139
source_files = Dir . glob ( "#{ @guides_dir } /assets/*" ) . reject { |name | name . include? ( "stylesrc" ) }
132
140
FileUtils . cp_r ( source_files , @output_dir )
133
141
end
134
142
143
+ def add_digests
144
+ assets_files = Dir . glob ( "{javascripts,stylesheets}/**/*" , base : @output_dir )
145
+ # Add the MD5 digest to the asset names.
146
+ assets_files . each do |asset |
147
+ asset_path = File . join ( @output_dir , asset )
148
+ if File . file? ( asset_path )
149
+ digest = Digest ::MD5 . file ( asset_path ) . hexdigest
150
+ ext = File . extname ( asset )
151
+ basename = File . basename ( asset , ext )
152
+ dirname = File . dirname ( asset )
153
+ digest_path = "#{ dirname } /#{ basename } -#{ digest } #{ ext } "
154
+ FileUtils . mv ( asset_path , "#{ @output_dir } /#{ digest_path } " )
155
+ @digest_paths [ asset ] = digest_path
156
+ end
157
+ end
158
+ end
159
+
135
160
def output_file_for ( guide )
136
161
if guide . end_with? ( ".md" )
137
162
guide . sub ( /md\z / , "html" )
@@ -157,12 +182,13 @@ def generate_guide(guide, output_file)
157
182
158
183
view = ActionView ::Base . with_empty_template_cache . with_view_paths (
159
184
[ @source_dir ] ,
160
- edge : @edge ,
161
- version : @version ,
162
- epub : "epub/#{ epub_filename } " ,
163
- language : @language ,
164
- direction : @direction ,
165
- uuid : SecureRandom . uuid
185
+ edge : @edge ,
186
+ version : @version ,
187
+ epub : "epub/#{ epub_filename } " ,
188
+ language : @language ,
189
+ direction : @direction ,
190
+ uuid : SecureRandom . uuid ,
191
+ digest_paths : @digest_paths
166
192
)
167
193
view . extend ( Helpers )
168
194
0 commit comments