mdless 2.1.51 → 2.1.52

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.
@@ -36,16 +36,16 @@ module Redcarpet
36
36
  input.split(/\n/).map do |line|
37
37
  if first
38
38
  if line =~ /^\+-+/
39
- line.gsub!(/^/, color("table border"))
39
+ line.gsub!(/^/, color('table border'))
40
40
  else
41
41
  first = false
42
- line.gsub!(/\|/, "#{color("table border")}|#{color("table header")}")
42
+ line.gsub!(/\|/, "#{color('table border')}|#{color('table header')}")
43
43
  end
44
44
  elsif line.strip =~ /^[|:\- +]+$/
45
- line.gsub!(/^(.*)$/, "#{color("table border")}\\1#{color("table color")}")
46
- line.gsub!(/([:\-+]+)/, "#{color("table divider")}\\1#{color("table border")}")
45
+ line.gsub!(/^(.*)$/, "#{color('table border')}\\1#{color('table color')}")
46
+ line.gsub!(/([:\-+]+)/, "#{color('table divider')}\\1#{color('table border')}")
47
47
  else
48
- line.gsub!(/\|/, "#{color("table border")}|#{color("table color")}")
48
+ line.gsub!(/\|/, "#{color('table border')}|#{color('table color')}")
49
49
  end
50
50
  end.join("\n")
51
51
  end
@@ -60,7 +60,7 @@ module Redcarpet
60
60
 
61
61
  def code_bg(input, width)
62
62
  input.split(/\n/).map do |line|
63
- tail = line.uncolor.length < width ? "\u00A0" * (width - line.uncolor.length) : ""
63
+ tail = line.uncolor.length < width ? "\u00A0" * (width - line.uncolor.length) : ''
64
64
  "#{x}#{line}#{tail}#{x}"
65
65
  end.join("\n")
66
66
  end
@@ -96,39 +96,39 @@ module Redcarpet
96
96
  # end.join("\n").blackout(MDLess.theme['code_block']['bg']) + "#{xc}\n"
97
97
  # end
98
98
 
99
- if MDLess.options[:syntax_higlight] && !exec_available("pygmentize")
100
- MDLess.log.error("Syntax highlighting requested by pygmentize is not available")
99
+ if MDLess.options[:syntax_higlight] && !exec_available('pygmentize')
100
+ MDLess.log.error('Syntax highlighting requested by pygmentize is not available')
101
101
  MDLess.options[:syntax_higlight] = false
102
102
  end
103
103
 
104
104
  if MDLess.options[:syntax_higlight]
105
- pyg = TTY::Which.which("pygmentize")
106
- lexer = language&.valid_lexer? ? "-l #{language}" : "-g"
105
+ pyg = TTY::Which.which('pygmentize')
106
+ lexer = language&.valid_lexer? ? "-l #{language}" : '-g'
107
107
  begin
108
- pygments_theme = MDLess.options[:pygments_theme] || MDLess.theme["code_block"]["pygments_theme"]
108
+ pygments_theme = MDLess.options[:pygments_theme] || MDLess.theme['code_block']['pygments_theme']
109
109
 
110
110
  unless pygments_theme.valid_pygments_theme?
111
111
  MDLess.log.error("Invalid Pygments theme #{pygments_theme}, defaulting to 'default' for highlighting")
112
- pygments_theme = "default"
112
+ pygments_theme = 'default'
113
113
  end
114
114
 
115
115
  cmd = [
116
116
  "#{pyg} -f terminal256",
117
117
  "-O style=#{pygments_theme}",
118
118
  lexer,
119
- "2> /dev/null",
120
- ].join(" ")
119
+ '2> /dev/null'
120
+ ].join(' ')
121
121
  hilite, s = Open3.capture2(cmd,
122
122
  stdin_data: code_block)
123
123
 
124
124
  if s.success?
125
125
  hilite = xc + hilite.split(/\n/).map do |l|
126
126
  [
127
- color("code_block marker"),
128
- MDLess.theme["code_block"]["character"],
129
- "#{color("code_block bg")}#{l}#{xc}",
127
+ color('code_block marker'),
128
+ MDLess.theme['code_block']['character'],
129
+ "#{color('code_block bg')}#{l}#{xc}"
130
130
  ].join
131
- end.join("\n").blackout(MDLess.theme["code_block"]["bg"]) + "#{xc}\n"
131
+ end.join("\n").blackout(MDLess.theme['code_block']['bg']) + "#{xc}\n"
132
132
  end
133
133
  rescue StandardError => e
134
134
  MDLess.log.error(e)
@@ -137,32 +137,32 @@ module Redcarpet
137
137
  else
138
138
  hilite = code_block.split(/\n/).map do |line|
139
139
  [
140
- color("code_block marker"),
141
- MDLess.theme["code_block"]["character"],
142
- color("code_block color"),
140
+ color('code_block marker'),
141
+ MDLess.theme['code_block']['character'],
142
+ color('code_block color'),
143
143
  line,
144
- xc,
144
+ xc
145
145
  ].join
146
- end.join("\n").blackout(MDLess.theme["code_block"]["bg"]) + "#{xc}\n"
146
+ end.join("\n").blackout(MDLess.theme['code_block']['bg']) + "#{xc}\n"
147
147
  end
148
148
 
149
149
  top_border = if language.nil? || language.empty?
150
- "-" * longest_line
151
- else
152
- "--[ #{language} ]#{"-" * (longest_line - 6 - language.length)}"
153
- end
150
+ '-' * longest_line
151
+ else
152
+ "--[ #{language} ]#{'-' * (longest_line - 6 - language.length)}"
153
+ end
154
154
  [
155
155
  xc,
156
- color("code_block border"),
156
+ color('code_block border'),
157
157
  top_border,
158
158
  xc,
159
159
  "\n",
160
- color("code_block color"),
160
+ color('code_block color'),
161
161
  code_bg(hilite.chomp, longest_line),
162
162
  "\n",
163
- color("code_block border"),
164
- "-" * longest_line,
165
- xc,
163
+ color('code_block border'),
164
+ '-' * longest_line,
165
+ xc
166
166
  ].join
167
167
  end
168
168
 
@@ -173,14 +173,14 @@ module Redcarpet
173
173
  if MDLess.theme.key?(keys[0])
