From 3a6f023f0b8cb55b29e2704bf3abae933c894f61 Mon Sep 17 00:00:00 2001 From: Mauro Druwel Date: Sat, 4 Jan 2025 12:53:02 +0100 Subject: [PATCH] Underscores, length limit, unique name, tests --- src/markitdown/_markitdown.py | 52 +++++++++++++++++++++---- tests/test_files/test_with_images.docx | Bin 0 -> 58583 bytes tests/test_markitdown.py | 14 +++++++ 3 files changed, 59 insertions(+), 7 deletions(-) create mode 100644 tests/test_files/test_with_images.docx diff --git a/src/markitdown/_markitdown.py b/src/markitdown/_markitdown.py index 1656eaf..d6f550a 100644 --- a/src/markitdown/_markitdown.py +++ b/src/markitdown/_markitdown.py @@ -702,19 +702,57 @@ class DocxConverter(HtmlConverter): """ def sanitize_filename(self, name: str) -> str: - """Sanitizes a string to make it a valid file name.""" - # Normalize whitespace - name = re.sub(r"\s+", " ", name.strip()) + """Sanitizes a string to make it a valid file name across different operating systems.""" + # Normalize underscore + name = re.sub(r"\s+", "_", name.strip()) + # Replace invalid characters with underscores - return re.sub(r'[\\/*?:"<>|]', "_", name) + name = re.sub(r'[\\/*?:"<>|]', "_", name) + + # Remove leading and trailing dots and spaces + name = name.strip(" .") + + # Limit the length of the filename to a reasonable length (e.g., 251 characters) + max_length = 251 + if len(name) > max_length: + name = name[:max_length] + + return name + + def truncate_filename(self, name: str, max_length: int, extension: str = "") -> str: + """Truncates the filename to ensure the final length is within the limit.""" + max_base_length = max_length - len(extension) + if len(name) > max_base_length: + return name[:max_base_length] + return name + + def unique_filename(self, base_path: str, max_length: int = 251) -> str: + """Generates a unique filename while ensuring it stays within the length limit.""" + base, ext = os.path.splitext(base_path) + truncated_base = self.truncate_filename(base, max_length, ext) + + counter = 1 + unique_path = f"{truncated_base}{ext}" + while os.path.exists(unique_path): + suffix = f"_{counter}" + # Ensure base is short enough to add the suffix + truncated_base = self.truncate_filename(base, max_length - len(suffix) - len(ext)) + unique_path = f"{truncated_base}{suffix}{ext}" + counter += 1 + + return unique_path def convert_image(self, image, output_dir: str) -> dict: - """Handles image extraction and saving.""" + """Handles image extraction and saving with collision avoidance and length limits.""" os.makedirs(output_dir, exist_ok=True) raw_name = image.alt_text or f"image_{hash(image)}" - image_name = self.sanitize_filename(raw_name) + ".png" - image_path = os.path.join(output_dir, image_name) + sanitized_name = self.sanitize_filename(raw_name) + truncated_name = self.truncate_filename(sanitized_name, 251, ".png") + image_path = os.path.join(output_dir, truncated_name + ".png") + + # Ensure unique filename + image_path = self.unique_filename(image_path) try: with image.open() as image_bytes: diff --git a/tests/test_files/test_with_images.docx b/tests/test_files/test_with_images.docx new file mode 100644 index 0000000000000000000000000000000000000000..fe34fc688698492c8b8cd16d9fde9171ae7c8193 GIT binary patch literal 58583 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 None: result = markitdown.convert(os.path.join(TEST_FILES_DIR, "test.docx")) validate_strings(result, DOCX_TEST_STRINGS) + # Test DOCX processing, with images + result = markitdown.convert(os.path.join(TEST_FILES_DIR, "test_with_images.docx")) + validate_strings(result, DOCX_IMAGES_TEST_STRINGS) + # Test DOCX processing, with comments result = markitdown.convert( os.path.join(TEST_FILES_DIR, "test_with_comment.docx"),