diff --git a/packages/notus/example/main.dart b/packages/notus/example/main.dart index cf17d8d9f..a7072c345 100644 --- a/packages/notus/example/main.dart +++ b/packages/notus/example/main.dart @@ -3,13 +3,16 @@ // BSD-style license that can be found in the LICENSE file. import 'package:notus/notus.dart'; +import 'package:quill_delta/quill_delta.dart'; void main() { +// final doc = NotusDocument.fromDelta(Delta.fromJson([{"insert":"Zefyr\n","attributes":{"c":[255, 34, 67, 220]}}])); final doc = new NotusDocument(); // Modify this document with insert, delete and format operations doc.insert( 0, 'Notus package provides rich text document model for Zefyr editor'); doc.format(0, 5, NotusAttribute.bold); // Makes first word bold. + doc.format(0, 5, NotusAttribute.color.fromString([255, 34, 67, 220])); doc.format(0, 0, NotusAttribute.h1); // Makes first line a heading. doc.delete(23, 10); // Deletes "rich text " segment. diff --git a/packages/notus/lib/src/convert/markdown.dart b/packages/notus/lib/src/convert/markdown.dart index 187e482d6..abf5a1be2 100644 --- a/packages/notus/lib/src/convert/markdown.dart +++ b/packages/notus/lib/src/convert/markdown.dart @@ -19,6 +19,7 @@ class NotusMarkdownCodec extends Codec { } class _NotusMarkdownEncoder extends Converter { + static const kColor = '&&'; static const kBold = '**'; static const kItalic = '_'; static final kSimpleBlocks = { @@ -160,6 +161,8 @@ class _NotusMarkdownEncoder extends Converter { {bool close: false}) { if (attribute == NotusAttribute.bold) { _writeBoldTag(buffer); + } else if (attribute == NotusAttribute.color) { + _writeColorTag(buffer); } else if (attribute == NotusAttribute.italic) { _writeItalicTag(buffer); } else if (attribute.key == NotusAttribute.link.key) { @@ -177,6 +180,10 @@ class _NotusMarkdownEncoder extends Converter { buffer.write(kBold); } + void _writeColorTag(StringBuffer buffer) { + buffer.write(kColor); + } + void _writeItalicTag(StringBuffer buffer) { buffer.write(kItalic); } diff --git a/packages/notus/lib/src/document/attributes.dart b/packages/notus/lib/src/document/attributes.dart index 57197488e..d5efc45be 100644 --- a/packages/notus/lib/src/document/attributes.dart +++ b/packages/notus/lib/src/document/attributes.dart @@ -65,6 +65,7 @@ abstract class NotusAttributeBuilder implements NotusAttributeKey { /// List of supported attributes: /// /// * [NotusAttribute.bold] +/// * [NotusAttribute.color] /// * [NotusAttribute.italic] /// * [NotusAttribute.link] /// * [NotusAttribute.heading] @@ -72,6 +73,7 @@ abstract class NotusAttributeBuilder implements NotusAttributeKey { class NotusAttribute implements NotusAttributeBuilder { static final Map _registry = { NotusAttribute.bold.key: NotusAttribute.bold, + NotusAttribute.color.key: NotusAttribute.color, NotusAttribute.italic.key: NotusAttribute.italic, NotusAttribute.link.key: NotusAttribute.link, NotusAttribute.heading.key: NotusAttribute.heading, @@ -87,6 +89,9 @@ class NotusAttribute implements NotusAttributeBuilder { /// Italic style attribute. static const italic = const _ItalicAttribute(); + /// Color style attribute. + static const color = const ColorAttributeBuilder._(); + /// Link style attribute. static const link = const LinkAttributeBuilder._(); @@ -322,6 +327,20 @@ class _ItalicAttribute extends NotusAttribute { const _ItalicAttribute() : super._('i', NotusAttributeScope.inline, true); } + +/// Builder for color attribute values. +/// +/// There is no need to use this class directly, consider using +/// [NotusAttribute.color] instead. +class ColorAttributeBuilder extends NotusAttributeBuilder> { + static const _cLink = 'c'; + const ColorAttributeBuilder._() : super._(_cLink, NotusAttributeScope.inline); + + /// Creates a color attribute with specified link [value]. + NotusAttribute> fromString(List value) => + new NotusAttribute>._(key, scope, value); +} + /// Builder for link attribute values. /// /// There is no need to use this class directly, consider using diff --git a/packages/zefyr/example/lib/main.dart b/packages/zefyr/example/lib/main.dart index ef157bb7a..661eb0cc5 100644 --- a/packages/zefyr/example/lib/main.dart +++ b/packages/zefyr/example/lib/main.dart @@ -53,9 +53,24 @@ Delta getDelta() { return Delta.fromJson(json.decode(doc)); } +NotusDocument getdocument(){ + final doc = new NotusDocument(); + // Modify this document with insert, delete and format operations + doc.insert( + 0, 'Notus package provides rich text document model for Zefyr editor'); + doc.format(0, 5, NotusAttribute.bold); // Makes first word bold. + doc.format(0, 5, NotusAttribute.color.fromString([255,34,67,220])); // Makes first word color. + doc.format(0, 0, NotusAttribute.h1); // Makes first line a heading. + doc.delete(23, 10); // Deletes "rich text " segment. + + // Collects style attributes at 1 character in this document. + doc.collectStyle(1, 0); // returned style would include "bold" and "h1". + return doc; +} + class _MyHomePageState extends State { final ZefyrController _controller = - ZefyrController(NotusDocument.fromDelta(getDelta())); + ZefyrController(getdocument()); final FocusNode _focusNode = new FocusNode(); bool _editing = false; diff --git a/packages/zefyr/lib/src/widgets/common.dart b/packages/zefyr/lib/src/widgets/common.dart index e0a2e3332..9b7da371f 100644 --- a/packages/zefyr/lib/src/widgets/common.dart +++ b/packages/zefyr/lib/src/widgets/common.dart @@ -133,6 +133,11 @@ class _RawZefyrLineState extends State { if (style.contains(NotusAttribute.link)) { result = result.merge(theme.linkStyle); } + if(style.contains(NotusAttribute.color)){ + List notusAttribute = style.value(NotusAttribute.color); + TextStyle textStyle=new TextStyle(color: Color.fromARGB(notusAttribute[0], notusAttribute[1], notusAttribute[2], notusAttribute[3])); + result = result.merge(textStyle); + } return result; }