Showing
2 changed files
with
32 additions
and
0 deletions
@@ -5,6 +5,7 @@ | @@ -5,6 +5,7 @@ | ||
5 | - Add Flutter's Logical Pixel constant | 5 | - Add Flutter's Logical Pixel constant |
6 | - Add support for existing reference objects | 6 | - Add support for existing reference objects |
7 | - Update barcode golden pdf | 7 | - Update barcode golden pdf |
8 | +- Add support for hyphenation [ilja] | ||
8 | 9 | ||
9 | ## 3.10.7 | 10 | ## 3.10.7 |
10 | 11 |
@@ -658,6 +658,8 @@ class RichTextContext extends WidgetContext { | @@ -658,6 +658,8 @@ class RichTextContext extends WidgetContext { | ||
658 | '$runtimeType Offset: $startOffset -> $endOffset Span: $spanStart -> $spanEnd'; | 658 | '$runtimeType Offset: $startOffset -> $endOffset Span: $spanStart -> $spanEnd'; |
659 | } | 659 | } |
660 | 660 | ||
661 | +typedef Hyphenation = List<String> Function(String word); | ||
662 | + | ||
661 | class RichText extends Widget with SpanningWidget { | 663 | class RichText extends Widget with SpanningWidget { |
662 | RichText({ | 664 | RichText({ |
663 | required this.text, | 665 | required this.text, |
@@ -668,6 +670,7 @@ class RichText extends Widget with SpanningWidget { | @@ -668,6 +670,7 @@ class RichText extends Widget with SpanningWidget { | ||
668 | this.textScaleFactor = 1.0, | 670 | this.textScaleFactor = 1.0, |
669 | this.maxLines, | 671 | this.maxLines, |
670 | this.overflow = TextOverflow.visible, | 672 | this.overflow = TextOverflow.visible, |
673 | + this.hyphenation, | ||
671 | }); | 674 | }); |
672 | 675 | ||
673 | static bool debug = false; | 676 | static bool debug = false; |
@@ -700,6 +703,8 @@ class RichText extends Widget with SpanningWidget { | @@ -700,6 +703,8 @@ class RichText extends Widget with SpanningWidget { | ||
700 | 703 | ||
701 | List<InlineSpan>? _preprocessed; | 704 | List<InlineSpan>? _preprocessed; |
702 | 705 | ||
706 | + final Hyphenation? hyphenation; | ||
707 | + | ||
703 | void _appendDecoration(bool append, _TextDecoration td) { | 708 | void _appendDecoration(bool append, _TextDecoration td) { |
704 | if (append && _decorations.isNotEmpty) { | 709 | if (append && _decorations.isNotEmpty) { |
705 | final last = _decorations.last; | 710 | final last = _decorations.last; |
@@ -946,6 +951,32 @@ class RichText extends Widget with SpanningWidget { | @@ -946,6 +951,32 @@ class RichText extends Widget with SpanningWidget { | ||
946 | 951 | ||
947 | if (_softWrap && | 952 | if (_softWrap && |
948 | offsetX + metrics.width > constraintWidth + 0.00001) { | 953 | offsetX + metrics.width > constraintWidth + 0.00001) { |
954 | + if (hyphenation != null) { | ||
955 | + final syllables = hyphenation!(word); | ||
956 | + if (syllables.length > 1) { | ||
957 | + var fits = ''; | ||
958 | + for (var syllable in syllables) { | ||
959 | + if (offsetX + | ||
960 | + ((font.stringMetrics('$fits$syllable-', | ||
961 | + letterSpacing: style.letterSpacing! / | ||
962 | + (style.fontSize! * | ||
963 | + textScaleFactor)) * | ||
964 | + (style.fontSize! * textScaleFactor)) | ||
965 | + .width) > | ||
966 | + constraintWidth + 0.00001) { | ||
967 | + break; | ||
968 | + } | ||
969 | + fits += syllable; | ||
970 | + } | ||
971 | + if (fits.isNotEmpty) { | ||
972 | + words[index] = '$fits-'; | ||
973 | + words.insert(index + 1, word.substring(fits.length)); | ||
974 | + index--; | ||
975 | + continue; | ||
976 | + } | ||
977 | + } | ||
978 | + } | ||
979 | + | ||
949 | if (spanCount > 0 && metrics.width <= constraintWidth) { | 980 | if (spanCount > 0 && metrics.width <= constraintWidth) { |
950 | overflow = true; | 981 | overflow = true; |
951 | lines.add(_Line( | 982 | lines.add(_Line( |
-
Please register or login to post a comment