Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 12 additions & 13 deletions docling/backend/opendocument_backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -303,32 +303,31 @@ def _odf_text_runs(
odf_obj: OdfDocument | None,
inherited_formatting: Formatting | None = None,
) -> list[_OdfTextRun]:
style_name = getattr(element, "attributes", {}).get("text:style-name")
style_name = element.attributes.get("text:style-name")
formatting = _formatting_from_odf_text_style(
odf_obj, style_name, inherited_formatting
)
tag = getattr(element, "tag", None)
tag = element.tag
if tag == "text:line-break":
text = getattr(element, "text", "\n") or "\n"
text_recursive = getattr(element, "text_recursive", "")
if text_recursive.startswith(text):
text = text_recursive
return [_OdfTextRun(text=text, formatting=formatting)]
return [_OdfTextRun(text=element.text or "\n", formatting=formatting)]
if tag == "text:tab":
return [_OdfTextRun(text="\t", formatting=formatting)]

runs: list[_OdfTextRun] = []
text = getattr(element, "text", "")
children = element.children
text = element.text
if text:
runs.append(_OdfTextRun(text=text, formatting=formatting))

for child in getattr(element, "children", []):
for child in children:
runs.extend(_odf_text_runs(child, odf_obj, formatting))
if child.tail:
runs.append(_OdfTextRun(text=child.tail, formatting=formatting))

if not runs and not getattr(element, "children", []):
text_recursive = getattr(element, "text_recursive", "")
if text_recursive:
runs.append(_OdfTextRun(text=text_recursive, formatting=formatting))
if not runs and not children:
inner_text = element.inner_text
if inner_text:
runs.append(_OdfTextRun(text=inner_text, formatting=formatting))

return runs

