def run(self, parent, blocks):

    builder = self._tryReuseLast(parent)
    if builder is None:
      builder = HierarchyByIndentationBuilder(CustomHtmlListBuilder(self.parser, parent))

    block = blocks.pop(0)
    # многострочные HTML-комментарии могут поломать структуру списка
    block = self._replaceHtmlComments(block)

    for line in block.split('\n'):
      builder.putLine(line)

    self._storeLast(parent, builder)
  def assertTrace(self, source, expectedTrace):
    trace = []
    builder = HierarchyByIndentationBuilder(TracingHierarchyBuilderWithQueue(trace))
    for line in source.strip('\n').split('\n'):
      builder.putLine(line)

    if type(expectedTrace) is list:
      # expectedTrace - массив
      self.assertEqual(expectedTrace, trace)
    else:
      # expectedTrace - строка
      # используем её как регулярное выражение
      trace = '#'.join(':'.join(step) for step in trace)
      expectedTrace = '^' + expectedTrace + '$'
      self.assertRegex(trace, expectedTrace)