bchess 0.1.1

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/lib/pgn/parser.rb ADDED
@@ -0,0 +1,42 @@
1
+ require 'treetop'
2
+
3
+ module Bchess
4
+ module PGN
5
+ class ParserException < Exception ;end
6
+
7
+ class Parser
8
+ attr_reader :input, :output, :error, :tree
9
+
10
+ Treetop.load('./lib/pgn/pgn_rules.treetop')
11
+ @@parser = SexpParser.new
12
+
13
+ def initialize(input)
14
+ @input = input
15
+ end
16
+
17
+ def parse
18
+ if input.kind_of?(String)
19
+ @tree = @@parser.parse(input)
20
+ elsif input.kind_of?(Bchess::PGN::PGNFile)
21
+ @tree = @@parser.parse(input.load_games)
22
+ end
23
+
24
+ if !tree
25
+ raise PGN::ParserException, "Parse error at offset: #{@@parser.index}"
26
+ end
27
+
28
+ sanitize_tree(tree)
29
+ end
30
+
31
+ private
32
+
33
+ def sanitize_tree(root_node)
34
+ root_elements = root_node.elements
35
+ return unless root_elements
36
+
37
+ root_elements.delete_if{ |node| node.class.name == "Treetop::Runtime::SyntaxNode" }
38
+ root_elements.each{ |node| sanitize_tree(node) }
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,16 @@
1
+ module Bchess
2
+ module PGN
3
+ class PGNFile
4
+ attr_accessor :filepath, :games, :content
5
+
6
+ def initialize(filepath)
7
+ @filepath = filepath
8
+ end
9
+
10
+ def load_games
11
+ file = File.open(filepath, "rt")
12
+ @content = file.read
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,84 @@
1
+ module Sexp
2
+ class PAllGames < Treetop::Runtime::SyntaxNode
3
+ end
4
+
5
+ class PGame < Treetop::Runtime::SyntaxNode
6
+ end
7
+
8
+ class PHeaderBody < Treetop::Runtime::SyntaxNode
9
+ end
10
+
11
+ class PHeader < Treetop::Runtime::SyntaxNode
12
+ def parse(value)
13
+ val = value.split(" ", 2)
14
+
15
+ [val[0].delete('['), val[1].delete('"]').rstrip]
16
+ end
17
+ end
18
+
19
+ class PAllMoves < Treetop::Runtime::SyntaxNode
20
+ end
21
+
22
+ class PAllMovesWithResult < Treetop::Runtime::SyntaxNode
23
+ end
24
+
25
+ class POneMove < Treetop::Runtime::SyntaxNode
26
+ end
27
+
28
+ class PMove < Treetop::Runtime::SyntaxNode
29
+ end
30
+
31
+ class PMoveNumber < Treetop::Runtime::SyntaxNode
32
+ end
33
+
34
+ class PComment < Treetop::Runtime::SyntaxNode
35
+ end
36
+
37
+ class PCommentWithBracket < Treetop::Runtime::SyntaxNode
38
+ end
39
+
40
+ class PVariation < Treetop::Runtime::SyntaxNode
41
+ end
42
+
43
+ class PResult < Treetop::Runtime::SyntaxNode
44
+ end
45
+
46
+ class PTakes < Treetop::Runtime::SyntaxNode
47
+ end
48
+
49
+ class PInteger < Treetop::Runtime::SyntaxNode
50
+ end
51
+
52
+ class PFloat < Treetop::Runtime::SyntaxNode
53
+ end
54
+
55
+ class PString < Treetop::Runtime::SyntaxNode
56
+ end
57
+
58
+ class PIdentifier < Treetop::Runtime::SyntaxNode
59
+ end
60
+
61
+ class PCastle < Treetop::Runtime::SyntaxNode
62
+ end
63
+
64
+ class PTime < Treetop::Runtime::SyntaxNode
65
+ end
66
+
67
+ class PTimeIdentifier < Treetop::Runtime::SyntaxNode
68
+ end
69
+ end
70
+
71
+ class Treetop::Runtime::SyntaxNode
72
+ def create_value_hash
73
+ hash = {}
74
+
75
+ self.elements.each do |element|
76
+ key = element.elements.first.text_value
77
+ value = element.elements.last.text_value
78
+
79
+ hash[key] = value.gsub('"','')
80
+ end
81
+
82
+ hash
83
+ end
84
+ end
@@ -0,0 +1,127 @@
1
+ grammar Sexp
2
+ rule all_games
3
+ ( game )* <PAllGames>
4
+ end
5
+
6
+ rule game
7
+ header_body new_line all_moves? new_line? result? multiple_line? <PGame>
8
+ end
9
+
10
+ ## HEADER PART
11
+
12
+ rule header_body
13
+ (header)* <PHeaderBody>
14
+ end
15
+
16
+ rule header
17
+ "[" identifier space string "]" new_line <PHeader>
18
+ end
19
+
20
+ ## BODY PART
21
+
22
+ rule all_moves
23
+ ( move / comment_with_brackets / variation / castle / special_sign )* <PAllMovesWithResult>
24
+ end
25
+
26
+ rule move
27
+ ( move_number? piecechar? chessline? takes? chesscolumn takes? chesscolumn? chessline promotion? check?) space? <PMove>
28
+ end
29
+
30
+ rule variation
31
+ "(" space? all_moves space? ")" space? <PVariation>
32
+ end
33
+
34
+ rule move_number
35
+ ( integer ( '...' / '.' ) space? ) <PMoveNumber>
36
+ end
37
+
38
+
39
+ rule comment_with_brackets
40
+ "{" comment "}" space? <PCommentWithBracket>
41
+ end
42
+
43
+ rule comment
44
+ space? new_line? float? time? ( identifier space? )* <PComment>
45
+ end
46
+
47
+ rule time
48
+ "[" time_identifier "]" <PTime>
49
+ end
50
+
51
+ rule time_identifier
52
+ "%clk" space [0-9]+ ":" [0-9]* ":" [0-9]* <PTimeIdentifier>
53
+ end
54
+
55
+ rule move_with_number
56
+ integer ( '...' / '.' ) space? move <PMoveWithNumber>
57
+ end
58
+
59
+ rule takes
60
+ [x] / "ax" / "bx" / "cx" / "dx" / "ex" / "fx" / "gx" / "hx" <PTakes>
61
+ end
62
+
63
+
64
+ rule result
65
+ "1-0" / "0-1" / "1/2-1/2" / "1/2" / "*" <PResult>
66
+ end
67
+
68
+ ## DATATYPES
69
+
70
+ rule integer
71
+ ('+' / '-')? [0-9]+ <PInteger>
72
+ end
73
+
74
+ rule float
75
+ ('+' / '-')? [0-9]+ (('.' [0-9]+) / ('e' [0-9]+)) <PFloat>
76
+ end
77
+
78
+ rule string
79
+ '"' ([^"\\] / "\\" . )* '"' <PString>
80
+ end
81
+
82
+ rule identifier
83
+ [a-zA-Z0-9\=\*\+\-\%\'\"\`\;\/\$\!\?\,\:\(\)\.\<\>] [a-zA-Z0-9_\=\*\+\-\%\'\"\`\;\/\$\!\?\,\:\(\)\.\<\>]* <PIdentifier>
84
+ end
85
+
86
+ rule space
87
+ [\s]+
88
+ end
89
+
90
+ rule new_line
91
+ [\n]
92
+ end
93
+
94
+ rule multiple_line
95
+ (new_line)*
96
+ end
97
+
98
+ ## CHESS RULES
99
+
100
+ rule chesscolumn
101
+ [a-h]
102
+ end
103
+
104
+ rule chessline
105
+ [1-8]
106
+ end
107
+
108
+ rule piecechar
109
+ [A-Z]
110
+ end
111
+
112
+ rule check
113
+ "+" / "#"
114
+ end
115
+
116
+ rule castle
117
+ move_number? ( "O-O-O" / "O-O" ) check? space? <PCastle>
118
+ end
119
+
120
+ rule promotion
121
+ "="? [A-Z]
122
+ end
123
+
124
+ rule special_sign
125
+ "$" integer space?
126
+ end
127
+ end
data/test.sh ADDED
@@ -0,0 +1 @@
1
+ rspec --tag ~slow spec/
metadata ADDED
@@ -0,0 +1,153 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bchess
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Staszek Zawadzki
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-11-23 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.16'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.16'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: treetop
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.6'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.6'
69
+ - !ruby/object:Gem::Dependency
70
+ name: pry
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ description: Parsing and validating a chess games and returning as chess game objects
84
+ email:
85
+ - s.zawadzki@visuality.pl
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".rspec"
92
+ - ".travis.yml"
93
+ - CODE_OF_CONDUCT.md
94
+ - Gemfile
95
+ - Gemfile.lock
96
+ - LICENSE.txt
97
+ - README.md
98
+ - Rakefile
99
+ - bchess.gemspec
100
+ - bin/console
101
+ - bin/setup
102
+ - full_test.sh
103
+ - lib/bchess.rb
104
+ - lib/bchess/bishop.rb
105
+ - lib/bchess/board.rb
106
+ - lib/bchess/game.rb
107
+ - lib/bchess/helpers/board_helpers.rb
108
+ - lib/bchess/helpers/castle_helpers.rb
109
+ - lib/bchess/helpers/en_passant_helpers.rb
110
+ - lib/bchess/helpers/fen_helpers.rb
111
+ - lib/bchess/helpers/field_between_helpers.rb
112
+ - lib/bchess/helpers/validations.rb
113
+ - lib/bchess/king.rb
114
+ - lib/bchess/knight.rb
115
+ - lib/bchess/pawn.rb
116
+ - lib/bchess/piece.rb
117
+ - lib/bchess/queen.rb
118
+ - lib/bchess/rook.rb
119
+ - lib/bchess/version.rb
120
+ - lib/pgn/game.rb
121
+ - lib/pgn/game_body.rb
122
+ - lib/pgn/game_header.rb
123
+ - lib/pgn/move_info_parser.rb
124
+ - lib/pgn/parser.rb
125
+ - lib/pgn/pgn_file.rb
126
+ - lib/pgn/pgn_nodes.rb
127
+ - lib/pgn/pgn_rules.treetop
128
+ - test.sh
129
+ homepage: ''
130
+ licenses:
131
+ - MIT
132
+ metadata: {}
133
+ post_install_message:
134
+ rdoc_options: []
135
+ require_paths:
136
+ - lib
137
+ required_ruby_version: !ruby/object:Gem::Requirement
138
+ requirements:
139
+ - - ">="
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ required_rubygems_version: !ruby/object:Gem::Requirement
143
+ requirements:
144
+ - - ">="
145
+ - !ruby/object:Gem::Version
146
+ version: '0'
147
+ requirements: []
148
+ rubyforge_project:
149
+ rubygems_version: 2.6.14
150
+ signing_key:
151
+ specification_version: 4
152
+ summary: Parsing chess PGN games.
153
+ test_files: []