yard_ghurt 1.2.0 → 1.2.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,23 +1,11 @@
1
- #!/usr/bin/env ruby
2
1
  # encoding: UTF-8
3
2
  # frozen_string_literal: true
4
3
 
5
4
  #--
6
5
  # This file is part of YardGhurt.
7
- # Copyright (c) 2019 Jonathan Bradley Whited (@esotericpig)
8
- #
9
- # YardGhurt is free software: you can redistribute it and/or modify
10
- # it under the terms of the GNU Lesser General Public License as published by
11
- # the Free Software Foundation, either version 3 of the License, or
12
- # (at your option) any later version.
13
- #
14
- # YardGhurt is distributed in the hope that it will be useful,
15
- # but WITHOUT ANY WARRANTY; without even the implied warranty of
16
- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
- # GNU Lesser General Public License for more details.
18
- #
19
- # You should have received a copy of the GNU Lesser General Public License
20
- # along with YardGhurt. If not, see <https://www.gnu.org/licenses/>.
6
+ # Copyright (c) 2019-2021 Jonathan Bradley Whited
7
+ #
8
+ # SPDX-License-Identifier: LGPL-3.0-or-later
21
9
  #++
22
10
 
23
11
 
@@ -33,29 +21,29 @@ module YardGhurt
33
21
  ###
34
22
  # Fix (find & replace) text in the GitHub Flavored Markdown (GFM) files in the YARDoc directory,
35
23
  # for differences between the two formats.
36
- #
24
+ #
37
25
  # You can set {dry_run} on the command line:
38
26
  # rake yard_gfm_fix dryrun=true
39
- #
27
+ #
40
28
  # @example What I Use
41
29
  # YardGhurt::GFMFixTask.new() do |task|
42
30
  # task.arg_names = [:dev]
43
31
  # task.dry_run = false
44
32
  # task.fix_code_langs = true
45
33
  # task.md_files = ['index.html']
46
- #
47
- # task.before = Proc.new() do |task,args|
34
+ #
35
+ # task.before = Proc.new() do |t2,args|
48
36
  # # Delete this file as it's never used (index.html is an exact copy)
49
- # YardGhurt.rm_exist(File.join(task.doc_dir,'file.README.html'))
50
- #
37
+ # YardGhurt.rm_exist(File.join(t2.doc_dir,'file.README.html'))
38
+ #
51
39
  # # Root dir of my GitHub Page for CSS/JS
52
- # GHP_ROOT_DIR = YardGhurt.to_bool(args.dev) ? '../../esotericpig.github.io' : '../../..'
53
- #
54
- # task.css_styles << %Q(<link rel="stylesheet" type="text/css" href="#{GHP_ROOT_DIR}/css/prism.css" />)
55
- # task.js_scripts << %Q(<script src="#{GHP_ROOT_DIR}/js/prism.js"></script>)
40
+ # ghp_root_dir = YardGhurt.to_bool(args.dev) ? '../../esotericpig.github.io' : '../../..'
41
+ #
42
+ # t2.css_styles << %Q(<link rel="stylesheet" type="text/css" href="#{ghp_root_dir}/css/prism.css" />)
43
+ # t2.js_scripts << %Q(<script src="#{ghp_root_dir}/js/prism.js"></script>)
56
44
  # end
57
45
  # end
58
- #
46
+ #
59
47
  # @example Using All Options
60
48
  # YardGhurt::GFMFixTask.new(:yard_fix) do |task|
61
49
  # task.anchor_db = {'tests' => 'Testing'} # #tests => #Testing
@@ -76,192 +64,192 @@ module YardGhurt
76
64
  # task.js_scripts << '<script>document.write("Hello World!");</script>'
77
65
  # task.md_files = ['index.html']
78
66
  # task.verbose = false
79
- #
67
+ #
80
68
  # task.before = Proc.new() {|task,args| puts "Hi, #{args.name}!"}
81
69
  # task.during = Proc.new() {|task,args,file| puts "#{args.name} can haz #{file}?"}
