docs: def _build_block_context(template, context):
      """Populate the block context with BlockNodes from parent templates."""
  
      # Ensure there's a BlockContext before rendering. This allows blocks in
      # ExtendsNodes to be found by sub-templates (allowing {{ block.super }} and
      # overriding sub-blocks to work).
      if BLOCK_CONTEXT_KEY not in context.render_context:
          context.render_context[BLOCK_CONTEXT_KEY] = BlockContext()
      block_context = context.render_context[BLOCK_CONTEXT_KEY]
  
      for node in template.nodelist:
          if isinstance(node, ExtendsNode):
              compiled_parent = node.get_parent(context)
  
              # Add the parent node's blocks to the context. (This ends up being
              # similar logic to ExtendsNode.render(), where we're adding the
              # parent's blocks to the context so a child can find them.)
              block_context.add_blocks(
                  {n.name: n for n in compiled_parent.nodelist.get_nodes_by_type(BlockNode)})
  
              _build_block_context(compiled_parent, context)
              return compiled_parent
  
          # The ExtendsNode has to be the first non-text node.
          if not isinstance(node, TextNode):
              break