texas 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (88) hide show
  1. data/bin/texas +6 -0
  2. data/contents/_chapter.md.erb +13 -0
  3. data/contents/_preambel.tex.erb +50 -0
  4. data/contents/master.tex.erb +7 -0
  5. data/lib/texas/build/base.rb +120 -0
  6. data/lib/texas/build/dry.rb +11 -0
  7. data/lib/texas/build/final.rb +7 -0
  8. data/lib/texas/build/task/add_default_templates_to_build_path.rb +22 -0
  9. data/lib/texas/build/task/base.rb +15 -0
  10. data/lib/texas/build/task/copy_contents_to_build_path.rb +31 -0
  11. data/lib/texas/build/task/open_pdf.rb +36 -0
  12. data/lib/texas/build/task/publish_pdf.rb +46 -0
  13. data/lib/texas/build/task/rewrite_marked_templates.rb +13 -0
  14. data/lib/texas/build/task/run_before_scripts.rb +22 -0
  15. data/lib/texas/build/task/run_master_template.rb +23 -0
  16. data/lib/texas/build.rb +15 -0
  17. data/lib/texas/core_ext/string.rb +132 -0
  18. data/lib/texas/core_ext.rb +1 -0
  19. data/lib/texas/option_parser.rb +175 -0
  20. data/lib/texas/runner.rb +71 -0
  21. data/lib/texas/task/base.rb +23 -0
  22. data/lib/texas/task/new.rb +18 -0
  23. data/lib/texas/task/watch.rb +39 -0
  24. data/lib/texas/task.rb +11 -0
  25. data/lib/texas/template/helper/base.rb +82 -0
  26. data/lib/texas/template/helper/info.rb +29 -0
  27. data/lib/texas/template/helper/md.rb +35 -0
  28. data/lib/texas/template/helper/tex.rb +83 -0
  29. data/lib/texas/template/helper.rb +6 -0
  30. data/lib/texas/template/runner/base.rb +70 -0
  31. data/lib/texas/template/runner/md.rb +16 -0
  32. data/lib/texas/template/runner/tex.rb +11 -0
  33. data/lib/texas/template/runner.rb +13 -0
  34. data/lib/texas/template.rb +62 -0
  35. data/lib/texas/version.rb +9 -0
  36. data/lib/texas.rb +18 -0
  37. data/spec/fixtures/basic/contents/contents.tex.erb +8 -0
  38. data/spec/fixtures/basic/figures/test_figure.png +0 -0
  39. data/spec/fixtures/basic-md/contents/contents.md.erb +1 -0
  40. data/spec/fixtures/basic-md/contents/contents.tex.should +3 -0
  41. data/spec/fixtures/basic-md/contents/input_template.md.erb +3 -0
  42. data/spec/fixtures/basic-tex/contents/contents.tex.erb +1 -0
  43. data/spec/fixtures/basic-tex/contents/contents.tex.should +1 -0
  44. data/spec/fixtures/basic-tex/contents/input_template.tex.erb +3 -0
  45. data/spec/fixtures/basic-tex/contents/input_template.tex.should +3 -0
  46. data/spec/fixtures/basic-tex/contents/unused_template.tex.erb +1 -0
  47. data/spec/fixtures/different-master-tex/contents/contents.tex.erb +1 -0
  48. data/spec/fixtures/different-master-tex/contents/contents.tex.should +1 -0
  49. data/spec/fixtures/different-master-tex/contents/master.tex.erb +9 -0
  50. data/spec/fixtures/different-master-tex/contents/master.tex.should +59 -0
  51. data/spec/fixtures/helper-methods-tex/contents/contents.tex.erb +7 -0
  52. data/spec/fixtures/helper-methods-tex/contents/contents.tex.should +7 -0
  53. data/spec/fixtures/helper-methods-tex/contents/input_template.tex.erb +5 -0
  54. data/spec/fixtures/helper-methods-tex/contents/input_template.tex.should +5 -0
  55. data/spec/fixtures/helper-methods-tex/contents/some_chapter/another_include.tex +1 -0
  56. data/spec/fixtures/helper-methods-tex/contents/some_chapter/test_include.tex.erb +7 -0
  57. data/spec/fixtures/helper-methods-tex/contents/some_chapter/test_include.tex.should +7 -0
  58. data/spec/fixtures/helper-methods-tex/contents/some_chapter.tex.erb +5 -0
  59. data/spec/fixtures/helper-methods-tex/contents/some_chapter.tex.should +5 -0
  60. data/spec/fixtures/helper-methods-tex/contents/template/helper/_some_partial.md.erb +1 -0
  61. data/spec/fixtures/helper-methods-tex/contents/template/helper/base.tex.erb +3 -0
  62. data/spec/fixtures/helper-methods-tex/contents/template/helper/base.tex.should +4 -0
  63. data/spec/fixtures/helper-methods-tex/contents/template/helper/info.md.erb +6 -0
  64. data/spec/fixtures/helper-methods-tex/contents/template/helper/info.tex.should +1 -0
  65. data/spec/fixtures/helper-methods-tex/contents/test_figure.tex.erb +1 -0
  66. data/spec/fixtures/helper-methods-tex/figures/test_figure.png +0 -0
  67. data/spec/fixtures/lib-helpers/contents/contents.tex.erb +3 -0
  68. data/spec/fixtures/lib-helpers/contents/contents.tex.should +3 -0
  69. data/spec/fixtures/lib-helpers/lib/helpers/document_helper.rb +7 -0
  70. data/spec/fixtures/lib-helpers/lib/init.rb +4 -0
  71. data/spec/fixtures/new/contents/contents.tex.erb +9 -0
  72. data/spec/fixtures/new/lib/helpers/document_helper.rb +11 -0
  73. data/spec/fixtures/new/lib/init.rb +4 -0
  74. data/spec/fixtures/prose/contents/chapter-1/01-some-scene.md +1 -0
  75. data/spec/fixtures/prose/contents/chapter-1/02-another-scene.md +1 -0
  76. data/spec/fixtures/prose/contents/chapter-1/03-and-another-scene.md +1 -0
  77. data/spec/fixtures/prose/contents/contents.md.erb +1 -0
  78. data/spec/fixtures/rerun/contents/contents.tex.erb +6 -0
  79. data/spec/fixtures/rerun/contents/contents.tex.should +4 -0
  80. data/spec/fixtures/texasrc/contents/contents.tex.erb +3 -0
  81. data/spec/fixtures/texasrc/contents/contents.tex.should +3 -0
  82. data/spec/spec_helper.rb +64 -0
  83. data/spec/texas/build_spec.rb +17 -0
  84. data/spec/texas/template/helper/info_spec.rb +41 -0
  85. data/spec/texas/template/runner_spec.rb +35 -0
  86. data/spec/texas/template_spec.rb +11 -0
  87. data/spec/texas_spec.rb +43 -0
  88. metadata +196 -0
