Skip to main content

Fast C++ library for extracting comment metadata from .docx files

Project description

docx_comment_parser

A C++17 shared library that extracts every piece of comment metadata from .docx files — text, authors, dates, reply threads, anchor text, and resolution status — with full Python bindings via pybind11.

Tests C++17 Python ≥ 3.8 License: MIT


Table of Contents

  1. What it does
  2. Quick start — Python
  3. Quick start — C++
  4. Installation
  5. Python API reference
  6. C++ API reference
  7. Architecture
  8. Testing
  9. Changelog
  10. License

What it does

A .docx file is a ZIP archive containing XML parts defined by the OOXML standard. Comments are spread across up to four of those parts, each requiring a different parsing strategy:

Part Content Parse method
word/comments.xml Core comment data (id, author, date, text) DOM — always small
word/commentsExtended.xml Reply threading, done flag (OOXML 2016+) SAX streaming
word/commentsIds.xml Para-ID cross-reference (fallback) SAX streaming
word/document.xml Anchor text via commentRangeStart/End SAX streaming — can be very large

docx_comment_parser opens the ZIP without decompressing it fully, inflates each part on demand, parses it, and discards the raw bytes. The result is a fully resolved CommentMetadata object for every comment in the document, with reply chains linked by id and anchor text extracted from the document body.

What you get per comment:

  • Identity: id, author, initials, date (ISO-8601 string)
  • Content: text (full plain-text body, XML entities decoded), paragraph_style
  • Anchoring: referenced_text — the exact document text the comment is attached to
  • Threading: is_reply, parent_id, replies list, thread_ids chain
  • Resolution: done flag from commentsExtended.xml

Quick start — Python

import docx_comment_parser as dcp

parser = dcp.DocxParser()
parser.parse("report.docx")

# Print every comment
for c in parser.comments():
    prefix = "  ↳ [reply]" if c.is_reply else f"[{c.id}]"
    print(f"{prefix} {c.author} ({c.date[:10]}): {c.text[:80]}")
    if c.referenced_text:
        print(f"       anchored to: \"{c.referenced_text[:60]}\"")
[0] Alice (2026-01-15): This sentence needs rephrasing for clarity and conciseness.
       anchored to: "The methodology employed in this study is fundamentally flaw"
  ↳ [reply] Bob (2026-01-16): Agreed. Suggest: "This sentence requires revision."
[2] Alice (2026-01-17): Please verify the statistical analysis in section 3 & 4.
       anchored to: "Results in section 3 and 4 show p < 0.05."

Quick start — C++

#include "docx_comment_parser.h"
#include <iostream>

int main() {
    docx::DocxParser parser;
    parser.parse("report.docx");

    for (const auto& c : parser.comments()) {
        std::cout << "[" << c.id << "] "
                  << c.author << ": "
                  << c.text.substr(0, 80) << "\n";
        if (!c.referenced_text.empty())
            std::cout << "  anchored to: \"" << c.referenced_text << "\"\n";
    }

    const auto& s = parser.stats();
    std::cout << "\n" << s.total_comments << " comment(s), "
              << s.unique_authors.size() << " author(s)\n";
}

Installation

Linux / macOS

# 1. Install system dependencies
sudo apt install build-essential g++ cmake zlib1g-dev   # Debian/Ubuntu
brew install cmake zlib                                  # macOS

# 2. Install the Python build dependency
pip install pybind11

# 3a. Build the Python extension in-place (for development)
python setup.py build_ext --inplace

# 3b. OR install permanently into the current environment
pip install .

Verify:

python -c "import docx_comment_parser; print('OK')"

Windows — MSVC (no vcpkg required)

docx_comment_parser bundles a self-contained DEFLATE inflate implementation (vendor/zlib/zlib.h). No external zlib install is needed on MSVC — pybind11 is the only dependency.

# 1. Open "Developer Command Prompt for VS 2022" (or run vcvarsall.bat x64)
# 2. Install the only required Python dependency
pip install pybind11

# 3. Build
python setup.py build_ext --inplace

