asciidoctor-rouge 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 514ab17fada9d5d6be0a3fc05ae1f8faa5df71ff
4
+ data.tar.gz: d9fc422a4bd70c1df7096c5762fb87eaa00d54a2
5
+ SHA512:
6
+ metadata.gz: b875cadbe7eb749630918d4849cd0858b413b287b1524cc53653d66878f492db990c69e3ba8602196eaaa186d715d64ba7da7b6fda4065c616ff673040ca8075
7
+ data.tar.gz: 5f490dde43ac3ef448bcb0f250f7d13fe1ed85dac38e68f445dbcf5714b3dea9fea9947837a3b093efb644241423a420eb4bb0cd23ee1d3d0c7642779df91f2d
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License
2
+
3
+ Copyright 2017 Jakub Jirutka <jakub@jirutka.cz>.
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.adoc ADDED
@@ -0,0 +1,50 @@
1
+ = Asciidoctor Rouge
2
+ :source-language: ruby
3
+ // custom
4
+ :gem-name: asciidoctor-rouge
5
+ :gem-version: 0.1.0
6
+ :gh-name: jirutka/{gem-name}
7
+ :gh-branch: master
8
+ :codacy-id: d2ed58f5f3f949a19bab7637fe7d0bdb
9
+
10
+ ifdef::env-github[]
11
+ image:https://travis-ci.org/{gh-name}.svg?branch={gh-branch}[Build Status, link="https://travis-ci.org/{gh-name}"]
12
+ image:https://api.codacy.com/project/badge/Coverage/{codacy-id}["Test Coverage", link="https://www.codacy.com/app/{gh-name}"]
13
+ image:https://api.codacy.com/project/badge/Grade/{codacy-id}["Codacy Code quality", link="https://www.codacy.com/app/{gh-name}"]
14
+ image:https://img.shields.io/gem/v/{gem-name}.svg?style=flat[Gem Version, link="https://rubygems.org/gems/{gem-name}"]
15
+ image:https://img.shields.io/badge/yard-docs-blue.svg[Yard Docs, link="http://www.rubydoc.info/github/{gh-name}/{gh-branch}"]
16
+ endif::env-github[]
17
+
18
+
19
+ This project provides an http://asciidoctor.org/[Asciidoctor] extension for highlighting source listing blocks using http://rouge.jneen.net/[Rouge] – a pure-ruby code highlighter that is compatible with pygments.
20
+
21
+ It supports all Asciidoctor features such as http://asciidoctor.org/docs/user-manual/#callouts[callouts], highlighting of specified lines (attribute `highlight`), http://asciidoctor.org/docs/user-manual/#passthroughs[passthroughs] inside a code and all other substitutions.
22
+
23
+ This extension is highly customizable and modular.
24
+
25
+
26
+ == Installation
27
+
28
+ To install (or update to the latest version):
29
+
30
+ [source, sh, subs="+attributes"]
31
+ gem install {gem-name}
32
+
33
+ or to install the latest development version:
34
+
35
+ [source, sh, subs="+attributes"]
36
+ gem install {gem-name} --pre
37
+
38
+
39
+ == Usage
40
+
41
+ Set attribute `source-highlighter` to `rouge`; globally or in the document.
42
+
43
+ [source, sh, subs="+attributes"]
44
+ asciidoctor -r {gem-name} -a source-highlighter=rouge Example.adoc
45
+
46
+
47
+ == License
48
+
49
+ This project is licensed under http://opensource.org/licenses/MIT/[MIT License].
50
+ For the full text of the license, see the link:LICENSE[LICENSE] file.
@@ -0,0 +1,27 @@
1
+ require File.expand_path('../lib/asciidoctor/rouge/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'asciidoctor-rouge'
5
+ s.version = Asciidoctor::Rouge::VERSION
6
+ s.author = 'Jakub Jirutka'
7
+ s.email = 'jakub@jirutka.cz'
8
+ s.homepage = 'https://github.com/jirutka/asciidoctor-rouge'
9
+ s.license = 'MIT'
10
+
11
+ s.summary = 'Rouge code highlighter support for Asciidoctor'
12
+
13
+ s.files = Dir['lib/**/*', '*.gemspec', 'LICENSE*', 'README*']
14
+ s.has_rdoc = 'yard'
15
+
16
+ s.required_ruby_version = '>= 2.1'
17
+
18
+ s.add_runtime_dependency 'asciidoctor', '~> 1.5.6'
19
+ s.add_runtime_dependency 'rouge', '~> 2.2'
20
+
21
+ s.add_development_dependency 'corefines', '~> 1.11'
22
+ s.add_development_dependency 'rake', '~> 12.0'
23
+ s.add_development_dependency 'rspec', '~> 3.6'
24
+ s.add_development_dependency 'rubocop', '~> 0.49.0'
25
+ s.add_development_dependency 'simplecov', '~> 0.14'
26
+ s.add_development_dependency 'yard', '~> 0.9'
27
+ end
@@ -0,0 +1,2 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/rouge'
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/extensions'
3
+ require 'asciidoctor/rouge/version'
4
+ require 'asciidoctor/rouge/docinfo_processor'
5
+ require 'asciidoctor/rouge/treeprocessor'
6
+
7
+ Asciidoctor::Extensions.register do
8
+ treeprocessor Asciidoctor::Rouge::Treeprocessor
9
+ docinfo_processor Asciidoctor::Rouge::DocinfoProcessor
10
+ end
@@ -0,0 +1,88 @@
1
+ # frozen_string_literal: true
2
+ require 'English'
3
+ require 'asciidoctor'
4
+ require 'asciidoctor/inline'
5
+ require 'asciidoctor/substitutors'
6
+ require 'asciidoctor/rouge/version'
7
+
8
+ module Asciidoctor::Rouge
9
+ # A substitutor for processing callouts inside a source listing block.
10
+ class CalloutsSubstitutor
11
+
12
+ # @return [Hash<Integer, Array<Integer>>]
13
+ attr_reader :callouts
14
+
15
+ # @param node [Asciidoctor::AbstractNode]
16
+ # @return [CalloutsSubstitutor] a callouts substitutor for the given _node_.
17
+ def self.create(node)
18
+ new(node)
19
+ end
20
+
21
+ # Extracts and stashes callout markers from the given _text_ for
22
+ # reinsertion after processing.
23
+ #
24
+ # This should be used prior passing the source to a code highlighter.
25
+ #
26
+ # @param text [#each_line] source of the listing block.
27
+ # @return [String] a copy of the _text_ with callout marks removed.
28
+ def extract(text)
29
+ escape_char = ::Asciidoctor::Substitutors::RS
30
+ @callouts.clear
31
+
32
+ text.each_line.with_index.map { |line, ln|
33
+ line.gsub(@callout_rx) do
34
+ match = $LAST_MATCH_INFO
35
+ if match[1] == escape_char
36
+ # We have to use sub since we aren't sure it's the first char.
37
+ match[0].sub(escape_char, '')
38
+ else
39
+ (@callouts[ln] ||= []) << match[3].to_i
40
+ nil
41
+ end
42
+ end
43
+ }.join
44
+ end
45
+
46
+ # Converts and restores the extracted callouts for the given _text_.
47
+ #
48
+ # @param text [#each_line]
49
+ # @return [String] a copy of the _text_ with inserted callouts.
50
+ def restore(text)
51
+ return text if @callouts.empty?
52
+
53
+ text.each_line.with_index.map { |line, ln|
54
+ if (conums = @callouts.delete(ln))
55
+ line.chomp + conums.map { |num| convert_callout(num) }.join(' ') + "\n"
56
+ else
57
+ line
58
+ end
59
+ }.join
60
+ end
61
+
62
+ protected
63
+
64
+ # (see .create)
65
+ def initialize(node)
66
+ @node = node
67
+ @callouts = {}
68
+
69
+ @callout_rx = if node.attr? 'line-comment'
70
+ comment_rx = ::Regexp.escape(node.attr('line-comment'))
71
+ /(?:#{comment_rx} )?#{::Asciidoctor::CalloutExtractRxt}/
72
+ else
73
+ ::Asciidoctor::CalloutExtractRx
74
+ end
75
+ end
76
+
77
+ # @param number [Integer] callout number.
78
+ # @return [String] an HTML markup of callout with the given _number_.
79
+ def convert_callout(number)
80
+ ::Asciidoctor::Inline.new(@node, :callout, number, id: next_callout_id).convert
81
+ end
82
+
83
+ # @return [Integer] an unique ID for callout.
84
+ def next_callout_id
85
+ (@doc_callouts ||= @node.document.callouts).read_next_id
86
+ end
87
+ end
88
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/rouge/version'
3
+ require 'asciidoctor/extensions'
4
+ require 'rouge'
5
+
6
+ module Asciidoctor::Rouge
7
+ # A docinfo processor that embeds CSS for Rouge into the document's header.
8
+ class DocinfoProcessor < ::Asciidoctor::Extensions::DocinfoProcessor
9
+
10
+ # @param document [Asciidoctor::Document] the document to process.
11
+ # @return [String, nil]
12
+ def process(document)
13
+ return unless document.attr?('source-highlighter', 'rouge')
14
+ return unless document.attr('rouge-css', 'class') == 'class'
15
+
16
+ if (theme = ::Rouge::Theme.find(document.attr('rouge-theme', 'github')))
17
+ css = theme.render(scope: '.highlight')
18
+ ['<style>', css, '</style>'].join("\n")
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/rouge/version'
3
+ require 'rouge'
4
+
5
+ module Asciidoctor::Rouge
6
+ # An HTML Rouge formatter with support for lines ID and highlighted lines.
7
+ class HtmlFormatter < ::Rouge::Formatter
8
+
9
+ tag 'asciidoctor_html'
10
+
11
+ # @param parent [Rouge::Formatter] the parent formatter; it must respond
12
+ # to method +span(token, value)+. Defaults to +Rouge::Formatters::HTML+.
13
+ #
14
+ # @param highlight_lines [Array<Integer>] a list of line numbers (1-based)
15
+ # to be highlighted (i.e. wrapped in +<strong></strong>+). Defaults to
16
+ # empty array.
17
+ #
18
+ # @param highlight_class [String] CSS class to use on an element wrapping
19
+ # highlighted lines (see above). Defaults to "highlighted".
20
+ #
21
+ # @param line_id [String] format string specifying +id+ for each line.
22
+ # Defaults to "L%i".
23
+ #
24
+ # @param line_class [String] CSS class to use on a line wrapper element.
25
+ # Defaults to "line".
26
+ #
27
+ def initialize(parent: ::Rouge::Formatters::HTML.new,
28
+ highlight_lines: [],
29
+ highlight_class: 'highlighted',
30
+ line_id: 'L%i',
31
+ line_class: 'line', **)
32
+ @parent = parent
33
+ @highlight_lines = highlight_lines
34
+ @highlight_class = highlight_class
35
+ @line_id = line_id
36
+ @line_class = line_class
37
+ end
38
+
39
+ def stream(tokens)
40
+ lno = 1
41
+ token_lines(tokens) do |line|
42
+ highlighted = @highlight_lines.include?(lno)
43
+
44
+ yield "\n" if lno > 1
45
+ yield line_open(lno)
46
+ yield highlight_open if highlighted
47
+
48
+ line.each do |token, value|
49
+ yield @parent.span(token, value)
50
+ end
51
+
52
+ yield highlight_close if highlighted
53
+ yield line_close
54
+
55
+ lno += 1
56
+ end
57
+ end
58
+
59
+ protected
60
+
61
+ def line_open(lno)
62
+ %(<span id=#{sprintf(@line_id, lno).inspect} class=#{@line_class.inspect}>)
63
+ end
64
+
65
+ def line_close
66
+ %(</span>)
67
+ end
68
+
69
+ def highlight_open
70
+ %(<strong class=#{@highlight_class.inspect}>)
71
+ end
72
+
73
+ def highlight_close
74
+ %(</strong>)
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/substitutors'
3
+ require 'asciidoctor/rouge/version'
4
+
5
+ module Asciidoctor::Rouge
6
+ # A substitutor for processing passthroughs inside listing blocks.
7
+ # It's basically just a facade for Asciidoctor's internal methods.
8
+ class PassthroughsSubstitutor
9
+
10
+ PASS_START_MARK = ::Asciidoctor::Substitutors::PASS_START
11
+ PASS_END_MARK = ::Asciidoctor::Substitutors::PASS_END
12
+ PASS_SLOT_RX = ::Asciidoctor::Substitutors::HighlightedPassSlotRx
13
+
14
+ # @param node [Asciidoctor::AbstractNode]
15
+ # @return [PassthroughsSubstitutor] a passthroughs substitutor for
16
+ # the given _node_.
17
+ def self.create(node)
18
+ new(node)
19
+ end
20
+
21
+ # Extracts passthrough regions from the given text for reinsertion
22
+ # after processing.
23
+ #
24
+ # @param text [String] the source of the node.
25
+ # @return [String] a copy of the _text_ with passthrough regions
26
+ # substituted with placeholders.
27
+ def extract(text)
28
+ @node.extract_passthroughs(text)
29
+ end
30
+
31
+ # Restores the extracted passthroughs by reinserting them into the
32
+ # placeholder positions.
33
+ #
34
+ # @param text [String] the text into which to restore the passthroughs.
35
+ # @return [String] a copy of the _text_ with restored passthroughs.
36
+ def restore(text)
37
+ return text if @node.passthroughs.empty?
38
+
39
+ # Fix passthrough placeholders that got caught up in syntax highlighting.
40
+ text = text.gsub(PASS_SLOT_RX, "#{PASS_START_MARK}\\1#{PASS_END_MARK}")
41
+
42
+ # Restore converted passthroughs.
43
+ @node.restore_passthroughs(text)
44
+ end
45
+
46
+ protected
47
+
48
+ # (see .create)
49
+ def initialize(node)
50
+ @node = node
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,110 @@
1
+ # frozen_string_literal: true
2
+ require 'asciidoctor/rouge/version'
3
+ require 'asciidoctor/rouge/callouts_substitutor'
4
+ require 'asciidoctor/rouge/html_formatter'
5
+ require 'asciidoctor/rouge/passthroughs_substitutor'
6
+ require 'asciidoctor/extensions'
7
+ require 'rouge'
8
+
9
+ module Asciidoctor::Rouge
10
+ # An Asciidoctor extension that highlights source listings using Rouge.
11
+ class Treeprocessor < ::Asciidoctor::Extensions::Treeprocessor
12
+
13
+ # @param formatter [Class<Rouge::Formatter>] the Rouge formatter to use for
14
+ # formatting a token stream from a Rouge lexer. It must respond to method
15
+ # +format+ accepting a token stream and (optionally) a hash of options,
16
+ # producing +String+. Defaults to {HtmlFormatter}.
17
+ #
18
+ # @param formatter_opts [Hash] options to pass to the _formatter_.
19
+ # It's used only if _formatter's_ +format+ method has arity > 1.
20
+ # Defaults to empty hash.
21
+ #
22
+ # @param callouts_sub [#create] the callouts substitutor class to use for
23
+ # processing callouts. Defaults to {CalloutsSubstitutor}.
24
+ #
25
+ # @param passthroughs_sub [#create] the passthroughs substitutor class to
26
+ # use for processing passthroughs.
27
+ # Defaults to {PassthroughsSubstitutor}.
28
+ #
29
+ def initialize(formatter: HtmlFormatter,
30
+ formatter_opts: {},
31
+ callouts_sub: CalloutsSubstitutor,
32
+ passthroughs_sub: PassthroughsSubstitutor, **)
33
+ super
34
+
35
+ @formatter = formatter
36
+ @formatter_opts = formatter_opts
37
+ @callouts_sub = callouts_sub
38
+ @passthroughs_sub = passthroughs_sub
39
+ end
40
+
41
+ # @param document [Asciidoctor::Document] the document to process.
42
+ def process(document)
43
+ return unless document.attr? 'source-highlighter', 'rouge'
44
+
45
+ document.find_by(context: :listing, style: 'source') do |block|
46
+ process_listing(block)
47
+ end
48
+ end
49
+
50
+ protected
51
+
52
+ # @param block [Asciidoctor::Block] the listing block to highlight.
53
+ def process_listing(block)
54
+ source = block.source # String
55
+ subs = block.subs # Array<Symbol>
56
+
57
+ # Don't escape special characters, Rouge will take care of it.
58
+ subs.delete(:specialcharacters)
59
+
60
+ if subs.delete(:macros)
61
+ passthroughs = @passthroughs_sub.create(block)
62
+ source = passthroughs.extract(source)
63
+ end
64
+
65
+ if subs.delete(:callouts)
66
+ callouts = @callouts_sub.create(block)
67
+ source = callouts.extract(source)
68
+ end
69
+
70
+ source = block.apply_subs(source, subs)
71
+ subs.clear
72
+
73
+ lang = block.attr('language', 'plaintext', false)
74
+ lexer = find_lexer(lang)
75
+ block.set_attr('language', lexer.tag)
76
+
77
+ if block.attr?('highlight', nil, false)
78
+ highlight_lines = block.resolve_highlight_lines(block.attr('highlight', '', false))
79
+ end
80
+
81
+ result = highlight(lexer, source, highlight_lines)
82
+ result = callouts.restore(result) if callouts
83
+ result = passthroughs.restore(result) if passthroughs
84
+
85
+ block.lines.replace(result.split("\n"))
86
+ end
87
+
88
+ # @param language [String]
89
+ # @return [Rouge::Lexer] a lexer for the specified _language_.
90
+ def find_lexer(language)
91
+ (::Rouge::Lexer.find(language) || ::Rouge::Lexers::PlainText).new
92
+ end
93
+
94
+ # @param lexer [Rouge::Lexer] the lexer to use.
95
+ # @param source [String] the code to highlight.
96
+ # @param highlight_lines [Array<Integer>] a list of line numbers (1-based)
97
+ # to be highlighted.
98
+ # @return [String] a highlighted and formatted _source_.
99
+ def highlight(lexer, source, highlight_lines = [])
100
+ tokens = lexer.lex(source)
101
+
102
+ if @formatter.method(:format).arity.abs > 1
103
+ opts = @formatter_opts.merge(highlight_lines: highlight_lines || [])
104
+ @formatter.format(tokens, opts)
105
+ else
106
+ @Formatter.format(tokens)
107
+ end
108
+ end
109
+ end
110
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Asciidoctor
4
+ module Rouge
5
+ VERSION = '0.1.0'.freeze
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,166 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: asciidoctor-rouge
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Jakub Jirutka
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-09-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: asciidoctor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 1.5.6
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 1.5.6
27
+ - !ruby/object:Gem::Dependency
28
+ name: rouge
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '2.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: corefines
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.11'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.11'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '12.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '12.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.6'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.6'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 0.49.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 0.49.0
97
+ - !ruby/object:Gem::Dependency
98
+ name: simplecov
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.14'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.14'
111
+ - !ruby/object:Gem::Dependency
112
+ name: yard
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.9'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.9'
125
+ description:
126
+ email: jakub@jirutka.cz
127
+ executables: []
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - LICENSE
132
+ - README.adoc
133
+ - asciidoctor-rouge.gemspec
134
+ - lib/asciidoctor-rouge.rb
135
+ - lib/asciidoctor/rouge.rb
136
+ - lib/asciidoctor/rouge/callouts_substitutor.rb
137
+ - lib/asciidoctor/rouge/docinfo_processor.rb
138
+ - lib/asciidoctor/rouge/html_formatter.rb
139
+ - lib/asciidoctor/rouge/passthroughs_substitutor.rb
140
+ - lib/asciidoctor/rouge/treeprocessor.rb
141
+ - lib/asciidoctor/rouge/version.rb
142
+ homepage: https://github.com/jirutka/asciidoctor-rouge
143
+ licenses:
144
+ - MIT
145
+ metadata: {}
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '2.1'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubyforge_project:
162
+ rubygems_version: 2.6.11
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: Rouge code highlighter support for Asciidoctor
166
+ test_files: []