refactor: color extensions

This commit is contained in:
Vincent Chan 2022-08-15 14:52:29 +08:00
parent a3ffbe2f00
commit e826006fa7
2 changed files with 40 additions and 39 deletions

View File

@ -0,0 +1,36 @@
import 'package:flutter/painting.dart';
extension ColorExtension on Color {
/// Try to parse the `rgba(red, greed, blue, alpha)`
/// from the string.
static Color? tryFromRgbaString(String colorString) {
final reg = RegExp(r'rgba\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)');
final match = reg.firstMatch(colorString);
if (match == null) {
return null;
}
if (match.groupCount < 4) {
return null;
}
final redStr = match.group(1);
final greenStr = match.group(2);
final blueStr = match.group(3);
final alphaStr = match.group(4);
final red = redStr != null ? int.tryParse(redStr) : null;
final green = greenStr != null ? int.tryParse(greenStr) : null;
final blue = blueStr != null ? int.tryParse(blueStr) : null;
final alpha = alphaStr != null ? int.tryParse(alphaStr) : null;
if (red == null || green == null || blue == null || alpha == null) {
return null;
}
return Color.fromARGB(alpha, red, green, blue);
}
String toRgbaString() {
return 'rgba($red, $green, $blue, $alpha)';
}
}

View File

@ -5,6 +5,7 @@ import 'package:flowy_editor/src/document/attributes.dart';
import 'package:flowy_editor/src/document/node.dart'; import 'package:flowy_editor/src/document/node.dart';
import 'package:flowy_editor/src/document/text_delta.dart'; import 'package:flowy_editor/src/document/text_delta.dart';
import 'package:flowy_editor/src/render/rich_text/rich_text_style.dart'; import 'package:flowy_editor/src/render/rich_text/rich_text_style.dart';
import 'package:flowy_editor/src/extensions/color_extension.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:html/parser.dart' show parse; import 'package:html/parser.dart' show parse;
import 'package:html/dom.dart' as html; import 'package:html/dom.dart' as html;
@ -39,12 +40,6 @@ class HTMLTag {
} }
} }
extension on Color {
String toRgbaString() {
return 'rgba($red, $green, $blue, $alpha)';
}
}
/// Converting the HTML to nodes /// Converting the HTML to nodes
class HTMLToNodesConverter { class HTMLToNodesConverter {
final html.Document _document; final html.Document _document;
@ -192,7 +187,9 @@ class HTMLToNodesConverter {
} }
final backgroundColorStr = cssMap["background-color"]; final backgroundColorStr = cssMap["background-color"];
final backgroundColor = _tryParseCssColorString(backgroundColorStr); final backgroundColor = backgroundColorStr == null
? null
: ColorExtension.tryFromRgbaString(backgroundColorStr);
if (backgroundColor != null) { if (backgroundColor != null) {
attrs[StyleKey.backgroundColor] = attrs[StyleKey.backgroundColor] =
'0x${backgroundColor.value.toRadixString(16)}'; '0x${backgroundColor.value.toRadixString(16)}';
@ -216,38 +213,6 @@ class HTMLToNodesConverter {
} }
} }
/// Try to parse the `rgba(red, greed, blue, alpha)`
/// from the string.
Color? _tryParseCssColorString(String? colorString) {
if (colorString == null) {
return null;
}
final reg = RegExp(r'rgba\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)');
final match = reg.firstMatch(colorString);
if (match == null) {
return null;
}
if (match.groupCount < 4) {
return null;
}
final redStr = match.group(1);
final greenStr = match.group(2);
final blueStr = match.group(3);
final alphaStr = match.group(4);
final red = redStr != null ? int.tryParse(redStr) : null;
final green = greenStr != null ? int.tryParse(greenStr) : null;
final blue = blueStr != null ? int.tryParse(blueStr) : null;
final alpha = alphaStr != null ? int.tryParse(alphaStr) : null;
if (red == null || green == null || blue == null || alpha == null) {
return null;
}
return Color.fromARGB(alpha, red, green, blue);
}
_handleRichTextElement(Delta delta, html.Element element) { _handleRichTextElement(Delta delta, html.Element element) {
if (element.localName == HTMLTag.span) { if (element.localName == HTMLTag.span) {
delta.insert(element.text, delta.insert(element.text,