Source code for src.xmlChecks.divXmlCheck

# SPDX-FileCopyrightText: Copyright © 2026 BBC
#
# SPDX-License-Identifier: BSD-3-Clause

from src.validationLogging.validationCodes import ValidationCode
from src.validationLogging.validationLogger import ValidationLogger
from xml.etree.ElementTree import Element
from src.xmlUtils import make_qname, get_unqualified_name
from .xmlCheck import XmlCheck
from .ttmlUtils import ns_ttml
from .timingAttributeCheck import getTimingAttributes, \
    pushParentTimingAttributes, popParentTimingAttributes


[docs] class divCheck(XmlCheck): """ Checks the div element """ _subChecks = [] def __init__(self, sub_checks: list[XmlCheck] = [], recurse_div_children: bool = True): super().__init__() self._subChecks = sub_checks self._recurse_div_children = recurse_div_children
[docs] def run( self, input: Element, context: dict, validation_results: ValidationLogger) -> bool: tt_ns = \ context.get('root_ns', ns_ttml) valid = True div_el_tag = make_qname(tt_ns, 'div') divs = [el for el in input if el.tag == div_el_tag] if len(divs) == 0 and get_unqualified_name(input.tag) == 'body': valid = False validation_results.error( location='{}/{}'.format(input.tag, div_el_tag), message='Found 0 div elements, require >0', code=ValidationCode.ebuttd_empty_body_constraint ) elif len(divs) > 0 and get_unqualified_name(input.tag) == 'div': valid = False validation_results.error( location='{}/{}'.format(input.tag, div_el_tag), message='Found {} div children of a div, require 0' .format(len(divs)), code=ValidationCode.ebuttd_nested_div_constraint ) # Check each div child for div in divs: timing_attributes = getTimingAttributes(div) pushParentTimingAttributes( timing_attributes=timing_attributes, context=context) if self._recurse_div_children: valid &= self.run( input=div, context=context, validation_results=validation_results ) for subCheck in self._subChecks: valid &= subCheck.run( input=div, context=context, validation_results=validation_results ) popParentTimingAttributes(context=context) return valid