82
70
  # task.after = Proc.new() {|task,args| puts "Goodbye, #{args.name}!"}
83
71
  # end
84
- #
85
- # @author Jonathan Bradley Whited (@esotericpig)
72
+ #
73
+ # @author Jonathan Bradley Whited
86
74
  # @since 1.1.0
87
75
  ###
88
76
  class GFMFixTask < Rake::TaskLib
89
77
  # This is important so that a subsequent call to this task will not write the CSS again.
90
- #
78
+ #
91
79
  # @return [String] the comment tag of where to place {css_styles}
92
- #
80
+ #
93
81
  # @see add_css_styles!
94
82
  CSS_COMMENT = "<!-- #{self} CSS - Do NOT remove this comment! -->"
95
-
83
+
96
84
  # This is important so that a subsequent call to this task will not write the JS again.
97
- #
85
+ #
98
86
  # @return [String] the comment tag of where to place {js_scripts}
99
- #
87
+ #
100
88
  # @see add_js_scripts!
101
89
  JS_COMMENT = "<!-- #{self} JS - Do NOT remove this comment! -->"
102
-
90
+
103
91
  # @example
104
92
  # task.arg_names = [:dev]
105
- #
93
+ #
106
94
  # # @param task [self]
107
95
  # # @param args [Rake::TaskArguments] the args specified by {arg_names}
108
96
  # task.after = Proc.new do |task,args|
109
97
  # puts args.dev
110
98
  # end
111
- #
99
+ #
112
100
  # @return [Proc,nil] the Proc ( +respond_to?(:call)+ ) to call at the end of this task or +nil+;
113
101
  # default: +nil+
114
102
  attr_accessor :after
115
-
103
+
116
104
  # The anchor links to override in the database.
117
- #
105
+ #
118
106
  # The keys are GFM anchor IDs and the values are their equivalent YARDoc anchor IDs.
119
- #
107
+ #
120
108
  # @return [Hash] the custom database (key-value pairs) of GFM anchor links to YARDoc anchor links;
121
109
  # default: +{}+
122
- #
110
+ #
123
111
  # @see build_anchor_links_db
124
112
  # @see AnchorLinks#merge_anchor_ids!
125
113
  attr_accessor :anchor_db
126
-
114
+
127
115
  # @return [Array<Symbol>,Symbol] the custom arg(s) for this task; default: +[]+
128
116
  attr_accessor :arg_names
129
-
117
+
130
118
  # @example
131
119
  # task.arg_names = [:dev]
132
- #
120
+ #
133
121
  # # @param task [self]
134
122
  # # @param args [Rake::TaskArguments] the args specified by {arg_names}
135
123
  # task.before = Proc.new do |task,args|
136
124
  # puts args.dev
137
125
  # end
138
- #
126
+ #
139
127
  # @return [Proc,nil] the Proc ( +respond_to?(:call)+ ) to call at the beginning of this task or +nil+;
140
128
  # default: +nil+
141
129
  attr_accessor :before
142
-
130
+
143
131
  # @example
144
132
  # task.css_styles << '<link rel="stylesheet" type="text/css" href="css/prism.css" />'
145
- #
133
+ #
146
134
  # @return [Array<String>] the CSS styles to add to each file; default: +[]+
147
135
  attr_accessor :css_styles
148
-
136
+
149
137
  # @example
150
138
  # # +gsub!()+ (and other mutable methods) must be used
151
139
  # # as the return value must be +true+ or +false+.
152
- # #
140
+ # #
153
141
  # # @param line [String] the current line being processed from the current file
154
- # #
142
+ # #
155
143
  # # @return [true,false] whether there was a change
156
144
  # task.custom_gsub = Proc.new do |line|
157
145
  # has_change = false
158
- #
146
+ #
159
147
  # has_change = !line.gsub!('dev','prod').nil?() || has_change
160
148
  # # More changes...
161
- #
149
+ #
162
150
  # return has_change
163
151
  # end
164
- #
152
+ #
165
153
  # @return [Proc,nil] the custom Proc ( +respond_to?(:call)+ ) to call to gsub! each line for each file
