coderay_bash 0.2.1 → 1.0

Sign up to get free protection for your applications and to get access to all the features.
data/coderay_bash.gemspec CHANGED
@@ -13,17 +13,17 @@ spec = Gem::Specification.new do |s|
13
13
  s.email = "pejuko@gmail.com"
14
14
  s.authors = ["Petr Kovar"]
15
15
  s.name = 'coderay_bash'
16
- s.version = '0.2.1'
16
+ s.version = '1.0'
17
17
  s.date = Time.now.strftime("%Y-%m-%d")
18
- s.add_dependency('coderay', '< 1.0')
18
+ s.add_dependency('coderay', '>= 1.0')
19
19
  s.require_path = 'lib'
20
20
  s.files = ["README.md", "coderay_bash.gemspec", "Rakefile"]
21
21
  s.files += Dir["lib/**/*.rb"]
22
22
  s.post_install_message = <<EOF
23
- This gem was tested with coderay 0.9.3 and won't work with coderay from svn.
23
+ This gem was tested with coderay 1.0 and won't work with coderay 0.9.
24
24
  EOF
25
25
  s.description = <<EOF
26
- Bash highlighting for coderay. This gem was tested with coderay 0.9.3 and won't work with coderay >= 1.0.
26
+ Bash highlighting for coderay. This gem was tested with coderay 1.0 and won't work with coderay < 1.0.
27
27
  EOF
28
28
  end
29
29
 
@@ -1,7 +1,8 @@
1
1
  # Scanner for Bash
2
2
  # Author: Petr Kovar <pejuko@gmail.com>
3
- module CodeRay
4
- module Scanners
3
+
4
+ module CodeRay module Scanners
5
+
5
6
  class Bash < Scanner
6
7
 
7
8
  register_for :bash
@@ -22,6 +23,14 @@ module Scanners
22
23
  local logout printf read set shopt source type typeset ulimit unalias
23
24
  )
24
25
 
26
+ PROGRAMS = %w(
27
+ awk bash bunzip2 bzcat bzip2 cat chgrp chmod chown cp cut date dd df dir dmesg du ed egrep
28
+ false fgrep findmnt fusermount gawk grep groups gunzip gzip hostname install keyctl kill less
29
+ ln loadkeys login ls lsblk lsinitcpio lsmod mbchk mkdir mkfifo mknod more mount mountpoint mv
30
+ netstat pidof ping ping6 ps pwd readlink red rm rmdir sed sh shred sleep stty su sudo sync tar
31
+ touch tput tr traceroute traceroute6 true umount uname uncompress vdir zcat
32
+ )
33
+
25
34
  VARIABLES = %w(
26
35
  CDPATH HOME IFS MAIL MAILPATH OPTARG OPTIND PATH PS1 PS2
27
36
  )
@@ -46,8 +55,9 @@ module Scanners
46
55
  add(RESERVED_WORDS, :reserved).
47
56
  add(COMMANDS, :method).
48
57
  add(BASH_COMMANDS, :method).
49
- add(VARIABLES, :pre_type).
50
- add(BASH_VARIABLES, :pre_type)
58
+ # add(PROGRAMS, :method).
59
+ add(VARIABLES, :predefined).
60
+ add(BASH_VARIABLES, :predefined)
51
61
 
52
62
  attr_reader :state, :quote
53
63
 
@@ -55,35 +65,46 @@ module Scanners
55
65
  super(*args)
56
66
  @state = :initial
57
67
  @quote = nil
68
+ @shell = false
58
69
  end
59
70
 
60
- def scan_tokens tokens, options
71
+ def scan_tokens encoder, options
61
72
 
62
73
  until eos?
63
74
  kind = match = nil
64
75
 
65
76
  if match = scan(/\n/)
66
- tokens << [match, :end_line]
77
+ encoder.text_token(match, :end_line)
67
78
  next
68
79
  end
69
80
 
70
81
  if @state == :initial
