GenProp / src /tools /paragraph_tools.py
adrien.aribaut-gaudin
feat: new public GenProp
498db6b
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:
#check if there is a style element in the root_numbering
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