| from xml.etree import ElementTree as ET |
|
|
| def find_list_indentation_level(para, doc): |
| namespace = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"} |
| xml_para = para._p.xml |
| try: |
| xml_numbering = doc.xdoc._part.numbering_part.element.xml |
| except: |
| return False, 0 |
| root_para = ET.fromstring(xml_para) |
| root_numbering = ET.fromstring(xml_numbering) |
| abstract_num_reference = [] |
| for item in root_numbering: |
| if item.tag == "{http://schemas.openxmlformats.org/wordprocessingml/2006/main}num": |
| abstract_num_reference.append(item) |
| is_numPr = root_para.find(".//w:numPr", namespaces=namespace) |
| is_style = root_para.find(".//w:pStyle", namespaces=namespace) |
| is_numId = root_para.find(".//w:numId", namespaces=namespace) |
| is_lvl = root_para.find(".//w:ilvl", namespaces=namespace) |
| if is_numPr != None: |
| if is_numId != None and is_lvl != None: |
| return True, int(is_lvl.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val"]) + 1 |
| elif is_numId != None and is_lvl == None: |
| numId = int(is_numId.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val"]) |
| is_abstractNumId = [item for item in abstract_num_reference if item.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}numId"] == str(numId)][0] |
| numID_reference = is_abstractNumId.find(".//w:abstractNumId", namespaces=namespace).attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val"] |
| real_numID = root_numbering.find(f".//w:abstractNum[@w:abstractNumId='{int(numID_reference)}']", namespaces=namespace) |
| if style_Id == None: |
| return False, 0 |
| style_Id = is_style.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val"] |
| is_style_in_numbering = root_numbering.find(f".//w:pStyle[@w:val='{style_Id}']...", namespaces=namespace) |
| lvl = real_numID.find(".//w:ilvl", namespaces=namespace) |
| return True, int(lvl.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ilvl"]) + 1 |
| else: |
| if is_style == None: |
| return False, 0 |
| else: |
| |
| style_Id = is_style.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}val"] |
| is_style_in_numbering = root_numbering.find(f".//w:pStyle[@w:val='{style_Id}']...", namespaces=namespace) |
| if is_style_in_numbering == None: |
| return False, 0 |
| else: |
| ilvl = is_style_in_numbering.attrib["{http://schemas.openxmlformats.org/wordprocessingml/2006/main}ilvl"] |
| return True, int(ilvl) + 1 |