jtag 0.1.22 → 0.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/jtag +271 -377
- data/lib/jtag/config_files/config.yml +2 -3
- data/lib/jtag/jekylltag.rb +225 -272
- data/lib/jtag/string.rb +42 -238
- data/lib/jtag/version.rb +1 -1
- data/lib/jtag.rb +13 -19
- metadata +19 -20
- data/.irbrc +0 -6
- data/CHANGELOG.md +0 -15
- data/Gemfile +0 -3
- data/Jekyll/plugins/autotag_gen.rb +0 -58
- data/Jekyll/source/_layouts/tags_json.html +0 -11
- data/README.md +0 -159
- data/Rakefile +0 -113
- data/jtag.completion.bash +0 -9
- data/jtag.gemspec +0 -25
- data/lib/jtag/array.rb +0 -48
- data/lib/jtag/errors.rb +0 -31
- data/lib/jtag/hash.rb +0 -103
- data/lib/jtag/stupid_json.rb +0 -319
- data/lib/jtag/util.rb +0 -237
- data/mise.toml +0 -2
data/lib/jtag/jekylltag.rb
CHANGED
|
@@ -1,314 +1,267 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
attr_reader :tags_loc
|
|
7
|
-
attr_reader :post_extension
|
|
8
|
-
attr_accessor :tags_key
|
|
3
|
+
class JTag
|
|
4
|
+
attr_reader :default_post_location
|
|
5
|
+
attr_accessor :tags_key
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
@
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
files = options[:files].map(&:File.expand_path)
|
|
18
|
-
elsif config[:tags_location].to_s =~ /^(auto|posts?)$/
|
|
19
|
-
@tags_loc = :auto
|
|
20
|
-
files = Dir.glob(File.expand_path(File.join(config[:default_post_location], "**", "*.#{config[:post_extension]}")))
|
|
21
|
-
else
|
|
22
|
-
@tags_loc = config[:tags_location]
|
|
23
|
-
if File.exist?(File.expand_path(@tags_loc))
|
|
24
|
-
@tags_loc = File.expand_path(@tags_loc)
|
|
25
|
-
else
|
|
26
|
-
@tags_loc.sub!(/^https?:\/\//, "")
|
|
27
|
-
end
|
|
28
|
-
files = nil
|
|
29
|
-
end
|
|
30
|
-
rescue StandardError => e
|
|
31
|
-
raise InvalidTagsFile, "Error reading configured tags locatio (#{e})"
|
|
32
|
-
end
|
|
33
|
-
|
|
34
|
-
@min_matches = config[:min_matches] || 2
|
|
35
|
-
@post_extension = config[:post_extension] || "md"
|
|
36
|
-
@post_extension.sub!(/^\./, "")
|
|
37
|
-
@tags_key = config[:tags_key] || "tags"
|
|
38
|
-
|
|
39
|
-
if config.has_key? :default_post_location
|
|
40
|
-
@default_post_location = File.expand_path(config[:default_post_location]) || false
|
|
41
|
-
else
|
|
42
|
-
str = ["#{color("yellow")}No #{color("boldyellow")}default_post_location#{color("yellow")} set.",
|
|
43
|
-
"If you commonly work on the same posts you can add the path and extension",
|
|
44
|
-
"to these key in ~/.jtag/config.yml. Then, if you don't specify files",
|
|
45
|
-
"to act on in a command, it will fall back to those. Nice!#{color("default")}"].join("\n")
|
|
46
|
-
@util.console_log str, err: true, level: :error
|
|
47
|
-
@default_post_location = false
|
|
48
|
-
end
|
|
49
|
-
@blacklistfile = File.join(@support, "blacklist.txt")
|
|
50
|
-
@blacklist = IO.read(@blacklistfile).split("\n") || []
|
|
51
|
-
@skipwords = IO.read(File.join(support_dir, "stopwords.txt")).split("\n") || []
|
|
52
|
-
remote_tags = tags(files: files)
|
|
53
|
-
@tags = {}
|
|
54
|
-
remote_tags.each do |tag|
|
|
55
|
-
@tags[tag.root_words] = tag if tag
|
|
56
|
-
end
|
|
57
|
-
synonyms.each { |k, v|
|
|
58
|
-
@tags[k.to_s.downcase] = v unless @blacklist.include?(k.to_s.downcase)
|
|
59
|
-
}
|
|
7
|
+
def initialize(support_dir, config)
|
|
8
|
+
@support = support_dir
|
|
9
|
+
begin
|
|
10
|
+
@tags_loc = config['tags_location']
|
|
11
|
+
@tags_loc.sub!(/^https?:\/\//,'')
|
|
12
|
+
rescue
|
|
13
|
+
raise "No tags location in configuration."
|
|
60
14
|
end
|
|
15
|
+
@min_matches = config['min_matches'] || 2
|
|
16
|
+
@tags_key = config['tags_key'] || 'tags'
|
|
61
17
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
18
|
+
if config.has_key?('default_post_location') && config['default_post_location']
|
|
19
|
+
@default_post_location = File.expand_path(config['default_post_location'])
|
|
20
|
+
else
|
|
21
|
+
console_log "#{color('yellow')}No #{color('boldyellow')}default_post_location#{color('yellow')} set.", :err => true
|
|
22
|
+
console_log "If you commonly work on the same posts you can add the path and *.ext", :err => true
|
|
23
|
+
console_log "to this key in ~/.config/jtag/config.yml. Then, if you don't specify files", :err => true
|
|
24
|
+
console_log "to act on in a command, it will fall back to those. Nice!#{color('default')}", :err => true
|
|
25
|
+
@default_post_location = false
|
|
26
|
+
end
|
|
27
|
+
@blacklistfile = File.join(@support,'blacklist.txt')
|
|
28
|
+
@blacklist = IO.read(@blacklistfile).split("\n") || []
|
|
29
|
+
@skipwords = IO.read(File.join(support_dir,'stopwords.txt')).split("\n") || []
|
|
30
|
+
remote_tags = get_tags
|
|
31
|
+
@tags = {}
|
|
32
|
+
remote_tags.each {|tag| @tags[Text::PorterStemming.stem(tag).downcase] = tag if tag}
|
|
33
|
+
synonyms.each { |k,v|
|
|
34
|
+
@tags[k.to_s.downcase] = v unless @blacklist.include?(k.to_s.downcase)
|
|
35
|
+
}
|
|
36
|
+
end
|
|
70
37
|
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
38
|
+
def get_tags(options={})
|
|
39
|
+
blacklisted = options[:blacklisted] || false
|
|
40
|
+
counts = options[:counts] || false
|
|
41
|
+
host, path = @tags_loc.match(/^([^\/]+)(\/.*)/)[1,2]
|
|
42
|
+
tags = ""
|
|
43
|
+
# http = Net::HTTP.new(host, 80)
|
|
44
|
+
# http.start do |http|
|
|
45
|
+
# request = Net::HTTP::Get.new(path)
|
|
46
|
+
# response = http.request(request)
|
|
47
|
+
# response.value
|
|
48
|
+
# tags = response.body
|
|
49
|
+
# end
|
|
50
|
+
tags = `curl -sSL "#{@tags_loc}"`
|
|
51
|
+
tags = JSON.parse(tags)
|
|
52
|
+
if tags && tags.key?("tags")
|
|
53
|
+
if counts
|
|
54
|
+
return tags["tags_count"]
|
|
88
55
|
else
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
# http = Net::HTTP.new(host, 80)
|
|
92
|
-
# http.start do |http|
|
|
93
|
-
# request = Net::HTTP::Get.new(path)
|
|
94
|
-
# response = http.request(request)
|
|
95
|
-
# response.value
|
|
96
|
-
# tags = response.body
|
|
97
|
-
# end
|
|
98
|
-
tags = `curl -sSL "#{@tags_loc}"`
|
|
99
|
-
tags = YAML.load(tags) rescue JSON.parse(tags)
|
|
100
|
-
raise InvalidTagsFile, "Tags file is not in YAML or JSON format." unless tags
|
|
101
|
-
end
|
|
102
|
-
if tags && tags.key?("tags")
|
|
103
|
-
if counts && tags.key?("tags_count")
|
|
104
|
-
tags["tags_count"].delete_if { |tag| !tag || @blacklist.include?(tag["name"].downcase) } unless blacklisted
|
|
105
|
-
return tags["tags_count"]
|
|
106
|
-
else
|
|
107
|
-
tags["tags"].delete_if { |tag| !tag || @blacklist.include?(tag.downcase) } unless blacklisted
|
|
108
|
-
return tags["tags"]
|
|
56
|
+
unless blacklisted
|
|
57
|
+
tags["tags"].delete_if {|tag| !tag || @blacklist.include?(tag.downcase) }
|
|
109
58
|
end
|
|
110
|
-
|
|
111
|
-
return false
|
|
59
|
+
return tags["tags"]
|
|
112
60
|
end
|
|
61
|
+
else
|
|
62
|
+
return false
|
|
113
63
|
end
|
|
64
|
+
end
|
|
114
65
|
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
}
|
|
66
|
+
def synonyms
|
|
67
|
+
if File.exist?(File.join(@support,"synonyms.yml"))
|
|
68
|
+
syn = YAML::load(File.open(File.join(@support,"synonyms.yml")))
|
|
69
|
+
compiled = {}
|
|
70
|
+
syn.each {|k,v|
|
|
71
|
+
v.each {|synonym|
|
|
72
|
+
compiled[synonym] = k
|
|
123
73
|
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
compiled
|
|
74
|
+
}
|
|
75
|
+
else
|
|
76
|
+
return false
|
|
128
77
|
end
|
|
78
|
+
compiled
|
|
79
|
+
end
|
|
129
80
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
end
|
|
141
|
-
[yaml, after]
|
|
81
|
+
def split_post(file, piped = false)
|
|
82
|
+
input = piped ? file : IO.read(file)
|
|
83
|
+
# Check to see if it's a full post with YAML headers
|
|
84
|
+
post_parts = input.split(/^[\.\-]{3}\s*$/)
|
|
85
|
+
if post_parts.length >= 3
|
|
86
|
+
after = post_parts[2].strip
|
|
87
|
+
yaml = YAML::load(input)
|
|
88
|
+
else
|
|
89
|
+
after = input
|
|
90
|
+
yaml = YAML::load("--- title: #{File.basename(file)}")
|
|
142
91
|
end
|
|
92
|
+
[yaml, after]
|
|
93
|
+
end
|
|
143
94
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
end
|
|
95
|
+
def post_tags(file, piped=false)
|
|
96
|
+
begin
|
|
97
|
+
input = piped ? file.strip : IO.read(file)
|
|
98
|
+
yaml = YAML::load(input)
|
|
99
|
+
return yaml[@tags_key] || []
|
|
100
|
+
rescue
|
|
101
|
+
return []
|
|
152
102
|
end
|
|
103
|
+
end
|
|
153
104
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
105
|
+
def merge_tags(tags, merged, file)
|
|
106
|
+
current_tags = post_tags(file)
|
|
107
|
+
post_has_tag = false
|
|
108
|
+
tags.each {|tag|
|
|
109
|
+
if current_tags.include?(tag)
|
|
110
|
+
current_tags.delete(tag)
|
|
111
|
+
post_has_tag = true
|
|
112
|
+
end
|
|
113
|
+
}
|
|
114
|
+
return false unless post_has_tag
|
|
115
|
+
current_tags.push(merged)
|
|
116
|
+
current_tags.uniq!
|
|
117
|
+
current_tags.sort
|
|
118
|
+
end
|
|
168
119
|
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
title = ""
|
|
179
|
-
end
|
|
180
|
-
else
|
|
120
|
+
|
|
121
|
+
def suggest(input)
|
|
122
|
+
parts = input.split(/^[\.\-]{3}\s*$/)
|
|
123
|
+
if parts.length >= 2
|
|
124
|
+
begin
|
|
125
|
+
yaml = YAML::load(parts[1])
|
|
126
|
+
current_tags = yaml[@tags_key] || []
|
|
127
|
+
title = yaml["title"] || ""
|
|
128
|
+
rescue
|
|
181
129
|
current_tags = []
|
|
182
130
|
title = ""
|
|
183
131
|
end
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
populate_auto_tags
|
|
188
|
-
|
|
189
|
-
@auto_tags.concat(current_tags).uniq
|
|
132
|
+
else
|
|
133
|
+
current_tags = []
|
|
134
|
+
title = ""
|
|
190
135
|
end
|
|
136
|
+
@content = (title + parts[2..-1].join(" ")).strip_all.strip_urls rescue input.strip_all.strip_urls
|
|
137
|
+
@words = split_words
|
|
138
|
+
@auto_tags = []
|
|
139
|
+
populate_auto_tags
|
|
191
140
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
word =~ /^[^a-z]+$/ || word.length < 4
|
|
195
|
-
}.map! { |word|
|
|
196
|
-
Text::PorterStemming.stem(word).downcase
|
|
197
|
-
}.delete_if { |word|
|
|
198
|
-
@skipwords.include?(word) && !@tags.keys.include?(word)
|
|
199
|
-
}
|
|
200
|
-
end
|
|
141
|
+
@auto_tags.concat(current_tags).uniq
|
|
142
|
+
end
|
|
201
143
|
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
144
|
+
def split_words
|
|
145
|
+
@content.gsub(/([\/\\]|\s+)/,' ').gsub(/[^A-Za-z0-9\s-]/,'').split(" ").delete_if { |word|
|
|
146
|
+
word =~ /^[^a-z]+$/ || word.length < 4
|
|
147
|
+
}.map! { |word|
|
|
148
|
+
Text::PorterStemming.stem(word).downcase
|
|
149
|
+
}.delete_if{ |word|
|
|
150
|
+
@skipwords.include?(word) && !@tags.keys.include?(word)
|
|
151
|
+
}
|
|
152
|
+
end
|
|
206
153
|
|
|
207
|
-
|
|
154
|
+
def populate_auto_tags
|
|
155
|
+
freqs = Hash.new(0)
|
|
156
|
+
@words.each { |word| freqs[word] += 1 }
|
|
157
|
+
freqs.delete_if {|k,v| v < @min_matches }
|
|
208
158
|
|
|
209
|
-
|
|
210
|
-
index = @tags.keys.index(word[0])
|
|
211
|
-
unless index.nil? || @blacklist.include?(@tags.keys[index])
|
|
212
|
-
@auto_tags.push(@tags[@tags.keys[index]]) unless index.nil?
|
|
213
|
-
end
|
|
214
|
-
}
|
|
159
|
+
return [] if freqs.empty?
|
|
215
160
|
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
end
|
|
161
|
+
freqs.sort_by {|k,v| [v * -1, k] }.each {|word|
|
|
162
|
+
index = @tags.keys.index(word[0])
|
|
163
|
+
unless index.nil? || @blacklist.include?(@tags.keys[index])
|
|
164
|
+
@auto_tags.push(@tags[@tags.keys[index]]) unless index.nil?
|
|
165
|
+
end
|
|
166
|
+
}
|
|
223
167
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
File.open(@blacklistfile, "w+") do |f|
|
|
229
|
-
f.puts @blacklist.uniq.sort.join("\n")
|
|
168
|
+
@tags.each{|k,v|
|
|
169
|
+
occurrences = @content.scan(/\b#{k}\b/i)
|
|
170
|
+
if occurrences.count >= @min_matches
|
|
171
|
+
@auto_tags.push(v)
|
|
230
172
|
end
|
|
173
|
+
}
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
def blacklist(tags)
|
|
177
|
+
tags.each {|word|
|
|
178
|
+
@blacklist.push(word.downcase)
|
|
179
|
+
}
|
|
180
|
+
File.open(@blacklistfile,'w+') do |f|
|
|
181
|
+
f.puts @blacklist.uniq.sort.join("\n")
|
|
231
182
|
end
|
|
183
|
+
end
|
|
232
184
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
end
|
|
185
|
+
def unblacklist(tags)
|
|
186
|
+
tags.each {|word|
|
|
187
|
+
@blacklist.delete_if { |x| x == word }
|
|
188
|
+
}
|
|
189
|
+
File.open(@blacklistfile,'w+') do |f|
|
|
190
|
+
f.puts @blacklist.uniq.sort.join("\n")
|
|
240
191
|
end
|
|
192
|
+
end
|
|
241
193
|
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
else
|
|
252
|
-
File.open(file, "w+") do |f|
|
|
253
|
-
f.puts yaml.to_yaml
|
|
254
|
-
f.puts "---"
|
|
255
|
-
f.puts after
|
|
256
|
-
end
|
|
257
|
-
end
|
|
194
|
+
def update_file_tags(file, tags, piped = false)
|
|
195
|
+
begin
|
|
196
|
+
if File.exist?(file) || piped
|
|
197
|
+
yaml, after = split_post(file, piped)
|
|
198
|
+
yaml[@tags_key] = tags
|
|
199
|
+
if piped
|
|
200
|
+
puts yaml.to_yaml
|
|
201
|
+
puts "---"
|
|
202
|
+
puts after
|
|
258
203
|
else
|
|
259
|
-
|
|
204
|
+
File.open(file,'w+') do |f|
|
|
205
|
+
f.puts yaml.to_yaml
|
|
206
|
+
f.puts "---"
|
|
207
|
+
f.puts after
|
|
208
|
+
end
|
|
260
209
|
end
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
raise e
|
|
264
|
-
return false
|
|
210
|
+
else
|
|
211
|
+
raise "File does not exist: #{file}"
|
|
265
212
|
end
|
|
213
|
+
return true
|
|
214
|
+
rescue Exception => e
|
|
215
|
+
raise e
|
|
216
|
+
return false
|
|
266
217
|
end
|
|
218
|
+
end
|
|
267
219
|
|
|
268
|
-
|
|
220
|
+
private
|
|
221
|
+
|
|
222
|
+
def color(name)
|
|
269
223
|
color = {}
|
|
270
|
-
color[
|
|
271
|
-
color[
|
|
272
|
-
color[
|
|
273
|
-
color[
|
|
274
|
-
color[
|
|
275
|
-
color[
|
|
276
|
-
color[
|
|
277
|
-
color[
|
|
278
|
-
color[
|
|
279
|
-
color[
|
|
280
|
-
color[
|
|
281
|
-
color[
|
|
282
|
-
color[
|
|
283
|
-
color[
|
|
284
|
-
color[
|
|
285
|
-
color[
|
|
286
|
-
color[
|
|
287
|
-
color[
|
|
288
|
-
color[
|
|
289
|
-
color[
|
|
290
|
-
color[
|
|
291
|
-
color[
|
|
292
|
-
color[
|
|
293
|
-
color[
|
|
294
|
-
color[
|
|
295
|
-
color[
|
|
296
|
-
color[
|
|
297
|
-
color[
|
|
298
|
-
color[
|
|
299
|
-
color[
|
|
300
|
-
color[
|
|
301
|
-
color[
|
|
302
|
-
color[
|
|
303
|
-
color[
|
|
304
|
-
color[
|
|
305
|
-
color[
|
|
306
|
-
color[
|
|
307
|
-
color[
|
|
308
|
-
color[
|
|
309
|
-
color[
|
|
310
|
-
color[
|
|
311
|
-
color[name
|
|
312
|
-
end
|
|
224
|
+
color['black'] = "\033[0;30m"
|
|
225
|
+
color['red'] = "\033[0;31m"
|
|
226
|
+
color['green'] = "\033[0;32m"
|
|
227
|
+
color['yellow'] = "\033[0;33m"
|
|
228
|
+
color['blue'] = "\033[0;34m"
|
|
229
|
+
color['magenta'] = "\033[0;35m"
|
|
230
|
+
color['cyan'] = "\033[0;36m"
|
|
231
|
+
color['white'] = "\033[0;37m"
|
|
232
|
+
color['bgblack'] = "\033[0;40m"
|
|
233
|
+
color['bgred'] = "\033[0;41m"
|
|
234
|
+
color['bggreen'] = "\033[0;42m"
|
|
235
|
+
color['bgyellow'] = "\033[0;43m"
|
|
236
|
+
color['bgblue'] = "\033[0;44m"
|
|
237
|
+
color['bgmagenta'] = "\033[0;45m"
|
|
238
|
+
color['bgcyan'] = "\033[0;46m"
|
|
239
|
+
color['bgwhite'] = "\033[0;47m"
|
|
240
|
+
color['boldblack'] = "\033[1;30m"
|
|
241
|
+
color['boldred'] = "\033[1;31m"
|
|
242
|
+
color['boldgreen'] = "\033[1;32m"
|
|
243
|
+
color['boldyellow'] = "\033[1;33m"
|
|
244
|
+
color['boldblue'] = "\033[1;34m"
|
|
245
|
+
color['boldmagenta'] = "\033[1;35m"
|
|
246
|
+
color['boldcyan'] = "\033[1;36m"
|
|
247
|
+
color['boldwhite'] = "\033[1;37m"
|
|
248
|
+
color['boldbgblack'] = "\033[1;40m"
|
|
249
|
+
color['boldbgred'] = "\033[1;41m"
|
|
250
|
+
color['boldbggreen'] = "\033[1;42m"
|
|
251
|
+
color['boldbgyellow'] = "\033[1;43m"
|
|
252
|
+
color['boldbgblue'] = "\033[1;44m"
|
|
253
|
+
color['boldbgmagenta'] = "\033[1;45m"
|
|
254
|
+
color['boldbgcyan'] = "\033[1;46m"
|
|
255
|
+
color['boldbgwhite'] = "\033[1;47m"
|
|
256
|
+
color['default'] = "\033[0;39m"
|
|
257
|
+
color['warning'] = color['yellow']
|
|
258
|
+
color['warningb'] = color['boldyellow']
|
|
259
|
+
color['success'] = color['green']
|
|
260
|
+
color['successb'] = color['boldgreen']
|
|
261
|
+
color['neutral'] = color['white']
|
|
262
|
+
color['neutralb'] = color['boldwhite']
|
|
263
|
+
color['info'] = color['cyan']
|
|
264
|
+
color['infob'] = color['boldcyan']
|
|
265
|
+
color[name]
|
|
313
266
|
end
|
|
314
267
|
end
|