chessboard 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +5 -0
  5. data/CODE_OF_CONDUCT.md +49 -0
  6. data/Gemfile +4 -0
  7. data/LICENSE.txt +21 -0
  8. data/README.md +87 -0
  9. data/Rakefile +6 -0
  10. data/bin/console +14 -0
  11. data/bin/setup +8 -0
  12. data/chessboard.gemspec +34 -0
  13. data/lib/chessboard/version.rb +3 -0
  14. data/lib/chessboard.rb +5 -0
  15. data/lib/generators/chessboard/USAGE +13 -0
  16. data/lib/generators/chessboard/chessboard_generator.rb +55 -0
  17. data/lib/generators/chessboard/templates/chess.min.js +6 -0
  18. data/lib/generators/chessboard/templates/chessboard-0.3.0.min.css +2 -0
  19. data/lib/generators/chessboard/templates/chessboard-0.3.0.min.js +31 -0
  20. data/lib/generators/chessboard/templates/chessboard_controller.rb +4 -0
  21. data/lib/generators/chessboard/templates/chessboard_empty_board.html.erb +5 -0
  22. data/lib/generators/chessboard/templates/chessboard_highlight_legal_moves.html.erb +83 -0
  23. data/lib/generators/chessboard/templates/chessboard_only_legal_moves.html.erb +84 -0
  24. data/lib/generators/chessboard/templates/chessboard_piece_highlighting_1.html.erb +68 -0
  25. data/lib/generators/chessboard/templates/chessboard_piece_highlighting_2.html.erb +97 -0
  26. data/lib/generators/chessboard/templates/chessboard_play_random_computer.html.erb +98 -0
  27. data/lib/generators/chessboard/templates/chessboard_random_vs_random.html.erb +25 -0
  28. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bB.png +0 -0
  29. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bK.png +0 -0
  30. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bN.png +0 -0
  31. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bP.png +0 -0
  32. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bQ.png +0 -0
  33. data/lib/generators/chessboard/templates/chesspieces/wikipedia/bR.png +0 -0
  34. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wB.png +0 -0
  35. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wK.png +0 -0
  36. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wN.png +0 -0
  37. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wP.png +0 -0
  38. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wQ.png +0 -0
  39. data/lib/generators/chessboard/templates/chesspieces/wikipedia/wR.png +0 -0
  40. metadata +144 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a537bf33cf726b4e8dec82bce2baff62e254d5e0
