play.pug 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. extends layout
  2. block head
  3. //- JSON.stringify, not #{}, so these are emitted as JS literals rather than
  4. //- pasted into JS source. The server already rejects anything that isn't a
  5. //- real token / integer (see the /play route); this is the second layer --
  6. //- Pug's HTML escaping is no defense in a script block, where a numeric
  7. //- payload like `1;alert(1)` needs no HTML characters to run.
  8. script.
  9. var $token = !{JSON.stringify(token)};
  10. var $time = !{JSON.stringify(time)};
  11. var $increment = !{JSON.stringify(increment)};
  12. block content
  13. header.clearfix
  14. ul#clock
  15. li.white
  16. li.black
  17. span#game-type
  18. a.button(href=`${basePath}/`) New game
  19. a.button.button--red.resign Resign
  20. a.button.button--red.rematch Rematch
  21. a.chat
  22. img#bubble(src=`${basePath}/images/chat.svg`, width='50', height='50')
  23. | Chat
  24. audio(id='moveSnd', preload='auto')
  25. source(src=`${basePath}/sounds/move.mp3`)
  26. source(src=`${basePath}/sounds/move.ogg`)
  27. audio(id='messageSnd', preload='auto')
  28. source(src=`${basePath}/sounds/message.mp3`)
  29. #chat-wrapper
  30. h4 Chat
  31. a.close x
  32. ul#chat
  33. form#sendMessage
  34. input
  35. #board_moves_wrapper.clearfix
  36. label(id='sounds_label')
  37. input(type='checkbox', id='sounds')
  38. | Enable sounds
  39. #board_wrapper
  40. #captured-pieces
  41. ul.w
  42. ul.b
  43. table.chess_board.white
  44. tr
  45. td.A8(data-id='A8', draggable='true')
  46. a.black.rook(draggable='true') ♜
  47. td.B8(data-id='B8', draggable='true')
  48. a.black.knight(draggable='true') ♞
  49. td.C8(data-id='C8', draggable='true')
  50. a.black.bishop(draggable='true') ♝
  51. td.D8(data-id='D8', draggable='true')
  52. a.black.king(draggable='true') ♛
  53. td.E8(data-id='E8', draggable='true')
  54. a.black.queen(draggable='true') ♚
  55. td.F8(data-id='F8', draggable='true')
  56. a.black.bishop(draggable='true') ♝
  57. td.G8(data-id='G8', draggable='true')
  58. a.black.knight(draggable='true') ♞
  59. td.H8(data-id='H8', draggable='true')
  60. a.black.rook(draggable='true') ♜
  61. tr
  62. td.A7(data-id='A7', draggable='true')
  63. a.black.pawn(draggable='true') ♟
  64. td.B7(data-id='B7', draggable='true')
  65. a.black.pawn(draggable='true') ♟
  66. td.C7(data-id='C7', draggable='true')
  67. a.black.pawn(draggable='true') ♟
  68. td.D7(data-id='D7', draggable='true')
  69. a.black.pawn(draggable='true') ♟
  70. td.E7(data-id='E7', draggable='true')
  71. a.black.pawn(draggable='true') ♟
  72. td.F7(data-id='F7', draggable='true')
  73. a.black.pawn(draggable='true') ♟
  74. td.G7(data-id='G7', draggable='true')
  75. a.black.pawn(draggable='true') ♟
  76. td.H7(data-id='H7', draggable='true')
  77. a.black.pawn(draggable='true') ♟
  78. tr
  79. td.A6(data-id='A6')
  80. td.B6(data-id='B6')
  81. td.C6(data-id='C6')
  82. td.D6(data-id='D6')
  83. td.E6(data-id='E6')
  84. td.F6(data-id='F6')
  85. td.G6(data-id='G6')
  86. td.H6(data-id='H6')
  87. tr
  88. td.A5(data-id='A5')
  89. td.B5(data-id='B5')
  90. td.C5(data-id='C5')
  91. td.D5(data-id='D5')
  92. td.E5(data-id='E5')
  93. td.F5(data-id='F5')
  94. td.G5(data-id='G5')
  95. td.H5(data-id='H5')
  96. tr
  97. td.A4(data-id='A4')
  98. td.B4(data-id='B4')
  99. td.C4(data-id='C4')
  100. td.D4(data-id='D4')
  101. td.E4(data-id='E4')
  102. td.F4(data-id='F4')
  103. td.G4(data-id='G4')
  104. td.H4(data-id='H4')
  105. tr
  106. td.A3(data-id='A3')
  107. td.B3(data-id='B3')
  108. td.C3(data-id='C3')
  109. td.D3(data-id='D3')
  110. td.E3(data-id='E3')
  111. td.F3(data-id='F3')
  112. td.G3(data-id='G3')
  113. td.H3(data-id='H3')
  114. tr
  115. td.A2(data-id='A2', draggable='true')
  116. a.white.pawn(draggable='true') ♙
  117. td.B2(data-id='B2', draggable='true')
  118. a.white.pawn(draggable='true') ♙
  119. td.C2(data-id='C2', draggable='true')
  120. a.white.pawn(draggable='true') ♙
  121. td.D2(data-id='D2', draggable='true')
  122. a.white.pawn(draggable='true') ♙
  123. td.E2(data-id='E2', draggable='true')
  124. a.white.pawn(draggable='true') ♙
  125. td.F2(data-id='F2', draggable='true')
  126. a.white.pawn(draggable='true') ♙
  127. td.G2(data-id='G2', draggable='true')
  128. a.white.pawn(draggable='true') ♙
  129. td.H2(data-id='H2', draggable='true')
  130. a.white.pawn(draggable='true') ♙
  131. tr
  132. td.A1(data-id='A1', draggable='true')
  133. a.white.rook(draggable='true') ♖
  134. td.B1(data-id='B1', draggable='true')
  135. a.white.night(draggable='true') ♘
  136. td.C1(data-id='C1', draggable='true')
  137. a.white.bishop(draggable='true') ♗
  138. td.D1(data-id='D1', draggable='true')
  139. a.white.king(draggable='true') ♕
  140. td.E1(data-id='E1', draggable='true')
  141. a.white.wife(draggable='true') ♔
  142. td.F1(data-id='F1', draggable='true')
  143. a.white.bishop(draggable='true') ♗
  144. td.G1(data-id='G1', draggable='true')
  145. a.white.night(draggable='true') ♘
  146. td.H1(data-id='H1', draggable='true')
  147. a.white.rook(draggable='true') ♖
  148. table.chess_board.black(style='display: none;')
  149. tr
  150. td.H1(data-id='H1', draggable='true')
  151. a.white.rook(draggable='true') ♖
  152. td.G1(data-id='G1', draggable='true')
  153. a.white.night(draggable='true') ♘
  154. td.F1(data-id='F1', draggable='true')
  155. a.white.bishop(draggable='true') ♗
  156. td.E1(data-id='E1', draggable='true')
  157. a.white.king(draggable='true') ♔
  158. td.D1(data-id='D1', draggable='true')
  159. a.white.queen(draggable='true') ♕
  160. td.C1(data-id='C1', draggable='true')
  161. a.white.bishop(draggable='true') ♗
  162. td.B1(data-id='B1', draggable='true')
  163. a.white.knight(draggable='true') ♘
  164. td.A1(data-id='A1', draggable='true')
  165. a.white.rook(draggable='true') ♖
  166. tr
  167. td.H2(data-id='H2', draggable='true')
  168. a.white.pawn(draggable='true') ♙
  169. td.G2(data-id='G2', draggable='true')
  170. a.white.pawn(draggable='true') ♙
  171. td.F2(data-id='F2', draggable='true')
  172. a.white.pawn(draggable='true') ♙
  173. td.E2(data-id='E2', draggable='true')
  174. a.white.pawn(draggable='true') ♙
  175. td.D2(data-id='D2', draggable='true')
  176. a.white.pawn(draggable='true') ♙
  177. td.C2(data-id='C2', draggable='true')
  178. a.white.pawn(draggable='true') ♙
  179. td.B2(data-id='B2', draggable='true')
  180. a.white.pawn(draggable='true') ♙
  181. td.A2(data-id='A2', draggable='true')
  182. a.white.pawn(draggable='true') ♙
  183. tr
  184. td.H3(data-id='H3')
  185. td.G3(data-id='G3')
  186. td.F3(data-id='F3')
  187. td.E3(data-id='E3')
  188. td.D3(data-id='D3')
  189. td.C3(data-id='C3')
  190. td.B3(data-id='B3')
  191. td.A3(data-id='A3')
  192. tr
  193. td.H4(data-id='H4')
  194. td.G4(data-id='G4')
  195. td.F4(data-id='F4')
  196. td.E4(data-id='E4')
  197. td.D4(data-id='D4')
  198. td.C4(data-id='C4')
  199. td.B4(data-id='B4')
  200. td.A4(data-id='A4')
  201. tr
  202. td.H5(data-id='H5')
  203. td.G5(data-id='G5')
  204. td.F5(data-id='F5')
  205. td.E5(data-id='E5')
  206. td.D5(data-id='D5')
  207. td.C5(data-id='C5')
  208. td.B5(data-id='B5')
  209. td.A5(data-id='A5')
  210. tr
  211. td.H6(data-id='H6')
  212. td.G6(data-id='G6')
  213. td.F6(data-id='F6')
  214. td.E6(data-id='E6')
  215. td.D6(data-id='D6')
  216. td.C6(data-id='C6')
  217. td.B6(data-id='B6')
  218. td.A6(data-id='A6')
  219. tr
  220. td.H7(data-id='H7', draggable='true')
  221. a.black.pawn(draggable='true') ♟
  222. td.G7(data-id='G7', draggable='true')
  223. a.black.pawn(draggable='true') ♟
  224. td.F7(data-id='F7', draggable='true')
  225. a.black.pawn(draggable='true') ♟
  226. td.E7(data-id='E7', draggable='true')
  227. a.black.pawn(draggable='true') ♟
  228. td.D7(data-id='D7', draggable='true')
  229. a.black.pawn(draggable='true') ♟
  230. td.C7(data-id='C7', draggable='true')
  231. a.black.pawn(draggable='true') ♟
  232. td.B7(data-id='B7', draggable='true')
  233. a.black.pawn(draggable='true') ♟
  234. td.A7(data-id='A7', draggable='true')
  235. a.black.pawn(draggable='true') ♟
  236. tr
  237. td.H8(data-id='H8', draggable='true')
  238. a.black.rook(draggable='true') ♜
  239. td.G8(data-id='G8', draggable='true')
  240. a.black.knight(draggable='true') ♞
  241. td.F8(data-id='F8', draggable='true')
  242. a.black.bishop(draggable='true') ♝
  243. td.E8(data-id='E8', draggable='true')
  244. a.black.king(draggable='true') ♚
  245. td.D8(data-id='D8', draggable='true')
  246. a.black.queen(draggable='true') ♛
  247. td.C8(data-id='C8', draggable='true')
  248. a.black.bishop(draggable='true') ♝
  249. td.B8(data-id='B8', draggable='true')
  250. a.black.knight(draggable='true') ♞
  251. td.A8(data-id='A8', draggable='true')
  252. a.black.rook(draggable='true') ♜
  253. table#moves.clearfix
  254. thead
  255. tr
  256. th Table of moves
  257. tbody
  258. tr
  259. span.promotion
  260. label(id='for_promotion') Promotion:
  261. select(id='promotion')
  262. option(value='q', selected) Queen
  263. option(value='r') Rook
  264. option(value='n') Knight
  265. option(value='b') Bishop
  266. span.feedback.whitefeedback
  267. span.feedback-move White to move.
  268. span.feedback-status
  269. block scripts
  270. script(type='text/javascript', src=`${basePath}/javascripts/play.js`)