coderay_bash 0.1.1 → 0.1.2

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.
data/coderay_bash.gemspec CHANGED
@@ -13,7 +13,7 @@ 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.1.1'
16
+ s.version = '0.1.2'
17
17
  s.date = Time.now.strftime("%Y-%m-%d")
18
18
  s.add_dependency('coderay', '< 1.0')
19
19
  s.require_path = 'lib'
@@ -1,6 +1,7 @@
1
1
  # Scanner for Bash
2
2
  # Author: Petr Kovar <pejuko@gmail.com>
3
- module CodeRay::Scanners
3
+ module CodeRay
4
+ module Scanners
4
5
  class Bash < Scanner
5
6
 
6
7
  register_for :bash
@@ -21,8 +22,6 @@ module CodeRay::Scanners
21
22
  local logout printf read set shopt source type typeset ulimit unalias
22
23
  )
23
24
 
24
- RESERVED = RESERVED_WORDS + COMMANDS + BASH_COMMANDS
25
-
26
25
  VARIABLES = %w(
27
26
  CDPATH HOME IFS MAIL MAILPATH OPTARG OPTIND PATH PS1 PS2
28
27
  )
@@ -41,7 +40,14 @@ module CodeRay::Scanners
41
40
  RANDOM REPLAY SECONDS SHELL SHELLOPTS SHLVL TIMEFORMAT TMOUT TMPDIR UID
42
41
  )
43
42
 