174
174
  val = MDLess.theme[keys.shift]
175
175
  else
176
- MDLess.log.error("Invalid theme key: #{key}") unless keys[0] =~ /^text/
176
+ MDLess.log.error("Invalid theme key~: #{key}") unless keys[0] =~ /^text/
177
177
  return c([:reset])
178
178
  end
179
179
  keys.each do |k|
180
180
  if val.key?(k)
181
181
  val = val[k]
182
182
  else
183
- MDLess.log.error("Invalid theme key: #{k}")
183
+ MDLess.log.error("Invalid theme key*: #{k}")
184
184
  return c([:reset])
185
185
  end
186
186
  end
@@ -199,56 +199,56 @@ module Redcarpet
199
199
 
200
200
  def block_quote(quote)
201
201
  ret = "\n\n"
202
- quote.strip.wrap(MDLess.cols, color("blockquote color")).split(/\n/).each do |line|
202
+ quote.strip.wrap(MDLess.cols, color('blockquote color')).split(/\n/).each do |line|
203
203
  ret += [
204
- color("blockquote marker color"),
205
- MDLess.theme["blockquote"]["marker"]["character"],
206
- color("blockquote color"),
207
- " ",
204
+ color('blockquote marker color'),
205
+ MDLess.theme['blockquote']['marker']['character'],
206
+ color('blockquote color'),
207
+ ' ',
208
208
  line,
209
- "\n",
210
- ].join("")
209
+ "\n"
210
+ ].join('')
211
211
  end
212
212
  "#{ret}\n\n"
213
213
  end
214
214
 
215
215
  def block_html(raw_html)
216
- "#{color("html color")}#{color_tags(raw_html)}#{xc}"
216
+ "#{color('html color')}#{color_tags(raw_html)}#{xc}"
217
217
  end
218
218
 
219
219
  def header(text, header_level)
220
- pad = ""
221
- ansi = ""
220
+ pad = ''
221
+ ansi = ''
222
222
  text.clean_header_ids!
223
- uncolored = text.uncolor.gsub(/<<(pre|post)\d+>>/, "")
223
+ uncolored = text.uncolor.gsub(/<<(pre|post)\d+>>/, '')
224
224
  uncolored.sub!(/\[(.*?)\]\(.*?\)/, '[\1][xxx]') if MDLess.options[:links] != :inline
225
225
 
226
226
  text_length = uncolored.length
227
227
  case header_level
228
228
  when 1
229
- ansi = color("h1 color")
230
- pad = color("h1 pad")
231
- char = MDLess.theme["h1"]["pad_char"] || "="
229
+ ansi = color('h1 color')
230
+ pad = color('h1 pad')
231
+ char = MDLess.theme['h1']['pad_char'] || '='
232
232
  pad += text_length + 2 > MDLess.cols ? char * text_length : char * (MDLess.cols - (text_length + 1))
233
233
  when 2
234
- ansi = color("h2 color")
235
- pad = color("h2 pad")
236
- char = MDLess.theme["h2"]["pad_char"] || "-"
234
+ ansi = color('h2 color')
235
+ pad = color('h2 pad')
236
+ char = MDLess.theme['h2']['pad_char'] || '-'
237
237
  pad += text_length + 2 > MDLess.cols ? char * text_length : char * (MDLess.cols - (text_length + 1))
238
238
  when 3
239
- ansi = color("h3 color")
239
+ ansi = color('h3 color')
240
240
  when 4
241
- ansi = color("h4 color")
241
+ ansi = color('h4 color')
242
242
  when 5
243
- ansi = color("h5 color")
243
+ ansi = color('h5 color')
244
244
  else
245
- ansi = color("h6 color")
245
+ ansi = color('h6 color')
246
246
  end
247
247
 
248
248
  # If we're in iTerm and not paginating, add
249
249
  # iTerm Marks for navigation on h1-3
250
250
  if header_level < 4 &&
251
- ENV["TERM_PROGRAM"] =~ /^iterm/i &&
251
+ ENV['TERM_PROGRAM'] =~ /^iterm/i &&
252
252
  MDLess.options[:pager] == false
253
253
  ansi = "\e]1337;SetMark\a#{ansi}"
254
254
  end
@@ -256,21 +256,21 @@ module Redcarpet
256
256
  "\n\n#{xc}#{ansi}#{text} #{pad}#{xc}\n\n"
257
257
  end
258
258
 
259
- def hrule()
260
- "\n\n#{color("hr color")}#{"_" * MDLess.cols}#{xc}\n\n"
259
+ def hrule
260
+ "\n\n#{color('hr color')}#{'_' * MDLess.cols}#{xc}\n\n"
261
261
  end
262
262
 
263
263
  def paragraph(text)
264
264
  text.scrub!
265
265
  out = if MDLess.options[:preserve_linebreaks]
266
- "#{xc}#{text.gsub(/ +/, " ").strip}#{xc}#{x}\n\n"
267
- else
268
- if text.uncolor =~ / {2,}$/ || text.uncolor =~ /^%/
269
- "#{xc}#{text.gsub(/ +/, " ").strip}#{xc}#{x}\n"
270
- else
271
- "#{xc}#{text.gsub(/ +/, " ").gsub(/\n+(?![:-])/, " ").strip}#{xc}#{x}\n\n"
272
- end
273
- end
266
+ "#{xc}#{text.gsub(/ +/, ' ').strip}#{xc}#{x}\n\n"
267
+ else
268
+ if text.uncolor =~ / {2,}$/ || text.uncolor =~ /^%/
269
+ "#{xc}#{text.gsub(/ +/, ' ').strip}#{xc}#{x}\n"
270
+ else
271
+ "#{xc}#{text.gsub(/ +/, ' ').gsub(/\n+(?![:-])/, ' ').strip}#{xc}#{x}\n\n"
272
+ end
273
+ end
274
274
  if MDLess.options[:at_tags] || MDLess.options[:taskpaper]
275
275
  highlight_tags(out)
276
276
  else
@@ -279,7 +279,7 @@ module Redcarpet
279
279
  end
280
280
 
281
281
  def uncolor_grafs(text)
