replaceBlocks function
Iterable<ElementChild>
replaceBlocks(
- Element element,
- Map<String?, RegularElement> definedOverrides,
- void onError(
- dynamic e
)?,
- bool replaceWithDefault,
- bool anyTemplatesRemain,
)
Implementation
Iterable<ElementChild> replaceBlocks(Element element, Map<String?, RegularElement> definedOverrides, void onError(e)?,
bool replaceWithDefault, bool anyTemplatesRemain) {
if (element.tagName.name == 'block') {
var nameAttr = element.attributes.firstWhereOrNull((a) => a.name == 'name');
var name = nameAttr?.value?.compute(new SymbolTable());
if (name?.trim()?.isNotEmpty != true) {
onError!(new TwigDartError(TwigDartErrorSeverity.warning,
'This <block> has no `name` attribute, and will be outputted as-is.', element.span));
return [element];
} else if (!definedOverrides.containsKey(name)) {
if (element is RegularElement) {
if (anyTemplatesRemain || !replaceWithDefault) {
// If there are still templates remaining, this current block may eventually
// be resolved. Keep it alive.
// We can't get rid of the block itself, but it may have blocks as children...
var inner =
allChildrenOfRegularElement(element, definedOverrides, onError, replaceWithDefault, anyTemplatesRemain);
return [
new RegularElement(element.lt, element.tagName, element.attributes, element.gt, inner, element.lt2,
element.slash, element.tagName2, element.gt2)
];
} else {
// Otherwise, just return the default contents.
return element.children;
}
} else {
return [element];
}
} else {
return allChildrenOfRegularElement(
definedOverrides[name]!, definedOverrides, onError, replaceWithDefault, anyTemplatesRemain);
}
} else if (element is SelfClosingElement) {
return [element];
} else {
return [
replaceChildrenOfRegularElement(
element as RegularElement, definedOverrides, onError, replaceWithDefault, anyTemplatesRemain)
];
}
}