data/bin/texas ADDED
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'bundler'
4
+ Bundler.require
5
+
6
+ Texas::Runner.new
@@ -0,0 +1,13 @@
1
+ <%= page_break %>
2
+
3
+ <% if o.title.to_s.size > 0 %>
4
+ # <%= o.title %>
5
+ <% end %>
6
+
7
+ <% templates = o.templates || [] %>
8
+
9
+ <% templates.each_with_index do |template, index| %>
10
+ <%= render template %>
11
+
12
+ <%= scene_delimiter unless index == templates.size - 1 %>
13
+ <% end %>
@@ -0,0 +1,50 @@
1
+ \documentclass[a4paper,parskip=half*,12pt]{scrartcl}
2
+
3
+ \usepackage{relsize}
4
+
5
+ \usepackage{amsmath,amstext,amssymb}
6
+
7
+ \usepackage[ngerman]{babel}
8
+ \usepackage[utf8]{inputenc}
9
+
10
+ %\usepackage[paper=a4paper,left=40mm,right=40mm,top=25mm,bottom=25mm]{geometry}
11
+
12
+ \usepackage{courier}
13
+
14
+
15
+ \usepackage[T1]{fontenc}
16
+
17
+ \usepackage[table]{xcolor}
18
+ \usepackage{color}
19
+
20
+
21
+ \usepackage{url,hyperref}
22
+ \urlstyle{same}
23
+
24
+ \usepackage{setspace}
25
+
26
+ \clubpenalty = 10000
27
+ \widowpenalty = 10000
28
+ \displaywidowpenalty = 10000
29
+
30
+ \setlength{\parindent}{1em}
31
+
32
+ \setcounter{secnumdepth}{0}
33
+ \setcounter{tocdepth}{0}
34
+
35
+ \usepackage{fancyhdr}
36
+ \pagestyle{fancy}
37
+
38
+ \fancyhead{}
39
+ \fancyfoot{}
40
+
41
+ \fancyhead[L]{<%= document.author %> -- <%= document.title %>}
42
+ \fancyhead[C]{}
43
+ \fancyhead[R]{}
44
+
45
+ \fancyfoot[L]{}
46
+ \fancyfoot[C]{}
47
+ \fancyfoot[R]{\thepage}
48
+
49
+
50
+ \onehalfspacing
@@ -0,0 +1,7 @@
1
+ <%= partial :preambel %>
2
+
3
+ \begin{document}
4
+
5
+ <%= input build.contents_template %>
6
+
7
+ \end{document}
@@ -0,0 +1,120 @@
1
+ require 'yaml'
2
+
3
+ module Texas
4
+ module Build
5
+ class Base
6
+ CONFIG_FILE = ".texasrc"
7
+ MASTER_TEMPLATE = "master.tex"
8
+
9
+ attr_reader :root, :options
10
+ attr_reader :master_file, :contents_dir, :contents_template
11
+ attr_reader :current_template, :ran_templates
12
+
13
+ def initialize(_options)
14
+ @options = _options
15
+ @root = options.work_dir
16
+ @contents_dir = options.contents_dir
17
+ @contents_template = options.contents_template
18
+ @master_file = File.join(__path__, MASTER_TEMPLATE)
19
+
20
+ verbose { "Starting #{self.class}" }
21
+ verbose { "[i] work_dir: #{options.work_dir}".dark }
22
+ verbose { "[i] contents_dir: #{@contents_dir}".dark }
23
+ verbose { "[i] contents_template: #{@contents_template}".dark }
24
+ verbose { "[i] build_path: #{@build_path}".dark }
25
+ end
26
+
27
+ def __path__
28
+ File.join(root, 'tmp', 'build')
29
+ end
30
+
31
+ def store
32
+ @store ||= OpenStruct.new
33
+ end
34
+
35
+ def current_template=(t)
36
+ @ran_templates ||= []
37
+ @ran_templates << t unless t.nil?
38
+ @current_template = t
39
+ end
40
+
41
+ def document_struct
42
+ @document_struct ||= begin
43
+ hash = config["document"] || {}
44
+ if options.merge_config
45
+ hash.merge! config[options.merge_config]
46
+ end
47
+ OpenStruct.new(hash)
48
+ end
49
+ end
50
+
51
+ def config
52
+ @config ||= begin
53
+ filename = File.join(root, CONFIG_FILE)
54
+ File.exist?(filename) ? YAML.load_file(filename) : {}
55
+ end
56
+ end
57
+
58
+ def dest_file
59
+ @dest_file ||= File.join(root, "bin", "#{Template.basename contents_template}.pdf")
60
+ end
61
+
62
+ def run_build_tasks(*tasks)
63
+ tasks.flatten.each { |t| run_build_task t }
64
+ end
65
+
66
+ def run_build_task(klass)
67
+ klass = eval("::Texas::Build::Task::#{klass}") if [Symbol, String].include?(klass.class)
68
+ klass.new(self).run
69
+ end
70
+
71
+ def run
72
+ run_build_tasks before_tasks, basic_tasks, after_tasks
73
+ end
74
+
75
+ %w(before basic after).each do |method|
76
+ class_eval <<-INSTANCE_EVAL
77
+ def #{method}_tasks
78
+ self.class.tasks(:#{method})
79
+ end
80
+ INSTANCE_EVAL
81
+ end
82
+
83
+ class << self
84
+ def run(options)
85
+ instance = self.new(options)
86
+ instance.run
87
+ instance
88
+ end
89
+
90
+ def tasks(key)
91
+ @@tasks ||= {}
92
+ initialize_tasks if @@tasks[self.to_s].nil?
93
+ @@tasks[self.to_s][key] ||= []
94
+ @@tasks[self.to_s][key]
95
+ end
96
+
97
+ def initialize_tasks
98
+ @@tasks[self.to_s] = {}
99
+ (@@tasks[self.superclass.to_s] || {}).each do |k, v|
100
+ @@tasks[self.to_s][k] = v.dup
101
+ end
102
+ end
103
+
104
+ %w(before basic after).each do |method|
105
+ class_eval <<-CLASS_EVAL
106
+ def prepend_#{method}_task(*_tasks)
107
+ tasks(:#{method}).unshift(*_tasks)
108
+ end
109
+
110
+ def append_#{method}_task(*_tasks)
111
+ tasks(:#{method}).concat(_tasks)
112
+ end
113
+ alias #{method}_task append_#{method}_task
114
+ CLASS_EVAL
115
+ end
116
+
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,11 @@
1
+ module Texas
2
+ module Build
3
+ class Dry < Base
4
+ before_task :RunBeforeScripts, :CopyContentsToBuildPath
5
+
6
+ basic_task :AddDefaultTemplatesToBuildPath, :RunMasterTemplate
7
+
8
+ after_task :RewriteMarkedTemplates
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module Texas
2
+ module Build
3
+ class Final < Dry
4
+ append_after_task :PublishPDF, :OpenPDF
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,22 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class AddDefaultTemplatesToBuildPath < Base
5
+ def build_path
6
+ build.__path__
7
+ end
8
+
9
+ def run
10
+ glob = File.join(Texas.texas_dir, Texas.contents_subdir_name, '*.*')
11
+ Dir[glob].each do |filename|
12
+ dest = File.join(build_path, File.basename(filename))
13
+ unless File.exists?(dest)
14
+ FileUtils.cp filename, build_path
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,15 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class Base
5
+ attr_reader :build
6
+
7
+ def initialize(_build = nil)
8
+ @build = _build
9
+ end
10
+ def run
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,31 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class CopyContentsToBuildPath < Base
5
+ def run
6
+ ensure_build_path_exists
7
+ copy_to_build_path
8
+ end
9
+
10
+ def build_path
11
+ build.__path__
12
+ end
13
+
14
+ def contents_dir
15
+ build.contents_dir
16
+ end
17
+
18
+ def ensure_build_path_exists
19
+ FileUtils.mkdir_p build_path
20
+ rescue
21
+ end
22
+
23
+ def copy_to_build_path
24
+ FileUtils.rm_r build_path
25
+ FileUtils.cp_r contents_dir, build_path
26
+ end
27
+
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,36 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class OpenPDF < Base
5
+ DEFAULT_OPEN_CMD = "evince"
6
+
7
+ def cmd
8
+ @cmd ||= scripts && scripts['open']
9
+ end
10
+
11
+ def scripts
12
+ build.config['script']
13
+ end
14
+
15
+ def run
16
+ return unless build.options.open_pdf
17
+ if open_pdf_cmd
18
+ system "#{open_pdf_cmd} #{build.dest_file}"
19
+ else
20
+ puts "Can't open PDF: no default command recognized. Specify in #{CONFIG_FILE}"
21
+ end
22
+ end
23
+
24
+ def open_pdf_cmd
25
+ if cmd
26
+ cmd
27
+ else
28
+ default = `which #{DEFAULT_OPEN_CMD}`.strip
29
+ default.empty? ? nil : default
30
+ end
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,46 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class PublishPDF < Base
5
+
6
+ def master_file
7
+ build.master_file
8
+ end
9
+
10
+ def build_path
11
+ build.__path__
12
+ end
13
+
14
+ def dest_file
15
+ build.dest_file
16
+ end
17
+
18
+ def run
19
+ run_pdflatex
20
+ copy_pdf_file_to_dest_dir
21
+ end
22
+
23
+ def copy_pdf_file_to_dest_dir
24
+ tmp_file = File.join(build_path, "#{File.basename(master_file, '.tex')}.pdf")
25
+ FileUtils.mkdir_p File.dirname(dest_file)
26
+ FileUtils.copy tmp_file, dest_file
27
+ verbose {
28
+ file = File.join(build_path, "master.log")
29
+ output = `grep "Output written on" #{file}`
30
+ numbers = output.scan(/\((\d+?) pages\, (\d+?) bytes\)\./).flatten
31
+ @page_count = numbers.first.to_i
32
+ "Written PDF in #{dest_file.gsub(root, '')} (#{@page_count} pages)".green
33
+ }
34
+ end
35
+
36
+ def run_pdflatex
37
+ verbose { "Running pdflatex in #{build_path} ..." }
38
+ Dir.chdir build_path
39
+ `pdflatex #{File.basename(master_file)}`
40
+ `pdflatex #{File.basename(master_file)}`
41
+ end
42
+
43
+ end
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,13 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class RewriteMarkedTemplates < Base
5
+ def run
6
+ build.ran_templates.select { |t| t.marked_for_rewrite? }.each do |t|
7
+ t.write
8
+ end
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,22 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class RunBeforeScripts < Base
5
+ def cmd
6
+ @cmd ||= scripts && scripts['before']
7
+ end
8
+
9
+ def scripts
10
+ build.config['script']
11
+ end
12
+
13
+ def run
14
+ if cmd
15
+ verbose { "\n[i] Running before script:\n\n #{cmd.cyan}\n\n" }
16
+ system cmd
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,23 @@
1
+ module Texas
2
+ module Build
3
+ module Task
4
+ class RunMasterTemplate < Base
5
+
6
+ def find_master_template(possible_templates)
7
+ regexes = Template.handlers.keys
8
+ valid_master_templates = possible_templates.select do |f|
9
+ regexes.any? { |regex| f =~ regex }
10
+ end
11
+ valid_master_templates.first
12
+ end
13
+
14
+ def run
15
+ filename = find_master_template Dir[build.master_file+'*']
16
+ master_template = Template.create(filename, build)
17
+ master_template.write
18
+ end
19
+
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,15 @@
1
+ module Texas
2
+ module Build
3
+ end
4
+ end
5
+
6
+ require_relative 'build/base'
7
+ require_relative 'build/dry'
8
+ require_relative 'build/final'
9
+
10
+ require_relative 'build/task/base'
11
+
12
+ all_rbs = Dir[ File.join( File.dirname(__FILE__), "build", "task", "*.rb" ) ]
13
+ all_rbs.each do |t|
14
+ require t
15
+ end
@@ -0,0 +1,132 @@
1
+ require 'term/ansicolor'
2
+
3
+ class String
4
+
5
+ end
6
+
7
+ module Term
8
+ # The ANSIColor module can be used for namespacing and mixed into your own
9
+ # classes.
10
+ module NoColor
11
+ # :stopdoc:
12
+ ATTRIBUTES = [
13
+ [ :clear , 0 ], # String#clear is already used to empty string in Ruby 1.9
14
+ [ :reset , 0 ], # synonym for :clear
15
+ [ :bold , 1 ],
16
+ [ :dark , 2 ],
17
+ [ :italic , 3 ], # not widely implemented
18
+ [ :underline , 4 ],
19
+ [ :underscore , 4 ], # synonym for :underline
20
+ [ :blink , 5 ],
21
+ [ :rapid_blink , 6 ], # not widely implemented
22
+ [ :negative , 7 ], # no reverse because of String#reverse
23
+ [ :concealed , 8 ],
24
+ [ :strikethrough , 9 ], # not widely implemented
25
+ [ :black , 30 ],
26
+ [ :red , 31 ],
27
+ [ :green , 32 ],
28
+ [ :yellow , 33 ],
29
+ [ :blue , 34 ],
30
+ [ :magenta , 35 ],
31
+ [ :cyan , 36 ],
32
+ [ :white , 37 ],
33
+ [ :on_black , 40 ],
34
+ [ :on_red , 41 ],
35
+ [ :on_green , 42 ],
36
+ [ :on_yellow , 43 ],
37
+ [ :on_blue , 44 ],
38
+ [ :on_magenta , 45 ],
39
+ [ :on_cyan , 46 ],
40
+ [ :on_white , 47 ],
41
+ [ :intense_black , 90 ], # High intensity, aixterm (works in OS X)
42
+ [ :intense_red , 91 ],
43
+ [ :intense_green , 92 ],
44
+ [ :intense_yellow , 93 ],
45
+ [ :intense_blue , 94 ],
46
+ [ :intense_magenta , 95 ],
47
+ [ :intense_cyan , 96 ],
48
+ [ :intense_white , 97 ],
49
+ [ :on_intense_black , 100 ], # High intensity background, aixterm (works in OS X)
50
+ [ :on_intense_red , 101 ],
51
+ [ :on_intense_green , 102 ],
52
+ [ :on_intense_yellow , 103 ],
53
+ [ :on_intense_blue , 104 ],
54
+ [ :on_intense_magenta , 105 ],
55
+ [ :on_intense_cyan , 106 ],
56
+ [ :on_intense_white , 107 ]
57
+ ]
58
+
59
+ ATTRIBUTE_NAMES = ATTRIBUTES.transpose.first
60
+ # :startdoc:
61
+
62
+ # Returns true if Term::ANSIColor supports the +feature+.
63
+ #
64
+ # The feature :clear, that is mixing the clear color attribute into String,
65
+ # is only supported on ruby implementations, that do *not* already
66
+ # implement the String#clear method. It's better to use the reset color
67
+ # attribute instead.
68
+ def support?(feature)
69
+ case feature
70
+ when :clear
71
+ !String.instance_methods(false).map(&:to_sym).include?(:clear)
72
+ end
73
+ end
74
+ # Returns true, if the coloring function of this module
75
+ # is switched on, false otherwise.
76
+ def self.coloring?
77
+ @coloring
78
+ end
79
+
80
+ # Turns the coloring on or off globally, so you can easily do
81
+ # this for example:
82
+ # Term::ANSIColor::coloring = STDOUT.isatty
83
+ def self.coloring=(val)
84
+ @coloring = val
85
+ end
86
+ self.coloring = true
87
+
88
+ ATTRIBUTES.each do |c, v|
89
+ eval <<-EOT
90
+ def #{c}(string = nil)
91
+ result = ''
92
+ if block_given?
93
+ result << yield
94
+ elsif string.respond_to?(:to_str)
95
+ result << string.to_str
96
+ elsif respond_to?(:to_str)
97
+ result << to_str
98
+ else
99
+ return result #only switch on
100
+ end
101
+ result
102
+ end
103
+ EOT
104
+ end
105
+
106
+ # Regular expression that is used to scan for ANSI-sequences while
107
+ # uncoloring strings.
108
+ COLORED_REGEXP = /\e\[(?:(?:[349]|10)[0-7]|[0-9])?m/
109
+
110
+ # Returns an uncolored version of the string, that is all
111
+ # ANSI-sequences are stripped from the string.
112
+ def uncolored(string = nil) # :yields:
113
+ if block_given?
114
+ yield.to_str.gsub(COLORED_REGEXP, '')
115
+ elsif string.respond_to?(:to_str)
116
+ string.to_str.gsub(COLORED_REGEXP, '')
117
+ elsif respond_to?(:to_str)
118
+ to_str.gsub(COLORED_REGEXP, '')
119
+ else
120
+ ''
121
+ end
122
+ end
123
+
124
+ module_function
125
+
126
+ # Returns an array of all Term::ANSIColor attributes as symbols.
127
+ def attributes
128
+ ATTRIBUTE_NAMES
129
+ end
130
+ extend self
131
+ end
132
+ end
@@ -0,0 +1 @@
1
+ require_relative 'core_ext/string'