282
- text.gsub(/#{Regexp.escape(color("text"))}/, color("list color"))
282
+ text.gsub(/#{Regexp.escape(color("text"))}/, color('list color'))
283
283
  end
284
284
 
285
285
  @table_cols = nil
@@ -288,24 +288,24 @@ module Redcarpet
288
288
  @header_row.map do |alignment|
289
289
  case alignment
290
290
  when :left
291
- "|:---"
291
+ '|:---'
292
292
  when :right
293
- "|---:"
293
+ '|---:'
294
294
  when :center
295
- "|:--:"
295
+ '|:--:'
296
296
  else
297
- "|----"
297
+ '|----'
298
298
  end
299
- end.join("") + "|"
299
+ end.join('') + '|'
300
300
  end
301
301
 
302
302
  def table(header, body)
303
303
  formatted = CLIMarkdown::MDTableCleanup.new([
304
- "#{header}",
304
+ header.to_s,
305
305
  table_header_row,
306
306
  "|\n",
307
- "#{body}\n\n",
308
- ].join(""))
307
+ "#{body}\n\n"
308
+ ].join(''))
309
309
  @header_row = []
310
310
  res = formatted.to_md
311
311
  "#{color_table(res)}\n\n"
@@ -319,80 +319,78 @@ module Redcarpet
319
319
 
320
320
  def table_cell(content, alignment)
321
321
  @header_row ||= []
322
- if @table_cols && @header_row.count < @table_cols
323
- @header_row << alignment
324
- end
322
+ @header_row << alignment if @table_cols && @header_row.count < @table_cols
325
323
  %(#{content} |)
326
324
  end
327
325
 
328
326
  def autolink(link, _)
329
327
  [
330
328
  pre_element,
331
- color("link brackets"),
332
- "<",
333
- color("link url"),
329
+ color('link brackets'),
330
+ '<',
331
+ color('link url'),
334
332
  link,
335
- color("link brackets"),
336
- ">",
333
+ color('link brackets'),
334
+ '>',
337
335
  xc,
338
- post_element,
339
- ].join("")
336
+ post_element
337
+ ].join('')
340
338
  end
341
339
 
342
340
  def codespan(code)
343
341
  out = [
344
342
  pre_element,
345
- color("code_span marker"),
346
- MDLess.theme["code_span"]["character"],
347
- color("code_span color"),
343
+ color('code_span marker'),
344
+ MDLess.theme['code_span']['character'],
345
+ color('code_span color'),
348
346
  code,
349
- color("code_span marker"),
350
- MDLess.theme["code_span"]["character"],
347
+ color('code_span marker'),
348
+ MDLess.theme['code_span']['character'],
351
349
  xc,
352
- post_element,
350
+ post_element
353
351
  ].join
354
352
  end
355
353
 
356
354
  def double_emphasis(text)
357
355
  [
358
356
  pre_element,
359
- color("emphasis bold"),
360
- MDLess.theme["emphasis"]["bold_character"],
357
+ color('emphasis bold'),
358
+ MDLess.theme['emphasis']['bold_character'],
361
359
  text,
362
- MDLess.theme["emphasis"]["bold_character"],
360
+ MDLess.theme['emphasis']['bold_character'],
363
361
  xc,
364
- post_element,
362
+ post_element
365
363
  ].join
366
364
  end
367
365
 
368
366
  def emphasis(text)
369
367
  [
370
368
  pre_element,
371
- color("emphasis italic"),
372
- MDLess.theme["emphasis"]["italic_character"],
369
+ color('emphasis italic'),
370
+ MDLess.theme['emphasis']['italic_character'],
373
371
  text,
374
- MDLess.theme["emphasis"]["italic_character"],
372
+ MDLess.theme['emphasis']['italic_character'],
375
373
  xc,
376
- post_element,
374
+ post_element
377
375
  ].join
378
376
  end
379
377
 
380
378
  def triple_emphasis(text)
381
379
  [
382
380
  pre_element,
383
- color("emphasis bold-italic"),
384
- MDLess.theme["emphasis"]["italic_character"],
385
- MDLess.theme["emphasis"]["bold_character"],
381
+ color('emphasis bold-italic'),
382
+ MDLess.theme['emphasis']['italic_character'],
383
+ MDLess.theme['emphasis']['bold_character'],
386
384
  text,
387
- MDLess.theme["emphasis"]["bold_character"],
388
- MDLess.theme["emphasis"]["italic_character"],
385
+ MDLess.theme['emphasis']['bold_character'],
386
+ MDLess.theme['emphasis']['italic_character'],
389
387
  xc,
390
- post_element,
388
+ post_element
391
389
  ].join
392
390
  end
393
391
 
394
392
  def highlight(text)
395
- "#{pre_element}#{color("highlight")}#{text}#{xc}#{post_element}"
393
+ "#{pre_element}#{color('highlight')}#{text}#{xc}#{post_element}"
396
394
  end
397
395
 
398
396
  def image(link, title, alt_text)
@@ -406,35 +404,35 @@ module Redcarpet
406
404
  def color_link(link, title, content)
407
405
  [
408
406
  pre_element,
409
- color("link brackets"),
410
- "[",
411
- color("link text"),
407
+ color('link brackets'),
408
+ '[',
409
+ color('link text'),
412
410
  content,
413
- color("link brackets"),
414
- "](",
415
- color("link url"),
411
+ color('link brackets'),
412
+ '](',
413
+ color('link url'),
416
414
  link,
417
- title.nil? ? "" : %( "#{title}"),
418
- color("link brackets"),
419
- ")",
415
+ title.nil? ? '' : %( "#{title}"),
416
+ color('link brackets'),
417
+ ')',
420
418
  xc,
421
- post_element,
419
+ post_element
422
420
  ].join
423
421
  end
424
422
 
425
423
  def color_image_tag(link, title, alt_text)
426
424
  image = [
427
- color("image brackets"),
428
- "[",
429
- color("image title"),
425
+ color('image brackets'),
426
+ '[',
427
+ color('image title'),
430
428
  alt_text,
431
- color("image brackets"),
432
- "](",
433
- color("image url"),
429
+ color('image brackets'),
430
+ '](',
431
+ color('image url'),
434
432
  link,
435
- title.nil? ? "" : %( "#{title}"),
436
- color("image brackets"),
437
- ")",
433
+ title.nil? ? '' : %( "#{title}"),
434
+ color('image brackets'),
435
+ ')'
438
436
  ].join
