angleToTex function

String angleToTex(
  1. String input, {
  2. SiOptions options = const SiOptions(),
})

\ang{12;30;15} → 12°30′15″; \ang{12.5} → 12.5°.

Implementation

String angleToTex(String input, {SiOptions options = const SiOptions()}) {
  final o = options;
  var parts = input.split(';').map((p) => p.trim()).toList();
  if (parts.length > 3) parts = parts.sublist(0, 3);
  final mode = o['angle-mode'];
  if (mode == 'decimal' && parts.length > 1) {
    final d = double.tryParse(parts[0].isEmpty ? '0' : parts[0]) ?? 0;
    final m = parts.length > 1 ? double.tryParse(parts[1]) ?? 0 : 0;
    final s = parts.length > 2 ? double.tryParse(parts[2]) ?? 0 : 0;
    final sign = parts[0].startsWith('-') ? -1 : 1;
    parts = [_double(d + sign * (m / 60 + s / 3600))];
  } else if (mode == 'arc' && parts.length == 1 && parts[0].isNotEmpty) {
    final v = double.tryParse(parts[0].replaceAll(',', '.'));
    if (v != null) {
      final a = v.abs();
      var d = a.floor();
      var m = ((a - d) * 60).floor();
      var s = (a - d - m / 60) * 3600;
      s = double.parse(s.toStringAsFixed(6));
      if (s >= 60) {
        s -= 60;
        m++;
      }
      if (m >= 60) {
        m -= 60;
        d++;
      }
      parts = [
        '${v < 0 ? '-' : ''}$d',
        if (m != 0 || s != 0) '$m' else '',
        if (s != 0) _double(s) else '',
      ];
    }
  }
  final symbols = [
    _symbolFor(o['angle-symbol-degree']),
    _symbolFor(o['angle-symbol-minute']),
    _symbolFor(o['angle-symbol-second']),
  ];
  final fill = [
    o._flag('fill-angle-degrees'),
    o._flag('fill-angle-minutes'),
    o._flag('fill-angle-seconds'),
  ];
  final last = parts.lastIndexWhere((p) => p.isNotEmpty);
  final out = <String>[];
  for (var i = 0; i < parts.length; i++) {
    var p = parts[i];
    if (p.isEmpty) {
      final later = i < last;
      final earlier = parts.sublist(0, i).any((q) => q.isNotEmpty);
      if (!(fill[i] && (later || earlier))) continue;
      p = '0';
    }
    out.add(_withSymbolOverDecimal(p, symbols[i], o));
  }
  final sep = o['angle-separator'];
  return out.join(sep);
}