Verify:

python -c "import docx_comment_parser; print('OK')"

The compiler invocation will include -Ivendor and no /link zlib.lib:

cl.exe /c /nologo /O2 /std:c++17 /DDOCX_BUILDING_DLL
    -Iinclude -Ivendor -I<pybind11\include> ...
    /Tpsrc/zip_reader.cpp ...
link.exe ... /OUT:docx_comment_parser.cp314-win_amd64.pyd

Windows — MinGW-w64 (MSYS2)

# Inside an MSYS2 MINGW64 shell
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-cmake \
          mingw-w64-x86_64-zlib mingw-w64-x86_64-python \
          mingw-w64-x86_64-python-pip
pip install pybind11
python setup.py build_ext --inplace

Building the shared library with CMake

If you need the C++ .so/.dll without Python bindings:

cmake -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j$(nproc)

CMake build options:

Option Default Effect
BUILD_PYTHON_BINDINGS ON Compile the pybind11 extension
BUILD_TESTS ON Build and register the test suite with CTest
CMAKE_BUILD_TYPE Release Debug / Release / RelWithDebInfo

Python API reference

import docx_comment_parser as dcp

DocxParser

Single-file parser. Non-copyable, movable. Can be reused across multiple calls to parse().

parse(file_path: str) -> None

Parses a .docx file and populates all results. Replaces any previous results from an earlier call.

parser = dcp.DocxParser()
parser.parse("report.docx")

Raises DocxFileError if the file cannot be opened or is not a valid ZIP archive.
Raises DocxFormatError if the OOXML structure is malformed.
Files without any comments parse successfully and return an empty list from comments().

comments() -> list[CommentMetadata]

Returns all comments sorted ascending by id.

for c in parser.comments():
    print(f"#{c.id:3d}  {c.author:20s}  {c.text[:60]}")

find_by_id(id: int) -> CommentMetadata | None

Looks up a single comment by its w:id. Returns None if not found.

c = parser.find_by_id(3)
if c is not None:
    print(c.author, "—", c.text)

by_author(author: str) -> list[CommentMetadata]

Returns all comments whose author field exactly matches the given string (case-sensitive). The author string is taken directly from the w:author XML attribute.

for c in parser.by_author("Alice"):
    status = "✓" if c.done else "○"
    print(f"  {status} [{c.date[:10]}] {c.text[:70]}")

root_comments() -> list[CommentMetadata]

Returns only the top-level (non-reply) comments in document order.

for root in parser.root_comments():
    n = len(root.replies)
    print(f"Thread #{root.id}: {n} repl{'y' if n == 1 else 'ies'}")

thread(root_id: int) -> list[CommentMetadata]

Returns the full reply chain for a given root comment, starting with the root itself, in chronological order.

for c in parser.thread(0):
    indent = "    " if c.is_reply else ""
    print(f"{indent}[{c.id}] {c.author}: {c.text}")
[0] Alice: This sentence needs rephrasing for clarity and conciseness.
    [1] Bob: Agreed. Suggest: "This sentence requires revision."

stats() -> DocumentCommentStats

Returns aggregate statistics computed during the last parse() call.

s = parser.stats()
print(f"File      : {s.file_path}")
print(f"Comments  : {s.total_comments} total "
      f"({s.total_root_comments} root, {s.total_replies} replies)")
print(f"Resolved  : {s.total_resolved}")
print(f"Authors   : {', '.join(s.unique_authors)}")
print(f"Date range: {s.earliest_date[:10]}{s.latest_date[:10]}")
File      : report.docx
Comments  : 3 total (2 root, 1 replies)
Resolved  : 1
Authors   : Alice, Bob
Date range: 2026-01-15 → 2026-01-17

BatchParser

Processes many files in parallel using a thread pool. The Python GIL is released during parse_all, so CPU-bound threads are not blocked.

bp = dcp.BatchParser(max_threads=0)   # 0 = one thread per CPU core

parse_all(file_paths: list[str]) -> None

Parses all files. Files that raise errors are captured in errors() rather than propagating as exceptions, so one bad file does not abort the batch.