4
+ data.tar.gz: 406852402db92ae49be30c44a0fabaab25b28ef7
5
+ SHA512:
6
+ metadata.gz: 3788536feda016f7d1fab35977e5581618d8161c7c528f73dbfe7c13e8814db115c7158009612ba92a6877bba2e3c3a137d3263ead4f17ed3d4950a06bd80e37
7
+ data.tar.gz: 804b8b135bd60262ce53e4167721dadb4eb27898282375c2709a78e13b16c923726cca385192edbfb0a72f4269ed0c5e6311f03212de8ce0540dd12935aaaee6
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.1
5
+ before_install: gem install bundler -v 1.12.5
@@ -0,0 +1,49 @@
1
+ # Contributor Code of Conduct
2
+
3
+ As contributors and maintainers of this project, and in the interest of
4
+ fostering an open and welcoming community, we pledge to respect all people who
5
+ contribute through reporting issues, posting feature requests, updating
6
+ documentation, submitting pull requests or patches, and other activities.
7
+
8
+ We are committed to making participation in this project a harassment-free
9
+ experience for everyone, regardless of level of experience, gender, gender
10
+ identity and expression, sexual orientation, disability, personal appearance,
11
+ body size, race, ethnicity, age, religion, or nationality.
12
+
13
+ Examples of unacceptable behavior by participants include:
14
+
15
+ * The use of sexualized language or imagery
16
+ * Personal attacks
17
+ * Trolling or insulting/derogatory comments
18
+ * Public or private harassment
19
+ * Publishing other's private information, such as physical or electronic
20
+ addresses, without explicit permission
21
+ * Other unethical or unprofessional conduct
22
+
23
+ Project maintainers have the right and responsibility to remove, edit, or
24
+ reject comments, commits, code, wiki edits, issues, and other contributions
25
+ that are not aligned to this Code of Conduct, or to ban temporarily or
26
+ permanently any contributor for other behaviors that they deem inappropriate,
27
+ threatening, offensive, or harmful.
28
+
29
+ By adopting this Code of Conduct, project maintainers commit themselves to
30
+ fairly and consistently applying these principles to every aspect of managing
31
+ this project. Project maintainers who do not follow or enforce the Code of
32
+ Conduct may be permanently removed from the project team.
33
+
34
+ This code of conduct applies both within project spaces and in public spaces
35
+ when an individual is representing the project or its community.
36
+
37
+ Instances of abusive, harassing, or otherwise unacceptable behavior may be
38
+ reported by contacting a project maintainer at dhrubo_moy@yahoo.com. All
39
+ complaints will be reviewed and investigated and will result in a response that
40
+ is deemed necessary and appropriate to the circumstances. Maintainers are
41
+ obligated to maintain confidentiality with regard to the reporter of an
42
+ incident.
43
+
44
+ This Code of Conduct is adapted from the [Contributor Covenant][homepage],
45
+ version 1.3.0, available at
46
+ [http://contributor-covenant.org/version/1/3/0/][version]
47
+
48
+ [homepage]: http://contributor-covenant.org
49
+ [version]: http://contributor-covenant.org/version/1/3/0/
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in chessboard.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2016 Dhrubomoy Das Gupta
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,87 @@
1
+ # Chessboard
2
+
3
+ A ruby gem to generate necessary assets (javascripts, stylesheets and images), controller and view in order to easily add varieties of chessboards in your Ruby on Rails 5 applications. Thanks to chess libraries like [chessboard.js](https://github.com/oakmac/chessboardjs/) and [chess.js] (https://github.com/jhlywa/chess.js) and awesome power of Ruby on Rails, you can add a nice chessboard in your rails 5 application with literally 3 commands.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'chessboard'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle install
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install chessboard
20
+
21
+ ## Usage
22
+
23
+ ### Basic Usage
24
+
25
+ 1. After installation run `rails generate chessboard` or `rails g chessboard`
26
+ 2. Start the rails server `rails server` or `rails s`
27
+ 3. Open your favourite browser and visit [http://localhost:3000/chessboard](http://localhost:3000/chessboard)
28
+
29
+ ### Print help message
30
+
31
+ Run `rails g chessboard --help` to print following:
32
+
33
+ ```
34
+ Usage:
35
+ rails generate chessboard [CHESSBOARD_NAME] [options]
36
+
37
+ Options:
38
+ [--skip-controller], [--no-skip-controller] # Skip including chessboard controller.
39
+ [--skip-route], [--no-skip-route] # Skip adding route for chessboard in your config/route.rb
40
+ [--skip-view], [--no-skip-view] # Skip including chessboard view (.html.erb file).
41
+ [--chessboard-type=CHESSBOARD_TYPE] # Specify what type of chessboard you want in your view.
42
+ Available options:
43
+ only_legal_moves,
44
+ play_random_computer,
45
+ empty_board,
46
+ random_vs_random,
47
+ highlight_legal_moves,
48
+ piece_highlighting_1,
49
+ piece_highlighting_2
50
+ # Default: only_legal_moves
51
+
52
+ Runtime options:
53
+ -f, [--force] # Overwrite files that already exist
54
+ -p, [--pretend], [--no-pretend] # Run but do not make any changes
55
+ -q, [--quiet], [--no-quiet] # Suppress status output
56
+ -s, [--skip], [--no-skip] # Skip files that already exist
57
+
58
+ Description:
59
+ Generates controller, view, javascripts and stylesheets for a chessboard.
60
+
61
+ Example:
62
+ rails generate chessboard
63
+
64
+ This will create:
65
+ vendor/assets/javascript/chess.min.js
66
+ vendor/assets/javascript/chessboard-0.3.0.min.js
67
+ vendor/assets/stylesheets/chessboard-0.3.0.min.css
68
+ app/controllers/chessboard_controller.rb
69
+ app/assets/images/chesspieces/<Images>.png
70
+ app/views/chessboard/chessboard.html.erb
71
+ ```
72
+
73
+ ## Development
74
+
75
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
76
+
77
+ To install this gem onto your local machine, run `bundle exec rake install`.
78
+
79
+ ## Contributing
80
+
81
+ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/chessboard. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
82
+
83
+
84
+ ## License
85
+
86
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
87
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "chessboard"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'chessboard/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "chessboard"
8
+ spec.version = Chessboard::VERSION
9
+ spec.authors = ["Dhrubomoy Das Gupta"]
10
+ spec.email = ["dhrubo_moy@yahoo.com"]
11
+
12
+ spec.summary = %q{Chessboard generator gem for Rails 5 apps.}
13
+ # spec.description = %q{TODO: Write a longer description or delete this line.}
14
+ spec.homepage = "https://github.com/dhrubomoy/chessboard"
15
+ spec.license = "MIT"
16
+
17
+ # Prevent pushing this gem to RubyGems.org. To allow pushes either set the 'allowed_push_host'
18
+ # to allow pushing to a single host or delete this section to allow pushing to any host.
19
+ # if spec.respond_to?(:metadata)
20
+ # spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
21
+ # else
22
+ # raise "RubyGems 2.0 or newer is required to protect against public gem pushes."
23
+ # end
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
26
+ spec.bindir = "exe"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.12"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency "rspec", "~> 3.0"
33
+ spec.add_development_dependency 'rails', '~> 5.0.0', '>= 5.0.0.1'
34
+ end
@@ -0,0 +1,3 @@
1
+ module Chessboard
2
+ VERSION = "0.1.0"
3
+ end
data/lib/chessboard.rb ADDED
@@ -0,0 +1,5 @@
1
+ require "chessboard/version"
2
+
3
+ module Chessboard
4
+
5
+ end
@@ -0,0 +1,13 @@
1
+ Description:
2
+ Generates controller, view, javascripts and stylesheets for a chessboard.
3
+
4
+ Example:
5
+ rails generate chessboard
6
+
7
+ This will create:
8
+ vendor/assets/javascript/chess.min.js
9
+ vendor/assets/javascript/chessboard-0.3.0.min.js
10
+ vendor/assets/stylesheets/chessboard-0.3.0.min.css
11
+ app/controllers/chessboard_controller.rb
12
+ app/assets/images/chesspieces/<Images>.png
13
+ app/views/chessboard/chessboard.html.erb
@@ -0,0 +1,55 @@
1
+ class ChessboardGenerator < Rails::Generators::Base
2
+ source_root File.expand_path('../templates', __FILE__)
3
+ argument :chessboard_name, type: :string, default: 'chessboard'
4
+ class_option :skip_controller, type: :boolean, defalt: false, desc: 'Skip including chessboard controller.'
5
+ class_option :skip_route, type: :boolean, default: false, desc: 'Skip adding route for chessboard in your config/route.rb'
6
+ class_option :skip_view, type: :boolean, defalt: false, desc: 'Skip including chessboard view (.html.erb file).'
7
+ class_option :chessboard_type, type: :string, default: 'only_legal_moves', desc: "Specify what type of chessboard you want in your view.
8
+ Available options:
9
+ only_legal_moves,
10
+ play_random_computer,
11
+ empty_board,
12
+ random_vs_random,
13
+ highlight_legal_moves,
14
+ piece_highlighting_1,
15
+ piece_highlighting_2"
16
+
17
+ def generate_chessboard_assets
18
+ copy_file 'chess.min.js', 'vendor/assets/javascripts/chess.min.js'
19
+ copy_file 'chessboard-0.3.0.min.js', 'vendor/assets/javascripts/chessboard-0.3.0.min.js'
20
+ copy_file 'chessboard-0.3.0.min.css', 'vendor/assets/stylesheets/chessboard-0.3.0.min.css'
21
+ inject_into_file 'app/assets/stylesheets/application.css', " *= require chessboard-0.3.0.min\n", after: " *= require_self\n"
22
+ inject_into_file 'app/assets/javascripts/application.js', "//= require chessboard-0.3.0.min\n//= require chess.min\n", after: "//= require jquery_ujs\n"
23
+ directory 'chesspieces', "app/assets/images/chesspieces"
24
+ end
25
+
26
+ def generate_chessboard_controller
27
+ copy_file 'chessboard_controller.rb', 'app/controllers/chessboard_controller.rb' if !options.skip_controller
28
+ end
29
+
30
+ def generate_chessboard_view
31
+ if !options.skip_view?
32
+ chessboard_view_path = 'app/views/chessboard/chessboard.html.erb'
33
+ case options.chessboard_type
34
+ when 'empty_board'
35
+ copy_file 'chessboard_empty_board.html.erb', chessboard_view_path
36
+ when 'only_legal_moves'
37
+ copy_file 'chessboard_only_legal_moves.html.erb', chessboard_view_path
38
+ when 'play_random_computer'
39
+ copy_file 'chessboard_play_random_computer.html.erb', chessboard_view_path
40
+ when 'random_vs_random'
41
+ copy_file 'chessboard_random_vs_random.html.erb', chessboard_view_path
42
+ when 'highlight_legal_moves'
43
+ copy_file 'chessboard_highlight_legal_moves.html.erb', chessboard_view_path
44
+ when 'piece_highlighting_1'
45
+ copy_file 'chessboard_piece_highlighting_1.html.erb', chessboard_view_path
46
+ when 'piece_highlighting_2'
47
+ copy_file 'chessboard_piece_highlighting_2.html.erb', chessboard_view_path
48
+ end
49
+ end
50
+ end
51
+
52
+ def inject_into_routes
53
+ inject_into_file 'config/routes.rb', "get '/chessboard', to: 'chessboard#chessboard'\n", after: "Rails.application.routes.draw do\n" if !options.skip_routes
54
+ end
55
+ end
@@ -0,0 +1,6 @@
1
+ /* @license
2
+ * Copyright (c) 2016, Jeff Hlywa (jhlywa@gmail.com)
3
+ * Released under the BSD license
4
+ * https://github.com/jhlywa/chess.js/blob/master/LICENSE
5
+ */
6
+ var Chess=function(r){function e(){ur=new Array(128),lr={w:x,b:x},sr=U,pr={w:0,b:0},cr=x,vr=0,gr=1,hr=[],dr={},a(i())}function n(){t(H)}function t(r){var n=r.split(/\s+/),t=n[0],f=0;if(!o(r).valid)return!1;e();for(var u=0;u<t.length;u++){var s=t.charAt(u);if("/"===s)f+=8;else if(O(s))f+=parseInt(s,10);else{var p="a">s?U:Q;l({type:s.toLowerCase(),color:p},R(f)),f++}}return sr=n[1],n[2].indexOf("K")>-1&&(pr.w|=er.KSIDE_CASTLE),n[2].indexOf("Q")>-1&&(pr.w|=er.QSIDE_CASTLE),n[2].indexOf("k")>-1&&(pr.b|=er.KSIDE_CASTLE),n[2].indexOf("q")>-1&&(pr.b|=er.QSIDE_CASTLE),cr="-"===n[3]?x:fr[n[3]],vr=parseInt(n[4],10),gr=parseInt(n[5],10),a(i()),!0}function o(r){var e={0:"No errors.",1:"FEN string must contain six space-delimited fields.",2:"6th field (move number) must be a positive integer.",3:"5th field (half move counter) must be a non-negative integer.",4:"4th field (en-passant square) is invalid.",5:"3rd field (castling availability) is invalid.",6:"2nd field (side to move) is invalid.",7:"1st field (piece positions) does not contain 8 '/'-delimited rows.",8:"1st field (piece positions) is invalid [consecutive numbers].",9:"1st field (piece positions) is invalid [invalid piece].",10:"1st field (piece positions) is invalid [row too large].",11:"Illegal en-passant square"},n=r.split(/\s+/);if(6!==n.length)return{valid:!1,error_number:1,error:e[1]};if(isNaN(n[5])||parseInt(n[5],10)<=0)return{valid:!1,error_number:2,error:e[2]};if(isNaN(n[4])||parseInt(n[4],10)<0)return{valid:!1,error_number:3,error:e[3]};if(!/^(-|[abcdefgh][36])$/.test(n[3]))return{valid:!1,error_number:4,error:e[4]};if(!/^(KQ?k?q?|Qk?q?|kq?|q|-)$/.test(n[2]))return{valid:!1,error_number:5,error:e[5]};if(!/^(w|b)$/.test(n[1]))return{valid:!1,error_number:6,error:e[6]};var t=n[0].split("/");if(8!==t.length)return{valid:!1,error_number:7,error:e[7]};for(var o=0;o<t.length;o++){for(var i=0,f=!1,a=0;a<t[o].length;a++)if(isNaN(t[o][a])){if(!/^[prnbqkPRNBQK]$/.test(t[o][a]))return{valid:!1,error_number:9,error:e[9]};i+=1,f=!1}else{if(f)return{valid:!1,error_number:8,error:e[8]};i+=parseInt(t[o][a],10),f=!0}if(8!==i)return{valid:!1,error_number:10,error:e[10]}}return"3"==n[3][1]&&"w"==n[1]||"6"==n[3][1]&&"b"==n[1]?{valid:!1,error_number:11,error:e[11]}:{valid:!0,error_number:0,error:e[0]}}function i(){for(var r=0,e="",n=fr.a8;n<=fr.h1;n++){if(null==ur[n])r++;else{r>0&&(e+=r,r=0);var t=ur[n].color,o=ur[n].type;e+=t===U?o.toUpperCase():o.toLowerCase()}n+1&136&&(r>0&&(e+=r),n!==fr.h1&&(e+="/"),r=0,n+=8)}var i="";pr[U]&er.KSIDE_CASTLE&&(i+="K"),pr[U]&er.QSIDE_CASTLE&&(i+="Q"),pr[Q]&er.KSIDE_CASTLE&&(i+="k"),pr[Q]&er.QSIDE_CASTLE&&(i+="q"),i=i||"-";var f=cr===x?"-":R(cr);return[e,sr,i,f,vr,gr].join(" ")}function f(r){for(var e=0;e<r.length;e+=2)"string"==typeof r[e]&&"string"==typeof r[e+1]&&(dr[r[e]]=r[e+1]);return dr}function a(r){hr.length>0||(r!==H?(dr.SetUp="1",dr.FEN=r):(delete dr.SetUp,delete dr.FEN))}function u(r){var e=ur[fr[r]];return e?{type:e.type,color:e.color}:null}function l(r,e){if(!("type"in r&&"color"in r))return!1;if(-1===W.indexOf(r.type.toLowerCase()))return!1;if(!(e in fr))return!1;var n=fr[e];return r.type==F&&lr[r.color]!=x&&lr[r.color]!=n?!1:(ur[n]={type:r.type,color:r.color},r.type===F&&(lr[r.color]=n),a(i()),!0)}function s(r){var e=u(r);return ur[fr[r]]=null,e&&e.type===F&&(lr[e.color]=x),a(i()),e}function p(r,e,n,t,o){var i={color:sr,from:e,to:n,flags:t,piece:r[e].type};return o&&(i.flags|=er.PROMOTION,i.promotion=o),r[n]?i.captured=r[n].type:t&er.EP_CAPTURE&&(i.captured=$),i}function c(r){function e(r,e,n,t,o){if(r[n].type!==$||w(t)!==ir&&w(t)!==nr)e.push(p(r,n,t,o));else for(var i=[G,M,B,j],f=0,a=i.length;a>f;f++)e.push(p(r,n,t,o,i[f]))}var n=[],t=sr,o=N(t),i={b:or,w:tr},f=fr.a8,a=fr.h1,u=!1,l="undefined"!=typeof r&&"legal"in r?r.legal:!0;if("undefined"!=typeof r&&"square"in r){if(!(r.square in fr))return[];f=a=fr[r.square],u=!0}for(var s=f;a>=s;s++)if(136&s)s+=7;else{var c=ur[s];if(null!=c&&c.color===t)if(c.type===$){var v=s+z[t][0];if(null==ur[v]){e(ur,n,s,v,er.NORMAL);var v=s+z[t][1];i[t]===w(s)&&null==ur[v]&&e(ur,n,s,v,er.BIG_PAWN)}for(g=2;4>g;g++){var v=s+z[t][g];136&v||(null!=ur[v]&&ur[v].color===o?e(ur,n,s,v,er.CAPTURE):v===cr&&e(ur,n,s,cr,er.EP_CAPTURE))}}else for(var g=0,E=J[c.type].length;E>g;g++)for(var b=J[c.type][g],v=s;;){if(v+=b,136&v)break;if(null!=ur[v]){if(ur[v].color===t)break;e(ur,n,s,v,er.CAPTURE);break}if(e(ur,n,s,v,er.NORMAL),"n"===c.type||"k"===c.type)break}}if(!u||a===lr[t]){if(pr[t]&er.KSIDE_CASTLE){var _=lr[t],y=_+2;null!=ur[_+1]||null!=ur[y]||h(o,lr[t])||h(o,_+1)||h(o,y)||e(ur,n,lr[t],y,er.KSIDE_CASTLE)}if(pr[t]&er.QSIDE_CASTLE){var _=lr[t],y=_-2;null!=ur[_-1]||null!=ur[_-2]||null!=ur[_-3]||h(o,lr[t])||h(o,_-1)||h(o,y)||e(ur,n,lr[t],y,er.QSIDE_CASTLE)}}if(!l)return n;for(var m=[],s=0,E=n.length;E>s;s++)S(n[s]),d(t)||m.push(n[s]),C();return m}function v(r,e){var n="";if(r.flags&er.KSIDE_CASTLE)n="O-O";else if(r.flags&er.QSIDE_CASTLE)n="O-O-O";else{var t=T(r,e);r.piece!==$&&(n+=r.piece.toUpperCase()+t),r.flags&(er.CAPTURE|er.EP_CAPTURE)&&(r.piece===$&&(n+=R(r.from)[0]),n+="x"),n+=R(r.to),r.flags&er.PROMOTION&&(n+="="+r.promotion.toUpperCase())}return S(r),E()&&(n+=b()?"#":"+"),C(),n}function g(r){return r.replace(/=/,"").replace(/[+#]?[?!]*$/,"")}function h(r,e){for(var n=fr.a8;n<=fr.h1;n++)if(136&n)n+=7;else if(null!=ur[n]&&ur[n].color===r){var t=ur[n],o=n-e,i=o+119;if(V[i]&1<<Y[t.type]){if(t.type===$){if(o>0){if(t.color===U)return!0}else if(t.color===Q)return!0;continue}if("n"===t.type||"k"===t.type)return!0;for(var f=X[i],a=n+f,u=!1;a!==e;){if(null!=ur[a]){u=!0;break}a+=f}if(!u)return!0}}return!1}function d(r){return h(N(r),lr[r])}function E(){return d(sr)}function b(){return E()&&0===c().length}function _(){return!E()&&0===c().length}function y(){for(var r={},e=[],n=0,t=0,o=fr.a8;o<=fr.h1;o++)if(t=(t+1)%2,136&o)o+=7;else{var i=ur[o];i&&(r[i.type]=i.type in r?r[i.type]+1:1,i.type===B&&e.push(t),n++)}if(2===n)return!0;if(3===n&&(1===r[B]||1===r[j]))return!0;if(n===r[B]+2){for(var f=0,a=e.length,o=0;a>o;o++)f+=e[o];if(0===f||f===a)return!0}return!1}function m(){for(var r=[],e={},n=!1;;){var t=C();if(!t)break;r.push(t)}for(;;){var o=i().split(" ").slice(0,4).join(" ");if(e[o]=o in e?e[o]+1:1,e[o]>=3&&(n=!0),!r.length)break;S(r.pop())}return n}function A(r){hr.push({move:r,kings:{b:lr.b,w:lr.w},turn:sr,castling:{b:pr.b,w:pr.w},ep_square:cr,half_moves:vr,move_number:gr})}function S(r){var e=sr,n=N(e);if(A(r),ur[r.to]=ur[r.from],ur[r.from]=null,r.flags&er.EP_CAPTURE&&(sr===Q?ur[r.to-16]=null:ur[r.to+16]=null),r.flags&er.PROMOTION&&(ur[r.to]={type:r.promotion,color:e}),ur[r.to].type===F){if(lr[ur[r.to].color]=r.to,r.flags&er.KSIDE_CASTLE){var t=r.to-1,o=r.to+1;ur[t]=ur[o],ur[o]=null}else if(r.flags&er.QSIDE_CASTLE){var t=r.to+1,o=r.to-2;ur[t]=ur[o],ur[o]=null}pr[e]=""}if(pr[e])for(var i=0,f=ar[e].length;f>i;i++)if(r.from===ar[e][i].square&&pr[e]&ar[e][i].flag){pr[e]^=ar[e][i].flag;break}if(pr[n])for(var i=0,f=ar[n].length;f>i;i++)if(r.to===ar[n][i].square&&pr[n]&ar[n][i].flag){pr[n]^=ar[n][i].flag;break}cr=r.flags&er.BIG_PAWN?"b"===sr?r.to-16:r.to+16:x,r.piece===$?vr=0:r.flags&(er.CAPTURE|er.EP_CAPTURE)?vr=0:vr++,sr===Q&&gr++,sr=N(sr)}function C(){var r=hr.pop();if(null==r)return null;var e=r.move;lr=r.kings,sr=r.turn,pr=r.castling,cr=r.ep_square,vr=r.half_moves,gr=r.move_number;var n=sr,t=N(sr);if(ur[e.from]=ur[e.to],ur[e.from].type=e.piece,ur[e.to]=null,e.flags&er.CAPTURE)ur[e.to]={type:e.captured,color:t};else if(e.flags&er.EP_CAPTURE){var o;o=n===Q?e.to-16:e.to+16,ur[o]={type:$,color:t}}if(e.flags&(er.KSIDE_CASTLE|er.QSIDE_CASTLE)){var i,f;e.flags&er.KSIDE_CASTLE?(i=e.to+1,f=e.to-1):e.flags&er.QSIDE_CASTLE&&(i=e.to-2,f=e.to+1),ur[i]=ur[f],ur[f]=null}return e}function T(r,e){for(var n=c({legal:!e}),t=r.from,o=r.to,i=r.piece,f=0,a=0,u=0,l=0,s=n.length;s>l;l++){var p=n[l].from,v=n[l].to,g=n[l].piece;i===g&&t!==p&&o===v&&(f++,w(t)===w(p)&&a++,L(t)===L(p)&&u++)}return f>0?a>0&&u>0?R(t):R(t).charAt(u>0?1:0):""}function I(){for(var r=" +------------------------+\n",e=fr.a8;e<=fr.h1;e++){if(0===L(e)&&(r+=" "+"87654321"[w(e)]+" |"),null==ur[e])r+=" . ";else{var n=ur[e].type,t=ur[e].color,o=t===U?n.toUpperCase():n.toLowerCase();r+=" "+o+" "}e+1&136&&(r+="|\n",e+=8)}return r+=" +------------------------+\n",r+=" a b c d e f g h\n"}function P(r,e){var n=g(r);if(e){var t=n.match(/([pnbrqkPNBRQK])?([a-h][1-8])x?-?([a-h][1-8])([qrbnQRBN])?/);if(t)var o=t[1],i=t[2],f=t[3],a=t[4]}for(var u=c(),l=0,s=u.length;s>l;l++){if(n===g(v(u[l]))||e&&n===g(v(u[l],!0)))return u[l];if(!(!t||o&&o.toLowerCase()!=u[l].piece||fr[i]!=u[l].from||fr[f]!=u[l].to||a&&a.toLowerCase()!=u[l].promotion))return u[l]}return null}function w(r){return r>>4}function L(r){return 15&r}function R(r){var e=L(r),n=w(r);return"abcdefgh".substring(e,e+1)+"87654321".substring(n,n+1)}function N(r){return r===U?Q:U}function O(r){return-1!=="0123456789".indexOf(r)}function k(r){var e=q(r);e.san=v(e,!1),e.to=R(e.to),e.from=R(e.from);var n="";for(var t in er)er[t]&e.flags&&(n+=rr[t]);return e.flags=n,e}function q(r){var e=r instanceof Array?[]:{};for(var n in r)"object"==typeof n?e[n]=q(r[n]):e[n]=r[n];return e}function D(r){return r.replace(/^\s+|\s+$/g,"")}function K(r){for(var e=c({legal:!1}),n=0,t=sr,o=0,i=e.length;i>o;o++){if(S(e[o]),!d(t))if(r-1>0){var f=K(r-1);n+=f}else n++;C()}return n}var Q="b",U="w",x=-1,$="p",j="n",B="b",M="r",G="q",F="k",W="pnbrqkPNBRQK",H="rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",Z=["1-0","0-1","1/2-1/2","*"],z={b:[16,32,17,15],w:[-16,-32,-17,-15]},J={n:[-18,-33,-31,-14,18,33,31,14],b:[-17,-15,17,15],r:[-16,1,16,-1],q:[-17,-16,-15,1,17,16,15,-1],k:[-17,-16,-15,1,17,16,15,-1]},V=[20,0,0,0,0,0,0,24,0,0,0,0,0,0,20,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,24,24,24,24,24,24,56,0,56,24,24,24,24,24,24,0,0,0,0,0,0,2,53,56,53,2,0,0,0,0,0,0,0,0,0,0,0,20,2,24,2,20,0,0,0,0,0,0,0,0,0,0,20,0,0,24,0,0,20,0,0,0,0,0,0,0,0,20,0,0,0,24,0,0,0,20,0,0,0,0,0,0,20,0,0,0,0,24,0,0,0,0,20,0,0,0,0,20,0,0,0,0,0,24,0,0,0,0,0,20,0,0,20,0,0,0,0,0,0,24,0,0,0,0,0,0,20],X=[17,0,0,0,0,0,0,16,0,0,0,0,0,0,15,0,0,17,0,0,0,0,0,16,0,0,0,0,0,15,0,0,0,0,17,0,0,0,0,16,0,0,0,0,15,0,0,0,0,0,0,17,0,0,0,16,0,0,0,15,0,0,0,0,0,0,0,0,17,0,0,16,0,0,15,0,0,0,0,0,0,0,0,0,0,17,0,16,0,15,0,0,0,0,0,0,0,0,0,0,0,0,17,16,15,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,-1,-1,-1,-1,-1,-1,-1,0,0,0,0,0,0,0,-15,-16,-17,0,0,0,0,0,0,0,0,0,0,0,0,-15,0,-16,0,-17,0,0,0,0,0,0,0,0,0,0,-15,0,0,-16,0,0,-17,0,0,0,0,0,0,0,0,-15,0,0,0,-16,0,0,0,-17,0,0,0,0,0,0,-15,0,0,0,0,-16,0,0,0,0,-17,0,0,0,0,-15,0,0,0,0,0,-16,0,0,0,0,0,-17,0,0,-15,0,0,0,0,0,0,-16,0,0,0,0,0,0,-17],Y={p:0,n:1,b:2,r:3,q:4,k:5},rr={NORMAL:"n",CAPTURE:"c",BIG_PAWN:"b",EP_CAPTURE:"e",PROMOTION:"p",KSIDE_CASTLE:"k",QSIDE_CASTLE:"q"},er={NORMAL:1,CAPTURE:2,BIG_PAWN:4,EP_CAPTURE:8,PROMOTION:16,KSIDE_CASTLE:32,QSIDE_CASTLE:64},nr=7,tr=6,or=1,ir=0,fr={a8:0,b8:1,c8:2,d8:3,e8:4,f8:5,g8:6,h8:7,a7:16,b7:17,c7:18,d7:19,e7:20,f7:21,g7:22,h7:23,a6:32,b6:33,c6:34,d6:35,e6:36,f6:37,g6:38,h6:39,a5:48,b5:49,c5:50,d5:51,e5:52,f5:53,g5:54,h5:55,a4:64,b4:65,c4:66,d4:67,e4:68,f4:69,g4:70,h4:71,a3:80,b3:81,c3:82,d3:83,e3:84,f3:85,g3:86,h3:87,a2:96,b2:97,c2:98,d2:99,e2:100,f2:101,g2:102,h2:103,a1:112,b1:113,c1:114,d1:115,e1:116,f1:117,g1:118,h1:119},ar={w:[{square:fr.a1,flag:er.QSIDE_CASTLE},{square:fr.h1,flag:er.KSIDE_CASTLE}],b:[{square:fr.a8,flag:er.QSIDE_CASTLE},{square:fr.h8,flag:er.KSIDE_CASTLE}]},ur=new Array(128),lr={w:x,b:x},sr=U,pr={w:0,b:0},cr=x,vr=0,gr=1,hr=[],dr={};return t("undefined"==typeof r?H:r),{WHITE:U,BLACK:Q,PAWN:$,KNIGHT:j,BISHOP:B,ROOK:M,QUEEN:G,KING:F,SQUARES:function(){for(var r=[],e=fr.a8;e<=fr.h1;e++)136&e?e+=7:r.push(R(e));return r}(),FLAGS:rr,load:function(r){return t(r)},reset:function(){return n()},moves:function(r){for(var e=c(r),n=[],t=0,o=e.length;o>t;t++)n.push("undefined"!=typeof r&&"verbose"in r&&r.verbose?k(e[t]):v(e[t],!1));return n},in_check:function(){return E()},in_checkmate:function(){return b()},in_stalemate:function(){return _()},in_draw:function(){return vr>=100||_()||y()||m()},insufficient_material:function(){return y()},in_threefold_repetition:function(){return m()},game_over:function(){return vr>=100||b()||_()||y()||m()},validate_fen:function(r){return o(r)},fen:function(){return i()},pgn:function(r){var e="object"==typeof r&&"string"==typeof r.newline_char?r.newline_char:"\n",n="object"==typeof r&&"number"==typeof r.max_width?r.max_width:0,t=[],o=!1;for(var i in dr)t.push("["+i+' "'+dr[i]+'"]'+e),o=!0;o&&hr.length&&t.push(e);for(var f=[];hr.length>0;)f.push(C());for(var a=[],u="";f.length>0;){var l=f.pop();hr.length||"b"!==l.color?"w"===l.color&&(u.length&&a.push(u),u=gr+"."):u=gr+". ...",u=u+" "+v(l,!1),S(l)}if(u.length&&a.push(u),"undefined"!=typeof dr.Result&&a.push(dr.Result),0===n)return t.join("")+a.join(" ");for(var s=0,i=0;i<a.length;i++)s+a[i].length>n&&0!==i?(" "===t[t.length-1]&&t.pop(),t.push(e),s=0):0!==i&&(t.push(" "),s++),t.push(a[i]),s+=a[i].length;return t.join("")},load_pgn:function(r,e){function o(r){return r.replace(/\\/g,"\\")}function i(r){for(var e in r)return!0;return!1}function a(r,e){for(var n="object"==typeof e&&"string"==typeof e.newline_char?e.newline_char:"\r?\n",t={},i=r.split(new RegExp(o(n))),f="",a="",u=0;u<i.length;u++)f=i[u].replace(/^\[([A-Z][A-Za-z]*)\s.*\]$/,"$1"),a=i[u].replace(/^\[[A-Za-z]+\s"(.*)"\]$/,"$1"),D(f).length>0&&(t[f]=a);return t}var u="undefined"!=typeof e&&"sloppy"in e?e.sloppy:!1,l="object"==typeof e&&"string"==typeof e.newline_char?e.newline_char:"\r?\n",s=new RegExp("^(\\[(.|"+o(l)+")*\\])("+o(l)+")*1.("+o(l)+"|.)*$","g"),p=r.replace(s,"$1");"["!==p[0]&&(p=""),n();var c=a(p,e);for(var v in c)f([v,c[v]]);if("1"===c.SetUp&&!("FEN"in c&&t(c.FEN)))return!1;var g=r.replace(p,"").replace(new RegExp(o(l),"g")," ");g=g.replace(/(\{[^}]+\})+?/g,"");for(var h=/(\([^\(\)]+\))+?/g;h.test(g);)g=g.replace(h,"");g=g.replace(/\d+\.(\.\.)?/g,""),g=g.replace(/\.\.\./g,""),g=g.replace(/\$\d+/g,"");var d=D(g).split(new RegExp(/\s+/));d=d.join(",").replace(/,,+/g,",").split(",");for(var E="",b=0;b<d.length-1;b++){if(E=P(d[b],u),null==E)return!1;S(E)}if(E=d[d.length-1],Z.indexOf(E)>-1)i(dr)&&"undefined"==typeof dr.Result&&f(["Result",E]);else{if(E=P(E,u),null==E)return!1;S(E)}return!0},header:function(){return f(arguments)},ascii:function(){return I()},turn:function(){return sr},move:function(r,e){var n="undefined"!=typeof e&&"sloppy"in e?e.sloppy:!1,t=null;if("string"==typeof r)t=P(r,n);else if("object"==typeof r)for(var o=c(),i=0,f=o.length;f>i;i++)if(!(r.from!==R(o[i].from)||r.to!==R(o[i].to)||"promotion"in o[i]&&r.promotion!==o[i].promotion)){t=o[i];break}if(!t)return null;var a=k(t);return S(t),a},undo:function(){var r=C();return r?k(r):null},clear:function(){return e()},put:function(r,e){return l(r,e)},get:function(r){return u(r)},remove:function(r){return s(r)},perft:function(r){return K(r)},square_color:function(r){if(r in fr){var e=fr[r];return(w(e)+L(e))%2===0?"light":"dark"}return null},history:function(r){for(var e=[],n=[],t=("undefined"!=typeof r&&"verbose"in r&&r.verbose);hr.length>0;)e.push(C());for(;e.length>0;){var o=e.pop();n.push(t?k(o):v(o)),S(o)}return n}}};"undefined"!=typeof exports&&(exports.Chess=Chess),"undefined"!=typeof define&&define(function(){return Chess});
@@ -0,0 +1,2 @@
1
+ /*! chessboard.js v0.3.0 | (c) 2013 Chris Oakman | MIT License chessboardjs.com/license */
2
+ .clearfix-7da63{clear:both}.board-b72b1{border:2px solid #404040;-moz-box-sizing:content-box;box-sizing:content-box}.square-55d63{float:left;position:relative;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.white-1e1d7{background-color:#f0d9b5;color:#b58863}.black-3c85d{background-color:#b58863;color:#f0d9b5}.highlight1-32417,.highlight2-9c5d2{-webkit-box-shadow:inset 0 0 3px 3px yellow;-moz-box-shadow:inset 0 0 3px 3px yellow;box-shadow:inset 0 0 3px 3px yellow}.notation-322f9{cursor:default;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;position:absolute}.alpha-d2270{bottom:1px;right:3px}.numeric-fc462{top:2px;left:2px}
@@ -0,0 +1,31 @@
1
+ /*! chessboard.js v0.3.0 | (c) 2013 Chris Oakman | MIT License chessboardjs.com/license */
2
+ (function(){function l(f){return"string"!==typeof f?!1:-1!==f.search(/^[a-h][1-8]$/)}function Q(f){if("string"!==typeof f)return!1;f=f.replace(/ .+$/,"");f=f.split("/");if(8!==f.length)return!1;for(var b=0;8>b;b++)if(""===f[b]||8<f[b].length||-1!==f[b].search(/[^kqrbnpKQRNBP1-8]/))return!1;return!0}function F(f){if("object"!==typeof f)return!1;for(var b in f)if(!0===f.hasOwnProperty(b)){var n;(n=!0!==l(b))||(n=f[b],n="string"!==typeof n?!1:-1!==n.search(/^[bw][KQRNBP]$/),n=!0!==n);if(n)return!1}return!0}
3
+ function K(f){if(!0!==Q(f))return!1;f=f.replace(/ .+$/,"");f=f.split("/");for(var b={},n=8,m=0;8>m;m++){for(var l=f[m].split(""),r=0,w=0;w<l.length;w++)if(-1!==l[w].search(/[1-8]/))var I=parseInt(l[w],10),r=r+I;else{var I=b,F=B[r]+n,A;A=l[w];A=A.toLowerCase()===A?"b"+A.toUpperCase():"w"+A.toUpperCase();I[F]=A;r++}n--}return b}function L(f){if(!0!==F(f))return!1;for(var b="",n=8,m=0;8>m;m++){for(var l=0;8>l;l++){var r=B[l]+n;!0===f.hasOwnProperty(r)?(r=f[r].split(""),r="w"===r[0]?r[1].toUpperCase():
4
+ r[1].toLowerCase(),b+=r):b+="1"}7!==m&&(b+="/");n--}b=b.replace(/11111111/g,"8");b=b.replace(/1111111/g,"7");b=b.replace(/111111/g,"6");b=b.replace(/11111/g,"5");b=b.replace(/1111/g,"4");b=b.replace(/111/g,"3");return b=b.replace(/11/g,"2")}var B="abcdefgh".split("");window.ChessBoard=window.ChessBoard||function(f,b){function n(){return"xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx-xxxx".replace(/x/g,function(a){return(16*Math.random()|0).toString(16)})}function m(a){return JSON.parse(JSON.stringify(a))}function X(a){a=
5
+ a.split(".");return{major:parseInt(a[0],10),minor:parseInt(a[1],10),patch:parseInt(a[2],10)}}function r(a,e,c){if(!0===b.hasOwnProperty("showErrors")&&!1!==b.showErrors){var d="ChessBoard Error "+a+": "+e;"console"===b.showErrors&&"object"===typeof console&&"function"===typeof console.log?(console.log(d),2<=arguments.length&&console.log(c)):"alert"===b.showErrors?(c&&(d+="\n\n"+JSON.stringify(c)),window.alert(d)):"function"===typeof b.showErrors&&b.showErrors(a,e,c)}}function w(a){return"fast"===
6
+ a||"slow"===a?!0:parseInt(a,10)+""!==a+""?!1:0<=a}function I(){for(var a=0;a<B.length;a++)for(var b=1;8>=b;b++){var c=B[a]+b;s[c]=c+"-"+n()}b="KQRBNP".split("");for(a=0;a<b.length;a++){var c="w"+b[a],d="b"+b[a];M[c]=c+"-"+n();M[d]=d+"-"+n()}}function ga(){var a='<div class="'+h.chessboard+'">';!0===b.sparePieces&&(a+='<div class="'+h.sparePieces+" "+h.sparePiecesTop+'"></div>');a+='<div class="'+h.board+'"></div>';!0===b.sparePieces&&(a+='<div class="'+h.sparePieces+" "+h.sparePiecesBottom+'"></div>');
7
+ return a+"</div>"}function A(a){"black"!==a&&(a="white");var e="",c=m(B),d=8;"black"===a&&(c.reverse(),d=1);for(var C="white",f=0;8>f;f++){for(var e=e+('<div class="'+h.row+'">'),k=0;8>k;k++){var g=c[k]+d,e=e+('<div class="'+h.square+" "+h[C]+" square-"+g+'" style="width: '+p+"px; height: "+p+'px" id="'+s[g]+'" data-square="'+g+'">');if(!0===b.showNotation){if("white"===a&&1===d||"black"===a&&8===d)e+='<div class="'+h.notation+" "+h.alpha+'">'+c[k]+"</div>";0===k&&(e+='<div class="'+h.notation+" "+
8
+ h.numeric+'">'+d+"</div>")}e+="</div>";C="white"===C?"black":"white"}e+='<div class="'+h.clearfix+'"></div></div>';C="white"===C?"black":"white";"white"===a?d--:d++}return e}function Y(a){if("function"===typeof b.pieceTheme)return b.pieceTheme(a);if("string"===typeof b.pieceTheme)return b.pieceTheme.replace(/{piece}/g,a);r(8272,"Unable to build image source for cfg.pieceTheme.");return""}function D(a,b,c){var d='<img src="'+Y(a)+'" ';c&&"string"===typeof c&&(d+='id="'+c+'" ');d+='alt="" class="'+
9
+ h.piece+'" data-piece="'+a+'" style="width: '+p+"px;height: "+p+"px;";!0===b&&(d+="display:none;");return d+'" />'}function N(a){var b="wK wQ wR wB wN wP".split(" ");"black"===a&&(b="bK bQ bR bB bN bP".split(" "));a="";for(var c=0;c<b.length;c++)a+=D(b[c],!1,M[b[c]]);return a}function ha(a,e,c,d){a=$("#"+s[a]);var C=a.offset(),f=$("#"+s[e]);e=f.offset();var k=n();$("body").append(D(c,!0,k));var g=$("#"+k);g.css({display:"",position:"absolute",top:C.top,left:C.left});a.find("."+h.piece).remove();g.animate(e,
10
+ {duration:b.moveSpeed,complete:function(){f.append(D(c));g.remove();"function"===typeof d&&d()}})}function ia(a,e,c){var d=$("#"+M[a]).offset(),f=$("#"+s[e]);e=f.offset();var g=n();$("body").append(D(a,!0,g));var k=$("#"+g);k.css({display:"",position:"absolute",left:d.left,top:d.top});k.animate(e,{duration:b.moveSpeed,complete:function(){f.find("."+h.piece).remove();f.append(D(a));k.remove();"function"===typeof c&&c()}})}function ja(a,e,c){function d(){f++;if(f===a.length&&(G(),!0===b.hasOwnProperty("onMoveEnd")&&
11
+ "function"===typeof b.onMoveEnd))b.onMoveEnd(m(e),m(c))}for(var f=0,g=0;g<a.length;g++)"clear"===a[g].type&&$("#"+s[a[g].square]+" ."+h.piece).fadeOut(b.trashSpeed,d),"add"===a[g].type&&!0!==b.sparePieces&&$("#"+s[a[g].square]).append(D(a[g].piece,!0)).find("."+h.piece).fadeIn(b.appearSpeed,d),"add"===a[g].type&&!0===b.sparePieces&&ia(a[g].piece,a[g].square,d),"move"===a[g].type&&ha(a[g].source,a[g].destination,a[g].piece,d)}function ka(a,b){a=a.split("");var c=B.indexOf(a[0])+1,d=parseInt(a[1],10);
12
+ b=b.split("");var g=B.indexOf(b[0])+1,f=parseInt(b[1],10),c=Math.abs(c-g),d=Math.abs(d-f);return c>=d?c:d}function la(a){for(var b=[],c=0;8>c;c++)for(var d=0;8>d;d++){var g=B[c]+(d+1);a!==g&&b.push({square:g,distance:ka(a,g)})}b.sort(function(a,b){return a.distance-b.distance});a=[];for(c=0;c<b.length;c++)a.push(b[c].square);return a}function G(){x.find("."+h.piece).remove();for(var a in g)!0===g.hasOwnProperty(a)&&$("#"+s[a]).append(D(g[a]))}function R(){x.html(A(u));G();!0===b.sparePieces&&("white"===
13
+ u?(S.html(N("black")),T.html(N("white"))):(S.html(N("white")),T.html(N("black"))))}function O(a){var e=m(g),c=m(a),d=L(e),f=L(c);if(d!==f){if(!0===b.hasOwnProperty("onChange")&&"function"===typeof b.onChange)b.onChange(e,c);g=a}}function U(a,b){for(var c in J)if(!0===J.hasOwnProperty(c)){var d=J[c];if(a>=d.left&&a<d.left+p&&b>=d.top&&b<d.top+p)return c}return"offboard"}function V(){x.find("."+h.square).removeClass(h.highlight1+" "+h.highlight2)}function ma(){function a(){G();y.css("display","none");
14
+ if(!0===b.hasOwnProperty("onSnapbackEnd")&&"function"===typeof b.onSnapbackEnd)b.onSnapbackEnd(E,t,m(g),u)}if("spare"===t)Z();else{V();var e=$("#"+s[t]).offset();y.animate(e,{duration:b.snapbackSpeed,complete:a});z=!1}}function Z(){V();var a=m(g);delete a[t];O(a);G();y.fadeOut(b.trashSpeed);z=!1}function na(a){V();var e=m(g);delete e[t];e[a]=E;O(e);e=$("#"+s[a]).offset();y.animate(e,{duration:b.snapSpeed,complete:function(){G();y.css("display","none");if(!0===b.hasOwnProperty("onSnapEnd")&&"function"===
15
+ typeof b.onSnapEnd)b.onSnapEnd(t,a,E)}});z=!1}function P(a,e,c,d){if("function"!==typeof b.onDragStart||!1!==b.onDragStart(a,e,m(g),u)){z=!0;E=e;t=a;H="spare"===a?"offboard":a;J={};for(var f in s)!0===s.hasOwnProperty(f)&&(J[f]=$("#"+s[f]).offset());y.attr("src",Y(e)).css({display:"",position:"absolute",left:c-p/2,top:d-p/2});"spare"!==a&&$("#"+s[a]).addClass(h.highlight1).find("."+h.piece).css("display","none")}}function aa(a,e){y.css({left:a-p/2,top:e-p/2});var c=U(a,e);if(c!==H){!0===l(H)&&$("#"+
16
+ s[H]).removeClass(h.highlight2);!0===l(c)&&$("#"+s[c]).addClass(h.highlight2);if("function"===typeof b.onDragMove)b.onDragMove(c,H,t,E,m(g),u);H=c}}function ba(a){var e="drop";"offboard"===a&&"snapback"===b.dropOffBoard&&(e="snapback");"offboard"===a&&"trash"===b.dropOffBoard&&(e="trash");if(!0===b.hasOwnProperty("onDrop")&&"function"===typeof b.onDrop){var c=m(g);"spare"===t&&!0===l(a)&&(c[a]=E);!0===l(t)&&"offboard"===a&&delete c[t];!0===l(t)&&!0===l(a)&&(delete c[t],c[a]=E);var d=m(g),c=b.onDrop(t,
17
+ a,E,c,d,u);if("snapback"===c||"trash"===c)e=c}"snapback"===e?ma():"trash"===e?Z():"drop"===e&&na(a)}function oa(a){a.preventDefault()}function pa(a){if(!0===b.draggable){var e=$(this).attr("data-square");!0===l(e)&&!0===g.hasOwnProperty(e)&&P(e,g[e],a.pageX,a.pageY)}}function qa(a){if(!0===b.draggable){var e=$(this).attr("data-square");!0===l(e)&&!0===g.hasOwnProperty(e)&&(a=a.originalEvent,P(e,g[e],a.changedTouches[0].pageX,a.changedTouches[0].pageY))}}function ra(a){if(!0===b.sparePieces){var e=
18
+ $(this).attr("data-piece");P("spare",e,a.pageX,a.pageY)}}function sa(a){if(!0===b.sparePieces){var e=$(this).attr("data-piece");a=a.originalEvent;P("spare",e,a.changedTouches[0].pageX,a.changedTouches[0].pageY)}}function ca(a){!0===z&&aa(a.pageX,a.pageY)}function ta(a){!0===z&&(a.preventDefault(),aa(a.originalEvent.changedTouches[0].pageX,a.originalEvent.changedTouches[0].pageY))}function da(a){!0===z&&(a=U(a.pageX,a.pageY),ba(a))}function ua(a){!0===z&&(a=U(a.originalEvent.changedTouches[0].pageX,
19
+ a.originalEvent.changedTouches[0].pageY),ba(a))}function va(a){if(!1===z&&(!0===b.hasOwnProperty("onMouseoverSquare")&&"function"===typeof b.onMouseoverSquare)&&(a=$(a.currentTarget).attr("data-square"),!0===l(a))){var e=!1;!0===g.hasOwnProperty(a)&&(e=g[a]);b.onMouseoverSquare(a,e,m(g),u)}}function wa(a){if(!1===z&&(!0===b.hasOwnProperty("onMouseoutSquare")&&"function"===typeof b.onMouseoutSquare)&&(a=$(a.currentTarget).attr("data-square"),!0===l(a))){var e=!1;!0===g.hasOwnProperty(a)&&(e=g[a]);
20
+ b.onMouseoutSquare(a,e,m(g),u)}}function xa(){$("body").on("mousedown mousemove","."+h.piece,oa);x.on("mousedown","."+h.square,pa);v.on("mousedown","."+h.sparePieces+" ."+h.piece,ra);x.on("mouseenter","."+h.square,va);x.on("mouseleave","."+h.square,wa);!0===(navigator&&navigator.userAgent&&-1!==navigator.userAgent.search(/MSIE/))?(document.ondragstart=function(){return!1},$("body").on("mousemove",ca),$("body").on("mouseup",da)):($(window).on("mousemove",ca),$(window).on("mouseup",da));!0==="ontouchstart"in
21
+ document.documentElement&&(x.on("touchstart","."+h.square,qa),v.on("touchstart","."+h.sparePieces+" ."+h.piece,sa),$(window).on("touchmove",ta),$(window).on("touchend",ua))}function ya(){v.html(ga());x=v.find("."+h.board);!0===b.sparePieces&&(S=v.find("."+h.sparePiecesTop),T=v.find("."+h.sparePiecesBottom));var a=n();$("body").append(D("wP",!0,a));y=$("#"+a);ea=parseInt(x.css("borderLeftWidth"),10);q.resize()}b=b||{};var fa=K("rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR"),h={alpha:"alpha-d2270",black:"black-3c85d",
22
+ board:"board-b72b1",chessboard:"chessboard-63f37",clearfix:"clearfix-7da63",highlight1:"highlight1-32417",highlight2:"highlight2-9c5d2",notation:"notation-322f9",numeric:"numeric-fc462",piece:"piece-417db",row:"row-5277c",sparePieces:"spare-pieces-7492f",sparePiecesBottom:"spare-pieces-bottom-ae20f",sparePiecesTop:"spare-pieces-top-4028b",square:"square-55d63",white:"white-1e1d7"},v,x,y,S,T,q={},ea=2,u="white",g={},p,E,H,t,z=!1,M={},s={},J;q.clear=function(a){q.position({},a)};q.destroy=function(){v.html("");
23
+ y.remove();v.unbind()};q.fen=function(){return q.position("fen")};q.flip=function(){q.orientation("flip")};q.move=function(){if(0!==arguments.length){for(var a=!0,b={},c=0;c<arguments.length;c++)if(!1===arguments[c])a=!1;else{var d;d=arguments[c];"string"!==typeof d?d=!1:(d=d.split("-"),d=2!==d.length?!1:!0===l(d[0])&&!0===l(d[1]));!0!==d?r(2826,"Invalid move passed to the move method.",arguments[c]):(d=arguments[c].split("-"),b[d[0]]=d[1])}var c=g,c=m(c),f;for(f in b)!0===b.hasOwnProperty(f)&&!0===
24
+ c.hasOwnProperty(f)&&(d=c[f],delete c[f],c[b[f]]=d);b=c;q.position(b,a);return b}};q.orientation=function(a){if(0===arguments.length)return u;"white"===a||"black"===a?(u=a,R()):"flip"===a?(u="white"===u?"black":"white",R()):r(5482,"Invalid value passed to the orientation method.",a)};q.position=function(a,b){if(0===arguments.length)return m(g);if("string"===typeof a&&"fen"===a.toLowerCase())return L(g);!1!==b&&(b=!0);"string"===typeof a&&"start"===a.toLowerCase()&&(a=m(fa));!0===Q(a)&&(a=K(a));if(!0!==
25
+ F(a))r(6482,"Invalid value passed to the position method.",a);else if(!0===b){var c=g,d=a,c=m(c),d=m(d),f=[],h={},k;for(k in d)!0===d.hasOwnProperty(k)&&(!0===c.hasOwnProperty(k)&&c[k]===d[k])&&(delete c[k],delete d[k]);for(k in d)if(!0===d.hasOwnProperty(k)){var l;a:{l=c;for(var n=d[k],s=la(k),p=0;p<s.length;p++){var q=s[p];if(!0===l.hasOwnProperty(q)&&l[q]===n){l=q;break a}}l=!1}!1!==l&&(f.push({type:"move",source:l,destination:k,piece:d[k]}),delete c[l],delete d[k],h[k]=!0)}for(k in d)!0===d.hasOwnProperty(k)&&
26
+ (f.push({type:"add",square:k,piece:d[k]}),delete d[k]);for(k in c)!0===c.hasOwnProperty(k)&&!0!==h.hasOwnProperty(k)&&(f.push({type:"clear",square:k,piece:c[k]}),delete c[k]);ja(f,g,a);O(a)}else O(a),G()};q.resize=function(){var a=parseInt(v.css("width"),10);if(!a||0>=a)p=0;else{for(a-=1;0!==a%8&&0<a;)a--;p=a/8}x.css("width",8*p+"px");y.css({height:p,width:p});!0===b.sparePieces&&v.find("."+h.sparePieces).css("paddingLeft",p+ea+"px");R()};q.start=function(a){q.position("start",a)};var W;if(W=!0===
27
+ function(){if("string"===typeof f){if(""===f)return window.alert("ChessBoard Error 1001: The first argument to ChessBoard() cannot be an empty string.\n\nExiting..."),!1;var a=document.getElementById(f);if(!a)return window.alert('ChessBoard Error 1002: Element with id "'+f+'" does not exist in the DOM.\n\nExiting...'),!1;v=$(a)}else if(v=$(f),1!==v.length)return window.alert("ChessBoard Error 1003: The first argument to ChessBoard() must be an ID or a single DOM node.\n\nExiting..."),!1;if(!window.JSON||
28
+ "function"!==typeof JSON.stringify||"function"!==typeof JSON.parse)return window.alert("ChessBoard Error 1004: JSON does not exist. Please include a JSON polyfill.\n\nExiting..."),!1;if(a=typeof window.$)if(a=$.fn)if(a=$.fn.jquery)var a=$.fn.jquery,b="1.7.0",a=X(a),b=X(b),a=!0===1E8*a.major+1E4*a.minor+a.patch>=1E8*b.major+1E4*b.minor+b.patch;return a?!0:(window.alert("ChessBoard Error 1005: Unable to find a valid version of jQuery. Please include jQuery 1.7.0 or higher on the page.\n\nExiting..."),
29
+ !1)}()){if("string"===typeof b||!0===F(b))b={position:b};"black"!==b.orientation&&(b.orientation="white");u=b.orientation;!1!==b.showNotation&&(b.showNotation=!0);!0!==b.draggable&&(b.draggable=!1);"trash"!==b.dropOffBoard&&(b.dropOffBoard="snapback");!0!==b.sparePieces&&(b.sparePieces=!1);!0===b.sparePieces&&(b.draggable=!0);if(!0!==b.hasOwnProperty("pieceTheme")||"string"!==typeof b.pieceTheme&&"function"!==typeof b.pieceTheme)b.pieceTheme="assets/chesspieces/wikipedia/{piece}.png";if(!0!==b.hasOwnProperty("appearSpeed")||
30
+ !0!==w(b.appearSpeed))b.appearSpeed=200;if(!0!==b.hasOwnProperty("moveSpeed")||!0!==w(b.moveSpeed))b.moveSpeed=200;if(!0!==b.hasOwnProperty("snapbackSpeed")||!0!==w(b.snapbackSpeed))b.snapbackSpeed=50;if(!0!==b.hasOwnProperty("snapSpeed")||!0!==w(b.snapSpeed))b.snapSpeed=25;if(!0!==b.hasOwnProperty("trashSpeed")||!0!==w(b.trashSpeed))b.trashSpeed=100;!0===b.hasOwnProperty("position")&&("start"===b.position?g=m(fa):!0===Q(b.position)?g=K(b.position):!0===F(b.position)?g=m(b.position):r(7263,"Invalid value passed to config.position.",
31
+ b.position));W=!0}W&&(I(),ya(),xa());return q};window.ChessBoard.fenToObj=K;window.ChessBoard.objToFen=L})();
@@ -0,0 +1,4 @@
1
+ class ChessboardController < ApplicationController
2
+ def chessboard
3
+ end
4
+ end
@@ -0,0 +1,5 @@
1
+ <div id="board" style="width: 600px"></div>
2
+
3
+ <script type="text/javascript">
4
+ var board = ChessBoard('board');
5
+ </script>
@@ -0,0 +1,83 @@
1
+ <div id="board" style="width: 600px"></div>
2
+
3
+ <script type="text/javascript">
4
+ var board,
5
+ game = new Chess();
6
+
7
+ var removeGreySquares = function() {
8
+ $('#board .square-55d63').css('background', '');
9
+ };
10
+
11
+ var greySquare = function(square) {
12
+ var squareEl = $('#board .square-' + square);
13
+
14
+ var background = '#a9a9a9';
15
+ if (squareEl.hasClass('black-3c85d') === true) {
16
+ background = '#696969';
17
+ }
18
+
19
+ squareEl.css('background', background);
20
+ };
21
+
22
+ var onDragStart = function(source, piece) {
23
+ // do not pick up pieces if the game is over
24
+ // or if it's not that side's turn
25
+ if (game.game_over() === true ||
26
+ (game.turn() === 'w' && piece.search(/^b/) !== -1) ||
27
+ (game.turn() === 'b' && piece.search(/^w/) !== -1)) {
28
+ return false;
29
+ }
30
+ };
31
+
32
+ var onDrop = function(source, target) {
33
+ removeGreySquares();
34
+
35
+ // see if the move is legal
36
+ var move = game.move({
37
+ from: source,
38
+ to: target,
39
+ promotion: 'q' // NOTE: always promote to a queen for example simplicity
40
+ });
41
+
42
+ // illegal move
43
+ if (move === null) return 'snapback';
44
+ };
45
+
46
+ var onMouseoverSquare = function(square, piece) {
47
+ // get list of possible moves for this square
48
+ var moves = game.moves({
49
+ square: square,
50
+ verbose: true
51
+ });
52
+
53
+ // exit if there are no moves available for this square
54
+ if (moves.length === 0) return;
55
+
56
+ // highlight the square they moused over
57
+ greySquare(square);
58
+
59
+ // highlight the possible squares for this piece
60
+ for (var i = 0; i < moves.length; i++) {
61
+ greySquare(moves[i].to);
62
+ }
63
+ };
64
+
65
+ var onMouseoutSquare = function(square, piece) {
66
+ removeGreySquares();
67
+ };
68
+
69
+ var onSnapEnd = function() {
70
+ board.position(game.fen());
71
+ };
72
+
73
+ var cfg = {
74
+ draggable: true,
75
+ position: 'start',
76
+ onDragStart: onDragStart,
77
+ onDrop: onDrop,
78
+ onMouseoutSquare: onMouseoutSquare,
79
+ onMouseoverSquare: onMouseoverSquare,
80
+ onSnapEnd: onSnapEnd
81
+ };
82
+ board = ChessBoard('board', cfg);
83
+ </script>
@@ -0,0 +1,84 @@
1
+ <div id="board" style="width: 600px"></div>
2
+ <p>Status: <span id="status"></span></p>
3
+
4
+ <script type="text/javascript">
5
+ var board,
6
+ game = new Chess(),
7
+ statusEl = $('#status'),
8
+ fenEl = $('#fen'),
9
+ pgnEl = $('#pgn');
10
+
11
+ // do not pick up pieces if the game is over
12
+ // only pick up pieces for the side to move
13
+ var onDragStart = function(source, piece, position, orientation) {
14
+ if (game.game_over() === true ||
15
+ (game.turn() === 'w' && piece.search(/^b/) !== -1) ||
16
+ (game.turn() === 'b' && piece.search(/^w/) !== -1)) {
17
+ return false;
18
+ }
19
+ };
20
+
21
+ var onDrop = function(source, target) {
22
+ // see if the move is legal
23
+ var move = game.move({
24
+ from: source,
25
+ to: target,
26
+ promotion: 'q' // NOTE: always promote to a queen for example simplicity
27
+ });
28
+
29
+ // illegal move
30
+ if (move === null) return 'snapback';
31
+
32
+ updateStatus();
33
+ };
34
+
35
+ // update the board position after the piece snap
36
+ // for castling, en passant, pawn promotion
37
+ var onSnapEnd = function() {
38
+ board.position(game.fen());
39
+ };
40
+
41
+ var updateStatus = function() {
42
+ var status = '';
43
+
44
+ var moveColor = 'White';
45
+ if (game.turn() === 'b') {
46
+ moveColor = 'Black';
47
+ }
48
+
49
+ // checkmate?
50
+ if (game.in_checkmate() === true) {
51
+ status = 'Game over, ' + moveColor + ' is in checkmate.';
52
+ }
53
+
54
+ // draw?
55
+ else if (game.in_draw() === true) {
56
+ status = 'Game over, drawn position';
57
+ }
58
+
59
+ // game still on
60
+ else {
61
+ status = moveColor + ' to move';
62
+
63
+ // check?
64
+ if (game.in_check() === true) {
65
+ status += ', ' + moveColor + ' is in check';
66
+ }
67
+ }
68
+
69
+ statusEl.html(status);
70
+ fenEl.html(game.fen());
71
+ pgnEl.html(game.pgn());
72
+ };
73
+
74
+ var cfg = {
75
+ draggable: true,
76
+ position: 'start',
77
+ onDragStart: onDragStart,
78
+ onDrop: onDrop,
79
+ onSnapEnd: onSnapEnd
80
+ };
81
+ board = ChessBoard('board', cfg);
82
+
83
+ updateStatus();
84
+ </script>
@@ -0,0 +1,68 @@
1
+ <style type="text/css">
2
+ .highlight-white {
3
+ -webkit-box-shadow: inset 0 0 3px 3px yellow;
4
+ -moz-box-shadow: inset 0 0 3px 3px yellow;
5
+ box-shadow: inset 0 0 3px 3px yellow;
6
+ }
7
+ .highlight-black {
8
+ -webkit-box-shadow: inset 0 0 3px 3px blue;
9
+ -moz-box-shadow: inset 0 0 3px 3px blue;
10
+ box-shadow: inset 0 0 3px 3px blue;
11
+ }
12
+ </style>
13
+ <div id="board" style="width: 600px"></div>
14
+
15
+
16
+ <script type="text/javascript">
17
+ var board,
18
+ boardEl = $('#board'),
19
+ game = new Chess(),
20
+ squareClass = 'square-55d63',
21
+ squareToHighlight,
22
+ colorToHighlight;
23
+
24
+ var makeRandomMove = function() {
25
+ var possibleMoves = game.moves({
26
+ verbose: true
27
+ });
28
+
29
+ // exit if the game is over
30
+ if (game.game_over() === true ||
31
+ game.in_draw() === true ||
32
+ possibleMoves.length === 0) return;
33
+
34
+ var randomIndex = Math.floor(Math.random() * possibleMoves.length);
35
+ var move = possibleMoves[randomIndex];
36
+
37
+ if (move.color === 'w') {
38
+ boardEl.find('.' + squareClass).removeClass('highlight-white');
39
+ boardEl.find('.square-' + move.from).addClass('highlight-white');
40
+ squareToHighlight = move.to;
41
+ colorToHighlight = 'white';
42
+ }
43
+ else {
44
+ boardEl.find('.square-55d63').removeClass('highlight-black');
45
+ boardEl.find('.square-' + move.from).addClass('highlight-black');
46
+ squareToHighlight = move.to;
47
+ colorToHighlight = 'black';
48
+ }
49
+
50
+ game.move(possibleMoves[randomIndex].san);
51
+ board.position(game.fen());
52
+
53
+ window.setTimeout(makeRandomMove, 1200);
54
+ };
55
+
56
+ var onMoveEnd = function() {
57
+ boardEl.find('.square-' + squareToHighlight)
58
+ .addClass('highlight-' + colorToHighlight);
59
+ };
60
+
61
+ var cfg = {
62
+ position: 'start',
63
+ onMoveEnd: onMoveEnd
64
+ };
65
+ board = ChessBoard('board', cfg);
66
+
67
+ window.setTimeout(makeRandomMove, 500);
68
+ </script>
@@ -0,0 +1,97 @@
1
+ <style type="text/css">
2
+ .highlight-white {
3
+ -webkit-box-shadow: inset 0 0 3px 3px yellow;
4
+ -moz-box-shadow: inset 0 0 3px 3px yellow;
5
+ box-shadow: inset 0 0 3px 3px yellow;
6
+ }
7
+ .highlight-black {
8
+ -webkit-box-shadow: inset 0 0 3px 3px blue;
9
+ -moz-box-shadow: inset 0 0 3px 3px blue;
10
+ box-shadow: inset 0 0 3px 3px blue;
11
+ }
12
+ </style>
13
+ <div id="board" style="width: 600px"></div>
14
+
15
+
16
+ <script type="text/javascript">
17
+ var board,
18
+ boardEl = $('#board'),
19
+ game = new Chess(),
20
+ squareToHighlight;
21
+
22
+ var removeHighlights = function(color) {
23
+ boardEl.find('.square-55d63')
24
+ .removeClass('highlight-' + color);
25
+ };
26
+
27
+ // do not pick up pieces if the game is over
28
+ // only pick up pieces for White
29
+ var onDragStart = function(source, piece, position, orientation) {
30
+ if (game.in_checkmate() === true || game.in_draw() === true ||
31
+ piece.search(/^b/) !== -1) {
32
+ return false;
33
+ }
34
+ };
35
+
36
+ var makeRandomMove = function() {
37
+ var possibleMoves = game.moves({
38
+ verbose: true
39
+ });
40
+
41
+ // game over
42
+ if (possibleMoves.length === 0) return;
43
+
44
+ var randomIndex = Math.floor(Math.random() * possibleMoves.length);
45
+ var move = possibleMoves[randomIndex];
46
+ game.move(move.san);
47
+
48
+ // highlight black's move
49
+ removeHighlights('black');
50
+ boardEl.find('.square-' + move.from).addClass('highlight-black');
51
+ squareToHighlight = move.to;
52
+
53
+ // update the board to the new position
54
+ board.position(game.fen());
55
+ };
56
+
57
+ var onDrop = function(source, target) {
58
+ // see if the move is legal
59
+ var move = game.move({
60
+ from: source,
61
+ to: target,
62
+ promotion: 'q' // NOTE: always promote to a queen for example simplicity
63
+ });
64
+
65
+ // illegal move
66
+ if (move === null) return 'snapback';
67
+
68
+ // highlight white's move
69
+ removeHighlights('white');
70
+ boardEl.find('.square-' + source).addClass('highlight-white');
71
+ boardEl.find('.square-' + target).addClass('highlight-white');
72
+
73
+ // make random move for black
74
+ window.setTimeout(makeRandomMove, 250);
75
+ };
76
+
77
+ var onMoveEnd = function() {
78
+ boardEl.find('.square-' + squareToHighlight)
79
+ .addClass('highlight-black');
80
+ };
81
+
82
+ // update the board position after the piece snap
83
+ // for castling, en passant, pawn promotion
84
+ var onSnapEnd = function() {
85
+ board.position(game.fen());
86
+ };
87
+
88
+ var cfg = {
89
+ draggable: true,
90
+ position: 'start',
91
+ onDragStart: onDragStart,
92
+ onDrop: onDrop,
93
+ onMoveEnd: onMoveEnd,
94
+ onSnapEnd: onSnapEnd
95
+ };
96
+ board = ChessBoard('board', cfg);
97
+ </script>
@@ -0,0 +1,98 @@
1
+ <style type="text/css">
2
+ .highlight-white {
3
+ -webkit-box-shadow: inset 0 0 3px 3px yellow;
4
+ -moz-box-shadow: inset 0 0 3px 3px yellow;
5
+ box-shadow: inset 0 0 3px 3px yellow;
6
+ }
7
+ .highlight-black {
8
+ -webkit-box-shadow: inset 0 0 3px 3px blue;
9
+ -moz-box-shadow: inset 0 0 3px 3px blue;
10
+ box-shadow: inset 0 0 3px 3px blue;
11
+ }
12
+ </style>
13
+ <div id="board" style="width: 600px"></div>
14
+
15
+
16
+
17
+ <script type="text/javascript">
18
+ var board,
19
+ boardEl = $('#board'),
20
+ game = new Chess(),
21
+ squareToHighlight;
22
+
23
+ var removeHighlights = function(color) {
24
+ boardEl.find('.square-55d63')
25
+ .removeClass('highlight-' + color);
26
+ };
27
+
28
+ // do not pick up pieces if the game is over
29
+ // only pick up pieces for White
30
+ var onDragStart = function(source, piece, position, orientation) {
31
+ if (game.in_checkmate() === true || game.in_draw() === true ||
32
+ piece.search(/^b/) !== -1) {
33
+ return false;
34
+ }
35
+ };
36
+
37
+ var makeRandomMove = function() {
38
+ var possibleMoves = game.moves({
39
+ verbose: true
40
+ });
41
+
42
+ // game over
43
+ if (possibleMoves.length === 0) return;
44
+
45
+ var randomIndex = Math.floor(Math.random() * possibleMoves.length);
46
+ var move = possibleMoves[randomIndex];
47
+ game.move(move.san);
48
+
49
+ // highlight black's move
50
+ removeHighlights('black');
51
+ boardEl.find('.square-' + move.from).addClass('highlight-black');
52
+ squareToHighlight = move.to;
53
+
54
+ // update the board to the new position
55
+ board.position(game.fen());
56
+ };
57
+
58
+ var onDrop = function(source, target) {
59
+ // see if the move is legal
60
+ var move = game.move({
61
+ from: source,
62
+ to: target,
63
+ promotion: 'q' // NOTE: always promote to a queen for example simplicity
64
+ });
65
+
66
+ // illegal move
67
+ if (move === null) return 'snapback';
68
+
69
+ // highlight white's move
70
+ removeHighlights('white');
71
+ boardEl.find('.square-' + source).addClass('highlight-white');
72
+ boardEl.find('.square-' + target).addClass('highlight-white');
73
+
74
+ // make random move for black
75
+ window.setTimeout(makeRandomMove, 250);
76
+ };
77
+
78
+ var onMoveEnd = function() {
79
+ boardEl.find('.square-' + squareToHighlight)
80
+ .addClass('highlight-black');
81
+ };
82
+
83
+ // update the board position after the piece snap
84
+ // for castling, en passant, pawn promotion
85
+ var onSnapEnd = function() {
86
+ board.position(game.fen());
87
+ };
88
+
89
+ var cfg = {
90
+ draggable: true,
91
+ position: 'start',
92
+ onDragStart: onDragStart,
93
+ onDrop: onDrop,
94
+ onMoveEnd: onMoveEnd,
95
+ onSnapEnd: onSnapEnd
96
+ };
97
+ board = ChessBoard('board', cfg);
98
+ </script>
@@ -0,0 +1,25 @@
1
+ <div id="board" style="width: 600px"></div>
2
+
3
+ <script type="text/javascript">
4
+ var board,
5
+ game = new Chess();
6
+
7
+ var makeRandomMove = function() {
8
+ var possibleMoves = game.moves();
9
+
10
+ // exit if the game is over
11
+ if (game.game_over() === true ||
12
+ game.in_draw() === true ||
13
+ possibleMoves.length === 0) return;
14
+
15
+ var randomIndex = Math.floor(Math.random() * possibleMoves.length);
16
+ game.move(possibleMoves[randomIndex]);
17
+ board.position(game.fen());
18
+
19
+ window.setTimeout(makeRandomMove, 500);
20
+ };
21
+
22
+ board = ChessBoard('board', 'start');
23
+
24
+ window.setTimeout(makeRandomMove, 500);
25
+ </script>
metadata ADDED
@@ -0,0 +1,144 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chessboard
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dhrubomoy Das Gupta
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-09-18 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.12'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.12'
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: rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 5.0.0
62
+ - - ">="
63
+ - !ruby/object:Gem::Version
64
+ version: 5.0.0.1
65
+ type: :development
66
+ prerelease: false
67
+ version_requirements: !ruby/object:Gem::Requirement
68
+ requirements:
69
+ - - "~>"
70
+ - !ruby/object:Gem::Version
71
+ version: 5.0.0
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: 5.0.0.1
75
+ description:
76
+ email:
77
+ - dhrubo_moy@yahoo.com
78
+ executables: []
79
+ extensions: []
80
+ extra_rdoc_files: []
81
+ files:
82
+ - ".gitignore"
83
+ - ".rspec"
84
+ - ".travis.yml"
85
+ - CODE_OF_CONDUCT.md
86
+ - Gemfile
87
+ - LICENSE.txt
88
+ - README.md
89
+ - Rakefile
90
+ - bin/console
91
+ - bin/setup
92
+ - chessboard.gemspec
93
+ - lib/chessboard.rb
94
+ - lib/chessboard/version.rb
95
+ - lib/generators/chessboard/USAGE
96
+ - lib/generators/chessboard/chessboard_generator.rb
97
+ - lib/generators/chessboard/templates/chess.min.js
98
+ - lib/generators/chessboard/templates/chessboard-0.3.0.min.css
99
+ - lib/generators/chessboard/templates/chessboard-0.3.0.min.js
100
+ - lib/generators/chessboard/templates/chessboard_controller.rb
101
+ - lib/generators/chessboard/templates/chessboard_empty_board.html.erb
102
+ - lib/generators/chessboard/templates/chessboard_highlight_legal_moves.html.erb
103
+ - lib/generators/chessboard/templates/chessboard_only_legal_moves.html.erb
104
+ - lib/generators/chessboard/templates/chessboard_piece_highlighting_1.html.erb
105
+ - lib/generators/chessboard/templates/chessboard_piece_highlighting_2.html.erb
106
+ - lib/generators/chessboard/templates/chessboard_play_random_computer.html.erb
107
+ - lib/generators/chessboard/templates/chessboard_random_vs_random.html.erb
108
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bB.png
109
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bK.png
110
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bN.png
111
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bP.png
112
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bQ.png
113
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/bR.png
114
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wB.png
115
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wK.png
116
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wN.png
117
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wP.png
118
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wQ.png
119
+ - lib/generators/chessboard/templates/chesspieces/wikipedia/wR.png
120
+ homepage: https://github.com/dhrubomoy/chessboard
121
+ licenses:
122
+ - MIT
123
+ metadata: {}
124
+ post_install_message:
125
+ rdoc_options: []
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - ">="
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.5.1
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Chessboard generator gem for Rails 5 apps.
144
+ test_files: []