asciidoctor 2.0.15 → 2.0.17

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.adoc +86 -11
  3. data/LICENSE +1 -1
  4. data/README-de.adoc +9 -12
  5. data/README-fr.adoc +9 -12
  6. data/README-jp.adoc +10 -13
  7. data/README-zh_CN.adoc +9 -12
  8. data/README.adoc +33 -18
  9. data/asciidoctor.gemspec +2 -9
  10. data/data/locale/attributes-fr.adoc +2 -2
  11. data/data/locale/attributes-th.adoc +23 -0
  12. data/data/locale/attributes-vi.adoc +23 -0
  13. data/data/stylesheets/asciidoctor-default.css +54 -53
  14. data/data/stylesheets/coderay-asciidoctor.css +9 -9
  15. data/lib/asciidoctor/abstract_block.rb +11 -9
  16. data/lib/asciidoctor/abstract_node.rb +9 -8
  17. data/lib/asciidoctor/block.rb +6 -6
  18. data/lib/asciidoctor/cli/invoker.rb +1 -2
  19. data/lib/asciidoctor/cli/options.rb +25 -25
  20. data/lib/asciidoctor/convert.rb +1 -0
  21. data/lib/asciidoctor/converter/docbook5.rb +20 -22
  22. data/lib/asciidoctor/converter/html5.rb +112 -94
  23. data/lib/asciidoctor/converter/manpage.rb +61 -52
  24. data/lib/asciidoctor/converter/template.rb +12 -13
  25. data/lib/asciidoctor/converter.rb +6 -4
  26. data/lib/asciidoctor/core_ext/hash/merge.rb +1 -1
  27. data/lib/asciidoctor/document.rb +39 -41
  28. data/lib/asciidoctor/extensions.rb +20 -12
  29. data/lib/asciidoctor/list.rb +2 -6
  30. data/lib/asciidoctor/load.rb +10 -9
  31. data/lib/asciidoctor/logging.rb +10 -8
  32. data/lib/asciidoctor/parser.rb +172 -189
  33. data/lib/asciidoctor/path_resolver.rb +3 -3
  34. data/lib/asciidoctor/reader.rb +71 -72
  35. data/lib/asciidoctor/rx.rb +3 -2
  36. data/lib/asciidoctor/section.rb +7 -0
  37. data/lib/asciidoctor/substitutors.rb +101 -103
  38. data/lib/asciidoctor/syntax_highlighter/coderay.rb +2 -1
  39. data/lib/asciidoctor/syntax_highlighter/highlightjs.rb +1 -1
  40. data/lib/asciidoctor/syntax_highlighter/pygments.rb +14 -5
  41. data/lib/asciidoctor/syntax_highlighter/rouge.rb +2 -1
  42. data/lib/asciidoctor/syntax_highlighter.rb +8 -11
  43. data/lib/asciidoctor/table.rb +18 -20
  44. data/lib/asciidoctor/timings.rb +3 -3
  45. data/lib/asciidoctor/version.rb +1 -1
  46. data/lib/asciidoctor.rb +7 -7
  47. data/man/asciidoctor.1 +26 -28
  48. data/man/asciidoctor.adoc +33 -27
  49. metadata +8 -62
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  module Asciidoctor
3
3
  # Public: Methods to perform substitutions on lines of AsciiDoc text. This module
4
- # is intented to be mixed-in to Section and Block to provide operations for performing
4
+ # is intended to be mixed-in to Section and Block to provide operations for performing
5
5
  # the necessary substitutions.
6
6
  module Substitutors
7
7
  SpecialCharsRx = /[<&>]/
@@ -330,13 +330,13 @@ module Substitutors
330
330
  # NOTE for convenience, map content (unparsed attrlist) to target when format is short
331
331
  target ||= ext_config[:format] == :short ? content : target
332
332
  end
333
- if (Inline === (replacement = extension.process_method[self, target, attributes]))
333
+ if Inline === (replacement = extension.process_method[self, target, attributes])
334
334
  if (inline_subs = replacement.attributes.delete 'subs') && (inline_subs = expand_subs inline_subs, 'custom inline macro')
