Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
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
27 changes: 27 additions & 0 deletions gdocs/docs_markdown.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,9 +122,36 @@ def _convert_paragraph_text(
for elem in para.get("elements", []):
if "textRun" in elem:
parts.append(_convert_text_run(elem["textRun"], skip_strikethrough))
elif "richLink" in elem:
parts.append(_convert_rich_link(elem["richLink"]))
elif "person" in elem:
parts.append(_convert_person(elem["person"]))
elif "dateElement" in elem:
props = elem["dateElement"].get("dateElementProperties", {})
parts.append(props.get("displayText", ""))
return "".join(parts).strip()


def _convert_rich_link(rich_link: dict[str, Any]) -> str:
"""Convert a richLink element (URL chip) to markdown."""
props = rich_link.get("richLinkProperties", {})
title = props.get("title", "")
uri = props.get("uri", "")
if title and uri:
return f"[{title}]({uri})"
return title or uri


def _convert_person(person: dict[str, Any]) -> str:
"""Convert a person element (person chip) to markdown."""
props = person.get("personProperties", {})
name = props.get("name", "")
email = props.get("email", "")
if name and email:
return f"{name} ({email})"
return name or email


def _convert_text_run(
text_run: dict[str, Any], skip_strikethrough: bool = False
) -> str:
Expand Down
25 changes: 22 additions & 3 deletions gdocs/docs_structure.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ def _parse_element(element: dict[str, Any]) -> Optional[dict[str, Any]]:
if "paragraph" in element:
paragraph = element["paragraph"]
element_info["type"] = "paragraph"
element_info["text"] = _extract_paragraph_text(paragraph)
element_info["text"] = extract_paragraph_text(paragraph)
element_info["style"] = paragraph.get("paragraphStyle", {})

elif "table" in element:
Expand Down Expand Up @@ -162,12 +162,31 @@ def _parse_table_cells(table: dict[str, Any]) -> list[list[dict[str, Any]]]:
return cells


def _extract_paragraph_text(paragraph: dict[str, Any]) -> str:
def extract_paragraph_text(paragraph: dict[str, Any]) -> str:
"""Extract text from a paragraph element."""
text_parts = []
for element in paragraph.get("elements", []):
if "textRun" in element:
text_parts.append(element["textRun"].get("content", ""))
elif "dateElement" in element:
props = element["dateElement"].get("dateElementProperties", {})
text_parts.append(props.get("displayText", ""))
elif "richLink" in element:
props = element["richLink"].get("richLinkProperties", {})
title = props.get("title", "")
uri = props.get("uri", "")
if title and uri:
text_parts.append(f"{title} ({uri})")
else:
text_parts.append(title or uri)
elif "person" in element:
props = element["person"].get("personProperties", {})
name = props.get("name", "")
email = props.get("email", "")
if name and email:
text_parts.append(f"{name} ({email})")
else:
text_parts.append(name or email)
return "".join(text_parts)


Expand All @@ -176,7 +195,7 @@ def _extract_cell_text(cell: dict[str, Any]) -> str:
text_parts = []
for element in cell.get("content", []):
if "paragraph" in element:
text_parts.append(_extract_paragraph_text(element["paragraph"]))
text_parts.append(extract_paragraph_text(element["paragraph"]))
return "".join(text_parts)


Expand Down
9 changes: 2 additions & 7 deletions gdocs/docs_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@
parse_document_structure,
find_tables,
analyze_document_complexity,
extract_paragraph_text,
)
from gdocs.docs_tables import extract_table_as_data
from gdocs.docs_markdown import (
Expand Down Expand Up @@ -193,13 +194,7 @@ def extract_text_from_elements(elements, tab_name=None, tab_id=None, depth=0):

for element in elements:
if "paragraph" in element:
paragraph = element.get("paragraph", {})
para_elements = paragraph.get("elements", [])
current_line_text = ""
for pe in para_elements:
text_run = pe.get("textRun", {})
if text_run and "content" in text_run:
current_line_text += text_run["content"]
current_line_text = extract_paragraph_text(element["paragraph"])
if current_line_text.strip():
text_lines.append(current_line_text)
elif "table" in element:
Expand Down
Loading