439
437
 
440
438
  @@links << {
@@ -442,67 +440,67 @@ module Redcarpet
442
440
  url: link,
443
441
  title: title,
444
442
  content: alt_text,
445
- image: true,
443
+ image: true
446
444
  }
447
445
 
448
446
  [
449
- color("image bang"),
450
- "!",
447
+ color('image bang'),
448
+ '!',
451
449
  image,
452
- xc,
450
+ xc
453
451
  ].join
454
452
  end
455
453
 
456
- def color_link_reference(link, idx, content)
454
+ def color_link_reference(_link, idx, content)
457
455
  [
458
456
  pre_element,
459
- color("link brackets"),
460
- "[",
461
- color("link text"),
457
+ color('link brackets'),
458
+ '[',
459
+ color('link text'),
462
460
  content,
463
- color("link brackets"),
464
- "][",
465
- color("link url"),
461
+ color('link brackets'),
462
+ '][',
463
+ color('link url'),
466
464
  idx,
467
- color("link brackets"),
468
- "]",
465
+ color('link brackets'),
466
+ ']',
469
467
  xc,
470
- post_element,
468
+ post_element
471
469
  ].join
472
470
  end
473
471
 
474
472
  def color_reference_link(link, title, content, image: false)
475
473
  [
476
- color("link brackets"),
477
- "[",
478
- color("link text"),
474
+ color('link brackets'),
475
+ '[',
476
+ color('link text'),
479
477
  content,
480
- color("link brackets"),
481
- "]:",
482
- color("text"),
483
- " ",
484
- image ? color("image url") : color("link url"),
478
+ color('link brackets'),
479
+ ']:',
480
+ color('text'),
481
+ ' ',
482
+ image ? color('image url') : color('link url'),
485
483
  link,
486
- title.nil? ? "" : %( "#{title}"),
487
- xc,
484
+ title.nil? ? '' : %( "#{title}"),
485
+ xc
488
486
  ].join
489
487
  end
490
488
 
491
489
  def color_image_reference(idx, content)
492
490
  [
493
491
  pre_element,
494
- color("image brackets"),
495
- "[",
496
- color("image title"),
492
+ color('image brackets'),
493
+ '[',
494
+ color('image title'),
497
495
  content,
498
- color("image brackets"),
499
- "][",
500
- color("link url"),
496
+ color('image brackets'),
497
+ '][',
498
+ color('link url'),
501
499
  idx,
502
- color("image brackets"),
503
- "]",
500
+ color('image brackets'),
501
+ ']',
504
502
  xc,
505
- post_element,
503
+ post_element
506
504
  ].join
507
505
  end
508
506
 
@@ -512,28 +510,28 @@ module Redcarpet
512
510
  link: res,
513
511
  url: link,
514
512
  title: title,
515
- content: content,
513
+ content: content
516
514
  }
517
515
  res
518
516
  end
519
517
 
520
518
  def color_tags(html)
521
- html.gsub(%r{((?!<)</?\w+( [^>]+)?>)}, "#{color("html brackets")}\\1#{xc}")
519
+ html.gsub(%r{((?!<)</?\w+( [^>]+)?>)}, "#{color('html brackets')}\\1#{xc}")
522
520
  end
523
521
 
524
522
  def raw_html(raw_html)
525
- "#{pre_element}#{color("html color")}#{color_tags(raw_html)}#{xc}#{post_element}"
523
+ "#{pre_element}#{color('html color')}#{color_tags(raw_html)}#{xc}#{post_element}"
526
524
  end
527
525
 
528
526
  def strikethrough(text)
529
- "#{pre_element}#{color("strikethrough")}#{text}#{xc}#{post_element}"
527
+ "#{pre_element}#{color('deletion')}#{text}#{xc}#{post_element}"
530
528
  end
531
529
 
532
530
  def superscript(text)
533
- "#{pre_element}#{color("super")}^#{text}#{xc}#{post_element}"
531
+ "#{pre_element}#{color('super')}^#{text}#{xc}#{post_element}"
534
532
  end
535
533
 
536
- def footnotes(text)
534
+ def footnotes(_text)
537
535
  # [
538
536
  # color('footnote note'),
539
537
  # text,
@@ -546,20 +544,20 @@ module Redcarpet
546
544
  def color_footnote_def(idx)
547
545
  text = @@footnotes[idx]
548
546
  [
549
- color("footnote brackets"),
550
- "[",
551
- color("footnote caret"),
552
- "^",
553
- color("footnote title"),
547
+ color('footnote brackets'),
548
+ '[',
549
+ color('footnote caret'),
550
+ '^',
551
+ color('footnote title'),
554
552
  idx,
555
- color("footnote brackets"),
556
- "]:",
557
- color("footnote note"),
558
- " ",
553
+ color('footnote brackets'),
554
+ ']:',
555
+ color('footnote note'),
556
+ ' ',
559
557
  text.uncolor.strip,
560
558
  xc,
561
- "\n",
562
- ].join("")
559
+ "\n"
560
+ ].join('')
563
561
  end
564
562
 
565
563
  def footnote_def(text, idx)
@@ -569,18 +567,18 @@ module Redcarpet
569
567
  def footnote_ref(text)
570
568
  [
571
569
  pre_element,
572
- color("footnote title"),
570
+ color('footnote title'),
573
571
  "[^#{text}]",
574
572
  xc,
575
- post_element,
576
- ].join("")
573
+ post_element
574
+ ].join('')
577
575
  end
578
576
 
579
577
  def insert_footnotes(input)
580
578
  input.split(/\n/).map do |line|
581
579
  notes = line.to_enum(:scan, /\[\^(?<ref>\d+)\]/).map { Regexp.last_match }
582
580
  if notes.count.positive?
583
- footnotes = notes.map { |n| color_footnote_def(n["ref"].to_i) }.join("\n")
581
+ footnotes = notes.map { |n| color_footnote_def(n['ref'].to_i) }.join("\n")
584
582
  "#{line}\n\n#{footnotes}\n\n\n"
585
583
  else
586
584
  line
@@ -608,7 +606,7 @@ module Redcarpet
608
606
 
609
607
  lines = input.split(/\n/)
610
608
  line1 = lines.shift
611
- pre = " "
609
+ pre = ' '
612
610
 