166
154
  attr_accessor :custom_gsub
167
-
155
+
168
156
  # @example
169
157
  # task.custom_gsubs = [
170
158
  # ['dev','prod'],
171
159
  # [/href="#[^"]*"/,'href="#contents"']
172
160
  # ]
173
- #
161
+ #
174
162
  # # Internal code:
175
163
  # # ---
176
164
  # # @custom_gsubs.each do |custom_gsub|
177
165
  # # line.gsub!(custom_gsub[0],custom_gsub[1])
178
166
  # # end
179
- #
167
+ #
180
168
  # @return [Array<[Regexp,String]>] the custom args to use in gsub on each line for each file
181
169
  attr_accessor :custom_gsubs
182
-
170
+
183
171
  # @example
184
172
  # task.deps = :yard
185
173
  # # or...
186
174
  # task.deps = [:clobber,:yard]
187
- #
175
+ #
188
176
  # @return [Array<Symbol>,Symbol] the custom dependencies for this task; default: +[]+
189
177
  attr_accessor :deps
190
-
178
+
191
179
  # @return [String] the description of this task (customizable)
192
180
  attr_accessor :description
193
-
181
+
194
182
  # @return [String] the directory of generated YARDoc files; default: +doc+
195
183
  attr_accessor :doc_dir
196
-
184
+
197
185
  # @return [true,false] whether to run a dry run (no writing to the files); default: +false+
198
186
  attr_accessor :dry_run
199
-
187
+
200
188
  # @example
201
189
  # task.arg_names = [:dev]
202
- #
190
+ #
203
191
  # # @param task [self]
204
192
  # # @param args [Rake::TaskArguments] the args specified by {arg_names}
205
193
  # # @param file [String] the current file being processed
206
194
  # task.during = Proc.new do |task,args,file|
207
195
  # puts args.dev
208
196
  # end
209
- #
197
+ #
210
198
  # @return [Proc,nil] the Proc to call ( +respond_to?(:call)+ ) at the beginning of processing
211
199
  # each file or +nil+; default: +nil+
212
200
  attr_accessor :during
213
-
201
+
214
202
  # @return [Set<String>] the case-sensitive code languages to not fix; default: +Set[ 'ruby' ]+
215
- #
203
+ #
216
204
  # @see fix_code_langs
217
205
  attr_accessor :exclude_code_langs
218
-
206
+
219
207
  # @return [true,false] whether to fix anchor links; default: +true+
220
208
  attr_accessor :fix_anchor_links
221
-
209
+
222
210
  # If +true+, +language-+ will be added to code classes, except for {exclude_code_langs}.
223
- #
211
+ #
224
212
  # For example, +code class="ruby"+ will be changed to +code class="language-ruby"+.
225
- #
213
+ #
226
214
  # @return [true,false] whether to fix code languages; default: +false+
227
215
  attr_accessor :fix_code_langs
228
-
216
+
229
217
  # If +true+, local file links (if the local file exists), will be changed to +file.{filename}.html+.
230
- #
218
+ #
231
219
  # This is useful for +README.md+, +LICENSE.txt+, etc.
232
- #
220
+ #
233
221
  # @return [true,false] whether to fix local file links; default: +true+
234
222
  attr_accessor :fix_file_links
235
-
223
+
236
224
  # This is an internal flag meant to be changed internally.
237
- #
225
+ #
238
226
  # @return [true,false] whether {CSS_COMMENT} has been seen/added; default: +false+
239
- #
227
+ #
240
228
  # @see add_css_styles!
241
229
  attr_accessor :has_css_comment
242
-
230
+
243
231
  # This is an internal flag meant to be changed internally.
244
- #
232
+ #
245
233
  # @return [true,false] whether {JS_COMMENT} has been seen/added; default: +false+
246
- #
234
+ #
247
235
  # @see add_js_scripts!
248
236
  attr_accessor :has_js_comment
249
-
237
+
250
238
  # @example
251
239
  # task.js_scripts << '<script src="js/prism.js"></script>'
