spellr 0.1.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 +7 -0
- data/.gitignore +2 -0
- data/.rspec +3 -0
- data/.rubocop.yml +186 -0
- data/.ruby-version +1 -0
- data/.spellr.yml +23 -0
- data/.spellr_wordlists/dictionary.txt +120 -0
- data/.spellr_wordlists/english.txt +3 -0
- data/.spellr_wordlists/lorem.txt +4 -0
- data/.spellr_wordlists/ruby.txt +2 -0
- data/.travis.yml +7 -0
- data/Gemfile +8 -0
- data/Gemfile.lock +67 -0
- data/LICENSE.txt +21 -0
- data/README.md +64 -0
- data/Rakefile +8 -0
- data/bin/console +8 -0
- data/bin/fetch_wordlist/english +65 -0
- data/bin/fetch_wordlist/ruby +150 -0
- data/bin/setup +3 -0
- data/exe/spellr +5 -0
- data/lib/.spellr.yml +93 -0
- data/lib/spellr.rb +26 -0
- data/lib/spellr/check.rb +56 -0
- data/lib/spellr/cli.rb +205 -0
- data/lib/spellr/column_location.rb +49 -0
- data/lib/spellr/config.rb +105 -0
- data/lib/spellr/file.rb +27 -0
- data/lib/spellr/file_list.rb +45 -0
- data/lib/spellr/interactive.rb +191 -0
- data/lib/spellr/language.rb +104 -0
- data/lib/spellr/line_location.rb +29 -0
- data/lib/spellr/line_tokenizer.rb +181 -0
- data/lib/spellr/reporter.rb +27 -0
- data/lib/spellr/string_format.rb +43 -0
- data/lib/spellr/token.rb +83 -0
- data/lib/spellr/tokenizer.rb +72 -0
- data/lib/spellr/version.rb +5 -0
- data/lib/spellr/wordlist.rb +100 -0
- data/lib/spellr/wordlist_reporter.rb +21 -0
- data/spellr.gemspec +35 -0
- data/wordlist +2 -0
- data/wordlists/dockerfile.txt +21 -0
- data/wordlists/html.txt +340 -0
- data/wordlists/javascript.txt +64 -0
- data/wordlists/ruby.txt +2344 -0
- data/wordlists/shell.txt +2 -0
- metadata +217 -0
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'string_format'
|
4
|
+
|
5
|
+
module Spellr
|
6
|
+
class Reporter
|
7
|
+
include Spellr::StringFormat
|
8
|
+
|
9
|
+
attr_accessor :total
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
@total = 0
|
13
|
+
end
|
14
|
+
|
15
|
+
def finish(checked)
|
16
|
+
puts "\n"
|
17
|
+
puts "#{pluralize 'file', checked} checked"
|
18
|
+
puts "#{pluralize 'error', total} found"
|
19
|
+
end
|
20
|
+
|
21
|
+
def call(token)
|
22
|
+
puts "#{aqua token.location} #{token.line.highlight(token.char_range).strip}"
|
23
|
+
|
24
|
+
self.total += 1
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'config'
|
4
|
+
|
5
|
+
module Spellr
|
6
|
+
module StringFormat
|
7
|
+
module_function
|
8
|
+
|
9
|
+
def pluralize(word, count)
|
10
|
+
"#{count} #{word}#{'s' if count != 1}"
|
11
|
+
end
|
12
|
+
|
13
|
+
def color_enabled?
|
14
|
+
return $stdout.tty? if Spellr.config.color.nil?
|
15
|
+
|
16
|
+
Spellr.config.color
|
17
|
+
end
|
18
|
+
|
19
|
+
def aqua(text)
|
20
|
+
return text unless Spellr::StringFormat.color_enabled?
|
21
|
+
|
22
|
+
"\e[36m#{text}#{normal}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def normal(text = '')
|
26
|
+
return text unless Spellr::StringFormat.color_enabled?
|
27
|
+
|
28
|
+
"\e[0m#{text}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def bold(text)
|
32
|
+
return text unless Spellr::StringFormat.color_enabled?
|
33
|
+
|
34
|
+
"\e[1;39m#{text}#{normal}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def red(text)
|
38
|
+
return text unless Spellr::StringFormat.color_enabled?
|
39
|
+
|
40
|
+
"\e[1;31m#{text}#{normal}"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/spellr/token.rb
ADDED
@@ -0,0 +1,83 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# frozen string_literal: true
|
4
|
+
|
5
|
+
require_relative 'column_location'
|
6
|
+
require_relative 'string_format'
|
7
|
+
|
8
|
+
module Spellr
|
9
|
+
class Token < String
|
10
|
+
attr_reader :location, :line
|
11
|
+
def self.normalize(value)
|
12
|
+
return value.normalize if value.is_a?(Spellr::Token)
|
13
|
+
|
14
|
+
value.strip.downcase.unicode_normalize.tr('’', "'") + "\n"
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.wrap(value)
|
18
|
+
return value if value.is_a?(Spellr::Token)
|
19
|
+
|
20
|
+
Spellr::Token.new(value || '')
|
21
|
+
end
|
22
|
+
|
23
|
+
def initialize(string, line: string, location: ColumnLocation.new)
|
24
|
+
@location = location
|
25
|
+
@line = line
|
26
|
+
super(string)
|
27
|
+
end
|
28
|
+
|
29
|
+
def strip
|
30
|
+
@strip ||= begin
|
31
|
+
lstripped = lstrip
|
32
|
+
new_column_location = lstripped_column_location(lstripped)
|
33
|
+
Token.new(lstripped.rstrip, line: line, location: new_column_location)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def lstripped_column_location(lstripped)
|
38
|
+
ColumnLocation.new(
|
39
|
+
byte_offset: bytesize - lstripped.bytesize,
|
40
|
+
char_offset: length - lstripped.length,
|
41
|
+
line_location: location.line_location
|
42
|
+
)
|
43
|
+
end
|
44
|
+
|
45
|
+
def normalize
|
46
|
+
@normalize ||= self.class.normalize(to_s)
|
47
|
+
end
|
48
|
+
|
49
|
+
def inspect
|
50
|
+
"#<#{self.class.name} #{to_s.inspect} @#{location}>"
|
51
|
+
end
|
52
|
+
|
53
|
+
def char_range
|
54
|
+
@char_range ||= location.char_offset...(location.char_offset + length)
|
55
|
+
end
|
56
|
+
|
57
|
+
def byte_range
|
58
|
+
@byte_range ||= location.byte_offset...(location.byte_offset + bytesize)
|
59
|
+
end
|
60
|
+
|
61
|
+
def coordinates
|
62
|
+
location.coordinates
|
63
|
+
end
|
64
|
+
|
65
|
+
def highlight(range = char_range)
|
66
|
+
"#{slice(0...(range.first))}#{Spellr::StringFormat.red slice(range)}#{slice(range.last..-1)}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def replace(replacement)
|
70
|
+
::File.open(file_name, 'r+') do |f|
|
71
|
+
body = f.read
|
72
|
+
body[location.absolute_char_offset...(location.absolute_char_offset + length)] = replacement
|
73
|
+
f.rewind
|
74
|
+
f.truncate(0)
|
75
|
+
f.write(body)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def file_name
|
80
|
+
location.file_name
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../spellr'
|
4
|
+
require_relative 'token'
|
5
|
+
require_relative 'column_location'
|
6
|
+
require_relative 'line_location'
|
7
|
+
require_relative 'line_tokenizer'
|
8
|
+
|
9
|
+
module Spellr
|
10
|
+
class Tokenizer
|
11
|
+
attr_reader :file
|
12
|
+
attr_reader :start_at
|
13
|
+
|
14
|
+
attr_accessor :disabled
|
15
|
+
alias_method :disabled?, :disabled
|
16
|
+
|
17
|
+
def initialize(file, start_at: nil, skip_uri: true, skip_key: true)
|
18
|
+
# $stderr.puts start_at if start_at
|
19
|
+
@start_at = start_at || ColumnLocation.new(line_location: LineLocation.new(file))
|
20
|
+
@file = file.is_a?(StringIO) || file.is_a?(IO) ? file : ::File.new(file)
|
21
|
+
@file.pos = @start_at.line_location.byte_offset
|
22
|
+
|
23
|
+
@line_tokenizer = LineTokenizer.new(skip_uri: skip_uri, skip_key: skip_key)
|
24
|
+
end
|
25
|
+
|
26
|
+
def terms
|
27
|
+
enum_for(:each_term).to_a
|
28
|
+
end
|
29
|
+
|
30
|
+
def map(&block)
|
31
|
+
enum_for(:each_token).map(&block)
|
32
|
+
end
|
33
|
+
|
34
|
+
def each_term(&block)
|
35
|
+
each_line_with_offset do |line, line_number|
|
36
|
+
prepare_tokenizer_for_line(line, line_number).each_term(&block)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def each_token(&block) # rubocop:disable Metrics/AbcSize
|
41
|
+
char_offset = @start_at.line_location.char_offset
|
42
|
+
byte_offset = @start_at.line_location.byte_offset
|
43
|
+
|
44
|
+
each_line_with_offset do |line, line_number|
|
45
|
+
line_location = LineLocation.new(file, line_number, byte_offset: byte_offset, char_offset: char_offset)
|
46
|
+
char_offset += line.length
|
47
|
+
byte_offset += line.bytesize
|
48
|
+
line = Token.new(line, location: ColumnLocation.new(line_location: line_location))
|
49
|
+
prepare_tokenizer_for_line(line, line_number).each_token(&block)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def normalized_terms
|
54
|
+
enum_for(:each_term).lazy.map { |t| Token.normalize(t) }.uniq.sort
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
attr_reader :line_tokenizer
|
60
|
+
|
61
|
+
def each_line_with_offset(&block)
|
62
|
+
file.each_line.with_index(@start_at.line_number, &block)
|
63
|
+
end
|
64
|
+
|
65
|
+
def prepare_tokenizer_for_line(line, _line_number)
|
66
|
+
line_tokenizer.string = line
|
67
|
+
line_tokenizer.pos = 0
|
68
|
+
# line_tokenizer.pos = @start_at.byte_offset if line_number == @start_at.line_number
|
69
|
+
line_tokenizer
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,100 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require_relative '../spellr'
|
5
|
+
require_relative 'token'
|
6
|
+
|
7
|
+
module Spellr
|
8
|
+
class Wordlist
|
9
|
+
class NotFound < Spellr::Error; end
|
10
|
+
|
11
|
+
include Enumerable
|
12
|
+
|
13
|
+
attr_reader :path, :name
|
14
|
+
|
15
|
+
def initialize(file, name: file)
|
16
|
+
path = @file = file
|
17
|
+
@path = Pathname.pwd.join('.spellr_wordlists').join(path).expand_path
|
18
|
+
@name = name
|
19
|
+
end
|
20
|
+
|
21
|
+
def each(&block)
|
22
|
+
raise_unless_exists?
|
23
|
+
|
24
|
+
@path.each_line(&block)
|
25
|
+
end
|
26
|
+
|
27
|
+
def inspect
|
28
|
+
"#<#{self.class.name}:#{@path}>"
|
29
|
+
end
|
30
|
+
|
31
|
+
# significantly faster than default Enumerable#include?
|
32
|
+
# requires terms to be sorted
|
33
|
+
def include?(term)
|
34
|
+
include_cache[Spellr::Token.normalize(term)]
|
35
|
+
end
|
36
|
+
|
37
|
+
def include_cache
|
38
|
+
@include_cache ||= Hash.new do |cache, term|
|
39
|
+
cache[term] = to_a.bsearch do |value|
|
40
|
+
term <=> value
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_a
|
46
|
+
@to_a ||= super
|
47
|
+
end
|
48
|
+
|
49
|
+
def clean(file = @path)
|
50
|
+
require_relative 'tokenizer'
|
51
|
+
write(Spellr::Tokenizer.new(file, skip_uri: false, skip_key: false).normalized_terms.join)
|
52
|
+
end
|
53
|
+
|
54
|
+
def write(content)
|
55
|
+
@path.write(content)
|
56
|
+
|
57
|
+
clear_cache
|
58
|
+
end
|
59
|
+
|
60
|
+
def read
|
61
|
+
raise_unless_exists?
|
62
|
+
|
63
|
+
@path.read
|
64
|
+
end
|
65
|
+
|
66
|
+
def clear_cache
|
67
|
+
@to_a = nil
|
68
|
+
@include = nil
|
69
|
+
end
|
70
|
+
|
71
|
+
def exist?
|
72
|
+
@path.exist?
|
73
|
+
end
|
74
|
+
|
75
|
+
def add(term)
|
76
|
+
touch
|
77
|
+
term = Spellr::Token.normalize(term)
|
78
|
+
include_cache[term] = true
|
79
|
+
to_a << term
|
80
|
+
to_a.sort!
|
81
|
+
write(@to_a.join)
|
82
|
+
Spellr.config.clear_cache if to_a.length == 1
|
83
|
+
end
|
84
|
+
|
85
|
+
private
|
86
|
+
|
87
|
+
def touch
|
88
|
+
return if exist?
|
89
|
+
|
90
|
+
@path.dirname.mkpath
|
91
|
+
@path.write('')
|
92
|
+
end
|
93
|
+
|
94
|
+
def raise_unless_exists?
|
95
|
+
return if exist?
|
96
|
+
|
97
|
+
raise Spellr::Wordlist::NotFound, "Wordlist file #{@file} doesn't exist at #{@path}"
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'set'
|
4
|
+
|
5
|
+
module Spellr
|
6
|
+
class WordlistReporter
|
7
|
+
attr_reader :words
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@words = Set.new
|
11
|
+
end
|
12
|
+
|
13
|
+
def finish(_checked)
|
14
|
+
puts words.sort.join
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(token)
|
18
|
+
words << token.normalize
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spellr.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = ::File.expand_path('lib', __dir__)
|
4
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
|
+
require 'spellr/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'spellr'
|
9
|
+
spec.version = Spellr::VERSION
|
10
|
+
spec.authors = ['Dana Sherson']
|
11
|
+
spec.email = ['robot@dana.sh']
|
12
|
+
|
13
|
+
spec.summary = 'Spell check your source code'
|
14
|
+
spec.homepage = 'http://github.com/robotdana/spellr'
|
15
|
+
spec.license = 'MIT'
|
16
|
+
|
17
|
+
# Specify which files should be added to the gem when it is released.
|
18
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
19
|
+
spec.files = Dir.chdir(::File.expand_path(__dir__)) do
|
20
|
+
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
21
|
+
end
|
22
|
+
spec.bindir = 'exe'
|
23
|
+
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
24
|
+
spec.require_paths = ['lib']
|
25
|
+
|
26
|
+
spec.add_development_dependency 'bundler', '~> 1.17'
|
27
|
+
spec.add_development_dependency 'pry'
|
28
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
29
|
+
spec.add_development_dependency 'rspec', '~> 3.0'
|
30
|
+
spec.add_development_dependency 'rspec-eventually'
|
31
|
+
spec.add_development_dependency 'rubocop'
|
32
|
+
spec.add_development_dependency 'rubocop-rspec'
|
33
|
+
spec.add_dependency 'fast_ignore'
|
34
|
+
spec.add_dependency 'parallel'
|
35
|
+
end
|
data/wordlist
ADDED
data/wordlists/html.txt
ADDED
@@ -0,0 +1,340 @@
|
|
1
|
+
a
|
2
|
+
abbr
|
3
|
+
accept
|
4
|
+
accesskey
|
5
|
+
acronym
|
6
|
+
action
|
7
|
+
activedescendant
|
8
|
+
address
|
9
|
+
alert
|
10
|
+
alertdialog
|
11
|
+
align
|
12
|
+
allow
|
13
|
+
alt
|
14
|
+
applet
|
15
|
+
application
|
16
|
+
area
|
17
|
+
aria
|
18
|
+
article
|
19
|
+
aside
|
20
|
+
async
|
21
|
+
atomic
|
22
|
+
audio
|
23
|
+
autocapitalize
|
24
|
+
autocomplete
|
25
|
+
autofocus
|
26
|
+
autoplay
|
27
|
+
b
|
28
|
+
banner
|
29
|
+
base
|
30
|
+
basefont
|
31
|
+
bdi
|
32
|
+
bdo
|
33
|
+
bgcolor
|
34
|
+
bgsound
|
35
|
+
big
|
36
|
+
blink
|
37
|
+
blockquote
|
38
|
+
body
|
39
|
+
br
|
40
|
+
buffered
|
41
|
+
busy
|
42
|
+
button
|
43
|
+
canvas
|
44
|
+
caption
|
45
|
+
cell
|
46
|
+
center
|
47
|
+
challenge
|
48
|
+
charset
|
49
|
+
checkbox
|
50
|
+
checked
|
51
|
+
cite
|
52
|
+
class
|
53
|
+
code
|
54
|
+
codebase
|
55
|
+
col
|
56
|
+
colcount
|
57
|
+
colgroup
|
58
|
+
colindex
|
59
|
+
color
|
60
|
+
cols
|
61
|
+
colspan
|
62
|
+
columnheader
|
63
|
+
combobox
|
64
|
+
command
|
65
|
+
complementary
|
66
|
+
content
|
67
|
+
contenteditable
|
68
|
+
contentinfo
|
69
|
+
contextmenu
|
70
|
+
controls
|
71
|
+
coords
|
72
|
+
crossorigin
|
73
|
+
csp
|
74
|
+
current
|
75
|
+
data
|
76
|
+
datalist
|
77
|
+
datetime
|
78
|
+
dd
|
79
|
+
decoding
|
80
|
+
default
|
81
|
+
defer
|
82
|
+
definition
|
83
|
+
del
|
84
|
+
describedby
|
85
|
+
details
|
86
|
+
dfn
|
87
|
+
dialog
|
88
|
+
dir
|
89
|
+
directory
|
90
|
+
dirname
|
91
|
+
disabled
|
92
|
+
div
|
93
|
+
dl
|
94
|
+
document
|
95
|
+
download
|
96
|
+
draggable
|
97
|
+
dropeffect
|
98
|
+
dropzone
|
99
|
+
dt
|
100
|
+
element
|
101
|
+
em
|
102
|
+
embed
|
103
|
+
enctype
|
104
|
+
equiv
|
105
|
+
errormessage
|
106
|
+
expanded
|
107
|
+
feed
|
108
|
+
fieldset
|
109
|
+
figcaption
|
110
|
+
figure
|
111
|
+
flowto
|
112
|
+
font
|
113
|
+
footer
|
114
|
+
for
|
115
|
+
form
|
116
|
+
formaction
|
117
|
+
frame
|
118
|
+
frameset
|
119
|
+
grabbed
|
120
|
+
grid
|
121
|
+
gridcell
|
122
|
+
group
|
123
|
+
h
|
124
|
+
haspopup
|
125
|
+
head
|
126
|
+
header
|
127
|
+
headers
|
128
|
+
heading
|
129
|
+
height
|
130
|
+
hgroup
|
131
|
+
hidden
|
132
|
+
high
|
133
|
+
hr
|
134
|
+
href
|
135
|
+
hreflang
|
136
|
+
html
|
137
|
+
http
|
138
|
+
i
|
139
|
+
icon
|
140
|
+
id
|
141
|
+
iframe
|
142
|
+
image
|
143
|
+
img
|
144
|
+
importance
|
145
|
+
input
|
146
|
+
ins
|
147
|
+
integrity
|
148
|
+
invalid
|
149
|
+
isindex
|
150
|
+
ismap
|
151
|
+
itemprop
|
152
|
+
kbd
|
153
|
+
keygen
|
154
|
+
keyshortcuts
|
155
|
+
keytype
|
156
|
+
kind
|
157
|
+
label
|
158
|
+
labelledby
|
159
|
+
lang
|
160
|
+
language
|
161
|
+
lazyload
|
162
|
+
legend
|
163
|
+
level
|
164
|
+
li
|
165
|
+
link
|
166
|
+
list
|
167
|
+
listbox
|
168
|
+
listing
|
169
|
+
listitem
|
170
|
+
live
|
171
|
+
log
|
172
|
+
loop
|
173
|
+
low
|
174
|
+
main
|
175
|
+
manifest
|
176
|
+
map
|
177
|
+
mark
|
178
|
+
marquee
|
179
|
+
math
|
180
|
+
max
|
181
|
+
maxlength
|
182
|
+
media
|
183
|
+
menu
|
184
|
+
menubar
|
185
|
+
menuitem
|
186
|
+
menuitemcheckbox
|
187
|
+
menuitemradio
|
188
|
+
meta
|
189
|
+
meter
|
190
|
+
method
|
191
|
+
min
|
192
|
+
minlength
|
193
|
+
modal
|
194
|
+
multicol
|
195
|
+
multiline
|
196
|
+
multiple
|
197
|
+
multiselectable
|
198
|
+
muted
|
199
|
+
name
|
200
|
+
nav
|
201
|
+
navigation
|
202
|
+
nextid
|
203
|
+
nobr
|
204
|
+
noembed
|
205
|
+
noframes
|
206
|
+
none
|
207
|
+
noscript
|
208
|
+
note
|
209
|
+
novalidate
|
210
|
+
object
|
211
|
+
ol
|
212
|
+
open
|
213
|
+
optgroup
|
214
|
+
optimum
|
215
|
+
option
|
216
|
+
orientation
|
217
|
+
output
|
218
|
+
owns
|
219
|
+
p
|
220
|
+
param
|
221
|
+
pattern
|
222
|
+
picture
|
223
|
+
ping
|
224
|
+
placeholder
|
225
|
+
plaintext
|
226
|
+
posinset
|
227
|
+
poster
|
228
|
+
pre
|
229
|
+
preload
|
230
|
+
presentation
|
231
|
+
pressed
|
232
|
+
progress
|
233
|
+
progressbar
|
234
|
+
q
|
235
|
+
radio
|
236
|
+
radiogroup
|
237
|
+
rb
|
238
|
+
readonly
|
239
|
+
referrerpolicy
|
240
|
+
region
|
241
|
+
rel
|
242
|
+
relevant
|
243
|
+
required
|
244
|
+
reversed
|
245
|
+
role
|
246
|
+
roledescription
|
247
|
+
row
|
248
|
+
rowcount
|
249
|
+
rowgroup
|
250
|
+
rowheader
|
251
|
+
rowindex
|
252
|
+
rows
|
253
|
+
rowspan
|
254
|
+
rp
|
255
|
+
rt
|
256
|
+
rtc
|
257
|
+
ruby
|
258
|
+
s
|
259
|
+
samp
|
260
|
+
sandbox
|
261
|
+
scope
|
262
|
+
scoped
|
263
|
+
script
|
264
|
+
scrollbar
|
265
|
+
search
|
266
|
+
searchbox
|
267
|
+
section
|
268
|
+
select
|
269
|
+
selected
|
270
|
+
separator
|
271
|
+
setsize
|
272
|
+
shadow
|
273
|
+
shape
|
274
|
+
size
|
275
|
+
sizes
|
276
|
+
slider
|
277
|
+
slot
|
278
|
+
small
|
279
|
+
sort
|
280
|
+
source
|
281
|
+
spacer
|
282
|
+
span
|
283
|
+
spellcheck
|
284
|
+
spinbutton
|
285
|
+
src
|
286
|
+
srcdoc
|
287
|
+
srclang
|
288
|
+
srcset
|
289
|
+
start
|
290
|
+
status
|
291
|
+
step
|
292
|
+
strike
|
293
|
+
strong
|
294
|
+
style
|
295
|
+
sub
|
296
|
+
summary
|
297
|
+
sup
|
298
|
+
switch
|
299
|
+
tab
|
300
|
+
tabindex
|
301
|
+
table
|
302
|
+
tablist
|
303
|
+
tabpanel
|
304
|
+
target
|
305
|
+
tbody
|
306
|
+
td
|
307
|
+
template
|
308
|
+
term
|
309
|
+
textarea
|
310
|
+
textbox
|
311
|
+
tfoot
|
312
|
+
th
|
313
|
+
thead
|
314
|
+
time
|
315
|
+
timer
|
316
|
+
title
|
317
|
+
toolbar
|
318
|
+
tooltip
|
319
|
+
tr
|
320
|
+
track
|
321
|
+
translate
|
322
|
+
tree
|
323
|
+
treegrid
|
324
|
+
treeitem
|
325
|
+
tt
|
326
|
+
type
|
327
|
+
u
|
328
|
+
ul
|
329
|
+
usemap
|
330
|
+
value
|
331
|
+
valuemax
|
332
|
+
valuemin
|
333
|
+
valuenow
|
334
|
+
valuetext
|
335
|
+
var
|
336
|
+
video
|
337
|
+
wbr
|
338
|
+
width
|
339
|
+
wrap
|
340
|
+
xmp
|