import 'package:collection/collection.dart'; import 'package:flutter_quill/models/documents/attribute.dart'; import 'package:quiver_hashcode/hashcode.dart'; /* Collection of style attributes */ class Style { final Map _attributes; Style.attr(this._attributes); Style() : _attributes = {}; static Style fromJson(Map attributes) { if (attributes == null) { return Style(); } Map result = attributes.map((String key, dynamic value) { Attribute attr = Attribute.fromKeyValue(key, value); return MapEntry(key, attr); }); return Style.attr(result); } Map toJson() => _attributes.isEmpty ? null : _attributes.map((String _, Attribute value) => MapEntry(value.key, value.value)); Iterable get keys => _attributes.keys; Iterable get values => _attributes.values; Map get attributes => _attributes; bool get isEmpty => _attributes.isEmpty; bool get isNotEmpty => _attributes.isNotEmpty; bool get isInline => isNotEmpty && values.every((item) => item.isInline); Attribute get single => _attributes.values.single; bool containsKey(String key) => _attributes.containsKey(key); Attribute getBlockExceptHeader() { for (Attribute val in values) { if (val.isBlockExceptHeader) { return val; } } return null; } Style merge(Attribute attribute) { Map merged = Map.from(_attributes); if (attribute.value == null) { merged.remove(attribute.key); } else { merged[attribute.key] = attribute; } return Style.attr(merged); } Style mergeAll(Style other) { Style result = Style.attr(_attributes); for (Attribute attribute in other.values) { result = result.merge(attribute); } return result; } Style removeAll(Set attributes) { Map merged = Map.from(_attributes); attributes.map((item) => item.key).forEach(merged.remove); return Style.attr(merged); } Style put(Attribute attribute) { Map m = Map.from(attributes); m[attribute.key] = attribute; return Style.attr(m); } @override bool operator ==(Object other) { if (identical(this, other)) return true; if (other is! Style) return false; Style typedOther = other; final eq = const MapEquality(); return eq.equals(_attributes, typedOther._attributes); } @override int get hashCode { final hashes = _attributes.entries.map((entry) => hash2(entry.key, entry.value)); return hashObjects(hashes); } @override String toString() => "{${_attributes.values.join(', ')}}"; }