252
- #
240
+ #
253
241
  # @return [Array<String>] the JS scripts to add to each file; default: +[]+
254
242
  attr_accessor :js_scripts
255
-
243
+
256
244
  # @return [Array<String>] the (GFM) Markdown files to fix; default: +['file.README.html','index.html']+
257
245
  attr_accessor :md_files
258
-
246
+
259
247
  # @return [String] the name of this task (customizable); default: +yard_gfm_fix+
260
248
  attr_accessor :name
261
-
249
+
262
250
  # @return [true,false] whether to output each change to stdout; default: +true+
263
251
  attr_accessor :verbose
264
-
252
+
265
253
  alias_method :dry_run?,:dry_run
266
254
  alias_method :fix_anchor_links?,:fix_anchor_links
267
255
  alias_method :fix_code_langs?,:fix_code_langs
@@ -269,9 +257,11 @@ module YardGhurt
269
257
  alias_method :has_css_comment?,:has_css_comment
270
258
  alias_method :has_js_comment?,:has_js_comment
271
259
  alias_method :verbose?,:verbose
272
-
260
+
273
261
  # @param name [Symbol] the name of this task to use on the command line with +rake+
274
262
  def initialize(name=:yard_gfm_fix)
263
+ super()
264
+
275
265
  @after = nil
276
266
  @anchor_db = {}
277
267
  @arg_names = []
@@ -292,125 +282,137 @@ module YardGhurt
292
282
  @md_files = ['file.README.html','index.html']
293
283
  @name = name
294
284
  @verbose = true
295
-
296
- yield self if block_given?()
297
- define()
285
+
286
+ yield self if block_given?
287
+ define
298
288
  end
299
-
289
+
300
290
  # Reset certain instance vars per file.
301
- def reset_per_file()
302
- @anchor_links = AnchorLinks.new()
291
+ def reset_per_file
292
+ @anchor_links = AnchorLinks.new
303
293
  @has_css_comment = false
304
294
  @has_js_comment = false
305
295
  @has_verbose_anchor_links = false
306
296
  end
307
-
297
+
308
298
  # Define the Rake task and description using the instance variables.
309
- def define()
299
+ def define
310
300
  desc @description
311
301
  task @name,Array(@arg_names) => Array(@deps) do |task,args|
312
302
  env_dryrun = ENV['dryrun']
313
-
314
- if !env_dryrun.nil?() && !(env_dryrun = env_dryrun.to_s().strip()).empty?()
303
+
304
+ if !env_dryrun.nil? && !(env_dryrun = env_dryrun.to_s.strip).empty?
315
305
  @dry_run = Util.to_bool(env_dryrun)
316
306
  end
317
-
307
+
318
308
  @before.call(self,args) if @before.respond_to?(:call)
319
-
309
+
320
310
  @md_files.each do |md_file|
321
- reset_per_file()
311
+ reset_per_file
322
312
  build_anchor_links_db(md_file)
323
-
313
+
324
314
  @during.call(self,args,md_file) if @during.respond_to?(:call)
325
-
315
+
326
316
  fix_md_file(md_file)
327
317
  end
328
-
318
+
329
319
  @after.call(self,args) if @after.respond_to?(:call)
330
320
  end
331
-
321
+
332
322
  return self
333
323
  end
334
-
324
+
335
325
  # Convert each HTML header tag in +md_file+ to a GFM & YARDoc anchor link
336
326
  # and build a database using them.
337
- #
327
+ #
338
328
  # @param md_file [String] the file (no dir) to build the anchor links database with,
339
329
  # will be joined to {doc_dir}
340
- #
330
+ #
341
331
  # @see AnchorLinks#<<
342
332
  # @see AnchorLinks#merge_anchor_ids!
343
333
  def build_anchor_links_db(md_file)
344
334
  filename = File.join(@doc_dir,md_file)
345
-
335
+
346
336
  return unless File.exist?(filename)
347
-
337
+
348
338
  File.open(filename,'r') do |file|
349
339
  file.each_line do |line|