71
82
  if match = scan(/\A#!.*/)
72
83
  kind = :directive
73
- elsif match = scan(/#.*/)
84
+ elsif match = scan(/\s*#.*/)
74
85
  kind = :comment
86
+ elsif match = scan(/.#/)
87
+ kind = :ident
75
88
  elsif match = scan(/(?:\. |source ).*/)
76
89
  kind = :reserved
77
90
  elsif match = scan(/(?:\\.|,)/)
78
91
  kind = :plain
79
92
  elsif match = scan(/;/)
80
93
  kind = :delimiter
81
- elsif match = scan(/(?:"|`)/)
94
+ elsif match = scan(/"/)
82
95
  @state = :quote
83
96
  @quote = match
84
- tokens << [:open, :string] if @quote == '"'
85
- tokens << [:open, :shell] if @quote == '`'
86
- tokens << [match, :delimiter]
97
+ encoder.begin_group :string
98
+ encoder.text_token(match, :delimiter)
99
+ next
100
+ elsif match = scan(/`/)
101
+ if @shell
102
+ encoder.end_group :shell
103
+ else
104
+ encoder.begin_group :shell
105
+ end
106
+ @shell = (not @shell)
107
+ encoder.text_token(match, :delimiter)
87
108
  next
88
109
  elsif match = scan(/'[^']*'/)
89
110
  kind = :string
@@ -100,12 +121,19 @@ module Scanners
100
121
  kind = :global_variable
101
122
  elsif match = scan(/ \$\{ [^\}]+ \} /ox)
102
123
  match =~ /\$\{(.*)\}/
103
- kind = IDENT_KIND[$1]
124
+ var=$1
125
+ if var =~ /\[.*\]/
126
+ encoder.text_token("${", :instance_variable)
127
+ match_array(var, encoder)
128
+ encoder.text_token("}", :instance_variable)
129
+ next
130
+ end
131
+ kind = IDENT_KIND[var]
104
132
  kind = :instance_variable if kind == :ident
105
133
  elsif match = scan(/ \$\( [^\)]+ \) /ox)
106
134
  kind = :shell
107
135
  elsif match = scan(PRE_CONSTANTS)
108
- kind = :pre_constant
136
+ kind = :predefined_constant
109
137
  elsif match = scan(/[^\s'"]*[A-Za-z_][A-Za-z_0-9]*\+?=/)
110
138
  match =~ /(.*?)([A-Za-z_][A-Za-z_0-9]*)(\+?=)/
111
139
  str = $1
@@ -115,23 +143,23 @@ module Scanners
115
143
  if str.to_s.strip.empty?
116
144
  kind = IDENT_KIND[pre]
117
145
  kind = :instance_variable if kind == :ident
118
- tokens << [pre, kind]
119
- tokens << [op, :operator]
146
+ encoder.text_token(pre, kind)
147
+ encoder.text_token(op, :operator)
120
148
  next
121
149
  end
122
- elsif match = scan(/[A-Za-z_]+\[[A-Za-z_\d]+\]/)
150
+ elsif match = scan(/[A-Za-z_]+\[[A-Za-z_\@\*\d]+\]/)
123
151
  # array
124
- kind = IDENT_KIND(match)
125
- kind = :instance_variable if kind == :ident
152
+ match_array(match, encoder)
153
+ next
126
154
  elsif match = scan(/ \$[A-Za-z_][A-Za-z_0-9]* /ox)
127
155
  match =~ /\$(.*)/
128
156
  kind = IDENT_KIND[$1]
129
157
  kind = :instance_variable if kind == :ident
130
158
  elsif match = scan(/read \S+/)
131
159
  match =~ /read(\s+)(\S+)/
132
- tokens << ['read', :method]
133
- tokens << [$1, :space]
134
- tokens << [$2, :instance_variable]
160
+ encoder.text_token('read', :method)
161
+ encoder.text_token($1, :space)
162
+ encoder.text_token($2, :instance_variable)
135
163
  next
136
164
  elsif match = scan(/[\!\:\[\]\{\}]/)
137
165
  kind = :reserved
@@ -139,8 +167,8 @@ module Scanners
139
167
  match =~ /([^;]+);?/
140
168
  kind = IDENT_KIND[$1]
141
169
  if match[/([^;]+);$/]
142
- tokens << [$1, kind]
143
- tokens << [';', :delimiter]
170
+ encoder.text_token($1, kind)
171
+ encoder.text_token(';', :delimiter)
144
172
  next
145
173
  end
146
174
  elsif match = scan(/(?: = | - | \+ | \{ | \} | \( | \) | && | \|\| | ;; | ! )/ox)
@@ -157,23 +185,30 @@ module Scanners
157
185
  if (match = scan(/\\.?/))
158
186
  kind = :content
159
187
  elsif match = scan(/#{@quote}/)
160
- tokens << [match, :delimiter]
161
- tokens << [:close, :string] if @quote == '"'
162
- tokens << [:close, :shell] if @quote == "`"
188
+ encoder.text_token(match, :delimiter)
189
+ encoder.end_group :string
163
190
  @quote = nil
164
191
  @state = :initial
165
192
  next
166
193
  #kind = :symbol
167
194
  elsif match = scan(PRE_CONSTANTS)
168
- kind = :pre_constant
169
- elsif match = scan(/ \$\{?[A-Za-z_][A-Za-z_\d]*\}? /x)
195
+ kind = :predefined_constant
196
+ elsif match = scan(/ (?: \$\(\(.*?\)\) ) /x)
197
+ kind = :global_variable
198
+ elsif match = scan(/ \$ (?: (?: \{ [^\}]* \}) | (?: [A-Za-z_0-9]+ ) ) /x)
199
+ match =~ /(\$\{?)([^\}]*)(\}?)/
200
+ pre=$1
201
+ var=$2
202
+ post=$3
203
+ if var =~ /\[.*?\]/
204
+ encoder.text_token(pre,:instance_variable)
205
+ match_array(var, encoder)
206
+ encoder.text_token(post,:instance_variable)
207
+ next
208
+ end
170
209
  kind = IDENT_KIND[match]
171
210
  kind = :instance_variable if kind == :ident
172
- elsif (@quote == '`') and (match = scan(/\$"/))
173
- kind = :content
174
- elsif (@quote == '"') and (match = scan(/\$`/))
175
- kind = :content
176
- elsif match = scan(/[^#{@quote}\$\\]+/)
211
+ elsif match = scan(/[^#{@quote}\\]+/)
177
212
  kind = :content
178
213
  else match = scan(/.+/)
179
214
  # this shouldn't be
@@ -184,12 +219,24 @@ module Scanners
184
219
  end
185
220
 
186
221
  match ||= matched
187
- tokens << [match, kind]
222
+ encoder.text_token(match, kind)
188
223
  end
189
224
 
190
- tokens
225
+ encoder
191
226
  end
192
227
 
228
+
229
+ def match_array(match, encoder)
230
+ match =~ /([A-Za-z_]+)\[(.*?)\]/
231
+ var = $1
232
+ key = $2
233
+ kind = IDENT_KIND[var]
234
+ kind = :instance_variable if kind == :ident
235
+ encoder.text_token(var, kind)
236
+ encoder.text_token("[", :operator)
237
+ encoder.text_token(key, :key)
238
+ encoder.text_token("]", :operator)
239
+ end
193
240
 
194
241
  def handle_error(match, options)
195
242
  o = {:ignore_errors => true}.merge(options)
@@ -1,10 +1,10 @@
1
1
  # Scanner for Bash
2
2
  # Author: spam+github@codez.ch
3
- require 'coderay/scanners/rhtml'
3
+ require 'coderay/scanners/erb'
4
4
 
5
5
  module CodeRay
6
6
  module Scanners
7
- class ErbBash < RHTML
7
+ class ErbBash < ERB
8
8
  register_for :erb_bash
9
9
 
10
10
  protected
metadata CHANGED
@@ -1,12 +1,12 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coderay_bash
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
4
+ hash: 15
5
+ prerelease:
5
6
  segments:
6
- - 0
7
- - 2
8
7
  - 1
9
- version: 0.2.1
8
+ - 0
9
+ version: "1.0"
10
10
  platform: ruby
11
11
  authors:
12
12
  - Petr Kovar
@@ -14,7 +14,7 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2011-03-30 00:00:00 +02:00
17
+ date: 2011-10-04 00:00:00 +02:00
18
18
  default_executable:
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
@@ -23,8 +23,9 @@ dependencies:
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  none: false
25
25
  requirements:
26
- - - <
26
+ - - ">="
27
27
  - !ruby/object:Gem::Version
28
+ hash: 15
28
29
  segments:
29
30
  - 1
30
31
  - 0
@@ -32,7 +33,7 @@ dependencies:
32
33
  type: :runtime
33
34
  version_requirements: *id001
34
35
  description: |
35
- Bash highlighting for coderay. This gem was tested with coderay 0.9.3 and won't work with coderay >= 1.0.
36
+ Bash highlighting for coderay. This gem was tested with coderay 1.0 and won't work with coderay < 1.0.
36
37
 
37
38
  email: pejuko@gmail.com
38
39
  executables: []
@@ -45,15 +46,15 @@ files:
45
46
  - README.md
46
47
  - coderay_bash.gemspec
47
48
  - Rakefile
48
- - lib/coderay/scanners/erb_bash.rb
49
- - lib/coderay/scanners/bash.rb
50
49
  - lib/coderay_bash.rb
50
+ - lib/coderay/scanners/bash.rb
51
+ - lib/coderay/scanners/erb_bash.rb
51
52
  has_rdoc: true
52
53
  homepage: http://github.com/pejuko/coderay_bash
53
54
  licenses: []
54
55
 
55
56
  post_install_message: |
56
- This gem was tested with coderay 0.9.3 and won't work with coderay from svn.
57
+ This gem was tested with coderay 1.0 and won't work with coderay 0.9.
57
58
 
58
59
  rdoc_options: []
59
60
 
@@ -64,6 +65,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
64
65
  requirements:
65
66
  - - ">="
66
67
  - !ruby/object:Gem::Version
68
+ hash: 3
67
69
  segments:
68
70
  - 0
69
71
  version: "0"
@@ -72,13 +74,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
72
74
  requirements:
73
75
  - - ">="
74
76
  - !ruby/object:Gem::Version
77
+ hash: 3
75
78
  segments:
76
79
  - 0
77
80
  version: "0"
78
81
  requirements: []
79
82
 
80
83
  rubyforge_project:
81
- rubygems_version: 1.3.7
84
+ rubygems_version: 1.6.0
82
85
  signing_key:
83
86
  specification_version: 3
84
87
  summary: Simple bash scanner for highlighting with coderay.