613
611
  body = lines.map { |l| "#{pre}#{l.rstrip}" }.join("\n")
614
612
  "#{line1}\n#{body}"
@@ -616,26 +614,26 @@ module Redcarpet
616
614
 
617
615
  def color_list_item(indent, content, type, counter)
618
616
  out = case type
619
- when :unordered
620
- [
621
- " " * indent,
622
- color("list bullet"),
623
- MDLess.theme["list"]["ul_char"].strip,
624
- " ",
625
- color("list color"),
626
- indent_lines(content).strip,
627
- xc,
628
- ].join
629
- when :ordered
630
- [
631
- " " * indent,
632
- color("list number"),
633
- "#{counter}. ",
634
- color("list color"),
635
- indent_lines(content).strip,
636
- xc,
637
- ].join
638
- end
617
+ when :unordered
618
+ [
619
+ ' ' * indent,
620
+ color('list bullet'),
621
+ MDLess.theme['list']['ul_char'].strip,
622
+ ' ',
623
+ color('list color'),
624
+ indent_lines(content).strip,
625
+ xc
626
+ ].join
627
+ when :ordered
628
+ [
629
+ ' ' * indent,
630
+ color('list number'),
631
+ "#{counter}. ",
632
+ color('list color'),
633
+ indent_lines(content).strip,
634
+ xc
635
+ ].join
636
+ end
639
637
  if MDLess.options[:at_tags] || MDLess.options[:taskpaper]
640
638
  color_tags(out)
641
639
  else
@@ -656,7 +654,7 @@ module Redcarpet
656
654
  def nest_lists(input, indent = 0)
657
655
  input.gsub!(%r{<<list(?<id>\d+)-(?<type>.*?)>>(?<content>.*?)<</list\k<id>>>}m) do
658
656
  m = Regexp.last_match
659
- lines = m["content"].strip.split(/\n/)
657
+ lines = m['content'].strip.split(/\n/)
660
658
 
661
659
  list = nest_lists(lines.map do |l|
662
660
  outdent = l.scan(%r{<</list\d+>>}).count
@@ -666,18 +664,18 @@ module Redcarpet
666
664
  end.join("\n"), indent)
667
665
  next if list.nil?
668
666
 
669
- "<<main#{m["id"]}>>#{list}<</main#{m["id"]}>>\n\n"
667
+ "<<main#{m['id']}>>#{list}<</main#{m['id']}>>\n\n"
670
668
  end
671
669
 
672
- input.gsub(/^(?<indent> +)<<main(?<id>\d+)>>(?<content>.*?)<<\/main\k<id>>>/m) do
670
+ input.gsub(%r{^(?<indent> +)<<main(?<id>\d+)>>(?<content>.*?)<</main\k<id>>>}m) do
673
671
  m = Regexp.last_match
674
- "#{m["indent"]}#{m["content"]}"
672
+ "#{m['indent']}#{m['content']}"
675
673
  end
676
674
  end
677
675
 
678
676
  def normalize_indentation(line)
679
677
  line.gsub(/^([ \t]+)/) do |pre|
680
- pre.gsub(/\t/, " ")
678
+ pre.gsub(/\t/, ' ')
681
679
  end
682
680
  end
683
681
 
@@ -685,8 +683,8 @@ module Redcarpet
685
683
  content.gsub(%r{^(?<indent> *)<<listitem(?<id>\d+)-(?<type>(?:un)?ordered)>>(?<content>.*?)<</listitem\k<id>>>}m) do
686
684
  m = Regexp.last_match
687
685
 
688
- indent = m["indent"].length
689
- if m["type"].to_sym == :ordered
686
+ indent = m['indent'].length
687
+ if m['type'].to_sym == :ordered
690
688
  if indent == last_indent
691
689
  levels[indent] ||= 0
692
690
  levels[indent] += 1
@@ -700,15 +698,15 @@ module Redcarpet
700
698
  end
701
699
  end
702
700
 
703
- content = m["content"] =~ /<<listitem/ ? fix_items(m["content"], indent, levels) : m["content"]
704
- color_list_item(indent, uncolor_grafs(content), m["type"].to_sym, levels[indent])
701
+ content = m['content'] =~ /<<listitem/ ? fix_items(m['content'], indent, levels) : m['content']
702
+ color_list_item(indent, uncolor_grafs(content), m['type'].to_sym, levels[indent])
705
703
  end
706
704
  end
707
705
 
708
706
  def fix_list_items(input)
709
707
  input.gsub(%r{<<main(?<id>\d+)>>(?<content>.*?)<</main\k<id>>>}m) do
710
708
  m = Regexp.last_match
711
- fix_items(m["content"])
709
+ fix_items(m['content'])
712
710
  end
713
711
  end
714
712
 
@@ -731,9 +729,9 @@ module Redcarpet
731
729
  title = h[2]
732
730
  end
733
731
  @headers << [
734
- "#" * hlevel,
732
+ '#' * hlevel,
735
733
  title,
736
- h[0],
734
+ h[0]
737
735
  ]
738
736
  end
739
737
  end
@@ -747,16 +745,16 @@ module Redcarpet
747
745
  MDLess.meta = {}
748
746
  first_line = input.split("\n").first
749
747
  if first_line =~ /(?i-m)^---[ \t]*?$/
750
- MDLess.log.info("Found YAML")
748
+ MDLess.log.info('Found YAML')
751
749
  # YAML
752
750
  in_yaml = true
753
751
  input.sub!(/(?i-m)^---[ \t]*\n(?<content>(?:[\s\S]*?))\n[-.]{3}[ \t]*\n/m) do
754
752
  m = Regexp.last_match
755
- MDLess.log.info("Processing YAML header")
753
+ MDLess.log.info('Processing YAML header')
756
754
  begin
757
- MDLess.meta = YAML.unsafe_load(m["content"]).each_with_object({}) { |(k, v), h| h[k.downcase] = v }
755
+ MDLess.meta = YAML.unsafe_load(m['content']).each_with_object({}) { |(k, v), h| h[k.downcase] = v }
758
756
  rescue Psych::DisallowedClass => e
759
- @log.error("Error reading YAML header")
757
+ @log.error('Error reading YAML header')
760
758
  @log.error(e)
761
759
  MDLess.meta = {}