335
335
  replacement.text = apply_subs replacement.text, inline_subs
336
336
  end
337
337
  replacement.convert
338
338
  elsif replacement
339
- logger.info %(expected substitution value for custom inline macro to be of type Inline; got #{replacement.class}: #{match})
339
+ logger.info { %(expected substitution value for custom inline macro to be of type Inline; got #{replacement.class}: #{match}) }
340
340
  replacement
341
341
  else
342
342
  ''
@@ -445,23 +445,16 @@ module Substitutors
445
445
  # indexterm:[Tigers,Big cats]
446
446
  if (attrlist = normalize_text $2, true, true).include? '='
447
447
  if (primary = (attrs = (AttributeList.new attrlist, self).parse)[1])
448
- attrs['terms'] = terms = [primary]
449
- if (secondary = attrs[2])
450
- terms << secondary
451
- if (tertiary = attrs[3])
452
- terms << tertiary
453
- end
454
- end
448
+ attrs['terms'] = [primary]
455
449
  if (see_also = attrs['see-also'])
456
450
  attrs['see-also'] = (see_also.include? ',') ? (see_also.split ',').map {|it| it.lstrip } : [see_also]
457
451
  end
458
452
  else
459
- attrs = { 'terms' => (terms = attrlist) }
453
+ attrs = { 'terms' => attrlist }
460
454
  end
461
455
  else
462
- attrs = { 'terms' => (terms = split_simple_csv attrlist) }
456
+ attrs = { 'terms' => (split_simple_csv attrlist) }
463
457
  end
464
- #doc.register :indexterms, terms
465
458
  (Inline.new self, :indexterm, nil, attributes: attrs).convert
466
459
  when 'indexterm2'
467
460
  # honor the escape
@@ -474,34 +467,33 @@ module Substitutors
474
467
  attrs['see-also'] = (see_also.include? ',') ? (see_also.split ',').map {|it| it.lstrip } : [see_also]
475
468
  end
476
469
  end
477
- #doc.register :indexterms, [term]
478
470
  (Inline.new self, :indexterm, term, attributes: attrs, type: :visible).convert
479
471
  else
480
- text = $3
472
+ encl_text = $3
481
473
  # honor the escape
482
474
  if $&.start_with? RS
483
475
  # escape concealed index term, but process nested flow index term
484
- if (text.start_with? '(') && (text.end_with? ')')
485
- text = text.slice 1, text.length - 2
476
+ if (encl_text.start_with? '(') && (encl_text.end_with? ')')
477
+ encl_text = encl_text.slice 1, encl_text.length - 2
486
478
  visible, before, after = true, '(', ')'
487
479
  else
488
480
  next $&.slice 1, $&.length
489
481
  end
490
482
  else
491
483
  visible = true
492
- if text.start_with? '('
493
- if text.end_with? ')'
494
- text, visible = (text.slice 1, text.length - 2), false
484
+ if encl_text.start_with? '('
485
+ if encl_text.end_with? ')'
486
+ encl_text, visible = (encl_text.slice 1, encl_text.length - 2), false
495
487
  else
496
- text, before, after = (text.slice 1, text.length), '(', ''
488
+ encl_text, before, after = (encl_text.slice 1, encl_text.length), '(', ''
497
489
  end
498
- elsif text.end_with? ')'
499
- text, before, after = text.chop, '', ')'
490
+ elsif encl_text.end_with? ')'
491
+ encl_text, before, after = encl_text.chop, '', ')'
500
492
  end
501
493
  end
502
494
  if visible
503
495
  # ((Tigers))
504
- if (term = normalize_text text, true).include? ';&'
496
+ if (term = normalize_text encl_text, true).include? ';&'
505
497
  if term.include? ' &gt;&gt; '
506
498
  term, _, see = term.partition ' &gt;&gt; '
507
499
  attrs = { 'see' => see }
@@ -510,12 +502,11 @@ module Substitutors
510
502
  attrs = { 'see-also' => see_also }
511
503
  end
512
504
  end
513
- #doc.register :indexterms, [term]
514
505
  subbed_term = (Inline.new self, :indexterm, term, attributes: attrs, type: :visible).convert
515
506
  else
516
507
  # (((Tigers,Big cats)))
517
508
  attrs = {}
518
- if (terms = normalize_text text, true).include? ';&'
509
+ if (terms = normalize_text encl_text, true).include? ';&'
519
510
  if terms.include? ' &gt;&gt; '
520
511
  terms, _, see = terms.partition ' &gt;&gt; '
521
512
  attrs['see'] = see
@@ -524,8 +515,7 @@ module Substitutors
524
515
  attrs['see-also'] = see_also
525
516
  end
526
517
  end
527
- attrs['terms'] = terms = split_simple_csv terms
528
- #doc.register :indexterms, terms
518
+ attrs['terms'] = split_simple_csv terms
529
519
  subbed_term = (Inline.new self, :indexterm, nil, attributes: attrs).convert
530
520
  end
531
521
  before ? %(#{before}#{subbed_term}#{after}) : subbed_term
@@ -545,7 +535,7 @@ module Substitutors
545
535
  # NOTE if $4 is set, we're looking at a formal macro (e.g., https://example.org[])
546
536
  if $4
547
537
  prefix = '' if prefix == 'link:'
548
- text = $4
538
+ link_text = nil if (link_text = $4).empty?
549
539
  else
550
540
  # invalid macro syntax (link: prefix w/o trailing square brackets or enclosed in double quotes)
551
541
  # FIXME we probably shouldn't even get here when the link: prefix is present; the regex is doing too much
@@ -553,7 +543,6 @@ module Substitutors
553
543
  when 'link:', ?", ?'
554
544
  next $&
555
545
  end
556
- text = ''
557
546
  case $3
558
547
  when ')', '?', '!'
559
548
  target = target.chop
@@ -593,27 +582,37 @@ module Substitutors
593
582
  end
594
583
 
595
584
  attrs, link_opts = nil, { type: :link }
596
- unless text.empty?
597
- text = text.gsub ESC_R_SB, R_SB if text.include? R_SB
598
- if !doc.compat_mode && (text.include? '=')
599
- # NOTE if an equals sign (=) is present, extract attributes from text
600
- text, attrs = extract_attributes_from_text text, ''
585
+
586
+ if link_text
587
+ new_link_text = link_text = link_text.gsub ESC_R_SB, R_SB if link_text.include? R_SB
588
+ if !doc.compat_mode && (link_text.include? '=')
589
+ # NOTE if an equals sign (=) is present, extract attributes from link text
590
+ link_text, attrs = extract_attributes_from_text link_text, ''
591
+ new_link_text = link_text
601
592
  link_opts[:id] = attrs['id']
602
593
  end
603
594
 
604
- if text.end_with? '^'
605
- text = text.chop
595
+ if link_text.end_with? '^'
596
+ new_link_text = link_text = link_text.chop
606
597
  if attrs
607
598
  attrs['window'] ||= '_blank'
608
599
  else
609
600
  attrs = { 'window' => '_blank' }
610
601
  end
611
602
  end
612
- end
613
603
 
614
- if text.empty?
604
+ if new_link_text && new_link_text.empty?
605
+ # NOTE it's not possible for the URI scheme to be bare in this case
606
+ link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub UriSniffRx, '') : target
607
+ bare = true
608
+ end
609
+ else
615
610
  # NOTE it's not possible for the URI scheme to be bare in this case
616
- text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub UriSniffRx, '') : target
611
+ link_text = (doc_attrs.key? 'hide-uri-scheme') ? (target.sub UriSniffRx, '') : target
612
+ bare = true
613
+ end
614
+
615
+ if bare
617
616
  if attrs
618
617
  attrs['role'] = (attrs.key? 'role') ? %(bare #{attrs['role']}) : 'bare'
619
618
  else
@@ -623,7 +622,7 @@ module Substitutors
623
622
 
624
623
  doc.register :links, (link_opts[:target] = target)
625
624
  link_opts[:attributes] = attrs if attrs
626
- %(#{prefix}#{(Inline.new self, :anchor, text, link_opts).convert}#{suffix})
625
+ %(#{prefix}#{(Inline.new self, :anchor, link_text, link_opts).convert}#{suffix})
627
626
  end
628
627
  end
629
628
 
@@ -639,12 +638,12 @@ module Substitutors
639
638
  target = $2
640
639
  end
641
640
  attrs, link_opts = nil, { type: :link }
642
- unless (text = $3).empty?
643
- text = text.gsub ESC_R_SB, R_SB if text.include? R_SB
641
+ unless (link_text = $3).empty?
642
+ link_text = link_text.gsub ESC_R_SB, R_SB if link_text.include? R_SB
644
643
  if mailto
645
- if !doc.compat_mode && (text.include? ',')
646
- # NOTE if a comma (,) is present, extract attributes from text
647
- text, attrs = extract_attributes_from_text text, ''
644
+ if !doc.compat_mode && (link_text.include? ',')
645
+ # NOTE if a comma (,) is present, extract attributes from link text
646
+ link_text, attrs = extract_attributes_from_text link_text, ''
648
647
  link_opts[:id] = attrs['id']
649
648
  if attrs.key? 2
650
649
  if attrs.key? 3
@@ -654,14 +653,14 @@ module Substitutors
654
653
  end
655
654
  end
656
655
  end
657
- elsif !doc.compat_mode && (text.include? '=')
658
- # NOTE if an equals sign (=) is present, extract attributes from text
659
- text, attrs = extract_attributes_from_text text, ''
656
+ elsif !doc.compat_mode && (link_text.include? '=')
657
+ # NOTE if an equals sign (=) is present, extract attributes from link text
658
+ link_text, attrs = extract_attributes_from_text link_text, ''
660
659
  link_opts[:id] = attrs['id']
661
660
  end
662
661
 
663
- if text.end_with? '^'
664
- text = text.chop
662
+ if link_text.end_with? '^'
663
+ link_text = link_text.chop
665
664
  if attrs
666
665
  attrs['window'] ||= '_blank'
667
666
  else
@@ -670,17 +669,17 @@ module Substitutors
670
669
  end
671
670
  end
672
671
 
673
- if text.empty?
672
+ if link_text.empty?
674
673
  # mailto is a special case, already processed
675
674
  if mailto
676
- text = mailto_text
675
+ link_text = mailto_text
677
676
  else
678
677
  if doc_attrs.key? 'hide-uri-scheme'
679
- if (text = target.sub UriSniffRx, '').empty?
680
- text = target
678
+ if (link_text = target.sub UriSniffRx, '').empty?
679
+ link_text = target
681
680
  end
682
681
  else
683
- text = target
682
+ link_text = target
684
683
  end
685
684
  if attrs
686
685
  attrs['role'] = (attrs.key? 'role') ? %(bare #{attrs['role']}) : 'bare'
@@ -693,7 +692,7 @@ module Substitutors
693
692
  # QUESTION should a mailto be registered as an e-mail address?
694
693
  doc.register :links, (link_opts[:target] = target)
695
694
  link_opts[:attributes] = attrs if attrs
696
- Inline.new(self, :anchor, text, link_opts).convert
695
+ Inline.new(self, :anchor, link_text, link_opts).convert
697
696
  end
698
697
  end
699
698
 
@@ -740,15 +739,17 @@ module Substitutors
740
739
 
741
740
  attrs = {}
742
741
  if (refid = $1)
743
- refid, text = refid.split ',', 2
744
- text = text.lstrip if text
742
+ if refid.include? ','
743
+ refid, _, link_text = refid.partition ','
744
+ link_text = nil if (link_text = link_text.lstrip).empty?
745
+ end
745
746
  else
746
747
  macro = true
747
748
  refid = $2
748
- if (text = $3)
749
- text = text.gsub ESC_R_SB, R_SB if text.include? R_SB
750
- # NOTE if an equals sign (=) is present, extract attributes from text
751
- text, attrs = extract_attributes_from_text text if !doc.compat_mode && (text.include? '=')
749
+ if (link_text = $3)
750
+ link_text = link_text.gsub ESC_R_SB, R_SB if link_text.include? R_SB
751
+ # NOTE if an equals sign (=) is present, extract attributes from link text
752
+ link_text, attrs = extract_attributes_from_text link_text if !doc.compat_mode && (link_text.include? '=')
752
753
  end
753
754
  end
754
755
 
@@ -827,7 +828,7 @@ module Substitutors
827
828
  attrs['path'] = path
828
829
  attrs['fragment'] = fragment
829
830
  attrs['refid'] = refid
830
- Inline.new(self, :anchor, text, type: :xref, target: target, attributes: attrs).convert
831
+ Inline.new(self, :anchor, link_text, type: :xref, target: target, attributes: attrs).convert
831
832
  end
832
833
  end
833
834
 
@@ -839,7 +840,7 @@ module Substitutors
839
840
  # footnoteref
840
841
  if $1
841
842
  if $3
842
- id, text = $3.split ',', 2
843
+ id, content = $3.split ',', 2
843
844
  logger.warn %(found deprecated footnoteref macro: #{$&}; use footnote macro with target instead) unless doc.compat_mode
844
845
  else
845
846
  next $&
@@ -847,31 +848,31 @@ module Substitutors
847
848
  # footnote
848
849
  else
849
850
  id = $2
850
- text = $3
851
+ content = $3
851
852
  end
852
853
 
853
854
  if id
854
855
  if (footnote = doc.footnotes.find {|candidate| candidate.id == id })
855
- index, text = footnote.index, footnote.text
856
+ index, content = footnote.index, footnote.text
856
857
  type, target, id = :xref, id, nil
857
- elsif text
858
- text = restore_passthroughs(normalize_text text, true, true)
858
+ elsif content
859
+ content = restore_passthroughs(normalize_text content, true, true)
859
860
  index = doc.counter('footnote-number')
860
- doc.register(:footnotes, Document::Footnote.new(index, id, text))
861
+ doc.register(:footnotes, Document::Footnote.new(index, id, content))
861
862
  type, target = :ref, nil
862
863
  else
863
864
  logger.warn %(invalid footnote reference: #{id})
864
- type, target, text, id = :xref, id, id, nil
865
+ type, target, content, id = :xref, id, id, nil
865
866
  end
866
- elsif text
867
- text = restore_passthroughs(normalize_text text, true, true)
867
+ elsif content
868
+ content = restore_passthroughs(normalize_text content, true, true)
868
869
  index = doc.counter('footnote-number')
869
- doc.register(:footnotes, Document::Footnote.new(index, id, text))
870
+ doc.register(:footnotes, Document::Footnote.new(index, id, content))
870
871
  type = target = nil
871
872
  else
872
873
  next $&
873
874
  end
874
- Inline.new(self, :footnote, text, attributes: { 'index' => index }, id: id, target: target, type: type).convert
875
+ Inline.new(self, :footnote, content, attributes: { 'index' => index }, id: id, target: target, type: type).convert
875
876
  end
876
877
  end
877
878
 
@@ -939,7 +940,7 @@ module Substitutors
939
940
  # process_callouts - a Boolean flag indicating whether callout marks should be located and substituted
940
941
  #
941
942
  # Returns the highlighted source code, if a syntax highlighter is defined on the document, otherwise the source with
942
- # verbatim substituions applied
943
+ # verbatim substitutions applied
943
944
  def highlight_source source, process_callouts
944
945
  # NOTE the call to highlight? is a defensive check since, normally, we wouldn't arrive here unless it returns true
945
946
  return sub_source source, process_callouts unless (syntax_hl = @document.syntax_highlighter) && syntax_hl.highlight?
@@ -948,8 +949,9 @@ module Substitutors
948
949
 
949
950
  doc_attrs = @document.attributes
950
951
  syntax_hl_name = syntax_hl.name
951
- if (linenums_mode = (attr? 'linenums') ? (doc_attrs[%(#{syntax_hl_name}-linenums-mode)] || :table).to_sym : nil)
952
- start_line_number = 1 if (start_line_number = (attr 'start', 1).to_i) < 1
952
+ if (linenums_mode = (attr? 'linenums') ? (doc_attrs[%(#{syntax_hl_name}-linenums-mode)] || :table).to_sym : nil) &&
953
+ (start_line_number = (attr 'start', 1).to_i) < 1
954
+ start_line_number = 1
953
955
  end
954
956
  highlight_lines = resolve_lines_to_highlight source, (attr 'highlight'), start_line_number if attr? 'highlight'
955
957
 
@@ -986,7 +988,7 @@ module Substitutors
986
988
  negate = true
987
989
  end
988
990
  if (delim = (entry.include? '..') ? '..' : ((entry.include? '-') ? '-' : nil))
989
- from, delim, to = entry.partition delim
991
+ from, _, to = entry.partition delim
990
992
  to = (source.count LF) + 1 if to.empty? || (to = to.to_i) < 0
991
993
  if negate
992
994
  lines -= (from.to_i..to).to_a
@@ -1008,7 +1010,7 @@ module Substitutors
1008
1010
 
1009
1011
  # Public: Extract the passthrough text from the document for reinsertion after processing.
1010
1012
  #
1011
- # text - The String from which to extract passthrough fragements
1013
+ # text - The String from which to extract passthrough fragments
1012
1014
  #
1013
1015
  # Returns the String text with passthrough regions substituted with placeholders
1014
1016
  def extract_passthroughs text
@@ -1215,7 +1217,7 @@ module Substitutors
1215
1217
  end
1216
1218
  end
1217
1219
  return unless candidates
1218
- # weed out invalid options and remove duplicates (order is preserved; first occurence wins)
1220
+ # weed out invalid options and remove duplicates (order is preserved; first occurrence wins)
1219
1221
  resolved = candidates & SUB_OPTIONS[type]
1220
1222
  unless (candidates - resolved).empty?
1221
1223
  invalid = candidates - resolved
@@ -1241,9 +1243,10 @@ module Substitutors
1241
1243
  #
1242
1244
  # Returns a Symbol Array of substitutions to pass to apply_subs or nil if no substitutions were resolved.
1243
1245
  def expand_subs subs, subject = nil
1244
- if ::Symbol === subs
1246
+ case subs
1247
+ when ::Symbol
1245
1248
  subs == :none ? nil : SUB_GROUPS[subs] || [subs]
1246
- elsif ::Array === subs
1249
+ when ::Array
1247
1250
  expanded_subs = []
1248
1251
  subs.each do |key|
1249
1252
  unless key == :none
@@ -1481,26 +1484,21 @@ module Substitutors
1481
1484
  if (str = str.strip).empty?
1482
1485
  {}
1483
1486
  elsif (str.start_with? '.', '#') && Compliance.shorthand_property_syntax
1484
- segments = str.split '#', 2
1485
-
1486
- if segments.size > 1
1487
- id, *more_roles = segments[1].split('.')
1487
+ before, _, after = str.partition '#'
1488
+ attrs = {}
1489
+ if after.empty?
1490
+ attrs['role'] = (before.tr '.', ' ').lstrip if before.length > 1
1488
1491
  else
1489
- more_roles = []
1490
- end
1491
-
1492
- roles = segments[0].empty? ? [] : segments[0].split('.')
1493
- if roles.size > 1
1494
- roles.shift
1495
- end
1496
-
1497
- if more_roles.size > 0
1498
- roles.concat more_roles
1492
+ id, _, roles = after.partition '.'
1493
+ attrs['id'] = id unless id.empty?
1494
+ if roles.empty?
1495
+ attrs['role'] = (before.tr '.', ' ').lstrip if before.length > 1
1496
+ elsif before.length > 1
1497
+ attrs['role'] = ((before + '.' + roles).tr '.', ' ').lstrip
1498
+ else
1499
+ attrs['role'] = roles.tr '.', ' '
1500
+ end
1499
1501
  end
1500
-
1501
- attrs = {}
1502
- attrs['id'] = id if id
1503
- attrs['role'] = roles.join ' ' unless roles.empty?
1504
1502
  attrs
1505
1503
  else
1506
1504
  { 'role' => str }
@@ -1534,7 +1532,7 @@ module Substitutors
1534
1532
  case c
1535
1533
  when ','
1536
1534
  if quote_open
1537
- accum = accum + c
1535
+ accum += c
1538
1536
  else
1539
1537
  values << accum.strip
1540
1538
  accum = ''
@@ -1542,7 +1540,7 @@ module Substitutors
1542
1540
  when '"'
1543
1541
  quote_open = !quote_open
1544
1542
  else
1545
- accum = accum + c
1543
+ accum += c
1546
1544
  end
1547
1545
  end
1548
1546
  values << accum.strip
@@ -78,7 +78,8 @@ class SyntaxHighlighter::CodeRayAdapter < SyntaxHighlighter::Base
78
78
  end
79
79
 
80
80
  extend Styles # exports static methods
81
- include Loader, Styles # adds methods to instance
81
+ include Styles # adds methods to instance
82
+ include Loader # adds methods to instance
82
83
 
83
84
  CodeCellStartTagCs = '<td class="code"><pre>'
84
85
 
@@ -9,7 +9,7 @@ class SyntaxHighlighter::HighlightJsAdapter < SyntaxHighlighter::Base
9
9
  end
10
10
 
11
11
  def format node, lang, opts
12
- super node, lang, (opts.merge transform: proc {|_, code| code['class'] = %(language-#{lang || 'none'} hljs) } )
12
+ super node, lang, (opts.merge transform: proc {|_, code| code['class'] = %(language-#{lang || 'none'} hljs) })
13
13
  end
14
14
 
15
15
  def docinfo? location
@@ -36,7 +36,13 @@ class SyntaxHighlighter::PygmentsAdapter < SyntaxHighlighter::Base
36
36
  node.sub_source source, false # handles nil response from ::Pygments::Lexer#highlight
37
37
  end
38
38
  elsif (highlighted = lexer.highlight source, options: highlight_opts)
39
- highlighted = highlighted.gsub StyledLinenoSpanTagRx, LinenoSpanTagCs if linenos && noclasses
39
+ if linenos
40
+ if noclasses
41
+ highlighted = highlighted.gsub StyledLinenoSpanTagRx, LinenoSpanTagCs
42
+ elsif highlighted.include? LegacyLinenoSpanStartTagCs
43
+ highlighted = highlighted.gsub LegacyLinenoSpanTagRx, LinenoSpanTagCs
44
+ end
45
+ end
40
46
  highlighted.sub WrapperTagRx, '\1'
41
47
  else
42
48
  node.sub_source source, false # handles nil response from ::Pygments::Lexer#highlight
@@ -114,6 +120,7 @@ class SyntaxHighlighter::PygmentsAdapter < SyntaxHighlighter::Base
114
120
  end
115
121
  @@stylesheet_cache = ::Hash.new do |cache, key|
116
122
  if (stylesheet = ::Pygments.css BASE_SELECTOR, classprefix: TOKEN_CLASS_PREFIX, style: key)
123
+ stylesheet = stylesheet.slice (stylesheet.index BASE_SELECTOR), stylesheet.length unless stylesheet.start_with? BASE_SELECTOR
117
124
  @@stylesheet_cache = cache.merge key => stylesheet
118
125
  stylesheet
119
126
  end
@@ -122,18 +129,20 @@ class SyntaxHighlighter::PygmentsAdapter < SyntaxHighlighter::Base
122
129
  DEFAULT_STYLE = 'default'
123
130
  BASE_SELECTOR = 'pre.pygments'
124
131
  TOKEN_CLASS_PREFIX = 'tok-'
125
-
126
132
  BaseStyleRx = /^#{BASE_SELECTOR.gsub '.', '\\.'} +\{([^}]+?)\}/
127
133
 
128
134
  private_constant :BASE_SELECTOR, :TOKEN_CLASS_PREFIX, :BaseStyleRx
129
135
  end
130
136
 
131
137
  extend Styles # exports static methods
132
- include Loader, Styles # adds methods to instance
138
+ include Styles # adds methods to instance
139
+ include Loader # adds methods to instance
133
140
 
134
141
  CodeCellStartTagCs = '<td class="code">'
142
+ LegacyLinenoSpanStartTagCs = '<span class="lineno">'
143
+ LegacyLinenoSpanTagRx = %r(#{LegacyLinenoSpanStartTagCs}( *\d+) ?</span>)
135
144
  LinenoColumnStartTagsCs = '<td class="linenos"><div class="linenodiv"><pre>'
136
- LinenoSpanTagCs = '<span class="lineno">\1 </span>'
145
+ LinenoSpanTagCs = '<span class="linenos">\1</span>'
137
146
  PreTagCs = '<pre>\1</pre>'
138
147
  StyledLinenoColumnStartTagsRx = /<td><div class="linenodiv" style="[^"]+?"><pre style="[^"]+?">/
139
148
  StyledLinenoSpanTagRx = %r((?<=^|<span></span>)<span style="[^"]+">( *\d+) ?</span>)
@@ -143,6 +152,6 @@ class SyntaxHighlighter::PygmentsAdapter < SyntaxHighlighter::Base
143
152
  # NOTE initial <span></span> preserves leading blank lines
144
153
  WrapperTagRx = %r(<div class="#{WRAPPER_CLASS}"><pre\b[^>]*?>(.*)</pre></div>\n*)m
145
154
 
146
- private_constant :CodeCellStartTagCs, :LinenoColumnStartTagsCs, :LinenoSpanTagCs, :PreTagCs, :StyledLinenoColumnStartTagsRx, :StyledLinenoSpanTagRx, :WrapperTagRx, :WRAPPER_CLASS
155
+ private_constant :CodeCellStartTagCs, :LegacyLinenoSpanStartTagCs, :LegacyLinenoSpanTagRx, :LinenoColumnStartTagsCs, :LinenoSpanTagCs, :PreTagCs, :StyledLinenoColumnStartTagsRx, :StyledLinenoSpanTagRx, :WrapperTagRx, :WRAPPER_CLASS
147
156
  end
148
157
  end
@@ -133,7 +133,8 @@ class SyntaxHighlighter::RougeAdapter < SyntaxHighlighter::Base
133
133
  end
134
134
 
135
135
  extend Styles # exports static methods
136
- include Loader, Styles # adds methods to instance
136
+ include Styles # adds methods to instance
137
+ include Loader # adds methods to instance
137
138
 
138
139
  CodeCellStartTagCs = '<td class="code">'
139
140
 
@@ -99,9 +99,10 @@ module SyntaxHighlighter
99
99
  raise ::NotImplementedError, %(#{SyntaxHighlighter} subclass #{self.class} must implement the ##{__method__} method since #write_stylesheet? returns true)
100
100
  end
101
101
 
102
- private_class_method def self.included into
102
+ def self.included into
103
103
  into.extend Config
104
- end || :included
104
+ end
105
+ private_class_method :included # use separate declaration for Ruby 2.0.x
105
106
 
106
107
  module Config
107
108
  # Public: Statically register the current class in the registry for the specified names.
@@ -152,7 +153,7 @@ module SyntaxHighlighter
152
153
  end
153
154
 
154
155
  private
155
-
156
+
156
157
  def registry
157
158
  raise ::NotImplementedError, %(#{Factory} subclass #{self.class} must implement the ##{__method__} method)
158
159
  end
@@ -166,19 +167,17 @@ module SyntaxHighlighter
166
167
  end
167
168
 
168
169
  private
169
-
170
- def registry
171
- @registry
172
- end
170
+
171
+ attr_reader :registry
173
172
  end
174
173
 
175
174
  module DefaultFactory
176
175
  include Factory
177
176
 
178
- private
179
-
180
177
  @@registry = {}
181
178
 
179
+ private
180
+
182
181
  def registry
183
182
  @@registry
184
183
  end
@@ -216,8 +215,6 @@ module SyntaxHighlighter
216
215
  'rouge' => %(#{__dir__}/syntax_highlighter/rouge),
217
216
  }
218
217
 
219
- private
220
-
221
218
  @@mutex = ::Mutex.new
222
219
  end
223
220
  end