mirrorSign function

String mirrorSign(
  1. String fsw
)

Returns the horizontal mirror of an FSW sign.

fsw must be ASCII Formal SignWriting. For SWU input, convert with swu2fsw first.

Implementation

String mirrorSign(String fsw) {
  if (!_isAscii(fsw)) {
    throw ArgumentError(
        'mirrorSign expects ASCII FSW; convert SWU input via swu2fsw first');
  }

  final sign = fswToSign(fsw);
  if (sign.symbols.isEmpty) return fsw;

  final boxMarker = _boxMirror[sign.box.symbol] ?? sign.box.symbol;
  final boxY = sign.box.position.item2;
  final origMinX =
      sign.symbols.map((s) => s.position.item1).reduce((a, b) => a < b ? a : b);

  final mirroredSymbols = <SignSymbol>[];
  for (final entry in sign.symbols) {
    final original = entry.symbol;
    final mirrored = mirrorSymbol(original);
    final origWidth = getSymbolSize(original).item1;
    final newWidth = getSymbolSize(mirrored).item1;
    mirroredSymbols.add(SignSymbol(
      symbol: mirrored,
      position: Tuple2(_mirrorX(entry.position.item1, origWidth, newWidth),
          entry.position.item2),
    ));
  }

  final mirroredSign = Sign(
    box:
        SignSymbol(symbol: boxMarker, position: Tuple2(_axis - origMinX, boxY)),
    symbols: mirroredSymbols,
  );
  return signToFsw(mirroredSign);
}