Expand Down
2 changes: 1 addition & 1 deletion tests/data/odf/groundtruth/text_document_03.odt.html
Original file line number Diff line number Diff line change
Expand Up @@ -202,7 +202,7 @@ <h3>Table with nested table</h3>
<p>Before table</p>
<table><tbody><tr><th>Column A</th><th>Column B</th></tr><tr><td>Simple cell upper left</td><td>Simple cell with bold and italic text</td></tr><tr><td><table><tbody><tr><th>A</th><th>B</th><th>C</th></tr><tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr></tbody></table></td><td><p>Rich cell<br>A nested table</p>
<table><tbody><tr><th>A</th><th>B</th><th>C</th></tr><tr><td>Cell 1</td><td>Cell 2</td><td>Cell 3</td></tr></tbody></table></td></tr></tbody></table>
<span class='inline-group'>After table with <strong>bold</strong> <u>underline</u> <del>strikethrough</del> <em>italic</em></span>
<span class='inline-group'>After table with <strong>bold</strong> , <u>underline</u> , <del>strikethrough</del> , and <em>italic</em> formatting</span>
<h3>Table with pictures</h3>
<table><tbody><tr><th>Column A</th><th>Column B</th></tr><tr><td>Only text</td><td><figure><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAU0ElEQVRoBb3BCVyUdcLA8d9/nmcOGO5LRE3xTsX7QLAQLyjakBKPhK200jRXs13fVq3NSt1eTbPUXM3rFcVbcD3wRoi8JY88IkfIm2tggAHmeJ53BnNfXz+1tW3v+/0KfmPh4eFhdpebN2+W8P9A8Btp3bp18w0bNqzt1atXjKIozrlz575748aNO927d+/WyOWWy44dO7YfPnz4S0VR+K0I/k2tW7duNsxl0qRJk51OZ/OVK1eSmJhIt27dcDqd1NfX4+npyQN2u7327NmzJ3e7bHW5fPnydf4Ngl9Bo9GQlJT09ESX2NjYOECqqamhU6dOYL2FX1hHOnXqxLZt26itraVt27ZMnjyZ8ePHo9FoeIjy1VdfZX/++edLN27cuN3hcKj8iwT/ouTk5Gdmz549t02bNp1wURSF48ePs3jxYkxnMvl0Qgv6TLnEi4ODeOf17gRJVcxf/x0fbi7B09OTiIgI+vfvz9ChQ4mMjOSBoqKib2fOnDk9LS1tG/8CwS8UGhoauGzZss8SExNH4VJTU8PKlStZtGgRJpMJt8HdfNj/aTQzFp3i/YldUaorGLfwO9bnVGJzqDyqTZs2vPHGG4wZMwYvLy/c9u3bl/HKK6+Mv3nz5j1+AcEvMHDgwOgtW7Zs9/f3D7Hb7Xz22WfMmjULi8XCA+2a6Ijv7s1fRjfF388DZC0NVBWcdqotVs4WVHPg62p2HLfwzY16HvD19eX9999nwoQJyLJMVVWVOTU1dVRmZuY+fobgZ4wfPz71s88+WyHLsr6goIARI0aQn5/PA7ERRt4d0Yj+fZuCdwB4eIMQYK8HnYF/UFVw2KCmEqrKycsv5uPMUnYcr+KBXr16sWnTJsLDw3FxzpgxY+qcOXM+5Z8Q/BNTp0597eOPP/4bLhkZGYwePRqr1Yqbr6eGJePCGD0gCPSeoCoQ0hxKb4G1EnyCIKAxVBSDtRICwsDLj3+os0LZTc5cKObVxbfIv16Hm5eXFxs3biQhIQG3995774+zZs36mJ8g+AmjRo0ampaWtlWj0Ujp6emkpqbidDpx69JCT+b05jQP0fEPQoDQgOKkgd4T7PWgOAEBPgFgrQJVhbBWYDCCqkJVOfV3vmfCku9ZdagCN1mWWbduHSNHjsRFGTdu3IvLly9P40cIfkT37t07Hjt27JROp/NYuXIlr732Goqi4JbY25v0PzbDQ6fhV9HqQWjA6QCdAUKag0YDtwqYt+l7pq29h5sQghUrVjB27FicTqctNjY2Ojc39zSPEDzCaDQa8vPzT7dp06ZjdnY2AwcORFEU3AZEGMn6Swu0suA34R0AvsGgkUDWwe0CpiwuYNGuctxkWSY7O5vo6Ghu3rxp6ty5cxez2VzNQwSP+Pzzzz8eP3781Fu3btGlSxfKyspw69hMz7H/bIm3h8T/ieBm4BOIs+gyg/98mSMXrLiFhIRw7tw5QkNDWb9+/RcpKSmv8hDBQ9q1a9fi4sWLV2VZ1iUkJLBnzx7cNALOLmhFlxYG/ocAwW/Hwxv8Q0HWcu3UOdq/fhWHQoOkpCS2b9+Oi9KzZ8/OZ86c+YYfCB6yadOmNcOHD39x//79xMXF8cDEOH8Wjw2lgRAguE8AQtBA8BABgl/HNxhkLRPnnGbp3nIeyM7OJiYmhiNHjmQNGDDgKX4g+EHLli2bXL161STLsq5Pnz6cPHkSN50Epk9a0sRfCwIQAgQguE8IENwnBAhAcJ8QNBA8RIDgPlVFATRC8L94B2AyldL6tUuoKg369etHbm4ubpGRkV1PnDhxDhfBDz755JO/Tp48+T/2799PXFwcD/w+ypu1rzQCIUDQYE2ehQVZZq4X2/EyaEjq5c2cEcH4GTUgBA0EIAQNBCAAIXC7csfGlFV3OXqxBrtTpW2YnvdGhTA8yhcE98k6Brx9hZMFtdTaVBQVsrOziYmJIS0t7YvU1NRXcRG4CCEoKSm5FRgYGPb888+zfft2PHUCq01l96RQnu7kCUKAgD9tLWPLFV+Sk5PZsmULRUVFuHVooiNvZjP8PCUQgOA+IUAAAhfBxVv1xH54i5SXJ1BQUMDu3bt5YOGYUKYkBIAQuH20o4Q/ryumW0sDZ011jBo1ig0bNlBTU1MREBAQbLPZHAKXXr16RZw8efJ8bW0t/v7+1NfXE9FYy4U7dmoWPIanTgMCzt600WPubY4dO0ZkZCQnTpwgMjKSB17v78PSlGAQggYCEAIE9wmI+uAGXQe/zNKlS3ELDQ3l3r17uMkS3Fzahka+EgjBkUs1DJj1PalP+rIupxKDwUBFRQV6vZ5Bgwb1O3ToUJ7AZdq0aX/46KOPFmVlZfHUU0+h1UBsaz1f37Zz7/2mIAABM3ZXMOeAhc2bN5OcnMzWrVtJTk7mgWAvDcXzmoMQNBCAwEWAAEu9gv+k6wweEkdWVhalpaU0b94cq9XKA2teC+XFJ3xACArL7IRPNjE9MYB5u8qxO+HAgQMMGjSIDz/8cOY777wzW+CyefPmtOTk5NHTp09n7ty5dAuTMeo0lFsVvnkrlAYCXtlqJtPkgdlsJiIiggsXLuB0OnmYuqg5CEAIENwnBAgoMjtoMeMGbo899hgVFRVYLBYeCA4O5u0BKlPj/EBARa2C/wQTb8X7ceRyLWeL6pk+fTqzZ89m3759O+Pj4xMFLufPnz8dERHRIyEhgT179jAqwsBNi0Kp1cmlyY1oIGDO0Sq+0j7J7t27+TEt/CWuzwgDAQgBgvsEIAR2RcXnT99T5+BHPfPMM4xrfopnOhtBQJlVIWhKIX+K8+NWhYMNJ6qJj49n7969FBUVfduiRYt2ApfKyspiHx+f4LZt21JQUMDb0Z58U+wg76adsmkhgEABPjlew7VWqRw8eJBvv/2Wh8myzOxBnkyL8ea62cm7By3k37EjBEQ20zErzpcwH4kJ28v54pQNu93OwwYMGICvjxcvBB5jWDcjbleK7Tz+/i0+fNafGpvK3KwKwsPDMZlMOByOeoOL0Gq12Gw2ByD5+PhQVVXF/Fgj1yudLDlbh3lqEH4GAUJQVOkkcVs1yRPfoaKigpycHCRJwtPTkyZVF/jiKQ15N2xMOljFgtmpDBySgOqwsisjjT/POcyaoX50aKRlzG4Ji18HzGYzer2egQMHUlZWxs0jX5CWEoinTgMCdlyw8tyqUtakBFJWo/DWDjMGg4Ha2lrcAgMDvYSXl5e2qqrKhotGo0FVVZYM8EQnC17dX0P6M16MfFwPCBDgVOHv12x8VW5EG9KKOvNdehuLGdHRwLkSByl7qjiwqAehjQPBVgCyAGMbir438cwbBexM9qe5n8SmC7UUqM3QGX1QS77jqVYKXcN0IAAhQMAfMitYebKafa+FcOGunQnbzLjZ7XZkWaZx48ZBwmAwiNraWgUXSZJQFIXPnvSge4jE0F01dAuR2JfkDQIQAgT3CQECELgIzhY7+P3eKja/GcyaY1Zmj/ZHq9eAVmATghn/Vc7zMd6M/+A2m5/zo22gBELQQABC0EAAQuBQVVrMu0fbIJk5cb6cvW1jYmYlbna7HVmWCQ0N9RO41NbWVhgMBl8XLBYLf+2jJyZMZvVVG8sv2cl73ouoUAmEoIEAhODbCifbrtk5fc/BrTqVtBRfQvwlJm2zsHJsALJOA1qBUxK8uKSMxRODKCpz8uL8Ytp7Cro2khnZ0UALPwkQIAABCFhzro6XMypZEO9N32Y6cops/Mf+Kjw8PLBarbg49Xq9TuBiMpmuhIeHt2vbti0FBQXM6q5lSBOZKgc8d6CWdn4ajg81IkuCBgJqFYhIr2Lc4zLR4VqiwvXQtCN4GECtB+EACdBJoNWC3gAGT7CX4qwpJDvfytEDlaQXOLgyLgBJAEKAgBqHSrtl5UgCNiT5ImkE267UMf+YlfDwcEwmE+Xl5XcCAwPDBC5ZWVmZcXFxzyYkJLBnzx7GtZGY0F6L1QGH7jqZmW9nQnuZJX31IAQIqFeg2/YaYoM1tPUWdArU0NRXwuAfiBwYhuzjj9AbQKiodivOmnLslXexVlgw3bXzzT0nVy0KZ6vgTKofGgEIgQKM2lXFlqs2lgw20q2RFgT87eta1lyoJz4+nr1793L8+PHsvn37xgpc5s6d+97bb7/9lxkzZjBnzhy6+AlyBum4ZFFxW1bgYO11hYntZBb10iFpaFBmgznnbWysCMHLy4ua8hKM9RUE6cFHFsgaUFWwKWCxq5TaBXWegfgGBqPVamlp+Ya1g4146wQIcKjw6mEray7ZmNhZT0oHPW7BRg3Jf68iv9jJ9OnTmT17NkuXLl04ceLEqQKX+Pj42L179x4+cOAAQ4YMwa3sWS1VDrhTByqw7JqT/ypS6B0gWNJLS88ADQjILVF41x5FamoqbqqqUlNTQ01NDXV1dUiShF6vx2g0YjAYUFUVtytXrlC881PWDvBAIwRH7jh4M6+Oc2UK4zpoeelxPQjQSfCYt0TIF5WowKFDhxgwYAAjRowYunnz5kyBi6enp85sNlcoiuLh7+9PXV0dK7poGNNcw8UqFasTEILDJQoffatgcUDfQEG5Dby18Fj/JKZOncqePXtwa9++PUajEZPJxO7du7Hb7QQHB9OuXTu6du3KkiVLyMvLQ1VVmnoKgj0E+WUKgXr4cxcd0aEyCEBAhwCJrSY7Y7Pr8PT0xGw2I8uys1GjRoGlpaWVgh9kZGSkJyYmjhw2bBjbtm2juw+c6afBrsKFKrCpoAIfXVM5VCGY9rsAIpvp2HWqig2X9Vy6dAmz2UxeXh4nTpygsLAQo9FIZGQk0dHR+Pr6cvnyZZYtW4b9zjHWv9WMUD+ZrLNVfJxZytGLVqZ31vJMU4kGQtDCWxDqoaH3362cKlV44YUXWL9+PTk5OftjYmLicBH8ICEhYcCuXbsO7du3j/j4eNwO9RLEBArOWcCmwta7CuvNMofefYwOvhoOnq2itV4lfEExd+7c4dNPP8VkMtGmTRtiYmJo27YtX3/9NV999RWFhYUMHz6c4cnDKJrXnJBgHVoPCSQNCFiXXcGEv93mjZYSiU0lEBDhr+FUuULs/nrcDh8+TGxsLGPGjBm1evXqjbgIHnL27Nlj3bp1i+zduzenTp2iqzfs7in4vk5wp05l1DmVo++3oE+oBBY75uJ6opeXcMWsUldXh06nw+3GjRvk5uZy7NgxSktLCQoK4oknnqBz585EdHycP/Tz4tnOnsR0NIJeAp0EOg2nCut5crqJJV0lOvhq8NUJUo/bOWNWiYqKIi8vjxs3blxr3bp1O5vN5sRF8JDExMQhGRkZ+w4ePMjgwYNxmxYOSaEaFl5XsDXxYsfrjcBi58TlGrafs3LT7MAU2IPFixdjMpno168fjRs35mElJSXk5ubSu3dvIiMjCXPeZftwP85XqDzd0QP0Eugl0EtM2VjK2TMV/GcnmZ13FeZeVXDLzs4mJiaGsWPHvrBq1ap0fiB4RE5Ozr4nnnhiSFJSEhkZGcgCPu8omHZFZePExgx5TAaLHSw20vKtpGbXkZaWxtChQ8nLy+PLL7/ku+++Q5ZlunbtysiRIwkLC+OBbdu28eKoZDwllfyRPjQJlEEvgV4CvcSFMifd59/li86CcRdU6hUYPnw4mzZtIj8//3iPHj36qqrKA4JHdOjQodXp06e/rqys9OrSpQvFxcX4ymBVwTKnKQarncuFdbx5qBqtqlLo34H8/HxeffVV6uvrefzxx4mOjqZHjx5cvXoVf39/3nrrLS5dukRdXR1CCO7du4eXsDOtg8z5SpUv+nvgaZRBL+HQaTD8tQQvCSod0LhxY86dO4efn199VFRUz9OnT1/kIYIfMW7cuJRly5aty8nJITY2FkVR8PcQXJ4QRCOnAyx25p6qZfoFJ7m5udhsNiwWC/3796eiooLc3Fyys7PRaDTMmzePPn36cOnSJSRJwu3u3btER0djMpmY217wdnsJ9BLoJYpVDU3XV2NXQJIkcnJyiIqKYtq0aW/MmzdvCY8Q/IQtW7asHTZs2O+XL1/O+PHjUVWVNn4a9g02EOZ00PeQjS5JL7F69WpKS0vJysoiNzeXyspKRo8eze9+9zvcMjMz2bRpExs2bKC6upqFCxeyZMkSGjVqxPnz55EELGgPf2ihocgGQ04ofFtNg2XLljFu3DiysrJ2PP3008+pqsqjBD9Bp9PJO3fu3BwXF5e0bt06XnrpJRRFwUeGCG9wtovk8OHDeHh48Cin04kkSdy7d48nn3ySBQsWcPjwYdavX0/Lli3p0qUL586d49ixYzyQGALZ5VDpAEmSWLNmDSkpKeTm5u6Pj49/1mq11vMjBP+EwWDQ7ty5c8vgwYMTMzMzSUlJobq6moiICLKzswkICOCnZGZmMmnSJCoqKvD396dTp0506NABo9GIXq9n4cKFlJSU8CgfHx82bNhAQkICx48fPzJ48OCE6urqWn6C4GcIIUhPT185YsSIMStWrGDFihXs2bOH8vJybt++TWlpKRaLhfLycu7du4fJZKKwsBBVVWnVqhXt27fHz88PvV6PTqdDlmVycnJYu3Ytj4qOjiY9PZ1mzZqxfPnyTyZNmvQnm83m4J8Q/AwvLy+Pixcvnrt27VqbhIQEmjVrhsFg4Pbt25SVlfEwIQR+fn5otVq0Wi0GgwGj0Yivry/+/v4EBgZit9tJT0/H6XTyQGBgILNnz+aVV17BarWap0yZ8vqqVas28QsIfsbMmTPf+uCDD+bv3r0bRVEYNGgQHh4e1NbWsnr1aubPn8/169f5NVq1asWbb77Jyy+/jKenJ5mZmenjx4+fdPfu3TJ+IcHPWLx48byJEyf+saqqypybm3skKytrn8lkKpgwYcIb8fHxzwLyl19+SUZGBkePHuXChQvY7XZ+jFarpXPnzsTExJCUlERUVBQajUY5cuTIvlmzZr139OjRk/yLBD9Do9GIgIAAb7PZXO10OhUe0qRJk+CUlJQXnnPp2bNnlEajke12O6Wlpdy5c4fq6mpUVcXb25vGjRsTFBSEVqvFRcnPzz+xw2XdunVphYWFd/iVBL+RoKAgnz59+vSKiIjoHO4S6uLh4WHUaDSixqWkpKS40OW8y/Hjx08UFxdX8Bv4b6f6hrZfDMyxAAAAAElFTkSuQmCC"></figure>
<p>Owner avatar</p></td></tr><tr><td><p>Text and picture</p>
Expand Down
102 changes: 53 additions & 49 deletions tests/data/odf/groundtruth/text_document_03.odt.itxt
Original file line number Diff line number Diff line change
Expand Up @@ -46,59 +46,63 @@ A nested table
item-42 at level 1: inline: group group
item-43 at level 2: text: After table with
item-44 at level 2: text: bold
item-45 at level 2: text: underline
item-46 at level 2: text: strikethrough
item-47 at level 2: text: italic
item-48 at level 1: section_header: Table with pictures
item-49 at level 1: table with [3x2]
item-50 at level 2: unspecified: group rich_cell_group_4_1_1
item-51 at level 3: picture
item-52 at level 3: text: Owner avatar
item-53 at level 2: unspecified: group rich_cell_group_4_0_2
item-54 at level 3: text: Text and picture
item-45 at level 2: text: ,
item-46 at level 2: text: underline
item-47 at level 2: text: ,
item-48 at level 2: text: strikethrough
item-49 at level 2: text: , and
item-50 at level 2: text: italic
item-51 at level 2: text: formatting
item-52 at level 1: section_header: Table with pictures
item-53 at level 1: table with [3x2]
item-54 at level 2: unspecified: group rich_cell_group_4_1_1
item-55 at level 3: picture
item-56 at level 3: text: Owner avatar
item-57 at level 1: section_header: Lists with same numId in different cells
item-58 at level 1: table with [2x1]
item-59 at level 2: unspecified: group rich_cell_group_5_0_0
item-60 at level 3: list: group list
item-61 at level 4: list_item: Cell 1 item 1
item-62 at level 4: list_item: Cell 1 item 2
item-63 at level 2: unspecified: group rich_cell_group_5_0_1
item-57 at level 2: unspecified: group rich_cell_group_4_0_2
item-58 at level 3: text: Text and picture
item-59 at level 3: picture
item-60 at level 3: text: Owner avatar
item-61 at level 1: section_header: Lists with same numId in different cells
item-62 at level 1: table with [2x1]
item-63 at level 2: unspecified: group rich_cell_group_5_0_0
item-64 at level 3: list: group list
item-65 at level 4: list_item: Cell 2 item 1
item-66 at level 4: list_item: Cell 2 item 2
item-67 at level 1: section_header: Lists with different numIds in different cells
item-68 at level 1: table with [2x1]
item-69 at level 2: unspecified: group rich_cell_group_6_0_0
item-70 at level 3: list: group list
item-71 at level 4: list_item: Cell 1 item 1
item-72 at level 4: list_item: Cell 1 item 2
item-73 at level 2: unspecified: group rich_cell_group_6_0_1
item-65 at level 4: list_item: Cell 1 item 1
item-66 at level 4: list_item: Cell 1 item 2
item-67 at level 2: unspecified: group rich_cell_group_5_0_1
item-68 at level 3: list: group list
item-69 at level 4: list_item: Cell 2 item 1
item-70 at level 4: list_item: Cell 2 item 2
item-71 at level 1: section_header: Lists with different numIds in different cells
item-72 at level 1: table with [2x1]
item-73 at level 2: unspecified: group rich_cell_group_6_0_0
item-74 at level 3: list: group list
item-75 at level 4: list_item: Cell 2 item 1
item-76 at level 4: list_item: Cell 2 item 2
item-77 at level 1: section_header: Multiple columns with lists
item-78 at level 1: table with [2x2]
item-79 at level 2: unspecified: group rich_cell_group_7_0_0
item-80 at level 3: list: group list
item-81 at level 4: list_item: R1C1 item 1
item-82 at level 4: list_item: R1C1 item 2
item-83 at level 2: unspecified: group rich_cell_group_7_1_0
item-75 at level 4: list_item: Cell 1 item 1
item-76 at level 4: list_item: Cell 1 item 2
item-77 at level 2: unspecified: group rich_cell_group_6_0_1
item-78 at level 3: list: group list
item-79 at level 4: list_item: Cell 2 item 1
item-80 at level 4: list_item: Cell 2 item 2
item-81 at level 1: section_header: Multiple columns with lists
item-82 at level 1: table with [2x2]
item-83 at level 2: unspecified: group rich_cell_group_7_0_0
item-84 at level 3: list: group list
item-85 at level 4: list_item: R1C2 item 1
item-86 at level 4: list_item: R1C2 item 2
item-87 at level 2: unspecified: group rich_cell_group_7_0_1
item-85 at level 4: list_item: R1C1 item 1
item-86 at level 4: list_item: R1C1 item 2
item-87 at level 2: unspecified: group rich_cell_group_7_1_0
item-88 at level 3: list: group list
item-89 at level 4: list_item: R2C1 item 1
item-90 at level 4: list_item: R2C1 item 2
item-91 at level 2: unspecified: group rich_cell_group_7_1_1
item-89 at level 4: list_item: R1C2 item 1
item-90 at level 4: list_item: R1C2 item 2
item-91 at level 2: unspecified: group rich_cell_group_7_0_1
item-92 at level 3: list: group list
item-93 at level 4: list_item: R2C2 item 1
item-94 at level 4: list_item: R2C2 item 2
item-95 at level 1: section_header: Mixed content - list and regular text in different cells
item-96 at level 1: table with [2x1]
item-97 at level 2: unspecified: group rich_cell_group_8_0_0
item-98 at level 3: list: group list
item-99 at level 4: list_item: List item 1
item-100 at level 4: list_item: List item 2
item-93 at level 4: list_item: R2C1 item 1
item-94 at level 4: list_item: R2C1 item 2
item-95 at level 2: unspecified: group rich_cell_group_7_1_1
item-96 at level 3: list: group list
item-97 at level 4: list_item: R2C2 item 1
item-98 at level 4: list_item: R2C2 item 2
item-99 at level 1: section_header: Mixed content - list and regular text in different cells
item-100 at level 1: table with [2x1]
item-101 at level 2: unspecified: group rich_cell_group_8_0_0
item-102 at level 3: list: group list
item-103 at level 4: list_item: List item 1
item-104 at level 4: list_item: List item 2
Loading
Loading