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.9 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 ===

=== test_encoding_utf8_bom ===

=== test_encoding_utf16le ===

=== test_encoding_utf16be ===

=== test_encoding_utf32le ===

=== test_encoding_windows1252 ===

=== test_encoding_iso8859_1 ===

=== test_encoding_numeric_entities ===

──────────────────────────────
Results: 66 passed, 0 failed

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


Changelog

v1.1.2 — Added multiple enconding support

Included multiple text enconding support for a wide range of encondings. Updated unit tests for the new text enconding functionality.

src/xml_parser.cpp — Added a complete encoding transcoding layer before the XML parser:

extract_xml_encoding_decl() — scans the XML prolog for encoding="..."

detect_encoding() — BOM detection (UTF-8/16/32 LE/BE) takes precedence, falls back to the XML declaration

utf16_to_utf8() / utf32_to_utf8() — built-in converters (no platform dependency) with correct surrogate-pair handling

Windows path: win_mbcs_to_utf8() via MultiByteToWideChar + WideCharToMultiByte; maps 60+ encoding names to Windows codepage numbers (all Windows-125x, ISO-8859-1..16, Asian, Cyrillic, Thai, OEM codepages)

Linux/macOS path: iconv_convert() via iconv(3) with the same name alias table; handles E2BIG/EILSEQ/EINVAL gracefully transcode_to_utf8() — public entry point, called at the start of sax_parse() so all parsing paths (DOM and SAX) go through it automatically

include/xml_parser.h — Exposed transcode_to_utf8() as a public API with full docstring.

CMakeLists.txt — Added find_package(Iconv QUIET) for non-Windows targets; links Iconv::Iconv only when it's a separate library (not built into libc).

tests/test_docx_parser.cpp — Added 7 encoding tests (66 total, all green):

test_encoding_utf8_bom — UTF-8 BOM is silently stripped

test_encoding_utf16le / test_encoding_utf16be — BOM-detected UTF-16

test_encoding_utf32le — BOM-detected UTF-32

test_encoding_windows1252encoding="windows-1252" with ç, é, ä in content

test_encoding_iso8859_1encoding="ISO-8859-1" with é, ñ