44
- CONSTANTS = VARIABLES + BASH_VARIABLES
43
+ PRE_CONSTANTS = / \$\{? (?: \# | \? | \d | \* | @ | - | \$ | \! | _ ) \}? /ox
44
+
45
+ IDENT_KIND = WordList.new(:ident).
46
+ add(RESERVED_WORDS, :reserved).
47
+ add(COMMANDS, :method).
48
+ add(BASH_COMMANDS, :method).
49
+ add(VARIABLES, :pre_type).
50
+ add(BASH_VARIABLES, :pre_type)
45
51
 
46
52
  def scan_tokens tokens, options
47
53
 
@@ -68,16 +74,16 @@ module CodeRay::Scanners
68
74
  elsif match = scan(/(?:"|`)/)
69
75
  state = :quote
70
76
  quote = match
71
- tokens << [match, :plain]
72
77
  tokens << [:open, :string] if quote == '"'
73
78
  tokens << [:open, :shell] if quote == '`'
79
+ tokens << [match, :delimiter]
74
80
  next
75
81
  elsif match = scan(/'[^']*'/)
76
82
  kind = :string
77
83
  elsif match = scan(/(?: \& | > | < | \| >> | << | >\& )/ox)
78
84
  kind = :bin
79
- elsif match = scan(/\d+\.(?:\d+\.?)+/)
80
- #version
85
+ elsif match = scan(/\d+[\.-](?:\d+[\.-]?)+/)
86
+ #versions, dates, and hyphen delimited numbers
81
87
  kind = :float
82
88
  elsif match = scan(/\d+\.\d+\s+/)
83
89
  kind = :float
@@ -86,12 +92,12 @@ module CodeRay::Scanners
86
92
  elsif match = scan(/ (?: \$\(\( | \)\) ) /x)
87
93
  kind = :global_variable
88
94
  elsif match = scan(/ \$\{ [^\}]+ \} /ox)
89
- kind = :instance_variable
90
95
  match =~ /\$\{(.*)\}/
91
- kind = :pre_type if CONSTANTS.include?($1)
96
+ kind = IDENT_KIND[$1]
97
+ kind = :instance_variable if kind == :ident
92
98
  elsif match = scan(/ \$\( [^\)]+ \) /ox)
93
99
  kind = :shell
94
- elsif match = scan(/ \$\{? (?: \# | \? | \d | \* | @ | - | \$ | \! | _ ) \}? /ox)
100
+ elsif match = scan(PRE_CONSTANTS)
95
101
  kind = :pre_constant
96
102
  elsif match = scan(/[^\s]*[A-Za-z_][A-Za-z_0-9]*\+?=/)
97
103
  match =~ /(.*?)([A-Za-z_][A-Za-z_0-9]*)(\+?=)/
@@ -100,24 +106,23 @@ module CodeRay::Scanners
100
106
  op = $3
101
107
  kind = :plain
102
108
  if str.to_s.strip.empty?
103
- kind = :instance_variable
104
- kind = :pre_type if CONSTANTS.include?(pre)
105
- #kind = :pre_constant if CONSTANTS.include?(pre)
109
+ kind = IDENT_KIND[pre]
110
+ kind = :instance_variable if kind == :ident
106
111
  tokens << [pre, kind]
107
112
  tokens << [op, :operator]
108
113
  next
109
114
  end
110
115
  elsif match = scan(/[A-Za-z_]+\[[A-Za-z_\d]+\]/)
111
116
  # array
112
- kind = :instance_variable
113
- kind = :pre_type if CONSTANTS.include?(match)
117
+ kind = IDENT_KIND(match)
118
+ kind = :instance_variable if kind == :ident
114
119
  elsif match = scan(/ \$[A-Za-z_][A-Za-z_0-9]* /ox)
115
- kind = :instance_variable
116
120
  match =~ /\$(.*)/
117
- kind = :pre_type if CONSTANTS.include?($1)
121
+ kind = IDENT_KIND[$1]
122
+ kind = :instance_variable if kind == :ident
118
123
  elsif match = scan(/read \S+/)
119
124
  match =~ /read(\s+)(\S+)/
120
- tokens << ['read', :reserved]
125
+ tokens << ['read', :method]
121
126
  tokens << [$1, :space]
122
127
  tokens << [$2, :instance_variable]
123
128
  next
@@ -125,13 +130,11 @@ module CodeRay::Scanners
125
130
  kind = :reserved
126
131
  elsif match = scan(/ [A-Za-z_][A-Za-z_\d]*;? /x)
127
132
  match =~ /([^;]+);?/
128
- if RESERVED.include?($1)
129
- if match[/([^;]+);$/]
130
- tokens << [$1, :reserved]
131
- tokens << [';', :delimiter]
132
- next
133
- end
134
- kind = :reserved
133
+ kind = IDENT_KIND[$1]
134
+ if match[/([^;]+);$/]
135
+ tokens << [$1, kind]
136
+ tokens << [';', :delimiter]
137
+ next
135
138
  end
136
139
  elsif match = scan(/(?: = | - | \+ | \{ | \} | \( | \) | && | \|\| | ;; | ! )/ox)
137
140
  kind = :operator
@@ -141,20 +144,25 @@ module CodeRay::Scanners
141
144
  kind = :plain
142
145
  elsif match = scan(/.+/)
143
146
  # this shouldn't be :reserved for highlighting bad matches
144
- #kind = :reserved
145
- kind = :plain
147
+ kind = :error
148
+ match = ">>>>>#{match}<<<<<"
146
149
  end
147
150
  elsif state == :quote
148
- if (match = scan(/\\./))
151
+ if (match = scan(/\\.?/))
149
152
  kind = :content
150
153
  elsif match = scan(/#{quote}/)
154
+ tokens << [match, :delimiter]
151
155
  tokens << [:close, :string] if quote == '"'
152
156
  tokens << [:close, :shell] if quote == "`"
153
157
  quote = nil
154
158
  state = :initial
155
- kind = :plain
156
- elsif match = scan(/ (?: \$\{?[A-Za-z_][A-Za-z_\d]*\}? | \$\{?(?:\#|\?|\d)\}? ) /x)
157
- kind = :instance_variable
159
+ next
160
+ #kind = :symbol
161
+ elsif match = scan(PRE_CONSTANTS)
162
+ kind = :pre_constant
163
+ elsif match = scan(/ \$\{?[A-Za-z_][A-Za-z_\d]*\}? /x)
164
+ kind = IDENT_KIND[match]
165
+ kind = :instance_variable if kind == :ident
158
166
  elsif (quote == '`') and (match = scan(/\$"/))
159
167
  kind = :content
160
168
  elsif (quote == '"') and (match = scan(/\$`/))
@@ -163,7 +171,10 @@ module CodeRay::Scanners
163
171
  kind = :content
164
172
  else match = scan(/.+/)
165
173
  # this shouldn't be
166
- kind = :reserved
174
+ #kind = :reserved
175
+ #raise match
176
+ match = ">>>>>#{match}<<<<<"
177
+ kind = :error
167
178
  end
168
179
  end
169
180
 
@@ -176,3 +187,4 @@ module CodeRay::Scanners
176
187
 
177
188
  end
178
189
  end
190
+ end
data/lib/coderay_bash.rb CHANGED
@@ -1,4 +1,3 @@
1
1
  require 'coderay'
2
2
  path = File.join File.expand_path(File.dirname(__FILE__)), "coderay/scanners/bash.rb"
3
- p path
4
3
  require path
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coderay_bash
3
3
  version: !ruby/object:Gem::Version
4
- hash: 25
4
+ hash: 31
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 1
9
- - 1
10
- version: 0.1.1
9
+ - 2
10
+ version: 0.1.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Petr Kovar