parseLength static method
CSSLengthValue
parseLength(
- String text,
- RenderStyle? renderStyle, [
- String? propertyName,
- Axis? axisType,
Implementation
static CSSLengthValue parseLength(String text, RenderStyle? renderStyle, [String? propertyName, Axis? axisType]) {
FlutterView? window = renderStyle?.currentFlutterView;
double? value;
CSSLengthType unit = CSSLengthType.PX;
if (text == ZERO) {
// Only '0' is accepted with no unit.
return CSSLengthValue.zero;
} else if (text == INITIAL) {
return CSSLengthValue.initial;
} else if (text == INHERIT) {
if (renderStyle != null && propertyName != null && renderStyle.target.parentElement != null) {
var element = renderStyle.target.parentElement!;
return parseLength(element.style.getPropertyValue(propertyName), element.renderStyle, propertyName, axisType);
}
return CSSLengthValue.zero;
} else if (text == AUTO) {
return CSSLengthValue.auto;
} else if (text == NONE) {
return CSSLengthValue.none;
} else if (text.endsWith(REM)) {
value = double.tryParse(text.split(REM)[0]);
unit = CSSLengthType.REM;
} else if (text.endsWith(EM)) {
value = double.tryParse(text.split(EM)[0]);
unit = CSSLengthType.EM;
} else if (text.endsWith(RPX)) {
value = double.tryParse(text.split(RPX)[0]);
if (value != null && window != null) value = value / 750.0 * window.physicalSize.width / window.devicePixelRatio;
} else if (text.endsWith(PX)) {
value = double.tryParse(text.split(PX)[0]);
} else if (text.endsWith(VW)) {
value = double.tryParse(text.split(VW)[0]);
if (value != null) value = value / 100;
unit = CSSLengthType.VW;
} else if (text.endsWith(VH)) {
value = double.tryParse(text.split(VH)[0]);
if (value != null) value = value / 100;
unit = CSSLengthType.VH;
} else if (text.endsWith(CM)) {
value = double.tryParse(text.split(CM)[0]);
if (value != null) value = value * _1cm;
} else if (text.endsWith(MM)) {
value = double.tryParse(text.split(MM)[0]);
if (value != null) value = value * _1mm;
} else if (text.endsWith(PC)) {
value = double.tryParse(text.split(PC)[0]);
if (value != null) value = value * _1pc;
} else if (text.endsWith(PT)) {
value = double.tryParse(text.split(PT)[0]);
if (value != null) value = value * _1pt;
} else if (text.endsWith(VMIN)) {
value = double.tryParse(text.split(VMIN)[0]);
if (value != null) value = value / 100;
unit = CSSLengthType.VMIN;
} else if (text.endsWith(VMAX)) {
value = double.tryParse(text.split(VMAX)[0]);
if (value != null) value = value / 100;
unit = CSSLengthType.VMAX;
} else if (text.endsWith(IN)) {
value = double.tryParse(text.split(IN)[0]);
if (value != null) value = value * _1in;
} else if (text.endsWith(Q)) {
value = double.tryParse(text.split(Q)[0]);
if (value != null) value = value * _1Q;
} else if (text.endsWith(PERCENTAGE)) {
value = double.tryParse(text.split(PERCENTAGE)[0]);
if (value != null) value = value / 100;
unit = CSSLengthType.PERCENTAGE;
} else if (CSSFunction.isFunction(text)) {
if (renderStyle != null) {
CSSCalcValue? calcValue = CSSCalcValue.tryParse(renderStyle, propertyName ?? '', text);
if (calcValue != null) {
return CSSLengthValue.calc(calcValue, renderStyle, propertyName);
}
}
List<CSSFunctionalNotation> notations = CSSFunction.parseFunction(text);
// https://drafts.csswg.org/css-env/#env-function
// Using Environment Variables: the env() notation
if (notations.length == 1 && notations[0].name == ENV && notations[0].args.length == 1 && window != null) {
switch (notations[0].args.first) {
case SAFE_AREA_INSET_TOP:
value = window.viewPadding.top / window.devicePixelRatio;
break;
case SAFE_AREA_INSET_RIGHT:
value = window.viewPadding.right / window.devicePixelRatio;
break;
case SAFE_AREA_INSET_BOTTOM:
value = window.viewPadding.bottom / window.devicePixelRatio;
break;
case SAFE_AREA_INSET_LEFT:
value = window.viewPadding.left / window.devicePixelRatio;
break;
default:
// Using fallback value if not match user agent-defined environment variable: env(xxx, 50px).
return parseLength(notations[0].args[1], renderStyle, propertyName, axisType);
}
}
} else {
value = double.tryParse(text);
}
if (value == 0 && unit != CSSLengthType.PERCENTAGE) {
return CSSLengthValue.zero;
} else if (value == null) {
return CSSLengthValue.unknown;
} else if (unit == CSSLengthType.PX) {
return CSSLengthValue(value, unit);
} else {
return CSSLengthValue(value, unit, renderStyle, propertyName, axisType);
}
}