diff --git a/packages/zefyr/lib/src/widgets/indent.dart b/packages/zefyr/lib/src/widgets/indent.dart index d163db9ed..d3a428f39 100644 --- a/packages/zefyr/lib/src/widgets/indent.dart +++ b/packages/zefyr/lib/src/widgets/indent.dart @@ -9,11 +9,13 @@ class ZefyrIndent extends StatelessWidget { @override Widget build(BuildContext context) { + final theme = ZefyrTheme.of(context); + final indentLevel = node.style.get(NotusAttribute.indentation)?.value ?? 0; return Padding( - padding: EdgeInsets.only(left: indentLevel * 16.0), + padding: EdgeInsets.only(left: indentLevel * theme.indentWidth), child: child, ); } diff --git a/packages/zefyr/lib/src/widgets/list.dart b/packages/zefyr/lib/src/widgets/list.dart index e15a7f1e4..6d5f291d4 100644 --- a/packages/zefyr/lib/src/widgets/list.dart +++ b/packages/zefyr/lib/src/widgets/list.dart @@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. import 'package:flutter/material.dart'; import 'package:notus/notus.dart'; +import 'package:zefyr/src/widgets/list_bullet_generator.dart'; import 'common.dart'; import 'indent.dart'; @@ -18,16 +19,29 @@ class ZefyrList extends StatelessWidget { @override Widget build(BuildContext context) { final theme = ZefyrTheme.of(context); - List items = []; - int index = 1; + var items = []; + final indicesForIndentation = {}; + for (var line in node.children) { - items.add(_buildItem(line, index)); - index++; + final indentation = + (line as LineNode).style.get(NotusAttribute.indentation)?.value ?? 0; + final indentationIndex = indicesForIndentation[indentation] ?? 1; + + items.add( + _buildItem( + line, + indentationIndex, + generators[indentation % generators.length], + ), + ); + + indicesForIndentation[indentation] = indentationIndex + 1; } final isNumberList = node.style.get(NotusAttribute.block) == NotusAttribute.block.numberList; - EdgeInsets padding = isNumberList + + var padding = isNumberList ? theme.attributeTheme.numberList.padding : theme.attributeTheme.bulletList.padding; padding = padding.copyWith(left: theme.indentWidth); @@ -38,18 +52,33 @@ class ZefyrList extends StatelessWidget { ); } - Widget _buildItem(Node node, int index) { + Widget _buildItem( + Node node, + int index, [ + String Function(int) indexStringGenerator, + ]) { LineNode line = node; - return ZefyrListItem(index: index, node: line); + + return ZefyrListItem( + index: index, + node: line, + indexStringGenerator: indexStringGenerator, + ); } } /// An item in a [ZefyrList]. class ZefyrListItem extends StatelessWidget { - ZefyrListItem({Key key, this.index, this.node}) : super(key: key); + ZefyrListItem({ + Key key, + this.index, + this.node, + this.indexStringGenerator, + }) : super(key: key); final int index; final LineNode node; + final String Function(int) indexStringGenerator; @override Widget build(BuildContext context) { @@ -59,8 +88,14 @@ class ZefyrListItem extends StatelessWidget { final blockTheme = (style == NotusAttribute.block.bulletList) ? theme.attributeTheme.bulletList : theme.attributeTheme.numberList; - final bulletText = - (style == NotusAttribute.block.bulletList) ? '•' : '$index.'; + + var bulletText = '•'; + + if (style == NotusAttribute.block.numberList) { + bulletText = + indexStringGenerator != null ? indexStringGenerator(index) : '$index'; + bulletText = '$bulletText.'; + } TextStyle textStyle; Widget content; diff --git a/packages/zefyr/lib/src/widgets/list_bullet_generator.dart b/packages/zefyr/lib/src/widgets/list_bullet_generator.dart new file mode 100644 index 000000000..07b97ec42 --- /dev/null +++ b/packages/zefyr/lib/src/widgets/list_bullet_generator.dart @@ -0,0 +1,51 @@ +const _romanNumerals = { + 1000: 'm', + 900: 'cm', + 500: 'd', + 400: 'cd', + 100: 'c', + 90: 'xc', + 50: 'l', + 40: 'xl', + 10: 'x', + 9: 'ix', + 5: 'v', + 4: 'iv', + 1: 'i', +}; + +String generateRomanNumeral(int index) { + var roman = ''; + var number = index; + + for (final item in _romanNumerals.entries) { + while (number >= item.key) { + roman += item.value; + number -= item.key; + } + } + + return roman; +} + +String generateLetterNumeral(int index) { + var numeral = ''; + var number = index - 1; + + if (number == 0) return 'a'; + + while (number > 0) { + numeral += String.fromCharCode(number % 26 + 'a'.codeUnits.single); + number = (number / 26).floor(); + } + + return numeral.split('').reversed.join(); +} + +String generateNumeral(int index) => index.toString(); + +List generators = [ + generateNumeral, + generateLetterNumeral, + generateRomanNumeral, +]; diff --git a/packages/zefyr/pubspec.yaml b/packages/zefyr/pubspec.yaml index 7d96195e6..d953edccf 100644 --- a/packages/zefyr/pubspec.yaml +++ b/packages/zefyr/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: quill_delta: ^1.0.0 notus: git: - url: https://github.com/kekland/zefyr.git + url: https://github.com/shinyinc/zefyr.git path: packages/notus ref: HEAD meta: ^1.1.0