pub fn build_blocks_from_groups( token_groups: &[TokenGroup], ) -> MdtResult<Vec<Block>>
Build blocks from already-tokenized groups. This is the shared logic used by both markdown parsing and source file scanning.