test_encoding_numeric_entities&#x4E2D; (Chinese) and &#233; (é) references

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.2.tar.gz (59.5 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.2-cp313-cp313-win_amd64.whl (165.6 kB view details)

Uploaded CPython 3.13Windows x86-64

docx_comment_parser-1.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (200.2 kB view details)

Uploaded CPython 3.13manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.2-cp313-cp313-macosx_11_0_arm64.whl (152.3 kB view details)

Uploaded CPython 3.13macOS 11.0+ ARM64

docx_comment_parser-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl (166.6 kB view details)

Uploaded CPython 3.13macOS 10.13+ x86-64

docx_comment_parser-1.1.2-cp312-cp312-win_amd64.whl (165.6 kB view details)

Uploaded CPython 3.12Windows x86-64

docx_comment_parser-1.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (199.8 kB view details)

Uploaded CPython 3.12manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.2-cp312-cp312-macosx_11_0_arm64.whl (152.2 kB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

docx_comment_parser-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl (166.5 kB view details)

Uploaded CPython 3.12macOS 10.13+ x86-64

docx_comment_parser-1.1.2-cp311-cp311-win_amd64.whl (163.2 kB view details)

Uploaded CPython 3.11Windows x86-64

docx_comment_parser-1.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (197.3 kB view details)

Uploaded CPython 3.11manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.2-cp311-cp311-macosx_11_0_arm64.whl (150.5 kB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

docx_comment_parser-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl (164.5 kB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

docx_comment_parser-1.1.2-cp310-cp310-win_amd64.whl (162.5 kB view details)

Uploaded CPython 3.10Windows x86-64

docx_comment_parser-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (196.9 kB view details)

Uploaded CPython 3.10manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.2-cp310-cp310-macosx_11_0_arm64.whl (149.4 kB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

docx_comment_parser-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl (163.2 kB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

docx_comment_parser-1.1.2-cp39-cp39-win_amd64.whl (165.2 kB view details)

Uploaded CPython 3.9Windows x86-64

docx_comment_parser-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (197.4 kB view details)

Uploaded CPython 3.9manylinux: glibc 2.17+ x86-64

docx_comment_parser-1.1.2-cp39-cp39-macosx_11_0_arm64.whl (149.5 kB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

docx_comment_parser-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl (163.3 kB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

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

File metadata

  • Download URL: docx_comment_parser-1.1.2.tar.gz
  • Upload date:
  • Size: 59.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for docx_comment_parser-1.1.2.tar.gz
Algorithm Hash digest
SHA256 7f5e3bb9cb356e727ab7d7bbc10f77ae411be73f6e9e0dc96d8af447718bd278
MD5 c15e7b208c10e14b170bc005c86ba3f3
BLAKE2b-256 629f006c13188354d4fe9016c5bcfff95171d6a1d0f57eaccec6509368a554de

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2.tar.gz:

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.2-cp313-cp313-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp313-cp313-win_amd64.whl
Algorithm Hash digest
SHA256 bb06601074a19fba7af758deec4cb5fec4c4ac6c8835d45f31a741cc212c5661
MD5 0af8a141bccdda08d21e539a2bfd082b
BLAKE2b-256 2a0d85090a708660fa826d67238e2f9ae4af3a1222dd90dd1cc4e35dc31f3f54

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 9b7534e130fbc9e888aa48c1f46f7d78c0900351922da70fd6b6aaa1f04e5b6c
MD5 fb438a7b830ad1a81803b50219027569
BLAKE2b-256 343e0bbfb523b0e3e03439a942e03fff78b09500e1c2290cd593e39293b1d223

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp313-cp313-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp313-cp313-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 fad140f7b0eb374f36f335f1dd729736d47ee5dd990b7e9924137c94342c3248
MD5 9e264bf4f5649d2de2b956e1099d3730
BLAKE2b-256 c270b7ea517e92e4dfe6ad8828f85d274cede30a0d8811c81dff806d4e14432a

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp313-cp313-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 253b9100dc577ff0594e3564a9e6280c65a7ecd15f61776c77696dd16a2a9b33
MD5 336fc9c1e7b9da8fadcf1a58410ddd35
BLAKE2b-256 73736bd05917b0ce0bdf63ba58beae73afddc77f72c4f3d4faac0ff82d8f4480

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp312-cp312-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 42788eb6643057531c0796f7799f852656fcbff5555dd3c68259e72793a3060d
MD5 d0ff8c7cf872b840c4d6587efc3a3e69
BLAKE2b-256 0ff98a784c17d32de829a65769d7ba88a3712e93e4890824a7b4072048a57c74

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 619b1c7e24dc69637770d4287be9c86b978d05553af75c16798d084da9f2b4c8
MD5 7b4015ef37963825089a6edc04af6964
BLAKE2b-256 77273ceb0629190beeadd99ebf322f7fc49c57ef3ae48e65d11da82f83b89d36

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 4944f05689716b5a21b4edf88ebdd7bb716e2f13521ab5460c119df5403705d7
MD5 681dedb6e7f34545e16716a7f30db64b
BLAKE2b-256 c18409bf4c78c1c6999b95d4096109728902a0dc85efbc49225cbc85062fe9c5

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp312-cp312-macosx_10_13_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl
Algorithm Hash digest
SHA256 10c2c97bc6faa48ddbbc3db36b8f30109789b1b40ad950214f855e9bb0a4b92a
MD5 c3e4158f1b9aed1e709881b2fbaf5da7
BLAKE2b-256 b7d1c99b50835390147d9f5e3b79ca9a78fc0f05349349926ee53e6f390474fe

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp311-cp311-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 47488abcbfb8cfe378184f5d49153d0ffb13d0d45943702d0c5431b7f93dbfd6
MD5 ef60ea073a5c6265a0f5ea2acb46ecef
BLAKE2b-256 ede72c23854248d81680737dbe94c61fbb71957f68196edec12b021dae2e3edd

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 42fc9224d074cc64155b1d035b1cb15ded0dfef54951b8c7c0a3997526cf8aec
MD5 c101d1ddb231f2f1f39d44261b77eb6e
BLAKE2b-256 c90a4f4f2bf1dc21ab9eeff1655d2b196f26ba77b33adca669642d23e3f41681

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c859d0ae0cfaa70e980a89fe9f6c75f24b453004bff0bb277a343b94e8c20df4
MD5 92f488287ff4c6b5670b8aa1e829d51b
BLAKE2b-256 627e5bf88bfd010e8ca2f867bb9303dd5e68bfcfe90ca221eda309b2551c06db

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 f61c2fea84414e6f4b11d1024c5af92b40b7430865c24c881e3ecb79b5d088ed
MD5 194b16e419e6c956320d58e5b3d49658
BLAKE2b-256 2198491fdbbd4e1a38f782f719c7f6f1c56145151ca6b35586fa96cf683115c7

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp310-cp310-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 423a0bbbc52940f5c118b3f40aa5899878199c8f62ebe68c61941af97b558e73
MD5 e992af34973d2980fbe4ddd7f4360811
BLAKE2b-256 059b93ee1204b2d8bdb93d082231c868e26192f039e322d4381499154ceedcba

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 67308d8fd56b246dec82325a5b7178f4154a1ff8273769cc8bd9d146d9d2c985
MD5 5025974271e7a23c660d481aa8b6812f
BLAKE2b-256 14b597e21d9a8301b3e62f3ac0f4ee77a189814dd112cb8a5ca908440cdd97fa

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 42f3283a22c425917879f006be9cbdbeae5fe44d59d70e6071319cf87710bdca
MD5 48c6b14705a58cb6df6b2d57ccc63470
BLAKE2b-256 101be4d833a492bd8a1c276c98367c7e5fd4479cec7f0c95da5f90e4d9d720b3

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 869d23e8a45154e0d42ce03e42c72cc2e0e99e5702692c484cd949bef6badfae
MD5 e55379a80eef1efddf6d111d11fd3ceb
BLAKE2b-256 6fc76f49d7a0a9d3ced3545d23af39ba22f71e4c28ed566ffd53b6005487b3c8

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp39-cp39-win_amd64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 264df5ea60edaeb8d6cb4fab50102e8019ddc6f18b350146cdedf529c5d64ef3
MD5 a8b40851bbc01e107675046d0ca52853
BLAKE2b-256 45334df57b1305127f881b4b4e2e6929f8f5f60a1318730e385253c9d308471e

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 84a0f36c35722cd06c6f728298b741b3f2aa6ce535c5d3244e5ce7c782c58e61
MD5 a93175f9a40a72434063c9b73488882d
BLAKE2b-256 832c0ae5aa209ee3167924cc985248b4fec66377fd5b2411f9bf812c444aa2f1

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7f5a42355e22bf1f791afdaff048d024e4208c7d701531f0d9ec1b6b171d7746
MD5 3245ae654fe5240c6da10b3c33a99236
BLAKE2b-256 794c93ba6cffa270251b69407b663157b75563ad6fc901226bcf2d7b42a66afe

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.2-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for docx_comment_parser-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 7d3b52d203eb6ce54e89c0dcd2ee19659c54959701c9078a7e0c146efc2560e9
MD5 047e36a59a305888a5187f71c3a7ba8a
BLAKE2b-256 13d83b7b42430a943a19f01d920fa670d7dd891766b29cff8842df33d6cbf356

See more details on using hashes here.

Provenance

The following attestation bundles were made for docx_comment_parser-1.1.2-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.

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