350
- next if line !~ /<h\d+>/i
351
-
340
+ # +<h3 id="..."+ or +<h3...+
341
+ # - +yard_id+ was added for YARD v0.9.25+.
342
+ match = line.match(/<\s*h\d+.*?id\s*=\s*["'](?<yard_id>[^"']+)["']|<\s*h\d+[\s>]/ui)
343
+
344
+ next unless match
345
+
346
+ yard_id = nil
347
+ caps = match.named_captures
348
+
349
+ if caps.key?('yard_id')
350
+ yard_id = caps['yard_id'].to_s.strip
351
+ yard_id = nil if yard_id.empty?
352
+ end
353
+
352
354
  line.gsub!(/<[^>]+>/,'') # Remove tags: <...>
353
- line.strip!()
354
-
355
- next if line.empty?()
356
-
357
- @anchor_links << line
355
+ line.strip!
356
+
357
+ next if line.empty?
358
+
359
+ @anchor_links.add_anchor(line,yard_id: yard_id)
358
360
  end
359
361
  end
360
-
362
+
361
363
  @anchor_links.merge_anchor_ids!(@anchor_db)
362
364
  end
363
-
365
+
364
366
  # Fix (find & replace) text in +md_file+. Calls all +add_*+ & +gsub_*+ methods.
365
- #
367
+ #
366
368
  # @param md_file [String] the file (no dir) to fix, will be joined to {doc_dir}
367
369
  def fix_md_file(md_file)
368
370
  filename = File.join(@doc_dir,md_file)
369
-
371
+
370
372
  puts "[#{filename}]:"
371
-
373
+
372
374
  if !File.exist?(filename)
373
375
  puts '! File does not exist'
374
-
376
+
375
377
  return
376
378
  end
377
-
379
+
378
380
  changes = 0
379
381
  lines = []
380
-
382
+
381
383
  File.open(filename,'r') do |file|
382
384
  file.each_line do |line|
383
- if line.strip().empty?()
385
+ if line.strip.empty?
384
386
  lines << line
385
-
387
+
386
388
  next
387
389
  end
388
-
390
+
389
391
  has_change = false
390
-
392
+
391
393
  # Standard
392
394
  has_change = add_css_styles!(line) || has_change
393
395
  has_change = add_js_scripts!(line) || has_change
394
396
  has_change = gsub_anchor_links!(line) || has_change
395
397
  has_change = gsub_code_langs!(line) || has_change
396
398
  has_change = gsub_local_file_links!(line) || has_change
397
-
399
+
398
400
  # Custom
399
401
  has_change = gsub_customs!(line) || has_change
400
402
  has_change = gsub_custom!(line) || has_change
401
-
403
+
402
404
  if has_change
403
405
  puts "+ #{line}" if @verbose
404
-
406
+
405
407
  changes += 1
406
408
  end
407
-
409
+
408
410
  lines << line
409
411
  end
410
412
  end
411
-
413
+
412
414
  print '= '
413
-
415
+
414
416
  if changes > 0
415
417
  if @dry_run
416
418
  puts 'Nothing written (dry run)'
@@ -418,195 +420,195 @@ module YardGhurt
418
420
  File.open(filename,'w') do |file|
419
421
  file.puts lines
420
422
  end
421
-
423
+
422
424
  puts "#{changes} changes written"
423
425
  end
424
426
  else
425
427
  puts 'Nothing written (up-to-date)'
426
428
  end
427
429
  end
428
-
430
+
429
431
  # Add {CSS_COMMENT} & {css_styles} to +line+ if it is +</head>+,
430
432
  # unless {CSS_COMMENT} has already been found or {has_css_comment}.
431
- #
433
+ #
432
434
  # @param line [String] the line from the file to check if +</head>+
433
435
  def add_css_styles!(line)
434
- return false if @has_css_comment || @css_styles.empty?()
435
-
436
- if line.strip() == CSS_COMMENT
436
+ return false if @has_css_comment || @css_styles.empty?
437
+
438
+ if line.strip == CSS_COMMENT
437
439
  @has_css_comment = true
438
-
440
+
439
441
  return false
