Skip to content

Commit

Permalink
Merge pull request #2 from kekland/master
Browse files Browse the repository at this point in the history
impl: added different index types for different indentations
  • Loading branch information
shinyinc authored Jun 10, 2020
2 parents 7c69350 + 6554057 commit e112533
Show file tree
Hide file tree
Showing 4 changed files with 100 additions and 12 deletions.
4 changes: 3 additions & 1 deletion packages/zefyr/lib/src/widgets/indent.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,13 @@ class ZefyrIndent extends StatelessWidget {

@override
Widget build(BuildContext context) {
final theme = ZefyrTheme.of(context);

final indentLevel =
node.style.get<int>(NotusAttribute.indentation)?.value ?? 0;

return Padding(
padding: EdgeInsets.only(left: indentLevel * 16.0),
padding: EdgeInsets.only(left: indentLevel * theme.indentWidth),
child: child,
);
}
Expand Down
55 changes: 45 additions & 10 deletions packages/zefyr/lib/src/widgets/list.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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';
Expand All @@ -18,16 +19,29 @@ class ZefyrList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final theme = ZefyrTheme.of(context);
List<Widget> items = [];
int index = 1;
var items = <Widget>[];
final indicesForIndentation = <int, int>{};

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);
Expand All @@ -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) {
Expand All @@ -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;
Expand Down
51 changes: 51 additions & 0 deletions packages/zefyr/lib/src/widgets/list_bullet_generator.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
const _romanNumerals = <int, String>{
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<String Function(int)> generators = [
generateNumeral,
generateLetterNumeral,
generateRomanNumeral,
];
2 changes: 1 addition & 1 deletion packages/zefyr/pubspec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e112533

Please sign in to comment.