dim-toolkit 2.1.1 → 2.2.0
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/bin/dim +9 -9
- data/lib/dim/commands/check.rb +13 -13
- data/lib/dim/commands/export.rb +145 -145
- data/lib/dim/commands/format.rb +196 -198
- data/lib/dim/commands/stats.rb +64 -64
- data/lib/dim/consistency.rb +157 -187
- data/lib/dim/dimmain.rb +28 -28
- data/lib/dim/encoding.rb +4 -4
- data/lib/dim/exit_helper.rb +23 -23
- data/lib/dim/exporter/csv.rb +24 -25
- data/lib/dim/exporter/exporterInterface.rb +37 -37
- data/lib/dim/exporter/json.rb +30 -32
- data/lib/dim/exporter/rst.rb +142 -142
- data/lib/dim/ext/psych.rb +63 -63
- data/lib/dim/ext/string.rb +85 -85
- data/lib/dim/globals.rb +12 -12
- data/lib/dim/helpers/attribute_helper.rb +126 -126
- data/lib/dim/helpers/file_helper.rb +25 -25
- data/lib/dim/loader.rb +561 -581
- data/lib/dim/options.rb +116 -116
- data/lib/dim/requirement.rb +217 -236
- data/lib/dim/ver.rb +7 -7
- data/lib/dim.rb +1 -1
- data/license.txt +205 -205
- data/version.txt +1 -1
- metadata +4 -4
data/lib/dim/exporter/rst.rb
CHANGED
@@ -1,142 +1,142 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Dim
|
4
|
-
class Rst < ExporterInterface
|
5
|
-
EXPORTER['rst'] = self
|
6
|
-
|
7
|
-
def initialize(loader)
|
8
|
-
super(loader)
|
9
|
-
@hasIndex = true
|
10
|
-
end
|
11
|
-
|
12
|
-
def document(f, name)
|
13
|
-
raw_html_name = ':raw-html:`' + name + '`'
|
14
|
-
f.puts raw_html_name
|
15
|
-
f.puts '=' * raw_html_name.length
|
16
|
-
@lastHeadingLevel = 0
|
17
|
-
@moduleName = name
|
18
|
-
end
|
19
|
-
|
20
|
-
def metadata(f, meta)
|
21
|
-
f.puts ''
|
22
|
-
f.puts html(meta.strip.escape_html, with_space: false)
|
23
|
-
end
|
24
|
-
|
25
|
-
def level2char(level)
|
26
|
-
{ 0 => '=',
|
27
|
-
1 => '-',
|
28
|
-
2 => '+',
|
29
|
-
3 => '~',
|
30
|
-
4 => '^',
|
31
|
-
5 => '"' }.fetch(level, '"')
|
32
|
-
end
|
33
|
-
|
34
|
-
def html(elem, with_space: true)
|
35
|
-
return if elem.empty?
|
36
|
-
|
37
|
-
with_space ? " :raw-html:`#{elem}`" : ":raw-html:`#{elem}`"
|
38
|
-
end
|
39
|
-
|
40
|
-
def handle_empty_value(value)
|
41
|
-
return '' if value.empty?
|
42
|
-
|
43
|
-
' ' + (value.is_a?(Array) ? value.join(', ') : value)
|
44
|
-
end
|
45
|
-
|
46
|
-
def createMultiLanguageElement(r, name)
|
47
|
-
lang_elems = r.data.keys.select { |k| k.start_with?("#{name}_") && !r.data[k].empty? }.sort
|
48
|
-
if lang_elems.empty?
|
49
|
-
return r.data[name].empty? ? '' : r.data[name]
|
50
|
-
end
|
51
|
-
|
52
|
-
str = (r.data[name].empty? ? '-' : r.data[name])
|
53
|
-
lang_elems.each do |l|
|
54
|
-
str << "<br><br><b>#{l.split('_').map(&:capitalize).join(' ')}: </b>"
|
55
|
-
str << r.data[l]
|
56
|
-
end
|
57
|
-
str
|
58
|
-
end
|
59
|
-
|
60
|
-
def requirement(f, r)
|
61
|
-
r.data.each { |k, v| r.data[k] = v.strip.escape_html }
|
62
|
-
|
63
|
-
if r.data['type'].start_with?('heading')
|
64
|
-
(@lastHeadingLevel + 1...r.depth).each do |l|
|
65
|
-
str = '<Skipped Heading Level>'
|
66
|
-
f.puts ''
|
67
|
-
f.puts str
|
68
|
-
f.puts level2char(l) * str.length
|
69
|
-
end
|
70
|
-
f.puts ''
|
71
|
-
str = ':raw-html:`' + r.data['text'] + '`'
|
72
|
-
f.puts str
|
73
|
-
f.puts level2char(r.depth) * str.length
|
74
|
-
@lastHeadingLevel = r.depth
|
75
|
-
return
|
76
|
-
end
|
77
|
-
|
78
|
-
r.data['tester'].gsub!('<br>', ' ')
|
79
|
-
r.data['developer'].gsub!('<br>', ' ')
|
80
|
-
text = createMultiLanguageElement(r, 'text')
|
81
|
-
comment = createMultiLanguageElement(r, 'comment')
|
82
|
-
refs = r.data['refs'].cleanUniqArray.select do |ref|
|
83
|
-
!@loader.requirements.has_key?(ref) || !@loader.requirements[ref].type.start_with?('heading')
|
84
|
-
end
|
85
|
-
tags = r.data['tags'].cleanUniqString
|
86
|
-
sources = r.data['sources'].cleanUniqString
|
87
|
-
|
88
|
-
f.puts ''
|
89
|
-
f.puts ".. #{r.data['type']}:: #{r.id}"
|
90
|
-
f.puts " :category: #{r.category}"
|
91
|
-
f.puts " :status: #{r.data['status']}"
|
92
|
-
f.puts " :review_status: #{r.data['review_status']}"
|
93
|
-
f.puts " :asil: #{r.data['asil']}"
|
94
|
-
f.puts " :cal: #{r.data['cal']}"
|
95
|
-
f.puts " :tags:#{handle_empty_value(tags)}"
|
96
|
-
f.puts " :comment:#{html(comment)}"
|
97
|
-
f.puts " :miscellaneous:#{html(r.data['miscellaneous'])}"
|
98
|
-
f.puts " :refs:#{handle_empty_value(refs)}"
|
99
|
-
@loader.custom_attributes.each_key do |custom_attribute|
|
100
|
-
f.puts " :#{custom_attribute}:#{handle_empty_value(r.data[custom_attribute])}"
|
101
|
-
end
|
102
|
-
if r.data['type'] == 'requirement'
|
103
|
-
vc = createMultiLanguageElement(r, 'verification_criteria')
|
104
|
-
|
105
|
-
f.puts " :sources:#{handle_empty_value(sources)}"
|
106
|
-
f.puts " :feature:#{html(r.data['feature'])}"
|
107
|
-
f.puts " :change_request:#{html(r.data['change_request'])}"
|
108
|
-
f.puts " :developer:#{handle_empty_value(r.data['developer'])}"
|
109
|
-
f.puts " :tester:#{handle_empty_value(r.data['tester'])}"
|
110
|
-
f.puts " :verification_methods:#{handle_empty_value(r.data['verification_methods'])}"
|
111
|
-
f.puts " :verification_criteria:#{html(vc)}"
|
112
|
-
end
|
113
|
-
|
114
|
-
f.puts "\n #{html(text)}" unless text.empty?
|
115
|
-
end
|
116
|
-
|
117
|
-
def footer(f)
|
118
|
-
files = @loader.module_data[@moduleName][:files].values.flatten
|
119
|
-
return if files.empty?
|
120
|
-
|
121
|
-
f.puts ''
|
122
|
-
f.puts '.. enclosed::'
|
123
|
-
f.puts ''
|
124
|
-
files.each do |file|
|
125
|
-
f.puts " #{file}"
|
126
|
-
end
|
127
|
-
end
|
128
|
-
|
129
|
-
def index(f, category, origin, modules)
|
130
|
-
caption = category.capitalize + ' (' + origin + ')'
|
131
|
-
f.puts caption
|
132
|
-
f.puts '=' * caption.length
|
133
|
-
f.puts ''
|
134
|
-
f.puts '.. toctree::'
|
135
|
-
f.puts ' :maxdepth: 1'
|
136
|
-
f.puts ''
|
137
|
-
modules.sort.each do |m|
|
138
|
-
f.puts " #{m.sanitize}/Requirements"
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Dim
|
4
|
+
class Rst < ExporterInterface
|
5
|
+
EXPORTER['rst'] = self
|
6
|
+
|
7
|
+
def initialize(loader)
|
8
|
+
super(loader)
|
9
|
+
@hasIndex = true
|
10
|
+
end
|
11
|
+
|
12
|
+
def document(f, name)
|
13
|
+
raw_html_name = ':raw-html:`' + name + '`'
|
14
|
+
f.puts raw_html_name
|
15
|
+
f.puts '=' * raw_html_name.length
|
16
|
+
@lastHeadingLevel = 0
|
17
|
+
@moduleName = name
|
18
|
+
end
|
19
|
+
|
20
|
+
def metadata(f, meta)
|
21
|
+
f.puts ''
|
22
|
+
f.puts html(meta.strip.escape_html, with_space: false)
|
23
|
+
end
|
24
|
+
|
25
|
+
def level2char(level)
|
26
|
+
{ 0 => '=',
|
27
|
+
1 => '-',
|
28
|
+
2 => '+',
|
29
|
+
3 => '~',
|
30
|
+
4 => '^',
|
31
|
+
5 => '"' }.fetch(level, '"')
|
32
|
+
end
|
33
|
+
|
34
|
+
def html(elem, with_space: true)
|
35
|
+
return if elem.empty?
|
36
|
+
|
37
|
+
with_space ? " :raw-html:`#{elem}`" : ":raw-html:`#{elem}`"
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_empty_value(value)
|
41
|
+
return '' if value.empty?
|
42
|
+
|
43
|
+
' ' + (value.is_a?(Array) ? value.join(', ') : value)
|
44
|
+
end
|
45
|
+
|
46
|
+
def createMultiLanguageElement(r, name)
|
47
|
+
lang_elems = r.data.keys.select { |k| k.start_with?("#{name}_") && !r.data[k].empty? }.sort
|
48
|
+
if lang_elems.empty?
|
49
|
+
return r.data[name].empty? ? '' : r.data[name]
|
50
|
+
end
|
51
|
+
|
52
|
+
str = (r.data[name].empty? ? '-' : r.data[name])
|
53
|
+
lang_elems.each do |l|
|
54
|
+
str << "<br><br><b>#{l.split('_').map(&:capitalize).join(' ')}: </b>"
|
55
|
+
str << r.data[l]
|
56
|
+
end
|
57
|
+
str
|
58
|
+
end
|
59
|
+
|
60
|
+
def requirement(f, r)
|
61
|
+
r.data.each { |k, v| r.data[k] = v.strip.escape_html }
|
62
|
+
|
63
|
+
if r.data['type'].start_with?('heading')
|
64
|
+
(@lastHeadingLevel + 1...r.depth).each do |l|
|
65
|
+
str = '<Skipped Heading Level>'
|
66
|
+
f.puts ''
|
67
|
+
f.puts str
|
68
|
+
f.puts level2char(l) * str.length
|
69
|
+
end
|
70
|
+
f.puts ''
|
71
|
+
str = ':raw-html:`' + r.data['text'] + '`'
|
72
|
+
f.puts str
|
73
|
+
f.puts level2char(r.depth) * str.length
|
74
|
+
@lastHeadingLevel = r.depth
|
75
|
+
return
|
76
|
+
end
|
77
|
+
|
78
|
+
r.data['tester'].gsub!('<br>', ' ')
|
79
|
+
r.data['developer'].gsub!('<br>', ' ')
|
80
|
+
text = createMultiLanguageElement(r, 'text')
|
81
|
+
comment = createMultiLanguageElement(r, 'comment')
|
82
|
+
refs = r.data['refs'].cleanUniqArray.select do |ref|
|
83
|
+
!@loader.requirements.has_key?(ref) || !@loader.requirements[ref].type.start_with?('heading')
|
84
|
+
end
|
85
|
+
tags = r.data['tags'].cleanUniqString
|
86
|
+
sources = r.data['sources'].cleanUniqString
|
87
|
+
|
88
|
+
f.puts ''
|
89
|
+
f.puts ".. #{r.data['type']}:: #{r.id}"
|
90
|
+
f.puts " :category: #{r.category}"
|
91
|
+
f.puts " :status: #{r.data['status']}"
|
92
|
+
f.puts " :review_status: #{r.data['review_status']}"
|
93
|
+
f.puts " :asil: #{r.data['asil']}"
|
94
|
+
f.puts " :cal: #{r.data['cal']}"
|
95
|
+
f.puts " :tags:#{handle_empty_value(tags)}"
|
96
|
+
f.puts " :comment:#{html(comment)}"
|
97
|
+
f.puts " :miscellaneous:#{html(r.data['miscellaneous'])}"
|
98
|
+
f.puts " :refs:#{handle_empty_value(refs)}"
|
99
|
+
@loader.custom_attributes.each_key do |custom_attribute|
|
100
|
+
f.puts " :#{custom_attribute}:#{handle_empty_value(r.data[custom_attribute])}"
|
101
|
+
end
|
102
|
+
if r.data['type'] == 'requirement'
|
103
|
+
vc = createMultiLanguageElement(r, 'verification_criteria')
|
104
|
+
|
105
|
+
f.puts " :sources:#{handle_empty_value(sources)}"
|
106
|
+
f.puts " :feature:#{html(r.data['feature'])}"
|
107
|
+
f.puts " :change_request:#{html(r.data['change_request'])}"
|
108
|
+
f.puts " :developer:#{handle_empty_value(r.data['developer'])}"
|
109
|
+
f.puts " :tester:#{handle_empty_value(r.data['tester'])}"
|
110
|
+
f.puts " :verification_methods:#{handle_empty_value(r.data['verification_methods'])}"
|
111
|
+
f.puts " :verification_criteria:#{html(vc)}"
|
112
|
+
end
|
113
|
+
|
114
|
+
f.puts "\n #{html(text)}" unless text.empty?
|
115
|
+
end
|
116
|
+
|
117
|
+
def footer(f)
|
118
|
+
files = @loader.module_data[@moduleName][:files].values.flatten
|
119
|
+
return if files.empty?
|
120
|
+
|
121
|
+
f.puts ''
|
122
|
+
f.puts '.. enclosed::'
|
123
|
+
f.puts ''
|
124
|
+
files.each do |file|
|
125
|
+
f.puts " #{file}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
def index(f, category, origin, modules)
|
130
|
+
caption = category.capitalize + ' (' + origin + ')'
|
131
|
+
f.puts caption
|
132
|
+
f.puts '=' * caption.length
|
133
|
+
f.puts ''
|
134
|
+
f.puts '.. toctree::'
|
135
|
+
f.puts ' :maxdepth: 1'
|
136
|
+
f.puts ''
|
137
|
+
modules.sort.each do |m|
|
138
|
+
f.puts " #{m.sanitize}/Requirements"
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
data/lib/dim/ext/psych.rb
CHANGED
@@ -1,63 +1,63 @@
|
|
1
|
-
require_relative '../exit_helper'
|
2
|
-
|
3
|
-
module Dim
|
4
|
-
module Refinements
|
5
|
-
refine Psych::Nodes::Document do
|
6
|
-
def line_numbers
|
7
|
-
hash = {}
|
8
|
-
children[0].children.each do |node|
|
9
|
-
if node.is_a?(Psych::Nodes::Scalar)
|
10
|
-
hash[node.value] = node.start_line + 1
|
11
|
-
end
|
12
|
-
end
|
13
|
-
hash
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
module Psych
|
20
|
-
module Visitors
|
21
|
-
class ToRuby
|
22
|
-
alias revive_hash_org revive_hash
|
23
|
-
|
24
|
-
def patched_revive_hash(hash, o)
|
25
|
-
test_hash = {}
|
26
|
-
o.children.each_slice(2) do |k, _v|
|
27
|
-
key = accept(k)
|
28
|
-
if test_hash.has_key?(key)
|
29
|
-
line = "line #{k.start_line + 1}: "
|
30
|
-
Dim::ExitHelper.exit(code: 1, msg: "#{line}found \"#{key}\" twice which must be unique.")
|
31
|
-
end
|
32
|
-
test_hash[key] = k
|
33
|
-
end
|
34
|
-
revive_hash_org hash, o
|
35
|
-
end
|
36
|
-
|
37
|
-
def self.add_patch
|
38
|
-
alias revive_hash patched_revive_hash
|
39
|
-
end
|
40
|
-
|
41
|
-
def self.revert_patch
|
42
|
-
alias revive_hash revive_hash_org
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
module Nodes
|
48
|
-
class Scalar
|
49
|
-
alias initialize_org initialize
|
50
|
-
def quoted_initialize(value, anchor = nil, tag = nil, plain = true, _quoted = false, style = ANY)
|
51
|
-
initialize_org(value, anchor, tag, plain, true, style)
|
52
|
-
end
|
53
|
-
|
54
|
-
def self.add_patch
|
55
|
-
alias initialize quoted_initialize
|
56
|
-
end
|
57
|
-
|
58
|
-
def self.revert_patch
|
59
|
-
alias initialize initialize_org
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
1
|
+
require_relative '../exit_helper'
|
2
|
+
|
3
|
+
module Dim
|
4
|
+
module Refinements
|
5
|
+
refine Psych::Nodes::Document do
|
6
|
+
def line_numbers
|
7
|
+
hash = {}
|
8
|
+
children[0].children.each do |node|
|
9
|
+
if node.is_a?(Psych::Nodes::Scalar)
|
10
|
+
hash[node.value] = node.start_line + 1
|
11
|
+
end
|
12
|
+
end
|
13
|
+
hash
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
module Psych
|
20
|
+
module Visitors
|
21
|
+
class ToRuby
|
22
|
+
alias revive_hash_org revive_hash
|
23
|
+
|
24
|
+
def patched_revive_hash(hash, o)
|
25
|
+
test_hash = {}
|
26
|
+
o.children.each_slice(2) do |k, _v|
|
27
|
+
key = accept(k)
|
28
|
+
if test_hash.has_key?(key)
|
29
|
+
line = "line #{k.start_line + 1}: "
|
30
|
+
Dim::ExitHelper.exit(code: 1, msg: "#{line}found \"#{key}\" twice which must be unique.")
|
31
|
+
end
|
32
|
+
test_hash[key] = k
|
33
|
+
end
|
34
|
+
revive_hash_org hash, o
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.add_patch
|
38
|
+
alias revive_hash patched_revive_hash
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.revert_patch
|
42
|
+
alias revive_hash revive_hash_org
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
module Nodes
|
48
|
+
class Scalar
|
49
|
+
alias initialize_org initialize
|
50
|
+
def quoted_initialize(value, anchor = nil, tag = nil, plain = true, _quoted = false, style = ANY)
|
51
|
+
initialize_org(value, anchor, tag, plain, true, style)
|
52
|
+
end
|
53
|
+
|
54
|
+
def self.add_patch
|
55
|
+
alias initialize quoted_initialize
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.revert_patch
|
59
|
+
alias initialize initialize_org
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/lib/dim/ext/string.rb
CHANGED
@@ -1,85 +1,85 @@
|
|
1
|
-
class String
|
2
|
-
def cleanString
|
3
|
-
cleanArray.join(', ')
|
4
|
-
end
|
5
|
-
|
6
|
-
def cleanUniqString
|
7
|
-
cleanUniqArray.join(', ')
|
8
|
-
end
|
9
|
-
|
10
|
-
def cleanUniqArray
|
11
|
-
cleanArray.uniq
|
12
|
-
end
|
13
|
-
|
14
|
-
def cleanArray
|
15
|
-
cleanSplit.select { |s| !s.empty? }
|
16
|
-
end
|
17
|
-
|
18
|
-
def cleanSplit
|
19
|
-
split(/(?<!\\),/).map(&:strip)
|
20
|
-
end
|
21
|
-
|
22
|
-
def addEnum(e)
|
23
|
-
replace((cleanArray << e).uniq.join(', '))
|
24
|
-
end
|
25
|
-
|
26
|
-
def removeEnum(e)
|
27
|
-
arr = cleanArray
|
28
|
-
arr.delete(e)
|
29
|
-
replace(arr.join(', '))
|
30
|
-
end
|
31
|
-
|
32
|
-
def escapeHtmlOutside
|
33
|
-
gsub(/&(?!(amp|lt|gt|quot|apos|emsp);)/, '&')
|
34
|
-
.gsub('<', '<')
|
35
|
-
.gsub('>', '>')
|
36
|
-
.gsub('"', '"')
|
37
|
-
.gsub("'", ''')
|
38
|
-
.gsub("\t", ' ')
|
39
|
-
.gsub("\n", '<br>')
|
40
|
-
.gsub('`', '`')
|
41
|
-
.gsub(/(?<= ) /, ' ')
|
42
|
-
end
|
43
|
-
|
44
|
-
def escape_html_inside
|
45
|
-
gsub('`', '`')
|
46
|
-
.gsub("\t", ' ')
|
47
|
-
.gsub("\n", ' ')
|
48
|
-
end
|
49
|
-
|
50
|
-
def get_next_escape_token(pos)
|
51
|
-
ind = index(%r{<\s*(\/?)\s*html\s*>}, pos)
|
52
|
-
return [:none, length - pos, -1] if ind.nil?
|
53
|
-
|
54
|
-
type = Regexp.last_match(1).empty? ? :start : :end
|
55
|
-
[type, ind - pos, ind + Regexp.last_match(0).length]
|
56
|
-
end
|
57
|
-
|
58
|
-
def escape_html
|
59
|
-
str = ''
|
60
|
-
search_pos = 0
|
61
|
-
nested = 0
|
62
|
-
while true
|
63
|
-
next_token, token_pos, after_token_pos = get_next_escape_token(search_pos)
|
64
|
-
if nested == 0
|
65
|
-
str << self[search_pos, token_pos].escapeHtmlOutside
|
66
|
-
nested = 1 if next_token == :start
|
67
|
-
else
|
68
|
-
str << self[search_pos, token_pos].escape_html_inside
|
69
|
-
nested += (next_token == :start ? +1 : -1)
|
70
|
-
end
|
71
|
-
break if next_token == :none
|
72
|
-
|
73
|
-
search_pos = after_token_pos
|
74
|
-
end
|
75
|
-
str.strip
|
76
|
-
end
|
77
|
-
|
78
|
-
def sanitize
|
79
|
-
gsub(/[^a-zA-Z0-9.\-_]/, '_')
|
80
|
-
end
|
81
|
-
|
82
|
-
def universal_newline
|
83
|
-
encode(encoding, universal_newline: true)
|
84
|
-
end
|
85
|
-
end
|
1
|
+
class String
|
2
|
+
def cleanString
|
3
|
+
cleanArray.join(', ')
|
4
|
+
end
|
5
|
+
|
6
|
+
def cleanUniqString
|
7
|
+
cleanUniqArray.join(', ')
|
8
|
+
end
|
9
|
+
|
10
|
+
def cleanUniqArray
|
11
|
+
cleanArray.uniq
|
12
|
+
end
|
13
|
+
|
14
|
+
def cleanArray
|
15
|
+
cleanSplit.select { |s| !s.empty? }
|
16
|
+
end
|
17
|
+
|
18
|
+
def cleanSplit
|
19
|
+
split(/(?<!\\),/).map(&:strip)
|
20
|
+
end
|
21
|
+
|
22
|
+
def addEnum(e)
|
23
|
+
replace((cleanArray << e).uniq.join(', '))
|
24
|
+
end
|
25
|
+
|
26
|
+
def removeEnum(e)
|
27
|
+
arr = cleanArray
|
28
|
+
arr.delete(e)
|
29
|
+
replace(arr.join(', '))
|
30
|
+
end
|
31
|
+
|
32
|
+
def escapeHtmlOutside
|
33
|
+
gsub(/&(?!(amp|lt|gt|quot|apos|emsp);)/, '&')
|
34
|
+
.gsub('<', '<')
|
35
|
+
.gsub('>', '>')
|
36
|
+
.gsub('"', '"')
|
37
|
+
.gsub("'", ''')
|
38
|
+
.gsub("\t", ' ')
|
39
|
+
.gsub("\n", '<br>')
|
40
|
+
.gsub('`', '`')
|
41
|
+
.gsub(/(?<= ) /, ' ')
|
42
|
+
end
|
43
|
+
|
44
|
+
def escape_html_inside
|
45
|
+
gsub('`', '`')
|
46
|
+
.gsub("\t", ' ')
|
47
|
+
.gsub("\n", ' ')
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_next_escape_token(pos)
|
51
|
+
ind = index(%r{<\s*(\/?)\s*html\s*>}, pos)
|
52
|
+
return [:none, length - pos, -1] if ind.nil?
|
53
|
+
|
54
|
+
type = Regexp.last_match(1).empty? ? :start : :end
|
55
|
+
[type, ind - pos, ind + Regexp.last_match(0).length]
|
56
|
+
end
|
57
|
+
|
58
|
+
def escape_html
|
59
|
+
str = ''
|
60
|
+
search_pos = 0
|
61
|
+
nested = 0
|
62
|
+
while true
|
63
|
+
next_token, token_pos, after_token_pos = get_next_escape_token(search_pos)
|
64
|
+
if nested == 0
|
65
|
+
str << self[search_pos, token_pos].escapeHtmlOutside
|
66
|
+
nested = 1 if next_token == :start
|
67
|
+
else
|
68
|
+
str << self[search_pos, token_pos].escape_html_inside
|
69
|
+
nested += (next_token == :start ? +1 : -1)
|
70
|
+
end
|
71
|
+
break if next_token == :none
|
72
|
+
|
73
|
+
search_pos = after_token_pos
|
74
|
+
end
|
75
|
+
str.strip
|
76
|
+
end
|
77
|
+
|
78
|
+
def sanitize
|
79
|
+
gsub(/[^a-zA-Z0-9.\-_]/, '_')
|
80
|
+
end
|
81
|
+
|
82
|
+
def universal_newline
|
83
|
+
encode(encoding, universal_newline: true)
|
84
|
+
end
|
85
|
+
end
|
data/lib/dim/globals.rb
CHANGED
@@ -1,12 +1,12 @@
|
|
1
|
-
OPTIONS ||= {}
|
2
|
-
SUBCOMMANDS ||= {}
|
3
|
-
EXPORTER ||= {}
|
4
|
-
CATEGORY_ORDER = {
|
5
|
-
'input' => 1,
|
6
|
-
'system' => 2,
|
7
|
-
'software' => 3,
|
8
|
-
'architecture' => 4,
|
9
|
-
'module' => 5,
|
10
|
-
}.freeze
|
11
|
-
ALLOWED_CATEGORIES = CATEGORY_ORDER.keys.each_with_object({}) { |k, obj| obj[k.to_sym] = k }.freeze
|
12
|
-
SRS_NAME_REGEX = /[^a-zA-Z0-9-]+/.freeze
|
1
|
+
OPTIONS ||= {}
|
2
|
+
SUBCOMMANDS ||= {}
|
3
|
+
EXPORTER ||= {}
|
4
|
+
CATEGORY_ORDER = {
|
5
|
+
'input' => 1,
|
6
|
+
'system' => 2,
|
7
|
+
'software' => 3,
|
8
|
+
'architecture' => 4,
|
9
|
+
'module' => 5,
|
10
|
+
}.freeze
|
11
|
+
ALLOWED_CATEGORIES = CATEGORY_ORDER.keys.each_with_object({}) { |k, obj| obj[k.to_sym] = k }.freeze
|
12
|
+
SRS_NAME_REGEX = /[^a-zA-Z0-9-]+/.freeze
|