def test_pop(self): sl = StringList(['', '', "hello", "world", '', '', '', "1234"]) assert sl.pop(2) == "hello" assert sl == ['', '', "world", '', '', '', "1234"] assert isinstance(sl, StringList)
def _reformat_blocks(blocks: List[List[str]]): cursor = 1 while cursor < len(blocks): if isinstance(blocks[cursor - 1], (_MultilineFunction, _DecoratedFunction, _Class)): # Add a blank line after _Variables, a multi-line function, or a decorated function blocks.insert(cursor, []) cursor += 1 if blocks[cursor] and blocks[cursor - 1] and re.match( "^[ \t]+", blocks[cursor - 1][-1]) and not re.match( "^[ \t]+", blocks[cursor][0]): # Add a blank line after a dedent blocks.insert(cursor, []) cursor += 1 if isinstance(blocks[cursor - 1], _Variables): # Add a blank line before and after _Variables blocks.insert(cursor - 1, []) blocks.insert(cursor + 1, []) cursor += 2 if isinstance(blocks[cursor], _Variables): # Add a blank line before and after _Variables blocks.insert(cursor, []) blocks.insert(cursor + 2, []) cursor += 2 if isinstance(blocks[cursor], (_DecoratedFunction, _MultilineFunction)): # Add a blank line before a decorated function blocks.insert(cursor, []) cursor += 1 if isinstance(blocks[cursor], _Class): if (cursor + 1 < len(blocks) and isinstance(blocks[cursor + 1], _Function) and not isinstance(blocks[cursor + 1], (_DecoratedFunction, _MultilineFunction)) and blocks[cursor][-1].lstrip().startswith("class") and blocks[cursor + 1][0][0].isspace()): blocks.insert(cursor, []) cursor += 2 else: blocks.insert(cursor, []) blocks.insert(cursor + 2, []) cursor += 3 cursor += 1 output = StringList() # Remove trailing whitespace from each block for block in blocks: if output and not block and not output[-1]: # Remove duplicate new lines continue output.append('\n'.join(block).rstrip()) if not output[0]: output.pop(0) output.blankline(ensure_single=True) return output
def run_html(self) -> List[nodes.Node]: """ Generate output for ``HTML`` builders. """ # colours = itertools.cycle(self.delimited_get("colours", "#6ab0de")) colours = itertools.cycle( get_random_sample(self.delimited_get("colours", "blue"))) classes = list( self.delimited_get( "class", "col-xl-6 col-lg-6 col-md-12 col-sm-12 col-xs-12 p-2")) content = StringList() content.append(".. panels::") content.indent_type = " " content.indent_size = 1 content.append(":container: container-xl pb-4 sphinx-highlights") content.blankline() for obj_name in get_random_sample(sorted(set(self.content))): if self.options.get("module", '') and obj_name.startswith('.'): obj_name = obj_name.replace('.', f"{self.options['module']}.", 1) name_parts = obj_name.split('.') module = import_module('.'.join(name_parts[:-1])) obj = getattr(module, name_parts[-1]) colour_class = f"highlight-{next(colours)}" content.append( f":column: {DelimitedList((*classes, colour_class)): }") if isinstance(obj, FunctionType): content.append( f":func:`{'.'.join(name_parts[1:])}() <.{obj_name}>`") elif isinstance(obj, type): content.append( f":class:`{'.'.join(name_parts[1:])} <.{obj_name}>`") else: content.append( f":py:obj:`{'.'.join(name_parts[1:])} <.{obj_name}>`") content.append('^' * len(content[-1])) content.blankline() # content.append(f".. function:: {name_parts[-1]} {stringify_signature(inspect.signature(obj))}") content.append(format_signature(obj)) content.blankline() content.append( inspect.cleandoc(obj.__doc__ or '').split("\n\n")[0]) content.blankline() content.append(f"See more in :mod:`{module.__name__}`.") content.append("---") content.pop(-1) targetid = f'sphinx-highlights-{self.env.new_serialno("sphinx-highlights"):d}' targetnode = nodes.target('', '', ids=[targetid]) view = ViewList(content) body_node = nodes.paragraph(rawsource=str(content)) self.state.nested_parse(view, self.content_offset, body_node) # type: ignore sphinx_highlights_purger.add_node(self.env, body_node, targetnode, self.lineno) return [targetnode, body_node]