kokopu-react 3.0.2 → 3.2.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.
- package/.eslintrc.yml +1 -1
- package/CHANGELOG.md +13 -1
- package/dist/lib/chessboard/BoardProperties.d.ts +91 -0
- package/dist/lib/chessboard/BoardProperties.js +43 -0
- package/dist/lib/chessboard/BoardProperties.js.map +1 -0
- package/dist/lib/chessboard/Chessboard.css +13 -13
- package/dist/lib/chessboard/Chessboard.d.ts +14 -58
- package/dist/lib/chessboard/Chessboard.js +26 -92
- package/dist/lib/chessboard/Chessboard.js.map +1 -1
- package/dist/lib/chessboard/ChessboardImpl.js.map +1 -1
- package/dist/lib/chessboard/Draggable.js.map +1 -1
- package/dist/lib/chessboard/Motion.js.map +1 -1
- package/dist/lib/chessboard/colorsets.js.map +1 -1
- package/dist/lib/chessboard/piecesets.js.map +1 -1
- package/dist/lib/errorbox/ErrorBox.css +18 -18
- package/dist/lib/errorbox/ErrorBox.js.map +1 -1
- package/dist/lib/errorbox/parsing.d.ts +57 -0
- package/dist/lib/errorbox/parsing.js +140 -0
- package/dist/lib/errorbox/parsing.js.map +1 -0
- package/dist/lib/exception.js.map +1 -1
- package/dist/lib/i18n.d.ts +6 -0
- package/dist/lib/i18n.js +7 -0
- package/dist/lib/i18n.js.map +1 -1
- package/dist/lib/icons/AnnotationSymbolShape.css +6 -6
- package/dist/lib/icons/AnnotationSymbolShape.js.map +1 -1
- package/dist/lib/icons/ArrowMarkerIcon.js.map +1 -1
- package/dist/lib/icons/ArrowTip.js.map +1 -1
- package/dist/lib/icons/ChessPieceIcon.js.map +1 -1
- package/dist/lib/icons/SquareMarkerIcon.js.map +1 -1
- package/dist/lib/icons/TextMarkerIcon.js.map +1 -1
- package/dist/lib/icons/arrow.css +1 -1
- package/dist/lib/index.d.ts +5 -1
- package/dist/lib/index.js +3 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/movetext/Movetext.css +27 -40
- package/dist/lib/movetext/Movetext.d.ts +9 -43
- package/dist/lib/movetext/Movetext.js +15 -67
- package/dist/lib/movetext/Movetext.js.map +1 -1
- package/dist/lib/movetext/MovetextImpl.d.ts +7 -28
- package/dist/lib/movetext/MovetextImpl.js +15 -94
- package/dist/lib/movetext/MovetextImpl.js.map +1 -1
- package/dist/lib/movetext/fonts.css +7 -7
- package/dist/lib/movetext/htmlFilter.js.map +1 -1
- package/dist/lib/movetext/moveFormatter.js.map +1 -1
- package/dist/lib/navigationboard/NavigationBoard.d.ts +156 -0
- package/dist/lib/navigationboard/NavigationBoard.js +195 -0
- package/dist/lib/navigationboard/NavigationBoard.js.map +1 -0
- package/dist/lib/navigationboard/NavigationButton.d.ts +54 -0
- package/dist/lib/navigationboard/NavigationButton.js +35 -0
- package/dist/lib/navigationboard/NavigationButton.js.map +1 -0
- package/dist/lib/navigationboard/NavigationField.css +36 -0
- package/dist/lib/navigationboard/NavigationField.d.ts +81 -0
- package/dist/lib/navigationboard/NavigationField.js +154 -0
- package/dist/lib/navigationboard/NavigationField.js.map +1 -0
- package/dist/lib/navigationboard/NavigationToolbar.css +54 -0
- package/dist/lib/navigationboard/NavigationToolbar.d.ts +34 -0
- package/dist/lib/navigationboard/NavigationToolbar.js +73 -0
- package/dist/lib/navigationboard/NavigationToolbar.js.map +1 -0
- package/dist/lib/navigationboard/iconPaths.d.ts +29 -0
- package/dist/lib/navigationboard/iconPaths.js +91 -0
- package/dist/lib/navigationboard/iconPaths.js.map +1 -0
- package/dist/lib/sanitization.js.map +1 -1
- package/dist/lib/types.js.map +1 -1
- package/dist/lib/util.js.map +1 -1
- package/doc_src/demo/PageChessboardBase.tsx +115 -115
- package/doc_src/demo/PageChessboardInteraction.tsx +303 -303
- package/doc_src/demo/PageChessboardMove.tsx +173 -156
- package/doc_src/demo/PageChessboardSmallScreens.tsx +94 -94
- package/doc_src/demo/PageMovetextBase.tsx +180 -180
- package/doc_src/demo/PageMovetextInteraction.tsx +123 -123
- package/doc_src/demo/PageNavigationBoardBase.tsx +201 -0
- package/doc_src/demo/PageNavigationBoardUncontrolledVsControlled.tsx +114 -0
- package/doc_src/demo/decs.d.ts +4 -4
- package/doc_src/demo/demo.css +12 -12
- package/doc_src/demo/game-3.pgn +10 -0
- package/doc_src/demo/util.ts +1 -1
- package/doc_src/examples/Movetext.md +1 -1
- package/doc_src/examples/NavigationBoard.md +15 -0
- package/doc_src/theming/LogoRenderer.js +13 -13
- package/doc_src/theming/theming.css +5 -5
- package/package.json +95 -95
- package/scripts/doc.styleguide.config.js +133 -123
- package/scripts/doc.tsconfig.json +5 -5
- package/scripts/docker-compose.yml +1 -1
- package/scripts/test-graphic.tsconfig.json +5 -5
- package/scripts/test-graphic.webpack.config.js +57 -57
- package/scripts/test-headless.webpack.config.js +29 -29
- package/src/chessboard/BoardProperties.ts +131 -0
- package/src/chessboard/Chessboard.css +13 -13
- package/src/chessboard/Chessboard.tsx +389 -518
- package/src/chessboard/ChessboardImpl.tsx +557 -557
- package/src/chessboard/Draggable.tsx +185 -185
- package/src/chessboard/Motion.tsx +67 -67
- package/src/chessboard/colorsets.ts +66 -66
- package/src/chessboard/piecesets.ts +84 -84
- package/src/decs.d.ts +2 -2
- package/src/errorbox/ErrorBox.css +18 -18
- package/src/errorbox/ErrorBox.tsx +75 -75
- package/src/errorbox/parsing.tsx +158 -0
- package/src/exception.ts +17 -17
- package/src/i18n.ts +8 -0
- package/src/icons/AnnotationSymbolShape.css +6 -6
- package/src/icons/AnnotationSymbolShape.tsx +31 -31
- package/src/icons/ArrowMarkerIcon.tsx +34 -34
- package/src/icons/ArrowTip.tsx +14 -14
- package/src/icons/ChessPieceIcon.tsx +45 -45
- package/src/icons/SquareMarkerIcon.tsx +20 -20
- package/src/icons/TextMarkerIcon.tsx +29 -29
- package/src/icons/arrow.css +1 -1
- package/src/index.ts +8 -3
- package/src/movetext/Movetext.css +27 -40
- package/src/movetext/Movetext.tsx +163 -228
- package/src/movetext/MovetextImpl.tsx +351 -438
- package/src/movetext/fonts.css +7 -7
- package/src/movetext/htmlFilter.tsx +129 -129
- package/src/movetext/moveFormatter.tsx +37 -37
- package/src/navigationboard/NavigationBoard.tsx +350 -0
- package/src/navigationboard/NavigationButton.ts +72 -0
- package/src/navigationboard/NavigationField.css +36 -0
- package/src/navigationboard/NavigationField.tsx +185 -0
- package/src/navigationboard/NavigationToolbar.css +54 -0
- package/src/navigationboard/NavigationToolbar.tsx +117 -0
- package/src/navigationboard/iconPaths.ts +98 -0
- package/src/sanitization.ts +17 -17
- package/src/types.ts +116 -116
- package/src/util.ts +11 -11
- package/test/01_types.js +167 -167
- package/test/02_chessboard_util.js +114 -114
- package/test/03_error_box_graphic.js +16 -16
- package/test/04_icons_graphic.js +32 -32
- package/test/05_chessboard_graphic.js +60 -58
- package/test/06_chessboard_animation.js +36 -36
- package/test/07_chessboard_interaction.js +101 -101
- package/test/08_chessboard_play_moves.js +62 -62
- package/test/09_chessboard_small_screens.js +42 -21
- package/test/10_movetext_graphic.js +36 -31
- package/test/11_movetext_interaction.js +100 -96
- package/test/12_navigation_board_base.js +151 -0
- package/test/13_navigation_board_graphic.js +68 -0
- package/test/14_navigation_board_autoplay.js +100 -0
- package/test/common/graphic.js +106 -97
- package/test/graphic_references/05_chessboard_graphic/move/illegal_null-move.png +0 -0
- package/test/graphic_references/05_chessboard_graphic/move/null-move.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_bottom_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/default_top_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_bottom_component.png +0 -0
- package/test/graphic_references/09_chessboard_small_screens/top_bottom_components/reduced_top_component.png +0 -0
- package/test/graphic_references/10_movetext_graphic/format_move/format_text.png +0 -0
- package/test/graphic_references/10_movetext_graphic/options/wrong_piece_symbol_value.png +0 -0
- package/test/graphic_references/11_movetext_interaction/select_moves/click_on_unselected_without_callback.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/default.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/forbidden_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/invalid_node_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/no_callback_defined_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/overriding_initial_node_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/controlled/regular_navigation_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_beginning_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/forbidden_navigation_at_end_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_end.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_at_specific_id.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_default_with_game_index.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/initial_state_on_null-move.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/navigation_with_keys_4.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_flipping_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_0.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_1.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_2.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_3.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_4.png +0 -0
- package/test/graphic_references/12_navigation_board_base/uncontrolled/regular_navigation_5.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_1.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/error_2.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/multiple_buttons.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/additional_buttons/single_button.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/error/pgn_parsing_error.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/error/wrong_game_type.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/custom_1.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/custom_2.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/large.png +0 -0
- package/test/graphic_references/13_navigation_board_graphic/theme/small.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_1_move_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_2_moves_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/after_reaching_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/already_at_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_at_the_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_is-playing_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/controlled/initial_state_not_acknowledging_node_changes.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_2_moves_from_beginning_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_after_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/after_reaching_the_end_before_stop.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_close_to_end.png +0 -0
- package/test/graphic_references/14_navigation_board_autoplay/uncontrolled/initial_state_default.png +0 -0
- package/test/graphic_test_app/03_error_box_graphic/base.tsx +14 -14
- package/test/graphic_test_app/03_error_box_graphic/localization.tsx +1 -1
- package/test/graphic_test_app/04_icons_graphic/chess_piece.tsx +7 -7
- package/test/graphic_test_app/04_icons_graphic/marker.tsx +15 -15
- package/test/graphic_test_app/05_chessboard_graphic/annotations.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/base.tsx +6 -6
- package/test/graphic_test_app/05_chessboard_graphic/chess_variants.tsx +7 -7
- package/test/graphic_test_app/05_chessboard_graphic/flipped.tsx +5 -5
- package/test/graphic_test_app/05_chessboard_graphic/move.tsx +12 -10
- package/test/graphic_test_app/05_chessboard_graphic/theme.tsx +12 -12
- package/test/graphic_test_app/06_chessboard_animation/base_1.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_2.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/base_3.tsx +6 -6
- package/test/graphic_test_app/06_chessboard_animation/on_redraw.tsx +16 -16
- package/test/graphic_test_app/07_chessboard_interaction/click_squares.tsx +5 -5
- package/test/graphic_test_app/07_chessboard_interaction/edit_arrows.tsx +4 -4
- package/test/graphic_test_app/07_chessboard_interaction/error.tsx +2 -2
- package/test/graphic_test_app/07_chessboard_interaction/move_pieces.tsx +5 -5
- package/test/graphic_test_app/08_chessboard_play_moves/base.tsx +8 -8
- package/test/graphic_test_app/08_chessboard_play_moves/promotions.tsx +4 -4
- package/test/graphic_test_app/09_chessboard_small_screens/base.tsx +9 -9
- package/test/graphic_test_app/09_chessboard_small_screens/top_bottom_components.tsx +48 -0
- package/test/graphic_test_app/10_movetext_graphic/base.tsx +4 -4
- package/test/graphic_test_app/10_movetext_graphic/error.tsx +6 -6
- package/test/graphic_test_app/10_movetext_graphic/format_move.tsx +31 -0
- package/test/graphic_test_app/10_movetext_graphic/html.tsx +5 -5
- package/test/graphic_test_app/10_movetext_graphic/options.tsx +10 -9
- package/test/graphic_test_app/11_movetext_interaction/error.tsx +1 -1
- package/test/graphic_test_app/11_movetext_interaction/select_moves.tsx +11 -10
- package/test/graphic_test_app/12_navigation_board_base/controlled.tsx +43 -0
- package/test/graphic_test_app/12_navigation_board_base/uncontrolled.tsx +56 -0
- package/test/graphic_test_app/13_navigation_board_graphic/additional_buttons.tsx +49 -0
- package/test/graphic_test_app/13_navigation_board_graphic/error.tsx +34 -0
- package/test/graphic_test_app/13_navigation_board_graphic/theme.tsx +38 -0
- package/test/graphic_test_app/14_navigation_board_autoplay/controlled.tsx +73 -0
- package/test/graphic_test_app/14_navigation_board_autoplay/uncontrolled.tsx +34 -0
- package/test/graphic_test_app/common/decs.d.ts +2 -2
- package/test/graphic_test_app/common/test_app.css +15 -15
- package/test/graphic_test_app/common/test_app.tsx +48 -48
- package/tsconfig.json +13 -13
package/src/types.ts
CHANGED
|
@@ -50,7 +50,7 @@ export type ChessPieceIconType = ColoredPiece | 'wx' | 'bx';
|
|
|
50
50
|
* Whether the given object is a {@link ChessPieceIconType} or not.
|
|
51
51
|
*/
|
|
52
52
|
export function isChessPieceIconType(iconType: unknown): iconType is ChessPieceIconType {
|
|
53
|
-
|
|
53
|
+
return isColoredPiece(iconType) || iconType === 'wx' || iconType === 'bx';
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
|
|
@@ -61,23 +61,23 @@ export function isChessPieceIconType(iconType: unknown): iconType is ChessPieceI
|
|
|
61
61
|
*/
|
|
62
62
|
export type Colorset = {
|
|
63
63
|
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
/** Color of the black squares. */
|
|
65
|
+
b: string;
|
|
66
66
|
|
|
67
|
-
|
|
68
|
-
|
|
67
|
+
/** Color of the white squares. */
|
|
68
|
+
w: string;
|
|
69
69
|
|
|
70
|
-
|
|
71
|
-
|
|
70
|
+
/** Color of the blue markers. */
|
|
71
|
+
cb: string;
|
|
72
72
|
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
/** Color of the green markers. */
|
|
74
|
+
cg: string;
|
|
75
75
|
|
|
76
|
-
|
|
77
|
-
|
|
76
|
+
/** Color of the red markers. */
|
|
77
|
+
cr: string;
|
|
78
78
|
|
|
79
|
-
|
|
80
|
-
|
|
79
|
+
/** Color of the yellow markers. */
|
|
80
|
+
cy: string;
|
|
81
81
|
};
|
|
82
82
|
|
|
83
83
|
|
|
@@ -88,47 +88,47 @@ export type Colorset = {
|
|
|
88
88
|
*/
|
|
89
89
|
export type Pieceset = {
|
|
90
90
|
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
/** Image for the black bishops. */
|
|
92
|
+
bb: string;
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
94
|
+
/** Image for the black kings. */
|
|
95
|
+
bk: string;
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
/** Image for the black knights. */
|
|
98
|
+
bn: string;
|
|
99
99
|
|
|
100
|
-
|
|
101
|
-
|
|
100
|
+
/** Image for the black pawns. */
|
|
101
|
+
bp: string;
|
|
102
102
|
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
/** Image for the black queens. */
|
|
104
|
+
bq: string;
|
|
105
105
|
|
|
106
|
-
|
|
107
|
-
|
|
106
|
+
/** Image for the black rooks. */
|
|
107
|
+
br: string;
|
|
108
108
|
|
|
109
|
-
|
|
110
|
-
|
|
109
|
+
/** Image for the black turn flags. */
|
|
110
|
+
bx: string;
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
112
|
+
/** Image for the white bishops. */
|
|
113
|
+
wb: string;
|
|
114
114
|
|
|
115
|
-
|
|
116
|
-
|
|
115
|
+
/** Image for the white kings. */
|
|
116
|
+
wk: string;
|
|
117
117
|
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
/** Image for the white knights. */
|
|
119
|
+
wn: string;
|
|
120
120
|
|
|
121
|
-
|
|
122
|
-
|
|
121
|
+
/** Image for the white pawns. */
|
|
122
|
+
wp: string;
|
|
123
123
|
|
|
124
|
-
|
|
125
|
-
|
|
124
|
+
/** Image for the white queens. */
|
|
125
|
+
wq: string;
|
|
126
126
|
|
|
127
|
-
|
|
128
|
-
|
|
127
|
+
/** Image for the white rooks. */
|
|
128
|
+
wr: string;
|
|
129
129
|
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
/** Image for the white turn flags. */
|
|
131
|
+
wx: string;
|
|
132
132
|
};
|
|
133
133
|
|
|
134
134
|
|
|
@@ -136,12 +136,12 @@ export type Pieceset = {
|
|
|
136
136
|
* Set of aliases for chess pieces symbols.
|
|
137
137
|
*/
|
|
138
138
|
export type PieceSymbolMapping = {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
139
|
+
K: string;
|
|
140
|
+
Q: string;
|
|
141
|
+
R: string;
|
|
142
|
+
B: string;
|
|
143
|
+
N: string;
|
|
144
|
+
P: string;
|
|
145
145
|
};
|
|
146
146
|
|
|
147
147
|
|
|
@@ -149,15 +149,15 @@ export type PieceSymbolMapping = {
|
|
|
149
149
|
* Whether the given object is a {@link PieceSymbolMapping} or not.
|
|
150
150
|
*/
|
|
151
151
|
export function isPieceSymbolMapping(mapping: unknown): mapping is PieceSymbolMapping {
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
152
|
+
if (typeof mapping !== 'object' || mapping === null) {
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
return typeof (mapping as PieceSymbolMapping).K === 'string' &&
|
|
156
|
+
typeof (mapping as PieceSymbolMapping).Q === 'string' &&
|
|
157
|
+
typeof (mapping as PieceSymbolMapping).R === 'string' &&
|
|
158
|
+
typeof (mapping as PieceSymbolMapping).B === 'string' &&
|
|
159
|
+
typeof (mapping as PieceSymbolMapping).N === 'string' &&
|
|
160
|
+
typeof (mapping as PieceSymbolMapping).P === 'string';
|
|
161
161
|
}
|
|
162
162
|
|
|
163
163
|
|
|
@@ -165,16 +165,16 @@ export function isPieceSymbolMapping(mapping: unknown): mapping is PieceSymbolMa
|
|
|
165
165
|
* Symbol that can be chosen to decorate a square in a {@link Chessboard}.
|
|
166
166
|
*/
|
|
167
167
|
export type AnnotationSymbol = 'plus' | 'times' | 'dot' | 'circle' |
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
168
|
+
'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'J' | 'K' | 'L' | 'M' | 'N' | 'O' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'X' | 'Y' | 'Z' |
|
|
169
|
+
'a' | 'b' | 'c' | 'd' | 'e' | 'f' | 'g' | 'h' | 'i' | 'j' | 'k' | 'l' | 'm' | 'n' | 'o' | 'p' | 'q' | 'r' | 's' | 't' | 'u' | 'v' | 'w' | 'x' | 'y' | 'z' |
|
|
170
|
+
'0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9';
|
|
171
171
|
|
|
172
172
|
|
|
173
173
|
/**
|
|
174
174
|
* Whether the given object is a {@link AnnotationSymbol} or not.
|
|
175
175
|
*/
|
|
176
176
|
export function isAnnotationSymbol(symbol: unknown): symbol is AnnotationSymbol {
|
|
177
|
-
|
|
177
|
+
return typeof symbol === 'string' && /^(?:[A-Za-z0-9]|plus|times|dot|circle)$/.test(symbol);
|
|
178
178
|
}
|
|
179
179
|
|
|
180
180
|
|
|
@@ -188,7 +188,7 @@ export type AnnotationColor = 'b' | 'g' | 'r' | 'y';
|
|
|
188
188
|
* Whether the given object is a {@link AnnotationSymbol} or not.
|
|
189
189
|
*/
|
|
190
190
|
export function isAnnotationColor(color: unknown): color is AnnotationColor {
|
|
191
|
-
|
|
191
|
+
return color === 'b' || color === 'g' || color === 'r' || color === 'y';
|
|
192
192
|
}
|
|
193
193
|
|
|
194
194
|
|
|
@@ -217,14 +217,14 @@ export type ArrowMarkerSet = Partial<Record<SquareCouple, AnnotationColor>>;
|
|
|
217
217
|
* @returns For example: `'Gd5,Ge4'`
|
|
218
218
|
*/
|
|
219
219
|
export function flattenSquareMarkers(markers: SquareMarkerSet): string {
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
220
|
+
if (typeof markers !== 'object' || markers === null) {
|
|
221
|
+
throw new IllegalArgument('flattenSquareMarkers()', 'markers');
|
|
222
|
+
}
|
|
223
|
+
return Object.entries(markers)
|
|
224
|
+
.filter(([ sq, color ]) => isSquare(sq) && isAnnotationColor(color))
|
|
225
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
226
|
+
.map(([ sq, color ]) => color.toUpperCase() + sq)
|
|
227
|
+
.join(',');
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
|
|
@@ -235,14 +235,14 @@ export function flattenSquareMarkers(markers: SquareMarkerSet): string {
|
|
|
235
235
|
* @returns For example: `'Rzd5,GAe4,Y(plus)h3'`
|
|
236
236
|
*/
|
|
237
237
|
export function flattenTextMarkers(markers: TextMarkerSet): string {
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
238
|
+
if (typeof markers !== 'object' || markers === null) {
|
|
239
|
+
throw new IllegalArgument('flattenTextMarkers()', 'markers');
|
|
240
|
+
}
|
|
241
|
+
return Object.entries(markers)
|
|
242
|
+
.filter(([ sq, desc ]) => isSquare(sq) && desc && isAnnotationColor(desc.color) && isAnnotationSymbol(desc.symbol))
|
|
243
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
244
|
+
.map(([ sq, desc ]) => desc.color.toUpperCase() + (desc.symbol.length === 1 ? desc.symbol : `(${desc.symbol})`) + sq)
|
|
245
|
+
.join(',');
|
|
246
246
|
}
|
|
247
247
|
|
|
248
248
|
|
|
@@ -253,14 +253,14 @@ export function flattenTextMarkers(markers: TextMarkerSet): string {
|
|
|
253
253
|
* @returns For example: `'Ge2e4,Rg8f6,Bg8h6'`
|
|
254
254
|
*/
|
|
255
255
|
export function flattenArrowMarkers(markers: ArrowMarkerSet): string {
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
256
|
+
if (typeof markers !== 'object' || markers === null) {
|
|
257
|
+
throw new IllegalArgument('flattenArrowMarkers()', 'markers');
|
|
258
|
+
}
|
|
259
|
+
return Object.entries(markers)
|
|
260
|
+
.filter(([ vect, color ]) => isSquareCouple(vect) && isAnnotationColor(color))
|
|
261
|
+
.sort((a, b) => a[0].localeCompare(b[0]))
|
|
262
|
+
.map(([ vect, color ]) => color.toUpperCase() + vect)
|
|
263
|
+
.join(',');
|
|
264
264
|
}
|
|
265
265
|
|
|
266
266
|
|
|
@@ -271,14 +271,14 @@ export function flattenArrowMarkers(markers: ArrowMarkerSet): string {
|
|
|
271
271
|
* @returns For example: `{ e4: 'g', d5: 'r' }`
|
|
272
272
|
*/
|
|
273
273
|
export function parseSquareMarkers(markers: string): SquareMarkerSet {
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
274
|
+
if (typeof markers !== 'string') {
|
|
275
|
+
throw new IllegalArgument('parseSquareMarkers()', 'markers');
|
|
276
|
+
}
|
|
277
|
+
return parseMarkers<Square, AnnotationColor>(markers, token => {
|
|
278
|
+
return /^([BGRY])([a-h][1-8])$/.test(token) ?
|
|
279
|
+
{ key: RegExp.$2 as Square, value: RegExp.$1.toLowerCase() as AnnotationColor } :
|
|
280
|
+
undefined;
|
|
281
|
+
});
|
|
282
282
|
}
|
|
283
283
|
|
|
284
284
|
|
|
@@ -289,14 +289,14 @@ export function parseSquareMarkers(markers: string): SquareMarkerSet {
|
|
|
289
289
|
* @returns For example: `{ e4: { symbol: 'A', color: 'g' }, d5: { symbol: 'z', color: 'r' }, h3: { symbol: 'plus', color: 'y' } }`
|
|
290
290
|
*/
|
|
291
291
|
export function parseTextMarkers(markers: string): TextMarkerSet {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
292
|
+
if (typeof markers !== 'string') {
|
|
293
|
+
throw new IllegalArgument('parseTextMarkers()', 'markers');
|
|
294
|
+
}
|
|
295
|
+
return parseMarkers<Square, { symbol: AnnotationSymbol, color: AnnotationColor }>(markers, token => {
|
|
296
|
+
return /^([BGRY])(?:([A-Za-z0-9])|\((plus|times|dot|circle)\))([a-h][1-8])$/.test(token) ?
|
|
297
|
+
{ key: RegExp.$4 as Square, value: { symbol: (RegExp.$2 || RegExp.$3) as AnnotationSymbol, color: RegExp.$1.toLowerCase() as AnnotationColor } } :
|
|
298
|
+
undefined;
|
|
299
|
+
});
|
|
300
300
|
}
|
|
301
301
|
|
|
302
302
|
|
|
@@ -307,23 +307,23 @@ export function parseTextMarkers(markers: string): TextMarkerSet {
|
|
|
307
307
|
* @returns For example: `{ e2e4: 'g', g8f6: 'r', g8h6: 'b' }`
|
|
308
308
|
*/
|
|
309
309
|
export function parseArrowMarkers(markers: string): ArrowMarkerSet {
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
310
|
+
if (typeof markers !== 'string') {
|
|
311
|
+
throw new IllegalArgument('parseArrowMarkers()', 'markers');
|
|
312
|
+
}
|
|
313
|
+
return parseMarkers<SquareCouple, AnnotationColor>(markers, token => {
|
|
314
|
+
return /^([BGRY])([a-h][1-8][a-h][1-8])$/.test(token) ?
|
|
315
|
+
{ key: RegExp.$2 as SquareCouple, value: RegExp.$1.toLowerCase() as AnnotationColor } :
|
|
316
|
+
undefined;
|
|
317
|
+
});
|
|
318
318
|
}
|
|
319
319
|
|
|
320
320
|
|
|
321
321
|
function parseMarkers<K extends string, V>(markers: string, tokenParser: (token: string) => { key: K, value: V } | undefined): Partial<Record<K, V>> {
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
322
|
+
const result: Partial<Record<K, V>> = {};
|
|
323
|
+
markers.split(',').map(token => tokenParser(token.trim())).forEach(marker => {
|
|
324
|
+
if (marker) {
|
|
325
|
+
result[marker.key] = marker.value;
|
|
326
|
+
}
|
|
327
|
+
});
|
|
328
|
+
return result;
|
|
329
329
|
}
|
package/src/util.ts
CHANGED
|
@@ -23,19 +23,19 @@
|
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
export function generateRandomId() {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
26
|
+
const buffer = new Uint32Array(8);
|
|
27
|
+
crypto.getRandomValues(buffer);
|
|
28
|
+
let result = '';
|
|
29
|
+
for (let i = 0; i < buffer.length; ++i) {
|
|
30
|
+
result += buffer[i].toString(16);
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
export function fillPlaceholder(message: string, ...placeholderValues: unknown[]) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
37
|
+
return message.replace(/{(\d+)}/g, (match, placeholder) => {
|
|
38
|
+
const placeholderIndex = Number(placeholder);
|
|
39
|
+
return placeholderIndex < placeholderValues.length ? String(placeholderValues[placeholderIndex]) : match;
|
|
40
|
+
});
|
|
41
41
|
}
|