440
442
  end
441
-
442
- return false unless line =~ /^\s*<\/head>\s*$/i
443
-
444
- line.slice!(0,line.length())
443
+
444
+ return false unless line =~ %r{^\s*</head>\s*$}i
445
+
446
+ line.slice!(0,line.length)
445
447
  line << " #{CSS_COMMENT}"
446
-
448
+
447
449
  @css_styles.each do |css_style|
448
450
  line << "\n #{css_style}"
449
451
  end
450
-
452
+
451
453
  line << "\n\n </head>"
452
-
454
+
453
455
  @has_css_comment = true
454
-
456
+
455
457
  return true
456
458
  end
457
-
459
+
458
460
  # Add {JS_COMMENT} & {js_scripts} to +line+ if it is +</body>+,
459
461
  # unless {JS_COMMENT} has already been found or {has_js_comment}.
460
- #
462
+ #
461
463
  # @param line [String] the line from the file to check if +</body>+
462
464
  def add_js_scripts!(line)
463
- return false if @has_js_comment || @js_scripts.empty?()
464
-
465
- if line.strip() == JS_COMMENT
465
+ return false if @has_js_comment || @js_scripts.empty?
466
+
467
+ if line.strip == JS_COMMENT
466
468
  @has_js_comment = true
467
-
469
+
468
470
  return false
469
471
  end
470
-
471
- return false unless line =~ /^\s*<\/body>\s*$/i
472
-
473
- line.slice!(0,line.length())
472
+
473
+ return false unless line =~ %r{^\s*</body>\s*$}i
474
+
475
+ line.slice!(0,line.length)
474
476
  line << "\n #{JS_COMMENT}"
475
-
477
+
476
478
  @js_scripts.each do |js_script|
477
479
  line << "\n #{js_script}"
478
480
  end
479
-
481
+
480
482
  line << "\n\n </body>"
481
-
483
+
482
484
  @has_js_comment = true
483
-
485
+
484
486
  return true
485
487
  end
486
-
488
+
487
489
  # Replace GFM anchor links with their equivalent YARDoc anchor links,
488
490
  # using {build_anchor_links_db} & {anchor_db}, if {fix_anchor_links}.
489
- #
491
+ #
490
492
  # @param line [String] the line from the file to fix
491
493
  def gsub_anchor_links!(line)
492
494
  return false unless @fix_anchor_links
493
-
495
+
494
496
  has_change = false
495
- tag = 'href="#'
496
-
497
- line.gsub!(Regexp.new(Regexp.quote(tag) + '[^"]*"')) do |href|
498
- link = href[tag.length..-2].strip()
499
-
500
- if link.empty?() || @anchor_links.yard_anchor_id?(link)
497
+
498
+ # +href="#..."+ or +href='#...'+
499
+ line.gsub!(/href\s*=\s*["']\s*#\s*(?<link>[^"']+)["']/ui) do |href|
500
+ link = Regexp.last_match[:link].to_s.strip # Same as +$~[:link]+.
501
+
502
+ if link.empty? || @anchor_links.yard_anchor_id?(link)
501
503
  href
502
504
  else
503
505
  yard_link = @anchor_links[link]
504
-
505
- if yard_link.nil?()
506
+
507
+ if yard_link.nil?
506
508
  # Either the GFM link is wrong [check with @anchor_links.to_github_anchor_id()]
507
509
  # or the internal code is broken [check with @anchor_links.to_s()]
508
510
  puts "! YARDoc anchor link for GFM anchor link [#{link}] does not exist"
509
-
511
+
510
512
  if !@has_verbose_anchor_links
511
513
  if @verbose
512
514
  puts ' GFM anchor link in the Markdown file is wrong?'
513
515
  puts ' Please check the generated links:'
