|
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 |