From ee1775349c046835457512ec1b837db14dbe1cce Mon Sep 17 00:00:00 2001 From: Rob Snider <53707285+kulture-rob-snider@users.noreply.github.com> Date: Thu, 27 Oct 2022 14:53:32 -0400 Subject: [PATCH] fix order list numbering (#988) --- .../widgets/style_widgets/number_point.dart | 70 ++++++++----------- 1 file changed, 28 insertions(+), 42 deletions(-) diff --git a/lib/src/widgets/style_widgets/number_point.dart b/lib/src/widgets/style_widgets/number_point.dart index f1ffddf1f..a47c1ef14 100644 --- a/lib/src/widgets/style_widgets/number_point.dart +++ b/lib/src/widgets/style_widgets/number_point.dart @@ -27,51 +27,40 @@ class QuillNumberPoint extends StatelessWidget { @override Widget build(BuildContext context) { - var s = index.toString(); - int? level = 0; - if (!attrs.containsKey(Attribute.indent.key) && - !indentLevelCounts.containsKey(1)) { - indentLevelCounts.clear(); - return Container( - alignment: AlignmentDirectional.topEnd, - width: width, - padding: EdgeInsetsDirectional.only(end: padding), - child: Text(withDot ? '$s.' : s, style: style), - ); - } - if (attrs.containsKey(Attribute.indent.key)) { - level = attrs[Attribute.indent.key]!.value; - } else { - // first level but is back from previous indent level - // supposed to be "2." - indentLevelCounts[0] = 1; - } - if (indentLevelCounts.containsKey(level! + 1)) { - // last visited level is done, going up - indentLevelCounts.remove(level + 1); - } - final count = (indentLevelCounts[level] ?? 0) + 1; - indentLevelCounts[level] = count; - - s = count.toString(); - if (level % 3 == 1) { - // a. b. c. d. e. ... - s = _toExcelSheetColumnTitle(count); - } else if (level % 3 == 2) { - // i. ii. iii. ... - s = _intToRoman(count); - } - // level % 3 == 0 goes back to 1. 2. 3. + final olString = _getOlString(); return Container( alignment: AlignmentDirectional.topEnd, width: width, padding: EdgeInsetsDirectional.only(end: padding), - child: Text(withDot ? '$s.' : s, style: style), + child: Text('$olString${withDot ? '.' : ''}', style: style), ); } - String _toExcelSheetColumnTitle(int n) { + 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--; @@ -93,14 +82,11 @@ class QuillNumberPoint extends StatelessWidget { final builder = StringBuffer(); for (var a = 0; a < arabianRomanNumbers.length; a++) { - final times = (num / arabianRomanNumbers[a]) - .truncate(); // equals 1 only when arabianRomanNumbers[a] = num + 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 + num -= times * arabianRomanNumbers[a]; // subtract previous roman number value from num } return builder.toString().toLowerCase();