|
|
|
import 'package:flutter/foundation.dart' show immutable;
|
|
|
|
import 'package:flutter/widgets.dart' show Alignment, BuildContext;
|
|
|
|
import 'package:flutter_quill/extensions.dart';
|
|
|
|
import 'package:flutter_quill/flutter_quill.dart' show Attribute, Node;
|
|
|
|
|
|
|
|
import 'element_shared_utils.dart';
|
|
|
|
|
|
|
|
/// Theses properties are not officialy supported by quill js
|
|
|
|
/// but they are only used in all platforms other than web
|
|
|
|
/// and they will be stored in css style property so quill js ignore them
|
|
|
|
enum ExtraElementProperties {
|
|
|
|
deletable,
|
|
|
|
}
|
|
|
|
|
|
|
|
(
|
|
|
|
ElementSize elementSize,
|
|
|
|
double? margin,
|
|
|
|
Alignment alignment,
|
|
|
|
) getElementAttributes(
|
|
|
|
Node node,
|
|
|
|
BuildContext context,
|
|
|
|
) {
|
|
|
|
var elementSize = const ElementSize(null, null);
|
|
|
|
var elementAlignment = Alignment.center;
|
|
|
|
double? elementMargin;
|
|
|
|
|
|
|
|
final heightValue = parseCssPropertyAsDouble(
|
|
|
|
node.style.attributes[Attribute.height.key]?.value.toString() ?? '',
|
|
|
|
context: context,
|
|
|
|
);
|
|
|
|
final widthValue = parseCssPropertyAsDouble(
|
|
|
|
node.style.attributes[Attribute.width.key]?.value.toString() ?? '',
|
|
|
|
context: context,
|
|
|
|
);
|
|
|
|
|
|
|
|
if (heightValue != null) {
|
|
|
|
elementSize = elementSize.copyWith(
|
|
|
|
height: heightValue,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
if (widthValue != null) {
|
|
|
|
elementSize = elementSize.copyWith(
|
|
|
|
width: widthValue,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
final cssStyle = node.style.attributes['style'];
|
|
|
|
|
|
|
|
if (cssStyle != null) {
|
|
|
|
// It css value as string but we will try to support it anyway
|
|
|
|
|
|
|
|
final cssAttrs = parseCssString(cssStyle.value.toString());
|
|
|
|
|
|
|
|
final cssHeightValue = parseCssPropertyAsDouble(
|
|
|
|
(cssAttrs[Attribute.height.key]) ?? '',
|
|
|
|
context: context,
|
|
|
|
);
|
|
|
|
final cssWidthValue = parseCssPropertyAsDouble(
|
|
|
|
(cssAttrs[Attribute.width.key]) ?? '',
|
|
|
|
context: context,
|
|
|
|
);
|
|
|
|
|
|
|
|
// cssHeightValue != null && elementSize.height == null
|
|
|
|
if (cssHeightValue != null) {
|
|
|
|
elementSize = elementSize.copyWith(height: cssHeightValue);
|
|
|
|
}
|
|
|
|
if (cssWidthValue != null) {
|
|
|
|
elementSize = elementSize.copyWith(width: cssWidthValue);
|
|
|
|
}
|
|
|
|
|
|
|
|
elementAlignment = getAlignment(cssAttrs['alignment']);
|
|
|
|
|
|
|
|
final margin = double.tryParse('margin');
|
|
|
|
if (margin != null) {
|
|
|
|
elementMargin = margin;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return (elementSize, elementMargin, elementAlignment);
|
|
|
|
}
|
|
|
|
|
|
|
|
@immutable
|
|
|
|
class ElementSize {
|
|
|
|
const ElementSize(
|
|
|
|
this.width,
|
|
|
|
this.height,
|
|
|
|
);
|
|
|
|
|
|
|
|
/// If non-null, requires the child to have exactly this width.
|
|
|
|
/// If null, the child is free to choose its own width.
|
|
|
|
final double? width;
|
|
|
|
|
|
|
|
/// If non-null, requires the child to have exactly this height.
|
|
|
|
/// If null, the child is free to choose its own height.
|
|
|
|
final double? height;
|
|
|
|
|
|
|
|
ElementSize copyWith({
|
|
|
|
double? width,
|
|
|
|
double? height,
|
|
|
|
}) {
|
|
|
|
return ElementSize(
|
|
|
|
width ?? this.width,
|
|
|
|
height ?? this.height,
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|