Adicionar app/io/document.py
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# All comments in English.
|
||||
|
||||
from docx import Document
|
||||
from odf.opendocument import load
|
||||
from odf.text import P
|
||||
from bs4 import BeautifulSoup
|
||||
import markdown
|
||||
|
||||
def normalize_newlines(value):
|
||||
if value is None:
|
||||
return ""
|
||||
return (
|
||||
str(value)
|
||||
.replace("\r\n", "\\n")
|
||||
.replace("\n\r", "\\n")
|
||||
.replace("\r", "\\n")
|
||||
.replace("\n", "\\n")
|
||||
)
|
||||
|
||||
def convert_docx(path):
|
||||
doc = Document(path)
|
||||
lines = []
|
||||
for p in doc.paragraphs:
|
||||
lines.append(normalize_newlines(p.text))
|
||||
return "\n".join(lines)
|
||||
|
||||
def convert_doc(path):
|
||||
# DOC (binary) requires LibreOffice headless conversion
|
||||
import subprocess, tempfile, os
|
||||
tmp = tempfile.mktemp(suffix=".docx")
|
||||
subprocess.run(["soffice", "--headless", "--convert-to", "docx", "--outdir", "/tmp", path])
|
||||
return convert_docx(tmp)
|
||||
|
||||
def convert_odt(path):
|
||||
doc = load(path)
|
||||
lines = []
|
||||
for p in doc.getElementsByType(P):
|
||||
text = p.firstChild.data if p.firstChild else ""
|
||||
lines.append(normalize_newlines(text))
|
||||
return "\n".join(lines)
|
||||
|
||||
def convert_txt(path):
|
||||
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||
return normalize_newlines(f.read())
|
||||
|
||||
def convert_md(path):
|
||||
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||
raw = f.read()
|
||||
html = markdown.markdown(raw)
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
return normalize_newlines(soup.get_text())
|
||||
|
||||
def convert_html(path):
|
||||
with open(path, "r", encoding="utf-8", errors="ignore") as f:
|
||||
raw = f.read()
|
||||
soup = BeautifulSoup(raw, "html.parser")
|
||||
return normalize_newlines(soup.get_text())
|
||||
|
||||
def convert_document(path):
|
||||
if path.endswith(".docx"):
|
||||
return convert_docx(path)
|
||||
if path.endswith(".doc"):
|
||||
return convert_doc(path)
|
||||
if path.endswith(".odt"):
|
||||
return convert_odt(path)
|
||||
if path.endswith(".txt"):
|
||||
return convert_txt(path)
|
||||
if path.endswith(".md"):
|
||||
return convert_md(path)
|
||||
if path.endswith(".html") or path.endswith(".htm"):
|
||||
return convert_html(path)
|
||||
raise ValueError("Unsupported document format")
|
||||
Reference in New Issue
Block a user