import 'package:flutter/material.dart'; import '../../models/documents/attribute.dart'; import '../text_block.dart'; class QuillNumberPoint extends StatelessWidget { const QuillNumberPoint({ required this.index, required this.indentLevelCounts, required this.count, required this.style, required this.width, required this.attrs, this.withDot = true, this.padding = 0.0, Key? key, }) : super(key: key); final int index; final Map indentLevelCounts; final int count; final TextStyle style; final double width; final Map attrs; final bool withDot; final double padding; @override Widget build(BuildContext context) { final olString = _getOlString(); return Container( alignment: AlignmentDirectional.topEnd, width: width, padding: EdgeInsetsDirectional.only(end: padding), child: Text('$olString${withDot ? '.' : ''}', style: style), ); } String _getOlString() { final int indentLevel = attrs[Attribute.indent.key]?.value ?? 0; if (indentLevelCounts.containsKey(indentLevel + 1)) { // last visited level is done, going up indentLevelCounts.remove(indentLevel + 1); } final count = (indentLevelCounts[indentLevel] ?? 0) + 1; indentLevelCounts[indentLevel] = count; final numberingMode = indentLevel % 3; if (numberingMode == 1) { // a. b. c. return _intToAlpha(count); } else if (numberingMode == 2) { // i. ii. iii. return _intToRoman(count); } return count.toString(); } String _intToAlpha(int n) { final result = StringBuffer(); while (n > 0) { n--; result.write(String.fromCharCode((n % 26).floor() + 97)); n = (n / 26).floor(); } return result.toString().split('').reversed.join(); } String _intToRoman(int input) { var num = input; if (num < 0) { return ''; } else if (num == 0) { return 'nulla'; } final builder = StringBuffer(); for (var a = 0; a < arabianRomanNumbers.length; a++) { final times = (num / arabianRomanNumbers[a]).truncate(); // equals 1 only when arabianRomanNumbers[a] = num // executes n times where n is the number of times you have to add // the current roman number value to reach current num. builder.write(romanNumbers[a] * times); num -= times * arabianRomanNumbers[a]; // subtract previous roman number value from num } return builder.toString().toLowerCase(); } }