def _get_bullet_string(paragraph: ElementTree.Element, context: Dict[str, Any]) -> str: """ Get bullet string if paragraph is numbered. (e.g, '- ' or '1) ') :param paragraph: <w:p> xml element :param context: dictionary of document attributes generated in ``get_context`` :return: specified 'bullet' string or '' if paragraph is not numbered <w:p> <w:pPr> <w:numPr> <w:ilvl w:val="0"/> <w:numId w:val="9"/> </w:numPr> </wpPr> <w:r> <w:t>this text in numbered or bulleted list </w:t> </w:r> </w:p> bullet preceded by four spaces for every indentation level. """ try: pPr = paragraph.find(qn("w:pPr")) numPr = pPr.find(qn("w:numPr")) numId = numPr.find(qn("w:numId")).attrib[qn("w:val")] ilvl = numPr.find(qn("w:ilvl")).attrib[qn("w:val")] numFmt = context["numId2numFmts"][numId][int(ilvl)] except (AttributeError, KeyError): # not a numbered paragraph return "" number = _increment_list_counter(context["numId2count"][numId], ilvl) indent = "\t" * int(ilvl) def format_bullet(bullet: str) -> str: """Indent, format and pad the bullet or number string.""" if bullet != nums.bullet(): bullet += ")" return indent + bullet + "\t" if numFmt == "decimal": return format_bullet(nums.decimal(number)) elif numFmt == "lowerLetter": return format_bullet(nums.lower_letter(number)) elif numFmt == "upperLetter": return format_bullet(nums.upper_letter(number)) elif numFmt == "lowerRoman": return format_bullet(nums.lower_roman(number)) elif numFmt == "upperRoman": return format_bullet(nums.upper_roman(number)) elif numFmt == "bullet": return format_bullet(nums.bullet()) else: warnings.warn("%s numbering format not implemented, substituting %s" % (numFmt, nums.bullet())) return format_bullet(nums.bullet())
def test_upper_roman() -> None: """Same as lower_roman, but upper""" for _ in range(100): n = randint(1, 10000) assert upper_roman(n) == lower_roman(n).upper()
def test_neg(self) -> None: """Raise a value error for < 1""" with pytest.raises(ValueError) as msg: lower_roman(-1) assert "Roman" in str(msg.value)
def test_convert_positive_int(self) -> None: """Convert a positive integer to a string of letters""" for arabic, roman in ARABIC_2_ROMAN.items(): assert lower_roman(arabic) == roman