comments(file_path: str) -> list[CommentMetadata]

Returns the parsed comments for a specific file.

stats(file_path: str) -> DocumentCommentStats

Returns statistics for a specific file.

errors() -> dict[str, str]

Returns {file_path: error_message} for every file that failed.

for path, msg in bp.errors().items():
    print(f"FAILED {path}: {msg}")

release(file_path: str) -> None

Frees the in-memory results for one file. Call this as soon as you have finished processing a file to keep peak memory low when working with large batches.

release_all() -> None

Frees results for all files.

Complete batch example:

import docx_comment_parser as dcp
import glob, json

files = glob.glob("/documents/**/*.docx", recursive=True)

bp = dcp.BatchParser(max_threads=0)
bp.parse_all(files)

summary = []
for path in files:
    if path in bp.errors():
        print(f"SKIP {path}: {bp.errors()[path]}")
        continue

    s = bp.stats(path)
    summary.append({
        "file":     path,
        "comments": s.total_comments,
        "authors":  s.unique_authors,
        "resolved": s.total_resolved,
    })
    bp.release(path)   # free this file's memory immediately

print(json.dumps(summary, indent=2))

CommentMetadata fields

All fields are read-only. Available in both Python and C++.

Field Type Description
id int w:id attribute. Unique within the document.
author str w:author — display name as set in Word.
date str w:date — ISO-8601 string exactly as stored in XML, e.g. "2026-01-15T09:00:00Z". Not parsed into a date object.
initials str w:initials — author abbreviation shown in the comment balloon.
text str Full plain-text body of the comment. XML character entities are decoded: &amp;&, &lt;<, &gt;>, &quot;", &apos;', numeric references → UTF-8.
paragraph_style str Style name of the first paragraph inside the comment (e.g. "CommentText"). Empty string if not set.
referenced_text str The document text that the comment is anchored to, extracted from the commentRangeStart / commentRangeEnd region in word/document.xml. Truncated to 240 bytes at a UTF-8 boundary. Empty if the range spans no text runs or the file has no word/document.xml.
is_reply bool True if this comment is a threaded reply. Requires word/commentsExtended.xml to be present.
parent_id int id of the parent comment. -1 for root (non-reply) comments.
replies list[CommentRef] Direct child replies, populated on the parent comment. Empty on reply comments.
thread_ids list[int] Ordered list of all ids in the full reply chain. Populated only on root comments. Use parser.thread(root_id) to retrieve the full objects.
done bool True if the comment has been marked resolved in Word. Sourced from commentsExtended.xml. False when that file is absent.
para_id str OOXML 2016+ paragraph ID (w14:paraId). Used internally for thread resolution.
para_id_parent str Parent paragraph ID string before numeric id resolution.
paragraph_index int 0-based paragraph position in the document body. -1 if not determined.
run_index int 0-based run position within the paragraph. -1 if not determined.

CommentRef fields (elements of replies)

Field Type Description
id int id of the reply comment.
author str Author of the reply.
date str ISO-8601 date of the reply.
text_snippet str First 120 characters of the reply text.

to_dict() — JSON serialisation

Both CommentMetadata and DocumentCommentStats expose a to_dict() method that returns all fields as a plain Python dict.

import json

data = [c.to_dict() for c in parser.comments()]
print(json.dumps(data, indent=2, ensure_ascii=False))

DocumentCommentStats fields

Field Type Description
file_path str Path passed to parse().
total_comments int Total comments including replies.
total_root_comments int Top-level (non-reply) comments.
total_replies int Reply comments. Equal to total_comments - total_root_comments.
total_resolved int Comments with done=True.
unique_authors list[str] Sorted list of distinct author names.
earliest_date str ISO-8601 date string of the oldest comment.
latest_date str ISO-8601 date string of the most recent comment.

Exceptions

Exception Python base Raised when
dcp.DocxFileError IOError File not found, permission denied, or not a valid ZIP archive.
dcp.DocxFormatError ValueError Valid ZIP but required OOXML parts are missing or structurally invalid.
dcp.DocxParserError RuntimeError Base class — catches both of the above with a single handler.
try:
    parser.parse("report.docx")
