hylite 1.0.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: '029f1390d68bcdad670b11ba3c3bd1c7688745dd'
4
+ data.tar.gz: 5e1a2079b48cc1fbe2b501c36f155611647402a1
5
+ SHA512:
6
+ metadata.gz: 525bf92d906fc94f8eb4891162c1cf7d21aaea4d75b9ec8b04e73309674131d43d98c1f1382c505579e7fd8aa42acdb4f1b4d99d18b48955311e96172a6159c0
7
+ data.tar.gz: 21175e7b41dff749412da917726f9045a3651a308188b2f3cfe44a82e4197bd4811ad8d439f21a5bf689d406a407f5f0e2fb8cf6b62bf7c1861f4d9f524b38a6
data/.gitignore ADDED
@@ -0,0 +1,5 @@
1
+ # don't commit the lock deps on gems, it should work for any versions that satisfy the Gemfile
2
+ Gemfile.lock
3
+
4
+ # don't commit the .gem file, it's big, binary, and can be generated
5
+ *.gem
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
data/Readme.md ADDED
@@ -0,0 +1,71 @@
1
+ Hylite
2
+ ======
3
+
4
+ Syntax Highlighting for scripters.
5
+
6
+ It has a simple binary-interface and Ruby interface that tries to find a
7
+ syntax highlighting tool on your machine and then highlight your code using that tool.
8
+
9
+ The intent:
10
+
11
+ 1. Allow a script to find and use an existing syntax highlighter without needing
12
+ to add one as a dependency.
13
+ 2. All syntax highlighting that I've seen have stupidly difficult interfaces
14
+ (often buggy, difficult to discover, the obvious use case requires non-obvious
15
+ configuration which is difficult to discover and has mediocre defaults),
16
+ the intent here is to improve discoverability, have it do the obvious thing
17
+ by default, and choose reasonable defaults so that you rarely have to configure it.
18
+ 3. If you find ways that it doesn't do this, let me know. Eg I didn't test the
19
+ themes on a light background to make sure they look good there. That might make
20
+ the defaults only work well on dark backgrounds.
21
+
22
+ If you're not scripting, you'll want to use one of the libraries this tool wraps:
23
+
24
+ * [Rouge](http://rouge.jneen.net)
25
+ * [Coderay](http://coderay.rubychan.de)
26
+ * [Pygments](http://pygments.org)
27
+
28
+
29
+ Todo
30
+ ----
31
+
32
+ * Allow user to pass a filename as that's a pretty obvious way to use it,
33
+ and that's probably a nicer interface for non-Ruby projects.
34
+ * Possibly allow it to guess the default (eg Rouge will do this)
35
+
36
+
37
+ Interface
38
+ ---------
39
+
40
+ ```sh
41
+ # Simplest interface
42
+ $ cat my_code.rb | hylite
43
+
44
+ # Highlight other languages
45
+ $ cat my_code.c | hylite --lang c
46
+ ```
47
+
48
+
49
+ Development
50
+ -----------
51
+
52
+ Assuming a working Ruby development environment (try [chruby](https://github.com/postmodern/chruby) if you don't have one).
53
+
54
+ ```sh
55
+ # Install Bundler for dependency management, if you don't already have it
56
+ $ gem install bundler
57
+
58
+ # Tell bundler to install the dev dependencies
59
+ $ bundle install
60
+
61
+ # Run the tests
62
+ $ mrspec
63
+ ```
64
+
65
+
66
+ License
67
+ -------
68
+
69
+ [WTFPL](http://www.wtfpl.net/about/), Just do what the fuck you want to.
70
+
71
+ NO WARRANTY.
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ # this is here to improve discoverability
3
+ $stderr.puts "Use the `hylite` binary (`#{$PROGRAM_NAME}` exists for discoverability)"
4
+ load File.join(__dir__, 'hylite')
data/bin/hylite ADDED
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift File.expand_path('../lib', __dir__)
4
+ require 'hylite/cli'
5
+
6
+ cli = Hylite::CLI.new($stdin, ARGV)
7
+ if cli.success?
8
+ $stdout.puts cli.result
9
+ else
10
+ $stderr.puts cli.errors
11
+ end
12
+ exit cli.success?
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+ # this is here to improve discoverability
3
+ $stderr.puts "Use the `hylite` binary (`#{$PROGRAM_NAME}` exists for discoverability)"
4
+ load File.join(__dir__, 'hylite')
data/hylite.gemspec ADDED
@@ -0,0 +1,23 @@
1
+ $:.push File.expand_path("lib", __dir__)
2
+ require "hylite/version"
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "hylite"
6
+ s.version = Hylite::VERSION
7
+ s.authors = ["Josh Cheek"]
8
+ s.email = ["josh.cheek@gmail.com"]
9
+ s.homepage = "https://github.com/JoshCheek/hylite"
10
+ s.summary = %q{Syntax Highlighting for scripters}
11
+ s.description = %q{Provides a simple binary interface and Ruby interface to highlight your code using whatever tools you already have on your machine.}
12
+ s.license = "WTFPL"
13
+
14
+ s.files = `git ls-files`.split("\n") - Dir['mascots/*']
15
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
16
+ s.executables = ['hylite', 'syntax_hilight', 'hilight_syntax']
17
+ s.require_paths = ['lib']
18
+
19
+ s.add_development_dependency "rspec", "~> 3.0"
20
+ s.add_development_dependency "rouge", "~> 2.0"
21
+ s.add_development_dependency "coderay", "~> 1.0"
22
+ s.add_development_dependency "ultraviolet", "~> 1.0"
23
+ end
data/lib/hylite.rb ADDED
@@ -0,0 +1,34 @@
1
+ require 'hylite/choose_hyliter'
2
+
3
+ class Hylite
4
+ def self.call(*args)
5
+ new(*args).call
6
+ end
7
+
8
+ attr_reader :lang
9
+
10
+ def initialize(to_highlight, options={})
11
+ self.to_highlight = to_highlight
12
+ options.each do |key, value|
13
+ if key =~ /^l/
14
+ self.lang = value
15
+ end
16
+ end
17
+ self.lang ||= 'ruby'
18
+ end
19
+
20
+ def call
21
+ code = to_highlight
22
+ code = code.read if code.respond_to? :read
23
+ hyliter(code, lang).call
24
+ end
25
+
26
+ private
27
+
28
+ attr_accessor :to_highlight
29
+ attr_writer :lang
30
+
31
+ def hyliter(code, lang)
32
+ ChooseHyliter.call(code, lang)
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ require 'open3'
2
+ require 'hylite/hyliters'
3
+
4
+ class Hylite
5
+ module ChooseHyliter
6
+ extend self
7
+
8
+ def call(code, lang)
9
+ case
10
+ when rouge_available? then Rouge.new(code, lang)
11
+ when pygments_available? then Pygments.new(code, lang)
12
+ when coderay_available? then CodeRay.new(code, lang)
13
+ end
14
+ end
15
+
16
+ def rouge_available?
17
+ require 'rouge'
18
+ true
19
+ rescue LoadError
20
+ false
21
+ end
22
+
23
+ def pygments_available?
24
+ ENV['PATH'].split(File::PATH_SEPARATOR).any? do |dir|
25
+ File.exist? File.join(dir, 'pygmentize')
26
+ end
27
+ end
28
+
29
+ def coderay_available?
30
+ require 'rouge'
31
+ true
32
+ rescue LoadError
33
+ false
34
+ end
35
+ end
36
+ end
data/lib/hylite/cli.rb ADDED
@@ -0,0 +1,64 @@
1
+ require 'hylite'
2
+
3
+ class Hylite
4
+ class CLI
5
+ def initialize(stdin, argv)
6
+ self.stdin = stdin
7
+ self.argv = argv
8
+ end
9
+
10
+ def errors
11
+ config.errors
12
+ end
13
+
14
+ def result
15
+ ensure_evaluated
16
+ @result
17
+ end
18
+
19
+ def success?
20
+ ensure_evaluated
21
+ errors.none?
22
+ end
23
+
24
+ def errors
25
+ config.fetch :errors
26
+ end
27
+
28
+ def config
29
+ @config ||= parse(argv)
30
+ end
31
+
32
+ private
33
+
34
+ attr_accessor :stdin, :argv
35
+
36
+ def ensure_evaluated
37
+ return if @evaluated
38
+ @evaluated = true
39
+ @success = true
40
+ @result = Hylite.call(stdin, config)
41
+ end
42
+
43
+ def parse(args)
44
+ config = {errors: [], help: false, lang: nil}
45
+ args = args.dup
46
+ while args.any?
47
+ arg = args.shift
48
+ case arg
49
+ when '-h', '--help'
50
+ config[:help] = true
51
+ when '-l', /^--l.*/
52
+ if lang = args.shift
53
+ config[:lang] = lang
54
+ else
55
+ config[:errors] << "Expected a language after #{arg.inspect}"
56
+ end
57
+ else
58
+ config[:errors] << "Unknown argument #{arg.inspect}"
59
+ end
60
+ end
61
+ config
62
+ end
63
+ end
64
+ end
@@ -0,0 +1,56 @@
1
+ require 'open3'
2
+
3
+ class Hylite
4
+ class Hyliter
5
+ attr_reader :code, :lang
6
+ def initialize(code, lang)
7
+ @code, @lang = code, lang
8
+ end
9
+ def type
10
+ raise NotImplementedError, 'Subclass should define'
11
+ end
12
+ end
13
+
14
+ class Rouge < Hyliter
15
+ def type
16
+ :rouge
17
+ end
18
+ def call
19
+ # From Fish, you can see all styles with:
20
+ # for style in (rougify help style | tail -1 | tr -d ' ' | tr , \n); echo \n===== $style =====; rougify highlight -t $style -l ruby bin/hylite ; end
21
+ theme = ::Rouge::Theme.find 'monokai'
22
+ formatter = ::Rouge::Formatters::Terminal256.new theme
23
+ lexer = ::Rouge::Lexer.find @lang
24
+ tokens = lexer.lex @code
25
+ formatter.format(tokens)
26
+ end
27
+ end
28
+
29
+ class Pygments < Hyliter
30
+ def type
31
+ :pygments
32
+ end
33
+ def call
34
+ # From Fish, you can see all styles with:
35
+ # for style in (pygmentize -L styles | sed -n '/\*/s/[*: ]//gp'); echo \n===== $style =====; pygmentize -f terminal256 -O style=$style -l ruby < lib/hylite.rb ; end
36
+ out, err, status = Open3.capture3(
37
+ 'pygmentize',
38
+ '-f', 'terminal256',
39
+ '-O', 'style=monokai',
40
+ '-l', lang,
41
+ stdin_data: code
42
+ )
43
+ return out if status.success? && err.empty?
44
+ raise "Uhhh, what led to this, I want to test it but don't know what can cause it / how to mimic it (and therefore what it should do)"
45
+ end
46
+ end
47
+
48
+ class CodeRay < Hyliter
49
+ def type
50
+ :coderay
51
+ end
52
+ def call
53
+ ::CodeRay.encode(code, lang, :terminal)
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,3 @@
1
+ class Hylite
2
+ VERSION = '1.0.0'
3
+ end
data/notes ADDED
@@ -0,0 +1,121 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ # Rouge
4
+ # * cat lib/hylite.rb | time rougify highlight -l ruby
5
+ # * slower (0.24s, sometimes 2x that)
6
+ # * 121 languages (coderay has 31, rouge 121)
7
+ # * Has 15 themes
8
+
9
+ # require 'rouge'
10
+ #
11
+ # # See all styles (from fish)
12
+ # # for style in (rougify help style | tail -1 | tr -d ' ' | tr , \n); echo \n===== $style =====; rougify highlight -t $style -l ruby bin/rougify ; end
13
+ # Rouge::Theme.registry.keys
14
+ #
15
+ # # Using the lib
16
+ # formatter = Rouge::Formatters::Terminal256.new theme: 'colorful'
17
+ # lexer = Rouge::Lexers::Ruby.new
18
+ # tokens = lexer.lex raw_code
19
+ # formatter.format(tokens)
20
+ #
21
+ # # Number of languages
22
+ # Rouge::Lexer.all.length # => 113
23
+ #
24
+ # # Inferring the language (supports a mimetype, too, but not useful for this)
25
+ # Rouge::Lexer.guesses(filename: 'file.rb') # => [Rouge::Lexers::Ruby]
26
+ # Rouge::Lexer.guesses(filename: 'file.py') # => [Rouge::Lexers::Python]
27
+ # Rouge::Lexer.guesses(source: "#!/usr/bin/env ruby\n1+1") # => [Rouge::Lexers::Ruby]
28
+ # Rouge::Lexer.guesses(source: "#!/usr/bin/env python\n1+1") # => [Rouge::Lexers::Python]
29
+ # Rouge::Lexer.guesses(source: "1+1") # => []
30
+ #
31
+ # Rouge.constants
32
+
33
+ # CodeRay
34
+ # * cat lib/hylite.rb | time coderay -ruby
35
+ # * 3-4x faster (0.07s)
36
+ # * 31 languages
37
+ # * Has the nicest default theme
38
+ # * Has only theme
39
+
40
+ # require 'coderay'
41
+ #
42
+ # # Using the lib
43
+ # CodeRay.encode '1+1', :ruby, :terminal # => "\e[1;34m1\e[0m+\e[1;34m1\e[0m"
44
+ #
45
+ # # Number of languages
46
+ # CodeRay::Scanners.list.length # => 27
47
+ #
48
+ # # Inferring language from filename (true means it should try checking the shebang)
49
+ # CodeRay::FileType.fetch 'somefile.zomg', :default_type, true # => :default_type
50
+ # CodeRay::FileType.fetch 'somefile.rb', :default_type, true # => :ruby
51
+
52
+ # Pygmentize
53
+ # * $ cat lib/hylite.rb | time pygmentize -l ruby
54
+ # * $ cat lib/hylite.rb | time ruby -e 'system "pygmentize -l ruby"'
55
+ # * slow (0.18s, occasionallly 0.30s, but 0.24 when shelling out from Ruby)
56
+ # * 402 languages (pygmentize -L lexers | ag '^\*' | wc -l)
57
+ # * 26 themes (pygmentize -L styles | ag '^\*' | wc -l)
58
+ # $ pygmentize -L styles
59
+ # $ pygmentize -L formatters
60
+
61
+ # Vim
62
+ # * http://superuser.com/questions/554047/export-vim-syntax-highlighting-to-output-to-shell
63
+ # * http://www.vim.org/scripts/script.php?script_id=4325
64
+ # * http://unix.stackexchange.com/questions/90990/less-command-and-syntax-highlighting
65
+
66
+
67
+ # ---------------------------------------------------------
68
+ # How to control which libraries it can see:
69
+
70
+ require 'rubygems'
71
+ require 'open3'
72
+
73
+ coderay = Gem::Specification.find_by_name('coderay')
74
+ coderay_paths = coderay.full_require_paths.join(":")
75
+
76
+ rouge = Gem::Specification.find_by_name('rouge')
77
+ rouge_paths = rouge.full_require_paths.join(":")
78
+
79
+ [ ['CodeRay', ['-I', coderay_paths]],
80
+ ['Rouge', ['-I', rouge_paths]],
81
+ ['Pygments', []],
82
+ ].each do |name, args|
83
+ puts "==== #{name} ====="
84
+ system 'ruby', '--disable-gem', *args, '-e', <<-'RUBY'
85
+ which = 'pygments'
86
+
87
+ begin
88
+ require 'rouge'
89
+ which = 'rouge'
90
+ rescue LoadError
91
+ puts "\e[31mCould not load rouge\e[0m"
92
+ end
93
+
94
+ begin
95
+ require 'coderay'
96
+ which = 'coderay'
97
+ rescue LoadError
98
+ puts "\e[31mCould not load coderay\e[0m"
99
+ end
100
+
101
+ case which
102
+ when 'coderay'
103
+ puts "\e[32mUsing CodeRay\e[0m", CodeRay.encode("1+1", :ruby, :terminal)
104
+ when 'rouge'
105
+ theme = Rouge::Theme.find 'tulip'
106
+ formatter = Rouge::Formatters::Terminal256.new theme
107
+ lexer = Rouge::Lexers::Ruby.new
108
+ tokens = lexer.lex "1+1"
109
+ puts "\e[32mUsing Rouge\e[0m", formatter.format(tokens)
110
+ when 'pygments'
111
+ require 'open3'
112
+ out, err, status = Open3.capture3 'pygmentize', '-f', 'terminal256', '-O', 'style=fruity', '-l', 'ruby', stdin_data: '1+1'
113
+ raise [status, err.inspect] unless status.success?
114
+ raise err unless err.empty?
115
+ puts "\e[32mUsing pygments\e[0m", out
116
+ else
117
+ raise "What!? #{which.inspect}"
118
+ end
119
+ RUBY
120
+ end
121
+
@@ -0,0 +1,108 @@
1
+ require 'open3'
2
+ require 'hylite/cli'
3
+ require 'spec_helpers'
4
+
5
+ bin_dir = File.expand_path '../bin', __dir__
6
+ ENV["PATH"] = bin_dir + ":" + ENV["PATH"]
7
+
8
+ RSpec.describe 'binaries' do
9
+ describe 'hylite' do
10
+ it 'reads code from stdin, highlights it, prints it to stdout' do
11
+ stdout, stderr, status = Open3.capture3 'hylite', stdin_data: '1+1'
12
+ expect(stderr).to be_empty
13
+ expect(status).to be_success
14
+ tokens = highlighted_tokens(stdout)
15
+ expect(tokens).to include :color
16
+ expect(tokens.select { |t| t.kind_of? String }).to eq %W[1 + 1 \n]
17
+ end
18
+
19
+ context 'when it has an error' do
20
+ it 'prints the error to stderr and exits with a failure code' do
21
+ stdout, stderr, status = Open3.capture3 'hylite -notanarg', stdin_data: '1+1'
22
+ expect(stderr).to include "notanarg"
23
+ expect(status).to_not be_success
24
+ expect(stdout).to be_empty
25
+ end
26
+ end
27
+
28
+ describe 'arguments' do
29
+ def unset
30
+ @unset ||= Object.new
31
+ end
32
+
33
+ def assert_parses(argv, key, value=unset)
34
+ cli = Hylite::CLI.new("", argv)
35
+ expect(cli.config[key]).to eq value unless value == unset
36
+ cli.config[key]
37
+ end
38
+
39
+ it 'prints a help screen for -h / --help and exits successfully' do
40
+ assert_parses [], :help, false
41
+ assert_parses [], :errors, []
42
+
43
+ assert_parses ['-h'], :help, true
44
+ assert_parses ['-h'], :errors, []
45
+
46
+ assert_parses ['--help'], :help, true
47
+ assert_parses ['--help'], :errors, []
48
+ end
49
+
50
+ describe 'language' do
51
+ it 'is not set by default (uses the lib\'s default of Ruby)' do
52
+ assert_parses [], :lang, nil
53
+ end
54
+
55
+ it 'can be specified with -l, --language, or --lmisspelled' do
56
+ assert_parses ['-l', 'java'], :lang, 'java'
57
+ assert_parses ['-l', 'cpp'], :lang, 'cpp'
58
+ assert_parses ['--lang', 'cpp'], :lang, 'cpp'
59
+ assert_parses ['--lmisspelled', 'cpp'], :lang, 'cpp'
60
+ end
61
+
62
+ it 'sets an error if it sees a language arg without a language' do
63
+ assert_parses ["-l", "cpp"], :errors, []
64
+ errors = assert_parses ["-l"], :errors
65
+ expect(errors.length).to eq 1
66
+ expect(errors[0]).to match /language/
67
+ end
68
+
69
+ it 'highlights according to the provided language' do
70
+ ruby = Hylite.call '1', lang: 'ruby'
71
+ css = Hylite.call '1', lang: 'css'
72
+ expect(ruby).to_not eq css
73
+ end
74
+ end
75
+
76
+ it 'sets an error if it sees an arg it doesn\'t understand' do
77
+ errors = assert_parses ["asdf"], :errors
78
+ expect(errors.length).to eq 1
79
+ expect(errors[0]).to match /asdf/
80
+ end
81
+
82
+ it 'passes the config, parsed from the arguments, down to the lib' do
83
+ ruby_stdout, ruby_stderr, ruby_status = Open3.capture3 'hylite -l ruby', stdin_data: '1+1'
84
+ css_stdout, css_stderr, css_status = Open3.capture3 'hylite -l css', stdin_data: '1+1'
85
+
86
+ expect(ruby_stderr).to eq css_stderr
87
+ expect(ruby_status).to eq css_status
88
+ expect(ruby_stdout).to_not eq css_stdout
89
+ end
90
+ end
91
+ end
92
+
93
+ describe 'binaries that exist for discoverability' do
94
+ specify 'syntax_hilight: warns you to use hylite, but still works' do
95
+ stdout, stderr, status = Open3.capture3 'syntax_hilight', stdin_data: '1+1'
96
+ expect(stderr).to match /hylite/
97
+ expect(status).to be_success
98
+ expect(stdout).to_not be_empty
99
+ end
100
+
101
+ specify 'highlight_syntax: warns you to use hylite, but still works' do
102
+ stdout, stderr, status = Open3.capture3 'highlight_syntax', stdin_data: '1+1'
103
+ expect(stderr).to match /hylite/
104
+ expect(status).to be_success
105
+ expect(stdout).to_not be_empty
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,48 @@
1
+ require 'hylite/choose_hyliter'
2
+ require 'rouge'
3
+
4
+ RSpec.describe 'ChooseHyliter' do
5
+ # ugh, might be better to inject require than this nonsense >.<
6
+
7
+ it 'uses rouge if available' do
8
+ hyliter = Hylite::ChooseHyliter.call("#a { color: #FFF; }" , "css")
9
+ expect(hyliter.type).to eq :rouge
10
+
11
+ hylited = hyliter.call
12
+ expect(hyliter.call).to include 'FFF'
13
+ expect(hyliter.call).to include "\e[" # an escape sequence in there somewhere
14
+ end
15
+
16
+
17
+ it 'does not use rouge if it does not support the requested language'
18
+
19
+
20
+ it 'uses pygments if rouge, isn\'t available' do
21
+ allow(Hylite::ChooseHyliter).to receive(:require).with('rouge').and_raise(LoadError)
22
+
23
+ hyliter = Hylite::ChooseHyliter.call("#a { color: #FFF; }" , "css")
24
+ expect(hyliter.type).to eq :pygments
25
+
26
+ hylited = hyliter.call
27
+ expect(hyliter.call).to include 'FFF'
28
+ expect(hyliter.call).to include "\e[" # an escape sequence in there somewhere
29
+ end
30
+
31
+
32
+ it 'uses coderay if rouge and pygmentize aren\'t available' do
33
+ require 'coderay'
34
+ allow(File).to receive(:exist?).and_return(false)
35
+ allow(Hylite::ChooseHyliter).to receive(:require).with('rouge').and_raise(LoadError)
36
+ allow(Hylite::ChooseHyliter).to receive(:require).with('coderay').and_return(true)
37
+
38
+ hyliter = Hylite::ChooseHyliter.call("#a { color: #FFF; }" , "css")
39
+ expect(hyliter.type).to eq :coderay
40
+
41
+ hylited = hyliter.call
42
+ expect(hyliter.call).to include 'FFF'
43
+ expect(hyliter.call).to include "\e[" # an escape sequence in there somewhere
44
+ end
45
+
46
+
47
+ it 'tells you how to install these other libs if none of them are available'
48
+ end
@@ -0,0 +1,40 @@
1
+ require 'stringio'
2
+ require 'spec_helpers'
3
+ require 'hylite'
4
+
5
+ RSpec.describe 'hylite' do
6
+ it 'invokes whichever hyliter "ChooseHyliter" returns', t:true do
7
+ expect(Hylite::ChooseHyliter).to receive(:call).with("to hylite", 'some lang').and_return(-> { "hylited" })
8
+ hylited = Hylite.new("to hylite", l: "some lang").call
9
+ expect(hylited).to eq "hylited"
10
+ end
11
+
12
+ it 'defaults the language to Ruby' do
13
+ expect(Hylite.new('' ).lang).to eq 'ruby'
14
+ expect(Hylite.new('', l: nil).lang).to eq 'ruby'
15
+ expect(Hylite.new('', l: 'css').lang).to_not eq 'ruby'
16
+ end
17
+
18
+
19
+ it 'can be overridden with the :l, :language, or :lmisspelled keywords' do
20
+ h = Hylite.new '', l: 'forth'
21
+ expect(h.lang).to eq 'forth'
22
+
23
+ h = Hylite.new '', lang: 'forth'
24
+ expect(h.lang).to eq 'forth'
25
+
26
+ h = Hylite.new '', lmisspelled: 'forth'
27
+ expect(h.lang).to eq 'forth'
28
+ end
29
+
30
+ it 'accepts strings or streams to highlight' do
31
+ # Based on CodeRay's formatting of "1":
32
+ # ["\e[1;34m", "1", "\e[0m"]
33
+ expected_tokens = [:color, "1", :color]
34
+ string = '1'.freeze
35
+ stream = StringIO.new string
36
+
37
+ expect(highlighted_tokens Hylite.call string).to eq expected_tokens
38
+ expect(highlighted_tokens Hylite.call stream).to eq expected_tokens
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ module SpecHelpers
2
+ def highlighted_tokens(ansi_string)
3
+ ansi_string.scan(/\e.*?m|[^\e]+/).map do |token|
4
+ token[0] == "\e" ? :color : token
5
+ end
6
+ end
7
+ end
8
+
9
+ RSpec.configure do |config|
10
+ config.include SpecHelpers
11
+ config.fail_fast = true
12
+ config.color = true
13
+ end
metadata ADDED
@@ -0,0 +1,125 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: hylite
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Josh Cheek
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-12-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rspec
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
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.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '2.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: coderay
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: ultraviolet
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.0'
69
+ description: Provides a simple binary interface and Ruby interface to highlight your
70
+ code using whatever tools you already have on your machine.
71
+ email:
72
+ - josh.cheek@gmail.com
73
+ executables:
74
+ - hylite
75
+ - syntax_hilight
76
+ - hilight_syntax
77
+ extensions: []
78
+ extra_rdoc_files: []
79
+ files:
80
+ - ".gitignore"
81
+ - Gemfile
82
+ - Readme.md
83
+ - bin/hilight_syntax
84
+ - bin/hylite
85
+ - bin/syntax_hilight
86
+ - hylite.gemspec
87
+ - lib/hylite.rb
88
+ - lib/hylite/choose_hyliter.rb
89
+ - lib/hylite/cli.rb
90
+ - lib/hylite/hyliters.rb
91
+ - lib/hylite/version.rb
92
+ - notes
93
+ - spec/binary_spec.rb
94
+ - spec/choose_hyliter.rb
95
+ - spec/hylite_spec.rb
96
+ - spec/spec_helpers.rb
97
+ homepage: https://github.com/JoshCheek/hylite
98
+ licenses:
99
+ - WTFPL
100
+ metadata: {}
101
+ post_install_message:
102
+ rdoc_options: []
103
+ require_paths:
104
+ - lib
105
+ required_ruby_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ required_rubygems_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ requirements: []
116
+ rubyforge_project:
117
+ rubygems_version: 2.6.8
118
+ signing_key:
119
+ specification_version: 4
120
+ summary: Syntax Highlighting for scripters
121
+ test_files:
122
+ - spec/binary_spec.rb
123
+ - spec/choose_hyliter.rb
124
+ - spec/hylite_spec.rb
125
+ - spec/spec_helpers.rb