762
760
  rescue StandardError => e
@@ -768,19 +766,21 @@ module Redcarpet
768
766
  longest = longest < MDLess.cols ? longest + 1 : MDLess.cols
769
767
  lines.map do |line|
770
768
  if line =~ /^[-.]{3}\s*$/
771
- line = "#{color("metadata marker")}#{"%" * longest}"
769
+ line = "#{color('metadata marker')}#{'%' * longest}"
772
770
  else
773
771
  line.sub!(/^(.*?:)[ \t]+(\S)/, '\1 \2')
774
- line = "#{color("metadata marker")}% #{color("metadata color")}#{line}"
772
+ line = "#{color('metadata marker')}% #{color('metadata color')}#{line}"
773
+ end
774
+ if (longest - line.uncolor.strip.length).positive?
775
+ line += "\u00A0" * (longest - line.uncolor.strip.length)
775
776
  end
776
- line += "\u00A0" * (longest - line.uncolor.strip.length) if (longest - line.uncolor.strip.length).positive?
777
777
  line + xc
778
778
  end.join("\n") + "#{xc}\n"
779
779
  end
780
780
  end
781
781
 
782
782
  if !in_yaml && first_line =~ /(?i-m)^[\w ]+:\s+\S+/
783
- MDLess.log.info("Found MMD Headers")
783
+ MDLess.log.info('Found MMD Headers')
784
784
  input.sub!(/(?i-m)^([\S ]+:[\s\S]*?)+(?=\n *\n)/) do |mmd|
785
785
  lines = mmd.split(/\n/)
786
786
  return mmd if lines.count > 20
@@ -792,12 +792,14 @@ module Redcarpet
792
792
  line.sub!(/^(.*?:)[ \t]+(\S)/, '\1 \2')
793
793
  parts = line.match(/^[ \t]*(\S.*?):[ \t]+(\S.*?)$/)
794
794
  if parts
795
- key = parts[1].gsub(/[^a-z0-9\-_]/i, "")
795
+ key = parts[1].gsub(/[^a-z0-9\-_]/i, '')
796
796
  value = parts[2].strip
797
797
  MDLess.meta[key] = value
798
798
  end
799
- line = "#{color("metadata marker")}%#{color("metadata color")}#{line}"
800
- line += "\u00A0" * (longest - line.uncolor.strip.length) if (longest - line.uncolor.strip.length).positive?
799
+ line = "#{color('metadata marker')}%#{color('metadata color')}#{line}"
800
+ if (longest - line.uncolor.strip.length).positive?
801
+ line += "\u00A0" * (longest - line.uncolor.strip.length)
802
+ end
801
803
  line + xc
802
804
  end.join("\n") + "#{xc}\n"
803
805
  end
@@ -807,15 +809,15 @@ module Redcarpet
807
809
  end
808
810
 
809
811
  def mmd_transclude(input)
810
- return input unless MDLess.file || MDLess.meta.key?("transcludebase")
812
+ return input unless MDLess.file || MDLess.meta.key?('transcludebase')
811
813
 
812
814
  input.gsub(/^{{(.*?)}}/) do |m|
813
815
  filename = Regexp.last_match(1).strip
814
- file = if MDLess.meta.key?("transcludebase")
815
- File.join(File.expand_path(MDLess.meta["transcludebase"]), filename)
816
- else
817
- File.join(File.dirname(MDLess.file), filename)
818
- end
816
+ file = if MDLess.meta.key?('transcludebase')
817
+ File.join(File.expand_path(MDLess.meta['transcludebase']), filename)
818
+ else
819
+ File.join(File.dirname(MDLess.file), filename)
820
+ end
819
821
  File.exist?(file) ? "\n\n#{mmd_transclude(IO.read(file).remove_meta)}\n\n" : m
820
822
  end
821
823
  end
@@ -850,13 +852,13 @@ module Redcarpet
850
852
 
851
853
  if MDLess.options[:section]
852
854
  new_content = []
853
- MDLess.log.info("Matching section(s) #{MDLess.options[:section].join(", ")}")
855
+ MDLess.log.info("Matching section(s) #{MDLess.options[:section].join(', ')}")
854
856
  MDLess.options[:section].each do |sect|
855
857
  comparison = MDLess.options[:section][0].is_a?(String) ? :regex : :numeric
856
858
 
857
859
  in_section = false
858
860
  top_level = 1