except dcp.DocxFileError as e:
    print(f"Cannot open file: {e}")
except dcp.DocxFormatError as e:
    print(f"Not a valid .docx: {e}")

BatchParser.parse_all() never raises. Failures go into errors() instead:

bp.parse_all(["good.docx", "corrupt.docx", "missing.docx"])
print(bp.errors())
# {'corrupt.docx': 'inflate failed...', 'missing.docx': 'Cannot open file...'}

C++ API reference

Include the single public header:

#include "docx_comment_parser.h"

Link against the shared library:

target_link_libraries(my_app PRIVATE docx_comment_parser)

docx::DocxParser

docx::DocxParser parser;

// Parse a file — throws on error
parser.parse("report.docx");

// Iterate all comments (sorted by id)
for (const auto& c : parser.comments()) {
    std::cout << "[" << c.id << "] "
              << c.author << ": " << c.text << "\n";
}

// Look up by id — returns nullptr if not found
const docx::CommentMetadata* c = parser.find_by_id(2);
if (c) std::cout << c->text << "\n";

// Filter by author
for (const auto* c : parser.by_author("Alice"))
    std::cout << c->text << "\n";

// Top-level comments only
for (const auto* root : parser.root_comments())
    std::cout << root->id << " has " << root->replies.size() << " replies\n";

// Full reply thread
for (const auto* c : parser.thread(0)) {
    std::string indent = c->is_reply ? "  " : "";
    std::cout << indent << c->author << ": " << c->text << "\n";
}

// Aggregate statistics
const auto& s = parser.stats();
std::cout << s.total_comments << " comments by "
          << s.unique_authors.size() << " authors\n"
          << "Date range: " << s.earliest_date
          << " – "          << s.latest_date << "\n";

docx::BatchParser

// 0 = use std::thread::hardware_concurrency()
docx::BatchParser bp(/*max_threads=*/0);

bp.parse_all({"a.docx", "b.docx", "c.docx"});

// Check for failures
for (const auto& [path, msg] : bp.errors())
    std::cerr << "Failed: " << path << ": " << msg << "\n";

// Access results per file
for (const auto& c : bp.comments("a.docx"))
    std::cout << c.author << ": " << c.text << "\n";

std::cout << bp.stats("a.docx").total_comments << "\n";

// Free memory as you go
bp.release("a.docx");
bp.release_all();

Exception hierarchy

try {
    parser.parse("report.docx");
} catch (const docx::DocxFileError& e) {
    // file not found, not a ZIP
} catch (const docx::DocxFormatError& e) {
    // valid ZIP, bad OOXML
} catch (const docx::DocxParserError& e) {
    // base class — catches both
}

Architecture

docx_comment_parser/
├── include/
│   ├── docx_comment_parser.h   ← public API (the only header consumers include)
│   ├── zip_reader.h            ← ZIP/DEFLATE reader interface
│   └── xml_parser.h            ← SAX + minimal DOM interface
├── src/
│   ├── docx_parser.cpp         ← orchestrates all four OOXML parts → CommentMetadata
│   ├── batch_parser.cpp        ← std::thread pool + result map
│   ├── zip_reader.cpp          ← memory-mapped ZIP + on-demand inflate
│   └── xml_parser.cpp          ← self-contained SAX + DOM, no libxml2
├── vendor/
│   └── zlib/
│       └── zlib.h              ← vendored DEFLATE + CRC-32 (used on MSVC only)
├── python/
│   └── python_bindings.cpp     ← pybind11 module (GIL released during batch)
├── tests/
│   ├── CMakeLists.txt
│   └── test_docx_parser.cpp    ← 38 assertions, builds its own .docx in memory
├── CMakeLists.txt
└── setup.py

Parse pipeline

.docx file (ZIP)
    │
    ▼
