'Process blocks of markdown text and attach to given etree node.
Given a list of ``blocks``, each blockprocessor is stepped through
until there are no blocks left. While an extension could potentially
call this method directly, it\'s generally expected to be used internally.
This is a public method as an extension may need to add/alter additional
BlockProcessors which call this method to recursively parse a nested
block.'

def parseBlocks(self, parent, blocks):

    while blocks:
        for processor in self.blockprocessors.values():
            if processor.test(parent, blocks[0]):
                processor.run(parent, blocks)
                break