514
- puts %Q( #{@anchor_links.to_s().strip().gsub("\n","\n ")})
516
+ puts %Q( #{@anchor_links.to_s.strip.gsub("\n","\n ")})
515
517
  else
516
518
  puts " Turn on #{self.class}.verbose for more info"
517
519
  end
518
-
520
+
519
521
  @has_verbose_anchor_links = true
520
522
  end
521
-
523
+
522
524
  href
523
525
  else
524
526
  has_change = true
525
-
526
- %Q(#{tag}#{yard_link}")
527
+
528
+ %Q(href="##{yard_link}")
527
529
  end
528
530
  end
529
531
  end
530
-
532
+
531
533
  return has_change
532
534
  end
533
-
535
+
534
536
  # Add +language-+ to code class languages and down case them,
535
537
  # if {fix_code_langs} and the language is not in {exclude_code_langs}.
536
- #
538
+ #
537
539
  # @param line [String] the line from the file to fix
538
540
  def gsub_code_langs!(line)
539
541
  return false unless @fix_code_langs
540
-
542
+
541
543
  has_change = false
542
544
  tag = 'code class="'
543
-
545
+
544
546
  line.gsub!(Regexp.new(Regexp.quote(tag) + '[^"]*"')) do |code_class|
545
- lang = code_class[tag.length..-2].strip()
546
-
547
- if lang.empty?() || lang =~ /^language\-/ || @exclude_code_langs.include?(lang)
547
+ lang = code_class[tag.length..-2].strip
548
+
549
+ if lang.empty? || lang =~ /^language\-/ || @exclude_code_langs.include?(lang)
548
550
  code_class
549
551
  else
550
552
  has_change = true
551
-
552
- %Q(#{tag}language-#{lang.downcase()}")
553
+
554
+ %Q(#{tag}language-#{lang.downcase}")
553
555
  end
554
556
  end
555
-
557
+
556
558
  return has_change
557
559
  end
558
-
560
+
559
561
  # Call the custom Proc {custom_gsub} (if it responds to +:call+) on +line+,
560
- #
562
+ #
561
563
  # @param line [String] the line from the file to fix
562
564
  def gsub_custom!(line)
563
565
  return false unless @custom_gsub.respond_to?(:call)
564
566
  return @custom_gsub.call(line)
565
567
  end
566
-
568
+
567
569
  # Call +gsub!()+ on +line+ with each {custom_gsubs},
568
570
  # which is an Array of pairs of arguments:
569
571
  # task.custom_gsubs = [
570
572
  # ['dev','prod'],
571
573
  # [/href="#[^"]*"/,'href="#contents"']
572
574
  # ]
573
- #
575
+ #
574
576
  # @param line [String] the line from the file to fix
575
577
  def gsub_customs!(line)
576
- return false if @custom_gsubs.empty?()
577
-
578
+ return false if @custom_gsubs.empty?
579
+
578
580
  has_change = false
579
-
581
+
580
582
  @custom_gsubs.each do |custom_gsub|
581
- has_change = !line.gsub!(custom_gsub[0],custom_gsub[1]).nil?() || has_change
583
+ has_change = !line.gsub!(custom_gsub[0],custom_gsub[1]).nil? || has_change
582
584
  end
583
-
585
+
584
586
  return has_change
585
587
  end
586
-
588
+
587
589
  # Replace local file links (that exist) to be +file.{filename}.html+,
588
590
  # if {fix_file_links}.
589
- #
591
+ #
590
592
  # @param line [String] the line from the file to fix
591
593
  def gsub_local_file_links!(line)
592
594
  return false unless @fix_file_links
593
-
595
+
594
596
  has_change = false
595
597
  tag = 'href="'
596
-
598
+
597
599
  line.gsub!(Regexp.new(Regexp.quote(tag) + '[^#][^"]*"')) do |href|
598
- link = href[tag.length..-2].strip()
599
-
600
- if link.empty?() || !File.exist?(link)
600
+ link = href[tag.length..-2].strip
601
+
602
+ if link.empty? || !File.exist?(link)
601
603
  href
602
604
  else
603
605
  link = File.basename(link,'.*')
604
606
  has_change = true
605
-
607
+
606
608
  %Q(#{tag}file.#{link}.html")
607
609
  end
608
610
  end
609
-
611
+
610
612
  return has_change
611
613
  end
612
614
  end