defmastership 1.0.5 → 1.0.6
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.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/bin/defmastership +21 -15
- data/cucumber.yml +1 -1
- data/defmastership.gemspec +12 -6
- data/features/changeref.feature +82 -129
- data/features/export.feature +88 -34
- data/features/modify.feature +143 -0
- data/features/rename_included_files.feature +121 -0
- data/lib/defmastership.rb +11 -3
- data/lib/defmastership/batch_modifier.rb +33 -0
- data/lib/defmastership/{ref_changer.rb → change_ref_line_modifier.rb} +18 -35
- data/lib/defmastership/change_ref_modifier.rb +15 -0
- data/lib/defmastership/constants.rb +14 -1
- data/lib/defmastership/csv_formatter.rb +15 -16
- data/lib/defmastership/csv_formatter_body.rb +11 -6
- data/lib/defmastership/csv_formatter_header.rb +11 -10
- data/lib/defmastership/definition.rb +11 -0
- data/lib/defmastership/definition_parser.rb +46 -0
- data/lib/defmastership/document.rb +43 -75
- data/lib/defmastership/filters.rb +30 -0
- data/lib/defmastership/line_modifier_base.rb +29 -0
- data/lib/defmastership/modifier_base.rb +29 -0
- data/lib/defmastership/rename_included_files_line_modifier.rb +126 -0
- data/lib/defmastership/rename_included_files_modifier.rb +30 -0
- data/lib/defmastership/version.rb +1 -1
- data/spec/spec_helper.rb +1 -0
- data/spec/unit/defmastership/batch_modifier_spec.rb +115 -0
- data/spec/unit/defmastership/{ref_changer_spec.rb → change_ref_line_modifier_spec.rb} +48 -26
- data/spec/unit/defmastership/change_ref_modifier_spec.rb +76 -0
- data/spec/unit/defmastership/comment_filter_spec.rb +8 -4
- data/spec/unit/defmastership/csv_formatter_body_spec.rb +61 -37
- data/spec/unit/defmastership/csv_formatter_header_spec.rb +46 -22
- data/spec/unit/defmastership/csv_formatter_spec.rb +65 -104
- data/spec/unit/defmastership/definition_parser_spec.rb +63 -0
- data/spec/unit/defmastership/definition_spec.rb +30 -4
- data/spec/unit/defmastership/document_spec.rb +112 -35
- data/spec/unit/defmastership/rename_included_files_line_modifier_spec.rb +203 -0
- data/spec/unit/defmastership/rename_included_files_modifier_spec.rb +67 -0
- metadata +34 -9
- data/lib/defmastership/batch_changer.rb +0 -41
- data/lib/defmastership/project_ref_changer.rb +0 -28
- data/spec/unit/defmastership/batch_changer_spec.rb +0 -109
- data/spec/unit/defmastership/project_ref_changer_spec.rb +0 -80
data/lib/defmastership.rb
CHANGED
@@ -7,10 +7,18 @@ require('defmastership/version')
|
|
7
7
|
# you just need to require this one file in your bin file
|
8
8
|
require('defmastership/constants')
|
9
9
|
require('defmastership/definition')
|
10
|
+
require('defmastership/definition_parser')
|
11
|
+
require('defmastership/filters')
|
10
12
|
require('defmastership/document')
|
11
13
|
require('defmastership/comment_filter')
|
12
14
|
require('defmastership/csv_formatter')
|
13
15
|
|
14
|
-
require('defmastership/
|
15
|
-
require('defmastership/
|
16
|
-
require('defmastership/
|
16
|
+
require('defmastership/modifier_base')
|
17
|
+
require('defmastership/line_modifier_base')
|
18
|
+
require('defmastership/batch_modifier')
|
19
|
+
|
20
|
+
require('defmastership/change_ref_modifier')
|
21
|
+
require('defmastership/change_ref_line_modifier')
|
22
|
+
|
23
|
+
require('defmastership/rename_included_files_modifier')
|
24
|
+
require('defmastership/rename_included_files_line_modifier')
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Change references from temporary to definitive with multiple RefChangers
|
6
|
+
class BatchModifier
|
7
|
+
attr_reader :config, :adoc_texts, :changes
|
8
|
+
|
9
|
+
def initialize(config, adoc_texts)
|
10
|
+
@config = config
|
11
|
+
@adoc_texts = adoc_texts
|
12
|
+
@changes = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def apply(modifs)
|
16
|
+
modifs.split(/\s*,\s*/).each do |modif|
|
17
|
+
modifier = modifier_from(modif)
|
18
|
+
@adoc_texts = modifier.do_modifications(@adoc_texts)
|
19
|
+
@config[modif.to_sym][:config] = modifier.config
|
20
|
+
modifier.changes.each do |change|
|
21
|
+
@changes << [modif] + change
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def modifier_from(modif)
|
29
|
+
class_name = "#{@config[modif.to_sym][:type].split('_').map(&:capitalize).join}Modifier"
|
30
|
+
DefMastership.const_get(class_name).new(@config[modif.to_sym][:config])
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -2,12 +2,10 @@
|
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
4
|
module DefMastership
|
5
|
-
# Change references from temporary to definitive
|
6
|
-
class
|
7
|
-
|
8
|
-
|
9
|
-
def self.from_h(hash)
|
10
|
-
new.from_h(hash)
|
5
|
+
# Change references from temporary to definitive with multiple RefChangers
|
6
|
+
class ChangeRefLineModifier < LineModifierBase
|
7
|
+
def self.from_config(hash)
|
8
|
+
new.from_config(hash)
|
11
9
|
end
|
12
10
|
|
13
11
|
REGEXP_FROM = {
|
@@ -24,32 +22,17 @@ module DefMastership
|
|
24
22
|
private_constant :REGEXP_FROM
|
25
23
|
|
26
24
|
def initialize
|
27
|
-
|
25
|
+
super
|
26
|
+
@config = {
|
28
27
|
from_regexp: '',
|
29
28
|
to_template: '',
|
30
29
|
next_ref: 0
|
31
30
|
}
|
32
|
-
@changes = []
|
33
31
|
@in_literal = false
|
34
32
|
end
|
35
33
|
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
super
|
40
|
-
end
|
41
|
-
|
42
|
-
def respond_to_missing?(method_name, *args)
|
43
|
-
@h[method_name] || super
|
44
|
-
end
|
45
|
-
|
46
|
-
def from_h(hash)
|
47
|
-
@h.merge!(hash)
|
48
|
-
self
|
49
|
-
end
|
50
|
-
|
51
|
-
def to_h
|
52
|
-
@h
|
34
|
+
def replace(method, line)
|
35
|
+
public_send("replace_#{method}".to_sym, line)
|
53
36
|
end
|
54
37
|
|
55
38
|
def replace_refdef(line)
|
@@ -70,6 +53,15 @@ module DefMastership
|
|
70
53
|
|
71
54
|
private
|
72
55
|
|
56
|
+
def do_replace_refdef(line)
|
57
|
+
line.gsub(regexp_from(:definition, from_regexp)) do
|
58
|
+
replacement = to_template % hmerge(Regexp.last_match)
|
59
|
+
changes << [Regexp.last_match[:from], replacement]
|
60
|
+
@config[:next_ref] += 1
|
61
|
+
text_with(Regexp.last_match, replacement)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
73
65
|
def regexp_from(const, from)
|
74
66
|
regexp_str =
|
75
67
|
"(?<before>#{REGEXP_FROM[const][:before]})" \
|
@@ -83,21 +75,12 @@ module DefMastership
|
|
83
75
|
end
|
84
76
|
|
85
77
|
def hmerge(match)
|
86
|
-
@
|
78
|
+
@config.merge(match.names.map(&:to_sym).zip(match.captures).to_h)
|
87
79
|
end
|
88
80
|
|
89
81
|
def in_literal(line)
|
90
82
|
@in_literal ^= true if line.chomp == '....'
|
91
83
|
@in_literal
|
92
84
|
end
|
93
|
-
|
94
|
-
def do_replace_refdef(line)
|
95
|
-
line.gsub(regexp_from(:definition, from_regexp)) do
|
96
|
-
replacement = to_template % hmerge(Regexp.last_match)
|
97
|
-
changes << [Regexp.last_match[:from], replacement]
|
98
|
-
@h[:next_ref] += 1
|
99
|
-
text_with(Regexp.last_match, replacement)
|
100
|
-
end
|
101
|
-
end
|
102
85
|
end
|
103
86
|
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module DefMastership
|
5
|
+
# Change all refs of a given project
|
6
|
+
class ChangeRefModifier < ModifierBase
|
7
|
+
def replacements
|
8
|
+
%i[replace_refdef replace_irefs]
|
9
|
+
end
|
10
|
+
|
11
|
+
def line_modifier_class
|
12
|
+
ChangeRefLineModifier
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -19,8 +19,11 @@ module DefMastership
|
|
19
19
|
\s*
|
20
20
|
(,\s*\[\s*(?<labels>.*?)\s*\])?\s*\]
|
21
21
|
AFT
|
22
|
+
|
23
|
+
DEF_CHECKSUM = '(\((?<explicit_checksum>[[:alnum:]]+)\))?'
|
24
|
+
|
22
25
|
DEFINITION = Regexp.new(
|
23
|
-
"#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_AFTER_REF}",
|
26
|
+
"#{DEF_BEFORE_REF}(?<reference>[\\w:_-]+)#{DEF_CHECKSUM}#{DEF_AFTER_REF}",
|
24
27
|
Regexp::EXTENDED
|
25
28
|
)
|
26
29
|
|
@@ -56,6 +59,16 @@ module DefMastership
|
|
56
59
|
|
57
60
|
WHATEVER = //.freeze
|
58
61
|
|
62
|
+
INCLUDE_KEYWORD = '\binclude::'
|
63
|
+
INCLUDE_PATH = '(?<path>.*/)?'
|
64
|
+
INCLUDE_FILENAME = '(?<filename>[^\\/]+)'
|
65
|
+
INCLUDE_OPTIONS = '\[(?<options>[\]]*)\]'
|
66
|
+
|
67
|
+
INCLUDE = Regexp.new(
|
68
|
+
INCLUDE_KEYWORD + INCLUDE_PATH + INCLUDE_FILENAME + INCLUDE_OPTIONS,
|
69
|
+
Regexp::EXTENDED
|
70
|
+
)
|
71
|
+
|
59
72
|
public_constant :SINGLE_LINE_COMMENT,
|
60
73
|
:MULTI_LINE_COMMENT_DELIM,
|
61
74
|
:DEF_BEFORE_REF,
|
@@ -8,36 +8,35 @@ require('defmastership/csv_formatter_body')
|
|
8
8
|
module DefMastership
|
9
9
|
# to export a CSV file
|
10
10
|
class CSVFormatter
|
11
|
-
|
12
|
-
|
11
|
+
COLUMN_LIST1 = %i[fixed wrong_explicit_checksum labels eref iref attributes].freeze
|
12
|
+
COLUMN_LIST2 = %i[fixed labels eref iref attributes].freeze
|
13
|
+
private_constant :COLUMN_LIST1
|
14
|
+
private_constant :COLUMN_LIST2
|
13
15
|
|
14
16
|
def initialize(doc, sep = ',')
|
15
17
|
@doc = doc
|
16
18
|
@sep = sep
|
17
|
-
@header_formatter = CSVFormatterHeader.new(@doc)
|
18
|
-
@body_formatter = CSVFormatterBody.new(@doc)
|
19
19
|
end
|
20
20
|
|
21
21
|
def export_to(output_file)
|
22
|
+
column_list = @doc.wrong_explicit_checksum? ? COLUMN_LIST1 : COLUMN_LIST2
|
22
23
|
CSV.open(output_file, 'w:ISO-8859-1', { col_sep: @sep }) do |csv|
|
23
|
-
csv << header
|
24
|
-
@doc.definitions.each { |definition| csv << body(definition) }
|
24
|
+
csv << header(column_list)
|
25
|
+
@doc.definitions.each { |definition| csv << body(definition, column_list) }
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
29
|
+
private
|
30
|
+
|
31
|
+
def header(column_list)
|
32
|
+
header_formatter = CSVFormatterHeader.new(@doc)
|
33
|
+
header_line = column_list.map { |part| header_formatter.public_send(part) }
|
33
34
|
header_line.reduce(:+)
|
34
35
|
end
|
35
36
|
|
36
|
-
def body(definition)
|
37
|
-
|
38
|
-
|
39
|
-
@body_formatter.public_send("#{part}_body".to_sym, definition)
|
40
|
-
end
|
37
|
+
def body(definition, column_list)
|
38
|
+
body_formatter = CSVFormatterBody.new(@doc)
|
39
|
+
body_line = column_list.map { |part| body_formatter.public_send(part, definition) }
|
41
40
|
body_line.reduce(:+)
|
42
41
|
end
|
43
42
|
end
|
@@ -10,23 +10,28 @@ module DefMastership
|
|
10
10
|
@doc = doc
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
[definition.type, definition.reference, definition.value]
|
13
|
+
def fixed(definition)
|
14
|
+
[definition.type, definition.reference, definition.value, definition.sha256]
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def wrong_explicit_checksum(definition)
|
18
|
+
wrong_explicit_checksum = definition.wrong_explicit_checksum
|
19
|
+
wrong_explicit_checksum ? [wrong_explicit_checksum] : ['']
|
20
|
+
end
|
21
|
+
|
22
|
+
def labels(definition)
|
18
23
|
@doc.labels.empty? ? [] : [definition.labels.to_a.join("\n")]
|
19
24
|
end
|
20
25
|
|
21
|
-
def
|
26
|
+
def eref(definition)
|
22
27
|
@doc.eref.map { |key, _| definition.eref[key].join("\n") }
|
23
28
|
end
|
24
29
|
|
25
|
-
def
|
30
|
+
def iref(definition)
|
26
31
|
@doc.iref ? [definition.iref.join("\n")] : []
|
27
32
|
end
|
28
33
|
|
29
|
-
def
|
34
|
+
def attributes(definition)
|
30
35
|
@doc.attributes.map do |key, _|
|
31
36
|
definition.attributes[key]
|
32
37
|
end
|
@@ -10,26 +10,27 @@ module DefMastership
|
|
10
10
|
@doc = doc
|
11
11
|
end
|
12
12
|
|
13
|
-
def
|
14
|
-
%w[Type Reference Value]
|
13
|
+
def fixed
|
14
|
+
%w[Type Reference Value sha256]
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
17
|
+
def wrong_explicit_checksum
|
18
|
+
@doc.wrong_explicit_checksum? ? ['Wrong explicit checksum'] : []
|
19
|
+
end
|
20
|
+
|
21
|
+
def labels
|
18
22
|
@doc.labels.empty? ? [] : %w[Labels]
|
19
23
|
end
|
20
24
|
|
21
|
-
def
|
22
|
-
@doc.eref.map
|
23
|
-
ref[:prefix] +
|
24
|
-
(ref[:url].nil? || ref[:url] == 'none' ? '' : " #{ref[:url]}")
|
25
|
-
end
|
25
|
+
def eref
|
26
|
+
@doc.eref.map { |_, ref| ref[:prefix] }
|
26
27
|
end
|
27
28
|
|
28
|
-
def
|
29
|
+
def iref
|
29
30
|
@doc.iref ? ['Internal links'] : []
|
30
31
|
end
|
31
32
|
|
32
|
-
def
|
33
|
+
def attributes
|
33
34
|
@doc.attributes.map { |_, value| value }
|
34
35
|
end
|
35
36
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
+
require 'digest'
|
5
|
+
|
4
6
|
module DefMastership
|
5
7
|
# DefMastership definition: contains all data of a definition
|
6
8
|
class Definition
|
@@ -16,6 +18,7 @@ module DefMastership
|
|
16
18
|
@eref = Hash.new([])
|
17
19
|
@iref = []
|
18
20
|
@attributes = {}
|
21
|
+
@explicit_checksum = match[:explicit_checksum]
|
19
22
|
end
|
20
23
|
|
21
24
|
def <<(new_line)
|
@@ -27,6 +30,14 @@ module DefMastership
|
|
27
30
|
@lines.join("\n")
|
28
31
|
end
|
29
32
|
|
33
|
+
def sha256
|
34
|
+
Digest::SHA2.new(256).hexdigest(value).split(//).last(8).join
|
35
|
+
end
|
36
|
+
|
37
|
+
def wrong_explicit_checksum
|
38
|
+
@explicit_checksum if @explicit_checksum != sha256
|
39
|
+
end
|
40
|
+
|
30
41
|
def add_eref(refname, extrefs)
|
31
42
|
@eref[refname] = extrefs.strip.split(/\s*,\s*/)
|
32
43
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require('aasm')
|
5
|
+
|
6
|
+
module DefMastership
|
7
|
+
# DefMastership definition: contains all data of a definition
|
8
|
+
class DefinitionParser
|
9
|
+
include AASM
|
10
|
+
|
11
|
+
def initialize(document)
|
12
|
+
@document = document
|
13
|
+
end
|
14
|
+
|
15
|
+
aasm do
|
16
|
+
state :idle, initial: true
|
17
|
+
state :wait_content
|
18
|
+
state :in_block
|
19
|
+
state :single_para
|
20
|
+
|
21
|
+
event :new_definition do
|
22
|
+
transitions from: :idle, to: :wait_content, after: ->(*args) { @document.add_new_definition(*args) }
|
23
|
+
end
|
24
|
+
|
25
|
+
event :block_delimiter do
|
26
|
+
transitions from: :wait_content, to: :in_block
|
27
|
+
transitions from: %i[in_block idle single_para], to: :idle
|
28
|
+
end
|
29
|
+
|
30
|
+
event :new_line do
|
31
|
+
transitions from: %i[wait_content single_para],
|
32
|
+
to: :single_para,
|
33
|
+
after: ->(*args) { @document.add_line(*args) }
|
34
|
+
transitions from: :in_block,
|
35
|
+
to: :in_block,
|
36
|
+
after: ->(*args) { @document.add_line(*args) }
|
37
|
+
transitions from: :idle, to: :idle
|
38
|
+
end
|
39
|
+
|
40
|
+
event :empty_line do
|
41
|
+
transitions from: %i[wait_content single_para idle], to: :idle
|
42
|
+
transitions from: :in_block, to: :in_block
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,41 +1,11 @@
|
|
1
1
|
# Copyright (c) 2020 Jerome Arbez-Gindre
|
2
2
|
# frozen_string_literal: true
|
3
3
|
|
4
|
-
require('aasm')
|
5
|
-
|
6
4
|
module DefMastership
|
7
5
|
# Contains the content of a DefMastership document: mainly definitions
|
8
|
-
# TODO: make this class smaller by defining a separated parser
|
9
|
-
|
10
|
-
# Contains regexp / action couples
|
11
|
-
Filter = Struct.new(:regexp, :event, :consumed_line)
|
12
|
-
private_constant :Filter
|
13
|
-
|
14
|
-
FILTERS_IN_LITERAL = [
|
15
|
-
Filter.new(DMRegexp::LITERAL_BLOCK, :code_block_delimiter, false),
|
16
|
-
Filter.new(DMRegexp::WHATEVER, :new_line, true)
|
17
|
-
].freeze
|
18
|
-
private_constant :FILTERS_IN_LITERAL
|
19
|
-
|
20
|
-
FILTERS = [
|
21
|
-
Filter.new(DMRegexp::VARIABLE_DEF, :new_variable_def, false),
|
22
|
-
Filter.new(DMRegexp::VARIABLE_USE, :new_variable_use, false),
|
23
|
-
Filter.new(DMRegexp::DEFINITION, :new_definition, true),
|
24
|
-
Filter.new(DMRegexp::EREF_CONFIG, :new_eref_setup, true),
|
25
|
-
Filter.new(DMRegexp::EREF_DEF, :new_eref_def, false),
|
26
|
-
Filter.new(DMRegexp::IREF_DEF, :new_iref_def, false),
|
27
|
-
Filter.new(DMRegexp::ATTR_CONFIG, :new_attribute_conf, true),
|
28
|
-
Filter.new(DMRegexp::ATTR_SET, :new_attribute_value, false),
|
29
|
-
Filter.new(DMRegexp::BLOCK, :block_delimiter, true),
|
30
|
-
Filter.new(DMRegexp::LITERAL_BLOCK, :code_block_delimiter, true),
|
31
|
-
Filter.new(DMRegexp::EMPTY_LINE, :empty_line, false),
|
32
|
-
Filter.new(DMRegexp::WHATEVER, :new_line, true)
|
33
|
-
].freeze
|
34
|
-
private_constant :FILTERS
|
35
6
|
|
36
7
|
# Reflects document structure from a definition point of view
|
37
8
|
class Document
|
38
|
-
include AASM
|
39
9
|
attr_reader :definitions, :labels, :eref, :iref, :attributes, :variables
|
40
10
|
|
41
11
|
def initialize
|
@@ -45,110 +15,108 @@ module DefMastership
|
|
45
15
|
@iref = false
|
46
16
|
@attributes = {}
|
47
17
|
@in_literal = true
|
48
|
-
@current_line = nil
|
49
18
|
@variables = {}
|
50
|
-
end
|
51
|
-
|
52
|
-
aasm do
|
53
|
-
state :idle, initial: true
|
54
|
-
state :wait_content
|
55
|
-
state :in_block
|
56
|
-
state :single_para
|
57
|
-
|
58
|
-
event :new_definition do
|
59
|
-
transitions from: :idle, to: :wait_content, after: :add_new_definition
|
60
|
-
end
|
61
|
-
|
62
|
-
event :block_delimiter do
|
63
|
-
transitions from: :wait_content, to: :in_block
|
64
|
-
transitions from: %i[in_block idle], to: :idle
|
65
|
-
transitions from: :single_para, to: :idle
|
66
|
-
end
|
67
19
|
|
68
|
-
|
69
|
-
|
70
|
-
transitions from: :single_para, to: :single_para, after: :add_line
|
71
|
-
transitions from: :in_block, to: :in_block, after: :add_line
|
72
|
-
transitions from: :idle, to: :idle
|
73
|
-
end
|
20
|
+
@definition_parser = DefinitionParser.new(self)
|
21
|
+
end
|
74
22
|
|
75
|
-
|
76
|
-
|
77
|
-
|
23
|
+
def wrong_explicit_checksum?
|
24
|
+
@definitions.reduce(false) do |res, definition|
|
25
|
+
res || !definition.wrong_explicit_checksum.nil?
|
78
26
|
end
|
79
27
|
end
|
80
28
|
|
81
|
-
def code_block_delimiter(_match)
|
29
|
+
def code_block_delimiter(_match, line)
|
82
30
|
@in_literal ^= true
|
31
|
+
line
|
83
32
|
end
|
84
33
|
|
85
|
-
def add_new_definition(match)
|
34
|
+
def add_new_definition(match, line)
|
86
35
|
definition = Definition.new(match)
|
87
36
|
@labels.merge(definition.labels)
|
88
37
|
@definitions << definition
|
38
|
+
line
|
89
39
|
end
|
90
40
|
|
91
|
-
def add_line(_match)
|
92
|
-
@definitions.last <<
|
41
|
+
def add_line(_match, line)
|
42
|
+
@definitions.last << line
|
43
|
+
line
|
93
44
|
end
|
94
45
|
|
95
|
-
def new_eref_setup(match)
|
46
|
+
def new_eref_setup(match, line)
|
96
47
|
@eref[match[:refname].to_sym] ||= {}
|
97
48
|
|
98
49
|
@eref[match[:refname].to_sym][match[:symb].to_sym] =
|
99
50
|
match[:value]
|
51
|
+
line
|
100
52
|
end
|
101
53
|
|
102
|
-
def new_eref_def(match)
|
54
|
+
def new_eref_def(match, line)
|
103
55
|
@definitions.last.add_eref(
|
104
56
|
match[:refname].to_sym,
|
105
57
|
match[:extrefs]
|
106
58
|
)
|
59
|
+
line
|
107
60
|
end
|
108
61
|
|
109
|
-
def new_iref_def(_match)
|
62
|
+
def new_iref_def(_match, line)
|
110
63
|
@iref = true
|
111
|
-
|
64
|
+
line.scan(DMRegexp::IREF_DEF) do |_|
|
112
65
|
@definitions.last.add_iref(Regexp.last_match[:intref])
|
113
66
|
end
|
67
|
+
line
|
114
68
|
end
|
115
69
|
|
116
|
-
def new_attribute_conf(match)
|
70
|
+
def new_attribute_conf(match, line)
|
117
71
|
@attributes[match[:attr].to_sym] = match[:prefix]
|
72
|
+
line
|
118
73
|
end
|
119
74
|
|
120
|
-
def new_attribute_value(match)
|
75
|
+
def new_attribute_value(match, line)
|
121
76
|
@definitions.last.set_attribute(
|
122
77
|
match[:attr].to_sym,
|
123
78
|
match[:value]
|
124
79
|
)
|
80
|
+
line
|
125
81
|
end
|
126
82
|
|
127
|
-
def new_variable_def(match)
|
83
|
+
def new_variable_def(match, line)
|
128
84
|
@variables[match[:varname].to_sym] = match[:value]
|
85
|
+
line
|
129
86
|
end
|
130
87
|
|
131
|
-
def new_variable_use(_match)
|
132
|
-
|
88
|
+
def new_variable_use(_match, line)
|
89
|
+
new_line = line.dup
|
90
|
+
line.scan(DMRegexp::VARIABLE_USE) do |_|
|
133
91
|
varname = Regexp.last_match[:varname]
|
134
92
|
next if @variables[varname.to_sym].nil?
|
135
93
|
|
136
|
-
|
137
|
-
"{#{varname}}", @variables[varname.to_sym]
|
138
|
-
)
|
94
|
+
new_line.gsub!("{#{varname}}", @variables[varname.to_sym])
|
139
95
|
end
|
96
|
+
new_line
|
140
97
|
end
|
141
98
|
|
142
99
|
def parse(lines)
|
143
100
|
lines.reject(&:commented?).each do |line|
|
144
|
-
@current_line = line
|
145
101
|
(@in_literal ? FILTERS : FILTERS_IN_LITERAL).each do |filter|
|
146
102
|
next unless line.match(filter.regexp)
|
147
103
|
|
148
|
-
|
104
|
+
line = generate_event(filter.event, Regexp.last_match, line)
|
105
|
+
|
149
106
|
break if filter.consumed_line
|
150
107
|
end
|
151
108
|
end
|
152
109
|
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def generate_event(event, match, line)
|
114
|
+
if respond_to?(event)
|
115
|
+
line = public_send(event, match, line)
|
116
|
+
else
|
117
|
+
@definition_parser.public_send(event, match, line)
|
118
|
+
end
|
119
|
+
line
|
120
|
+
end
|
153
121
|
end
|
154
122
|
end
|