Rich text editor for Flutter
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

58 lines
1.8 KiB

import 'dart:convert' show jsonDecode, jsonEncode;
/// An object which can be embedded into a Quill document.
///
/// See also:
///
/// * [BlockEmbed] which represents a block embed.
class Embeddable {
const Embeddable(this.type, this.data);
/// The type of this object.
final String type;
/// The data payload of this object.
final dynamic data;
Map<String, dynamic> toJson() {
return {type: data};
}
static Embeddable fromJson(Map<String, dynamic> json) {
final m = Map<String, dynamic>.from(json);
assert(m.length == 1, 'Embeddable map must only have one key');
return Embeddable(m.keys.first, m.values.first);
}
}
/// There are two built-in embed types supported by Quill documents, however
/// the document model itself does not make any assumptions about the types
/// of embedded objects and allows users to define their own types.
class BlockEmbed extends Embeddable {
const BlockEmbed(super.type, String super.data);
static const String imageType = 'image';
static BlockEmbed image(String imageUrl) => BlockEmbed(imageType, imageUrl);
static const String videoType = 'video';
static BlockEmbed video(String videoUrl) => BlockEmbed(videoType, videoUrl);
static const String formulaType = 'formula';
static BlockEmbed formula(String formula) => BlockEmbed(formulaType, formula);
static const String customType = 'custom';
static BlockEmbed custom(CustomBlockEmbed customBlock) =>
BlockEmbed(customType, customBlock.toJsonString());
}
class CustomBlockEmbed extends BlockEmbed {
const CustomBlockEmbed(super.type, super.data);
String toJsonString() => jsonEncode(toJson());
static CustomBlockEmbed fromJsonString(String data) {
final embeddable = Embeddable.fromJson(jsonDecode(data));
return CustomBlockEmbed(embeddable.type, embeddable.data);
}
}