Module: Sashite::Feen::Parser::PiecePlacement
- Defined in:
- lib/sashite/feen/parser/piece_placement.rb
Overview
Parser for the piece placement field (first field of FEEN).
Converts a FEEN piece placement string into a Placement object, decoding board configuration from EPIN notation with:
-
Empty square compression (numbers → consecutive nils)
-
Multi-dimensional separator preservation (exact “/” counts)
-
Support for any irregular board structure
The parser preserves the exact separator structure, enabling perfect round-trip conversion (parse → dump → parse).
Constant Summary collapse
- RANK_SEPARATOR =
Rank separator character.
"/"- EPIN_PATTERN =
Pattern to match EPIN pieces (optional state, letter, optional derivation).
/\A[-+]?[A-Za-z]'?\z/
Class Method Summary collapse
-
.parse(string) ⇒ Placement
Parse a FEEN piece placement string into a Placement object.
Class Method Details
.parse(string) ⇒ Placement
Parse a FEEN piece placement string into a Placement object.
Supports any valid FEEN structure:
-
1D: Single rank, no separators (e.g., “K2P”)
-
2D: Ranks separated by “/” (e.g., “8/8/8”)
-
3D+: Ranks separated by multiple “/” (e.g., “5/5//5/5”)
-
Irregular: Any combination of rank sizes and separators
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
# File 'lib/sashite/feen/parser/piece_placement.rb', line 54 def self.parse(string) # Detect dimension before parsing dimension = detect_dimension(string) # Handle 1D case (no separators) if dimension == 1 rank = parse_rank(string) return Placement.new([rank], [], 1) end # Parse multi-dimensional structure with separators ranks, separators = parse_with_separators(string) Placement.new(ranks, separators, dimension) end |