ZipReader — memory-mapped — inflate one entry at a time
    │
    ├──▶ word/comments.xml       → dom_parse()  → CommentMetadata[]
    │                                              id, author, date, initials, text
    │
    ├──▶ word/commentsExtended   → sax_parse()  → fill is_reply, done, para_id_parent
    │
    ├──▶ word/commentsIds.xml    → sax_parse()  → fill missing para_ids (fallback)
    │
    ├──▶ resolve_threads()       →               link parent_id, replies[], thread_ids[]
    │
    └──▶ word/document.xml       → sax_parse()  → fill referenced_text per comment

Memory model

ZIP extraction: the file is memory-mapped (mmap / MapViewOfFile). Each ZIP entry is inflated into a temporary heap buffer, parsed, and the buffer is freed. No two entries' raw bytes are live at the same time.

XML parsing: comments.xml is parsed into a minimal DOM tree (always small — typically < 100 KB). The three other parts are streamed with SAX callbacks; only the data the callbacks accumulate is held in memory, not the raw XML text.

BatchParser: one DocxParser instance per worker thread. Results are stored in a std::unordered_map protected by a mutex. Calling release(path) immediately after consuming a file's results keeps peak memory proportional to max_threads, not to the total batch size.

Zero external dependencies

Capability Implementation
ZIP parsing Custom memory-mapped reader (no libzip, no minizip)
DEFLATE inflate System zlib on Linux / macOS / MinGW; vendor/zlib/zlib.h on MSVC
XML parsing Custom SAX + minimal DOM (no libxml2, no expat)
Threading std::thread + std::mutex — C++17 standard library only
Python bindings pybind11 — header-only, build-time dependency only

Testing

The test suite creates a synthetic .docx file entirely in memory using a minimal ZIP builder and pre-compressed XML fixtures. No sample files need to be present on disk.

# Build and run via CTest
cmake -B build -DBUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Debug
cmake --build build -j$(nproc)
ctest --test-dir build --output-on-failure

# Or run the binary directly for line-by-line output
./build/tests/test_docx_parser

Expected output:

Test fixture: /tmp/test_docx_parser_fixture.docx

=== test_basic_parsing ===
=== test_threading ===
=== test_done_flag ===
=== test_anchor_text ===
=== test_by_author ===
=== test_stats ===
=== test_root_comments ===
=== test_batch_parser ===
=== test_missing_file ===

──────────────────────────────
Results: 38 passed, 0 failed

The test binary exits with code 0 on full pass, 1 on any failure.


Changelog

v1.1.0 — Inflate fix and zero-dependency MSVC support

Public API: unchanged. Existing code does not need modification.

vendor/zlib/zlib.h — two critical inflate bugs fixed

Bug 1 — huff_build: out-of-bounds write in the Huffman symbol table.

The original implementation used canonical code-start values as array indices into syms[]. For the RFC 1951 fixed literal tree, next[9] = 400, so all 112 nine-bit symbols (bytes 144–255, present in any real XML document) were written to syms[400]syms[511] — well past the 288-element array. This caused silent heap corruption on every inflate call that decoded actual XML text. Synthetic test data with only ASCII symbols (code values < 144, all 8-bit) happened to stay in bounds by coincidence.

Fixed by filling syms[] cumulatively: for each bit-length b in ascending order, all symbols with lens[i] == b are appended in symbol-value order. This exactly matches how huff_decode's index variable navigates the table.

Bug 2 — inflateInit2: wiped the caller's I/O fields.

inflateInit2 called memset(strm, 0, sizeof(*strm)). The real zlib API contract — and the usage in zip_reader.cpp — requires the caller to set next_in, avail_in, next_out, and avail_out before calling inflateInit2. The memset zeroed all four, so every inflate() call received null pointers and zero lengths, returning Z_DATA_ERROR (-3) immediately on the first bit read.

Fixed by only zeroing the fields inflateInit2 actually owns: total_in, total_out, msg, and state.

src/xml_parser.cpp — processing instruction terminator

The PI handler (<?...?>) scanned for the first bare >. A PI whose content contained > would terminate parsing prematurely. Fixed to scan for the correct ?> closing sequence.

