yard_ghurt 1.2.0 → 1.2.1

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.
@@ -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