enum AttributeScope { INLINE, // refer to https://quilljs.com/docs/formats/#inline BLOCK, // refer to https://quilljs.com/docs/formats/#block EMBEDS, // refer to https://quilljs.com/docs/formats/#embeds } class Attribute { final String key; final AttributeScope scope; final T value; Attribute(this.key, this.scope, this.value); } class BoldAttribute extends Attribute { BoldAttribute() : super('bold', AttributeScope.INLINE, null); } class ItalicAttribute extends Attribute { ItalicAttribute() : super('italic', AttributeScope.INLINE, null); } class UnderlineAttribute extends Attribute { UnderlineAttribute() : super('underline', AttributeScope.INLINE, null); } class StrikeThroughAttribute extends Attribute { StrikeThroughAttribute() : super('strike', AttributeScope.INLINE, null); } class LinkAttribute extends Attribute { LinkAttribute() : super('link', AttributeScope.INLINE, null); } class HeaderAttribute extends Attribute { HeaderAttribute(int level) : super('header', AttributeScope.BLOCK, level); // H1 in HTML Attribute get level1 => Attribute(key, scope, 1); // H2 in HTML Attribute get level2 => Attribute(key, scope, 2); // H3 in HTML Attribute get level3 => Attribute(key, scope, 3); } class ListAttribute extends Attribute { ListAttribute(String val) : super('list', AttributeScope.BLOCK, val); // "attributes":{"list":"ordered"} Attribute get ordered => Attribute(key, scope, 'ordered'); // "attributes":{"list":"bullet"} Attribute get bullet => Attribute(key, scope, 'bullet'); } class CodeBlockAttribute extends Attribute { CodeBlockAttribute() : super('code-block', AttributeScope.BLOCK, null); } class BlockQuoteAttribute extends Attribute { BlockQuoteAttribute() : super('blockquote', AttributeScope.BLOCK, null); }