Windows MSVC — zero-dependency build

vendor/zlib/zlib.h is now a self-contained, header-only DEFLATE decompressor + CRC-32 implementing the exact zlib API surface used by the library. When compiled with MSVC (#ifdef _MSC_VER), zip_reader.cpp defines VENDOR_ZLIB_IMPLEMENTATION and includes this header instead of the system <zlib.h>. On all other platforms the system zlib is used as before.

The result: building the Python extension on Windows now requires only pip install pybind11. No vcpkg, no pre-installed zlib, no additional configuration.


License

MIT — see LICENSE for the full text.

vendor/zlib/zlib.h is released under MIT-0 (no attribution required).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

docx_comment_parser-1.1.1.tar.gz (48.3 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

docx_comment_parser-1.1.1-cp314-cp314-win_amd64.whl (164.4 kB view details)

Uploaded CPython 3.14Windows x86-64

docx_comment_parser-1.1.1-cp313-cp313-win_amd64.whl (160.0 kB view details)

Uploaded CPython 3.13Windows x86-64

docx_comment_parser-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194.4 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp313-cp313-macosx_11_0_arm64.whl (147.5 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl (161.8 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

docx_comment_parser-1.1.1-cp312-cp312-win_amd64.whl (159.9 kB view details)

Uploaded CPython 3.12Windows x86-64

docx_comment_parser-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (194.4 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp312-cp312-macosx_11_0_arm64.whl (147.4 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl (161.8 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

docx_comment_parser-1.1.1-cp311-cp311-win_amd64.whl (157.6 kB view details)

Uploaded CPython 3.11Windows x86-64

docx_comment_parser-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (191.7 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp311-cp311-macosx_11_0_arm64.whl (145.7 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl (159.6 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

docx_comment_parser-1.1.1-cp310-cp310-win_amd64.whl (156.8 kB view details)

Uploaded CPython 3.10Windows x86-64

docx_comment_parser-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (191.2 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp310-cp310-macosx_11_0_arm64.whl (144.6 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl (158.4 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

docx_comment_parser-1.1.1-cp39-cp39-win_amd64.whl (159.7 kB view details)

Uploaded CPython 3.9Windows x86-64

docx_comment_parser-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (191.7 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp39-cp39-macosx_11_0_arm64.whl (144.7 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl (158.5 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

docx_comment_parser-1.1.1-cp38-cp38-win_amd64.whl (156.5 kB view details)

Uploaded CPython 3.8Windows x86-64

docx_comment_parser-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (191.0 kB view details)

Uploaded CPython 3.8manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.1-cp38-cp38-macosx_11_0_arm64.whl (144.4 kB view details)

Uploaded CPython 3.8macOS 11.0+ ARM64

docx_comment_parser-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl (158.2 kB view details)

Uploaded CPython 3.8macOS 10.9+ x86-64

File details

Details for the file docx_comment_parser-1.1.1.tar.gz.

File metadata

  • Download URL: docx_comment_parser-1.1.1.tar.gz
  • Upload date:
  • Size: 48.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for docx_comment_parser-1.1.1.tar.gz
Algorithm Hash digest
SHA256 475c37dcdc20e548505ad3fcd40a37637b9b385066b4392ae88c1d3bfbbe8a26
MD5 2285c25975f8c1af5ec7c59fd557c27e
BLAKE2b-256 594f02df93449606bac2623eaba949a2a3ace4b25708c5ed5daf23b69a7d7d8a

See more details on using hashes here.

File details

Details for the file docx_comment_parser-1.1.1-cp314-cp314-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp314-cp314-win_amd64.whl
Algorithm Hash digest
SHA256 e387cfc8dbde0346e33a0b7822bc041e5cd4a74b06a5e96e5dad269aa69e6fa0
MD5 8b566cc2dd822ef34e597dd8908a8616
BLAKE2b-256 0016bb1fc6d9759e278b92b8cf49bdee8ea7ba30045a33f44b5c906a221a38ef

See more details on using hashes here.

File details

Details for the file docx_comment_parser-1.1.1-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 658b29e580fecb309e27e48842cbb26db27d9e9145f240484f6c22e7e31c2f20
MD5 7a95a8637409482427f0a235c1f31184
BLAKE2b-256 b5106614df6a1c47732ea5ca0bb76b11e45784e009bfd9a08c1e476f0263ca73

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp313-cp313-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 956c5ba48a16f40a6552b299906a40dd30d8187c8a8b8d454c3ed1b84cc13b07
MD5 9c620b0688e417b8fb809dc15c6491a6
BLAKE2b-256 b9494aeaf00dee23fa236d938d2d2be94d18697753fb2797f4b6c61c2c8e6ea4

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e6d9312403997f1aa5d9f9c3af2fd5e983b78fadb47b8e0c857a0d8eebbde7ed
MD5 a320a8c27ef093ac1da8442034997c74
BLAKE2b-256 a611a2ce3b3d97c5e37d69bad9e2358be394cd8d15430d6fd3166fb7770bec27

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp313-cp313-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 aa9c713d81d5d7b21600aee626c48b05f69b8c441c35e0030bc49fe21c8d3586
MD5 56e9c3875ff47d2ddc094c5e49528bce
BLAKE2b-256 97233bf015cbe9794c255a9a6c57f57d5fdd39798f1332fca26e4ac00281bb18

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 0c503e73d89b959f35aeb620dcbc42c9efcd46bf9a2b176200c867f3944984af
MD5 c12fbc751ab74512e0e3ad27c6fb51ea
BLAKE2b-256 95c70f815be727535067a42ab767ed1064af82e15389ce7c53c92ee8704e3160

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp312-cp312-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 29cb99e28ee1b55c51589a977c0553f686b546e3fabefb6839f0fc9d7df9fb46
MD5 ac784aaa402aa1dfcaf097bf3e802710
BLAKE2b-256 3cde62b9cd8e29067361bf942a66ee297a7c07ac4f37b77fec6e474e288882f0

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 6e1904ef7080bc1180894741b6959bfd81b9a9871d0ad39014d420a92b048249
MD5 3e225cf632f57b94104ab50444b22c0e
BLAKE2b-256 d2d0d8e71eb804f50f85cd115715d6d7f5618ffc5a847c36bf0283825a0ceb7a

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp312-cp312-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 a76f2d055f9e5a0e323ede72cbe06c49c2070b20afd3ce30a58a0af2ccbdff21
MD5 b69f00768a9f6a9767bfce7fe07419b1
BLAKE2b-256 3c17a97d107320133eaebb43359b5fcfbb3f8e76d0f6a89a13b7b102cbd2a2e4

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 87f16d6ebca3bc6e739519ccba141675e614767994f31dfbda8caa558afb7c84
MD5 3c156a6161c6dfc889adbd2470cd8149
BLAKE2b-256 cb716f216ebea9a196948205ef9f708d78fb0e764da10f93463488c499a2f781

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp311-cp311-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 45e4c59d5bc0732481dc406948d4ee4ebd68bcc55e467abd47e27767442e31d0
MD5 6f9f735fa5e4fbcfd74ae89555295061
BLAKE2b-256 3de7b462226911e420abe68794cc20ce039c75427dbb1cc5f43eac0e08db331c

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f69576edde2fa9c3571dfc937049a6727974ba7514b405a6bd8c9608639f4ea
MD5 9a8b6489082baa7a18f0d9c5de56385e
BLAKE2b-256 77d9462827a42fbafb5aa8d9d46489fb0497838a7382545034eb3e6bc1315857

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp311-cp311-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f26233d304569e46d3d155e62517c59c69df94ed6b0061addeb75b9555538014
MD5 a8f705a9d20b40a3dcca54c54787278f
BLAKE2b-256 1a7c8c678fe7a41d7a0e11f97de216e3bb6b5eedcd0a2a3ec4a5cc29098e78b6

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 8194b63d0339ef5f615341175d484fde3bfdd7761913d6dd2030c287ac4f9577
MD5 617c80034466b0cd88095621934acd30
BLAKE2b-256 bf6f3d7a4427bf871c48120cb2b90d0070ec204590f989ff65fde6874f2f5ce7

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp310-cp310-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 f5978f2eebbdf576f8530d016325a8861728bb9ee613eb90f94231966858ac1f
MD5 2fcde0e37339bb07e831b78278bfb29f
BLAKE2b-256 2a869600882382d446e074f3d57711a37551a8e7f49a0ceaea305b921b326995

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 844180a601e589ff4a40ddb221ed51833c111c4ad0b936069d4255cf7fc057b1
MD5 1a5c15c8a1c69824389c1b03f99bd0cd
BLAKE2b-256 e8cac8cc65aeced3026a3b5f4dedb31a8dfdeb4e6115846c5b624c0d7c10b0bf

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp310-cp310-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1bdaa8eda3a82f99b2e2d8ef5d0d83d3b0cda9d5c0915519a4ca1427fb1ae4b5
MD5 3cb379d88c23ef2bad9cf83d961da54b
BLAKE2b-256 675456ffa28af6213ebf96cf0922d7374c6bf471acb639ead34091896b3099c2

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 dd5a117a3442da017c11cbb59d3b805fa47cb20158e2278b9105c39b046f082a
MD5 eb3f2463c02f6f0573b4079b7cd4902e
BLAKE2b-256 60cd6245d5fa87cc59e83cfd8d2aa3cd885669038b303a728fa01267359e590d

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp39-cp39-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 1dc35831d35674581869bc3d91d560f6d1b1620356b37bc1986f7e71f1945abf
MD5 c785f94353cea95c442fff03c3b44747
BLAKE2b-256 9f6c7159b73b0f0d5f899614642bd820448138c9e0e4c019873244eb99a84a24

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 1523762e3c05cb0a141b63210886b66551bff1cf27009ba8beada684d097adb4
MD5 7eaad6b82ab3a6fc70d009f13fa58a98
BLAKE2b-256 3d3448d17c0d27abc094535359f50829a8488d75fa8b5f81929217a63c875df5

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp39-cp39-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 1b01e6be873200ea132642218df17b9347e1fc1d3f3a79b2276ab225557fd46a
MD5 448a0731c3d46862e56fae3ea4a82abf
BLAKE2b-256 117ceb34e49ce70e6a3ba9cb5575fe78e80bc70513057e6120b71571755dae90

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp38-cp38-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp38-cp38-win_amd64.whl
Algorithm Hash digest
SHA256 2b2ee1cb9242fb7b08c76c3ad5a570a9ba5e2d5de76535d3eae3cb58c914af17
MD5 d26f43492283c41283c37554549f9f53
BLAKE2b-256 8215df75dc579750064f5b7326b0e5a0dffa307def5f8f1443f8149c5d2445bc

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp38-cp38-win_amd64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 b3fb5eb1e338925d51b243cd21e55f7533cef947e5ebdb3df118a111c5ba7c7f
MD5 1df0ecac86771960aa2f296d262914f5
BLAKE2b-256 80c6df67f9973201f13188e99a12b0f2fe0e6a148cd66a32420c4cdce5bfeed7

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp38-cp38-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp38-cp38-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 11d52cebd428c15bfd24f736c4e4bcb1376fc7a5325677ca37c3dad978800cbb
MD5 b7bd85c1ceedf413a99ea527f8f22486
BLAKE2b-256 6a0b2542f69f6ba8ab836db9005111194136c50158e2d60dac151ceaa7158a55

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp38-cp38-macosx_11_0_arm64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file docx_comment_parser-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 af1e63c7b220c2ee2d5b117e0c2b9ad916bbf329ee7c8a96a4cd9b4bb95671e0
MD5 f3f8341fc34b52f37e219f06cdbf4a5a
BLAKE2b-256 dbb6cde989a5795fc857e5943d666675b4fd5ca3ea2a96b9004517ec465cc720

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl:

Publisher: python-publish.yml on nick-developer/docx_cpp_parser

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page