859
- input.split(/\n/).each_with_index do |graf, idx|
861
+ input.split(/\n/).each_with_index do |graf, _idx|
860
862
  if graf =~ /^(#+) *(.*?)( *#+)?$/
861
863
  m = Regexp.last_match
862
864
  level = m[1].length
@@ -887,7 +889,20 @@ module Redcarpet
887
889
  # definition lists
888
890
  input.gsub!(/(?mi)(?<=\n|\A)(?<term>(?!<:)[^\n]+)(?<def>(\n+: [^\n]+)+)/) do
889
891
  m = Regexp.last_match
890
- "#{color("dd term")}#{m["term"]}#{xc}#{color("dd color")}#{color_dd_def(m["def"])}"
892
+ "#{color('dd term')}#{m['term']}#{xc}#{color('dd color')}#{color_dd_def(m['def'])}"
893
+ end
894
+
895
+ # deletions
896
+ input.gsub!(/(?mi)(?<=\n|\A)~~(?<text>.*?)~~/) do
897
+ m = Regexp.last_match
898
+ "#{color('deletion')}#{m['text']}#{xc}"
899
+ end
900
+
901
+ # emojis
902
+ input.gsub!(/(?<=\s|\A):(?<emoji>[\w-]+):/) do
903
+ m = Regexp.last_match
904
+ emoji = CLIMarkdown::Emoji.convert_emoji(m['emoji'])
905
+ "#{emoji}#{xc}"
891
906
  end
892
907
 
893
908
  input
@@ -897,11 +912,11 @@ module Redcarpet
897
912
  input.gsub(/(?<=\n|\A)(?::)\s+(.*)/) do
898
913
  m = Regexp.last_match
899
914
  [
900
- color("dd marker"),
901
- ": ",
902
- color("dd color"),
915
+ color('dd marker'),
916
+ ': ',
917
+ color('dd color'),
903
918
  m[1],
904
- xc,
919
+ xc
905
920
  ].join
906
921
  end
907
922
  end
@@ -909,7 +924,7 @@ module Redcarpet
909
924
  def color_links(input)
910
925
  input.gsub(/(?mi)(?<!\\e)\[(?<text>[^\[]+)\]\((?<url>\S+)(?: +"(?<title>.*?)")? *\)/) do
911
926
  m = Regexp.last_match
912
- color_link(m["url"].uncolor, m["title"]&.uncolor, m["text"].uncolor)
927
+ color_link(m['url'].uncolor, m['title']&.uncolor, m['text'].uncolor)
913
928
  end
914
929
  end
915
930
 
@@ -923,38 +938,38 @@ module Redcarpet
923
938
  links_added = false
924
939
 
925
940
  @@links.each do |link|
926
- if graf =~ /#{Regexp.escape(link[:link].gsub(/\n/, " "))}/
927
- table = graf.uncolor =~ /^ *\|/
928
- url = link[:url].uncolor
929
- content = link[:content]
930
- title = link[:title]&.uncolor
931
- image = link.key?(:image) && link[:image] ? true : false
932
- colored_link = image ? color_image_reference(counter, content) : color_link_reference(url, counter, content)
933
- if table
934
- diff = link[:link].gsub(/\n/, " ").uncolor.length - colored_link.uncolor.gsub(/\n/, " ").length
935
- graf.gsub!(/(?<=\|)([^\|]*?)#{Regexp.escape(link[:link].gsub(/\n/, " "))}(.*?)(?=\|)/) do
936
- before = Regexp.last_match(1)
937
- after = Regexp.last_match(2)
938
- surround = "#{before}#{after}"
939
- puts "**#{surround}**"
940
- diff += 2 if surround.uncolor.gsub(/#{CLIMarkdown::MDTableCleanup::PAD_CHAR}*/, "").strip.length.zero?
941
- "#{before}#{colored_link}#{after}#{" " * diff}"
942
- end
943
- else
944
- graf.gsub!(/#{Regexp.escape(link[:link].gsub(/\n/, " "))}/, colored_link)
941
+ next unless graf =~ /#{Regexp.escape(link[:link].gsub(/\n/, " "))}/
942
+
943
+ table = graf.uncolor =~ /^ *\|/
944
+ url = link[:url].uncolor
945
+ content = link[:content]
946
+ title = link[:title]&.uncolor
947
+ image = link.key?(:image) && link[:image] ? true : false
948
+ colored_link = image ? color_image_reference(counter, content) : color_link_reference(url, counter, content)
949
+ if table
950
+ diff = link[:link].gsub(/\n/, ' ').uncolor.length - colored_link.uncolor.gsub(/\n/, ' ').length
951
+ graf.gsub!(/(?<=\|)([^\|]*?)#{Regexp.escape(link[:link].gsub(/\n/, " "))}(.*?)(?=\|)/) do
952
+ before = Regexp.last_match(1)
953
+ after = Regexp.last_match(2)
954
+ surround = "#{before}#{after}"
955
+ puts "**#{surround}**"
956
+ diff += 2 if surround.uncolor.gsub(/#{CLIMarkdown::MDTableCleanup::PAD_CHAR}*/, '').strip.length.zero?
957
+ "#{before}#{colored_link}#{after}#{' ' * diff}"
945
958
  end
946
- if MDLess.options[:links] == :paragraph
947
- if links_added
948
- graf += "\n#{color_reference_link(url, title, counter, image: image)}"
949
- else
950
- graf = "#{graf}\n\n#{color_reference_link(url, title, counter, image: image)}"
951
- links_added = true
952
- end
959
+ else
960
+ graf.gsub!(/#{Regexp.escape(link[:link].gsub(/\n/, " "))}/, colored_link)
961
+ end
962
+ if MDLess.options[:links] == :paragraph
963
+ if links_added
964
+ graf += "\n#{color_reference_link(url, title, counter, image: image)}"
953
965
  else
954
- @@footer_links << color_reference_link(url, title, counter, image: image)
966
+ graf = "#{graf}\n\n#{color_reference_link(url, title, counter, image: image)}"
967
+ links_added = true
955
968
  end
956
- counter += 1
969
+ else
970
+ @@footer_links << color_reference_link(url, title, counter, image: image)
957
971
  end
972
+ counter += 1
958
973
  end
959
974
  "\n#{graf}\n"
960
975
  end
@@ -969,56 +984,56 @@ module Redcarpet
969
984
  def fix_colors(input)
970
985
  input.gsub(/<<pre(?<id>\d+)>>(?<content>.*?)<<post\k<id>>>/m) do
971
986
  m = Regexp.last_match
972
- pre = m.pre_match.gsub(/<<pre(?<id>\d+)>>.*?<<post\k<id>>>/m, "")
987
+ pre = m.pre_match.gsub(/<<pre(?<id>\d+)>>.*?<<post\k<id>>>/m, '')
973
988
  last_color = pre.last_color_code
974
989
 
975
- "#{fix_colors(m["content"])}#{last_color}"
976
- end.gsub(/<<(pre|post)\d+>>/, "")
990
+ "#{fix_colors(m['content'])}#{last_color}"
991
+ end.gsub(/<<(pre|post)\d+>>/, '')
977
992
  end
978
993
 
979
994
  def render_images(input)
980
995
  input.gsub(%r{<<img>>(.*?)<</img>>}) do
981
996
  link, title, alt_text = Regexp.last_match(1).split(/\|\|/)
982
997
 
983
- if (exec_available("imgcat") || exec_available("chafa")) && MDLess.options[:local_images]
984
- if exec_available("imgcat")
985
- MDLess.log.info("Using imgcat for image rendering")
986
- elsif exec_available("chafa")
987
- MDLess.log.info("Using chafa for image rendering")
998
+ if (exec_available('imgcat') || exec_available('chafa')) && MDLess.options[:local_images]
999
+ if exec_available('imgcat')
1000
+ MDLess.log.info('Using imgcat for image rendering')
1001
+ elsif exec_available('chafa')
1002
+ MDLess.log.info('Using chafa for image rendering')
988
1003
  end
989
1004
  img_path = link
990
1005
  if img_path =~ /^http/ && MDLess.options[:remote_images]
991
- if exec_available("imgcat")
992
- MDLess.log.info("Using imgcat for image rendering")
1006
+ if exec_available('imgcat')
1007
+ MDLess.log.info('Using imgcat for image rendering')
993
1008
  begin
994
1009
  res, s = Open3.capture2(%(curl -sS "#{img_path}" 2> /dev/null | imgcat))
995
1010
 
996
1011
  if s.success?
997
- pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
998
- post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ""
1012
+ pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
1013
+ post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
999
1014
  result = pre + res + post
1000
1015
  end
1001
1016
  rescue StandardError => e
1002
1017
  MDLess.log.error(e)
1003
1018
  end
1004
- elsif exec_available("chafa")
1005
- MDLess.log.info("Using chafa for image rendering")
1006
- term = "-f sixels"
1007
- term = ENV["TERMINAL_PROGRAM"] =~ /iterm/i ? "-f iterm" : term
1008
- term = ENV["TERMINAL_PROGRAM"] =~ /kitty/i ? "-f kitty" : term
1009
- FileUtils.rm_r ".mdless_tmp", force: true if File.directory?(".mdless_tmp")
1010
- Dir.mkdir(".mdless_tmp")
1011
- Dir.chdir(".mdless_tmp")
1019
+ elsif exec_available('chafa')
1020
+ MDLess.log.info('Using chafa for image rendering')
1021
+ term = '-f sixels'
1022
+ term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
1023
+ term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
1024
+ FileUtils.rm_r '.mdless_tmp', force: true if File.directory?('.mdless_tmp')
1025
+ Dir.mkdir('.mdless_tmp')
1026
+ Dir.chdir('.mdless_tmp')
1012
1027
  `curl -SsO #{img_path} 2> /dev/null`
1013
1028
  tmp_img = File.basename(img_path)
1014
1029
  img = `chafa #{term} "#{tmp_img}"`
1015
- pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
1016
- post = title ? "\n #{c(%i[b blue])}-- #{title} --" : ""
1030
+ pre = alt_text ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
1031
+ post = title ? "\n #{c(%i[b blue])}-- #{title} --" : ''
1017
1032
  result = pre + img + post
1018
- Dir.chdir("..")
1019
- FileUtils.rm_r ".mdless_tmp", force: true
1033
+ Dir.chdir('..')
1034
+ FileUtils.rm_r '.mdless_tmp', force: true
1020
1035
  else
1021
- MDLess.log.warn("No viewer for remote images")
1036
+ MDLess.log.warn('No viewer for remote images')
1022
1037
  end
1023
1038
  else
1024
1039
  if img_path =~ %r{^[~/]}
@@ -1028,14 +1043,14 @@ module Redcarpet
1028
1043
  img_path = File.join(base, img_path)
1029
1044
  end
1030
1045
  if File.exist?(img_path)
1031
- pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ""
1032
- post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ""
1033
- if exec_available("imgcat")
1046
+ pre = !alt_text.nil? ? " #{c(%i[d blue])}[#{alt_text.strip}]\n" : ''
1047
+ post = !title.nil? ? "\n #{c(%i[b blue])}-- #{title} --" : ''
1048
+ if exec_available('imgcat')
1034
1049
  img = `imgcat "#{img_path}"`
1035
- elsif exec_available("chafa")
1036
- term = "-f sixels"
1037
- term = ENV["TERMINAL_PROGRAM"] =~ /iterm/i ? "-f iterm" : term
1038
- term = ENV["TERMINAL_PROGRAM"] =~ /kitty/i ? "-f kitty" : term
1050
+ elsif exec_available('chafa')
1051
+ term = '-f sixels'
1052
+ term = ENV['TERMINAL_PROGRAM'] =~ /iterm/i ? '-f iterm' : term
1053
+ term = ENV['TERMINAL_PROGRAM'] =~ /kitty/i ? '-f kitty' : term
1039
1054
  img = `chafa #{term} "#{img_path}"`
1040
1055
  end
1041
1056
  result = pre + img + post
@@ -1062,36 +1077,36 @@ module Redcarpet
1062
1077
  end
1063
1078
  [
1064
1079
  pre_element,
1065
- color("math brackets"),
1080
+ color('math brackets'),
1066
1081
  brackets[0],
1067
1082
  xc,
1068
- color("math equation"),
1083
+ color('math equation'),
1069
1084
  equat,
1070
- color("math brackets"),
1085
+ color('math brackets'),
1071
1086
  brackets[1],
1072
1087
  xc,
1073
- post_element,
1088
+ post_element
1074
1089
  ].join
1075
1090
  end
1076
1091
  end
1077
1092
 
1078
1093
  def highlight_tags(input)
1079
- tag_color = color("at_tags tag")
1080
- value_color = color("at_tags value")
1094
+ tag_color = color('at_tags tag')
1095
+ value_color = color('at_tags value')
1081
1096
  input.gsub(/(?<pre>\s|m)(?<tag>@[^ \]:;.?!,("'\n]+)(?:(?<lparen>\()(?<value>.*?)(?<rparen>\)))?/) do
1082
1097
  m = Regexp.last_match
1083
1098
  last_color = m.pre_match.last_color_code
1084
1099
  [
1085
- m["pre"],
1100
+ m['pre'],
1086
1101
  tag_color,
1087
- m["tag"],
1088
- m["lparen"],
1102
+ m['tag'],
1103
+ m['lparen'],
1089
1104
  value_color,
1090
- m["value"],
1105
+ m['value'],
1091
1106
  tag_color,
1092
- m["rparen"],
1107
+ m['rparen'],
1093
1108
  xc,
1094
- last_color,
1109
+ last_color
1095
1110
  ].join
1096
1111
  end
1097
1112
  end
@@ -1101,14 +1116,14 @@ module Redcarpet
1101
1116
  content = Regexp.last_match(1)
1102
1117
  [
1103
1118
  pre_element,
1104
- color("link brackets"),
1105
- "[[",
1106
- color("link text"),
1119
+ color('link brackets'),
1120
+ '[[',
1121
+ color('link text'),
1107
1122
  content,
1108
- color("link brackets"),
1109
- "]]",
1123
+ color('link brackets'),
1124
+ ']]',
1110
1125
  xc,
1111
- post_element,
1126
+ post_element
1112
1127
  ].join
1113
1128
  end
1114
1129
  end