docs: def parse(self, source_or_text):
          """Do the actual parsing and returns an AST or parsed element.
  
          :param source_or_text: the text or source object.
              Based on the type, it will do following:
              - text: returns the parsed Document element.
              - source: parse the source and returns the parsed children as a list.
          """
          if isinstance(source_or_text, string_types):
              block.parser = self
              inline.parser = self
              return self.block_elements['Document'](source_or_text)
          element_list = self._build_block_element_list()
          ast = []
          while not source_or_text.exhausted:
              for ele_type in element_list:
                  if ele_type.match(source_or_text):
                      result = ele_type.parse(source_or_text)
                      if not hasattr(result, 'priority'):
                          result = ele_type(result)
                      ast.append(result)
                      break
              else:
                  # Quit the current parsing and go back to the last level.
                  break
          return ast