René's URL Explorer Experiment


Title: Add revision management capability + tests + docs by amithkk · Pull Request #1534 · python-openxml/python-docx · GitHub

Open Graph Title: Add revision management capability + tests + docs by amithkk · Pull Request #1534 · python-openxml/python-docx

X Title: Add revision management capability + tests + docs by amithkk · Pull Request #1534 · python-openxml/python-docx

Description: This PR adds comprehensive support for creating and managing tracked changes (revisions) in Word documents, enabling programmatic document editing with full revision history visible in Microsoft Word. Tests have been added for new functionality, and existing tests have been run to ensure that backwards compatibility is maintained. Why? Users need to make programmatic changes to Word documents while preserving some sort of an audit trail. Solves #930 and #340 Features Paragraph.add_run_tracked() - Add text as a tracked insertion Run.delete_tracked() - Mark existing text as a tracked deletion Paragraph.replace_tracked() - Replace specific text with revision tracking Document.find_and_replace_tracked() - Bulk find-and-replace across entire document document.settings.track_revisions - Enable/disable track changes mode TrackedInsertion and TrackedDeletion proxy classes with accept() and reject() methods Author and date metadata on all tracked changes Optional comment attachment to replacements Example Usage from docx import Document doc = Document('contract.docx') doc.settings.track_revisions = True count = doc.find_and_replace_tracked( "ACME Corp", "NewCo Inc", author="Legal Bot", comment="Company name updated per merger" ) doc.save('contract_revised.docx') This is just barebones, and this capability can be extended by later additions to possibly build out a context manager (eg. with document.track_all_changes() as doc:) to make it function similar to how "Track Changes" works in word. However there are a fair number of edge cases you'd have to deal with in that situation. Some of this work draws on the exhaustive code written in OpenXmlPowerTools WmlComparer and the underlying .NET library.

Open Graph Description: This PR adds comprehensive support for creating and managing tracked changes (revisions) in Word documents, enabling programmatic document editing with full revision history visible in Microsoft Wo...

X Description: This PR adds comprehensive support for creating and managing tracked changes (revisions) in Word documents, enabling programmatic document editing with full revision history visible in Microsoft Wo...

Opengraph URL: https://github.com/python-openxml/python-docx/pull/1534

X: @github

direct link

Domain: patch-diff.githubusercontent.com

route-pattern/:user_id/:repository/pull/:id/files(.:format)
route-controllerpull_requests
route-actionfiles
fetch-noncev2:1fd01667-8158-b344-ec8d-fb5756f9b8b7
current-catalog-service-hashae870bc5e265a340912cde392f23dad3671a0a881730ffdadd82f2f57d81641b
request-idC37C:119AFD:7FADC9:AE62CF:6973C186
html-safe-noncef6f6b019aaccb97526d810f9170d9c321e5809fc9cb61b7fbe279e0f18a8d516
visitor-payloadeyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiJDMzdDOjExOUFGRDo3RkFEQzk6QUU2MkNGOjY5NzNDMTg2IiwidmlzaXRvcl9pZCI6IjE3NDg4MDUzMDc2Nzc3ODY1MDIiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ==
visitor-hmac4169af04000dba040ec88b7d9eb1815ecbf0ab96d6967cf05b8e90d6ee04c159
hovercard-subject-tagpull_request:3152257580
github-keyboard-shortcutsrepository,pull-request-list,pull-request-conversation,pull-request-files-changed,copilot
google-site-verificationApib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I
octolytics-urlhttps://collector.github.com/github/collect
analytics-location///pull_requests/show/files
fb:app_id1401488693436528
apple-itunes-appapp-id=1477376905, app-argument=https://github.com/python-openxml/python-docx/pull/1534/files
twitter:imagehttps://avatars.githubusercontent.com/u/1029727?s=400&v=4
twitter:cardsummary_large_image
og:imagehttps://avatars.githubusercontent.com/u/1029727?s=400&v=4
og:image:altThis PR adds comprehensive support for creating and managing tracked changes (revisions) in Word documents, enabling programmatic document editing with full revision history visible in Microsoft Wo...
og:site_nameGitHub
og:typeobject
hostnamegithub.com
expected-hostnamegithub.com
Noneacb8c988baca9616cb18bcb596629b823688faa1ef21a000061fe3616b4e3605
turbo-cache-controlno-preview
diff-viewunified
go-importgithub.com/python-openxml/python-docx git https://github.com/python-openxml/python-docx.git
octolytics-dimension-user_id3403760
octolytics-dimension-user_loginpython-openxml
octolytics-dimension-repository_id13592924
octolytics-dimension-repository_nwopython-openxml/python-docx
octolytics-dimension-repository_publictrue
octolytics-dimension-repository_is_forkfalse
octolytics-dimension-repository_network_root_id13592924
octolytics-dimension-repository_network_root_nwopython-openxml/python-docx
turbo-body-classeslogged-out env-production page-responsive full-width
disable-turbotrue
browser-stats-urlhttps://api.github.com/_private/browser/stats
browser-errors-urlhttps://api.github.com/_private/browser/errors
releaseaf4eb23c75c70abd61c0b216b767faf4c9a30817
ui-targetfull
theme-color#1e2327
color-schemelight dark

Links:

Skip to contenthttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#start-of-content
https://patch-diff.githubusercontent.com/
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython-openxml%2Fpython-docx%2Fpull%2F1534%2Ffiles
GitHub CopilotWrite better code with AIhttps://github.com/features/copilot
GitHub SparkBuild and deploy intelligent appshttps://github.com/features/spark
GitHub ModelsManage and compare promptshttps://github.com/features/models
MCP RegistryNewIntegrate external toolshttps://github.com/mcp
ActionsAutomate any workflowhttps://github.com/features/actions
CodespacesInstant dev environmentshttps://github.com/features/codespaces
IssuesPlan and track workhttps://github.com/features/issues
Code ReviewManage code changeshttps://github.com/features/code-review
GitHub Advanced SecurityFind and fix vulnerabilitieshttps://github.com/security/advanced-security
Code securitySecure your code as you buildhttps://github.com/security/advanced-security/code-security
Secret protectionStop leaks before they starthttps://github.com/security/advanced-security/secret-protection
Why GitHubhttps://github.com/why-github
Documentationhttps://docs.github.com
Bloghttps://github.blog
Changeloghttps://github.blog/changelog
Marketplacehttps://github.com/marketplace
View all featureshttps://github.com/features
Enterpriseshttps://github.com/enterprise
Small and medium teamshttps://github.com/team
Startupshttps://github.com/enterprise/startups
Nonprofitshttps://github.com/solutions/industry/nonprofits
App Modernizationhttps://github.com/solutions/use-case/app-modernization
DevSecOpshttps://github.com/solutions/use-case/devsecops
DevOpshttps://github.com/solutions/use-case/devops
CI/CDhttps://github.com/solutions/use-case/ci-cd
View all use caseshttps://github.com/solutions/use-case
Healthcarehttps://github.com/solutions/industry/healthcare
Financial serviceshttps://github.com/solutions/industry/financial-services
Manufacturinghttps://github.com/solutions/industry/manufacturing
Governmenthttps://github.com/solutions/industry/government
View all industrieshttps://github.com/solutions/industry
View all solutionshttps://github.com/solutions
AIhttps://github.com/resources/articles?topic=ai
Software Developmenthttps://github.com/resources/articles?topic=software-development
DevOpshttps://github.com/resources/articles?topic=devops
Securityhttps://github.com/resources/articles?topic=security
View all topicshttps://github.com/resources/articles
Customer storieshttps://github.com/customer-stories
Events & webinarshttps://github.com/resources/events
Ebooks & reportshttps://github.com/resources/whitepapers
Business insightshttps://github.com/solutions/executive-insights
GitHub Skillshttps://skills.github.com
Documentationhttps://docs.github.com
Customer supporthttps://support.github.com
Community forumhttps://github.com/orgs/community/discussions
Trust centerhttps://github.com/trust-center
Partnershttps://github.com/partners
GitHub SponsorsFund open source developershttps://github.com/sponsors
Security Labhttps://securitylab.github.com
Maintainer Communityhttps://maintainers.github.com
Acceleratorhttps://github.com/accelerator
Archive Programhttps://archiveprogram.github.com
Topicshttps://github.com/topics
Trendinghttps://github.com/trending
Collectionshttps://github.com/collections
Enterprise platformAI-powered developer platformhttps://github.com/enterprise
GitHub Advanced SecurityEnterprise-grade security featureshttps://github.com/security/advanced-security
Copilot for BusinessEnterprise-grade AI featureshttps://github.com/features/copilot/copilot-business
Premium SupportEnterprise-grade 24/7 supporthttps://github.com/premium-support
Pricinghttps://github.com/pricing
Search syntax tipshttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
documentationhttps://docs.github.com/search-github/github-code-search/understanding-github-code-search-syntax
Sign in https://patch-diff.githubusercontent.com/login?return_to=https%3A%2F%2Fgithub.com%2Fpython-openxml%2Fpython-docx%2Fpull%2F1534%2Ffiles
Sign up https://patch-diff.githubusercontent.com/signup?ref_cta=Sign+up&ref_loc=header+logged+out&ref_page=%2F%3Cuser-name%3E%2F%3Crepo-name%3E%2Fpull_requests%2Fshow%2Ffiles&source=header-repo&source_repo=python-openxml%2Fpython-docx
Reloadhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Reloadhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Reloadhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
python-openxml https://patch-diff.githubusercontent.com/python-openxml
python-docxhttps://patch-diff.githubusercontent.com/python-openxml/python-docx
Notifications https://patch-diff.githubusercontent.com/login?return_to=%2Fpython-openxml%2Fpython-docx
Fork 1.3k https://patch-diff.githubusercontent.com/login?return_to=%2Fpython-openxml%2Fpython-docx
Star 5.4k https://patch-diff.githubusercontent.com/login?return_to=%2Fpython-openxml%2Fpython-docx
Code https://patch-diff.githubusercontent.com/python-openxml/python-docx
Issues 577 https://patch-diff.githubusercontent.com/python-openxml/python-docx/issues
Pull requests 124 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pulls
Actions https://patch-diff.githubusercontent.com/python-openxml/python-docx/actions
Projects 0 https://patch-diff.githubusercontent.com/python-openxml/python-docx/projects
Wiki https://patch-diff.githubusercontent.com/python-openxml/python-docx/wiki
Security 0 https://patch-diff.githubusercontent.com/python-openxml/python-docx/security
Insights https://patch-diff.githubusercontent.com/python-openxml/python-docx/pulse
Code https://patch-diff.githubusercontent.com/python-openxml/python-docx
Issues https://patch-diff.githubusercontent.com/python-openxml/python-docx/issues
Pull requests https://patch-diff.githubusercontent.com/python-openxml/python-docx/pulls
Actions https://patch-diff.githubusercontent.com/python-openxml/python-docx/actions
Projects https://patch-diff.githubusercontent.com/python-openxml/python-docx/projects
Wiki https://patch-diff.githubusercontent.com/python-openxml/python-docx/wiki
Security https://patch-diff.githubusercontent.com/python-openxml/python-docx/security
Insights https://patch-diff.githubusercontent.com/python-openxml/python-docx/pulse
Sign up for GitHub https://patch-diff.githubusercontent.com/signup?return_to=%2Fpython-openxml%2Fpython-docx%2Fissues%2Fnew%2Fchoose
terms of servicehttps://docs.github.com/terms
privacy statementhttps://docs.github.com/privacy
Sign inhttps://patch-diff.githubusercontent.com/login?return_to=%2Fpython-openxml%2Fpython-docx%2Fissues%2Fnew%2Fchoose
amithkkhttps://patch-diff.githubusercontent.com/amithkk
python-openxml:masterhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/tree/master
amithkk:feat/revision-managementhttps://patch-diff.githubusercontent.com/amithkk/python-docx/tree/feat/revision-management
Conversation 2 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534
Commits 4 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/commits
Checks 0 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/checks
Files changed https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Please reload this pagehttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Add revision management capability + tests + docs https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#top
Show all changes 4 commits https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
f5e9e3d Add revision management capability + tests + docs amithkk Jan 7, 2026 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/commits/f5e9e3dd04e3857669a5a5dc940e26fe78e5fb43
74feac5 Pull imports up amithkk Jan 7, 2026 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/commits/74feac50de030285fa51f7ed9e1c06a4f4547a28
912d276 positional replacement amithkk Jan 7, 2026 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/commits/912d2762fae66762991bfa316d80ec668d4000e1
b9a50d1 Merge pull request #1 from amithkk/feat/revision-management-positional amithkk Jan 8, 2026 https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/commits/b9a50d10d1d6f2601561bf6742cb6bca78a378f7
Clear filters https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Please reload this pagehttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
Please reload this pagehttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
.gitignore https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
revisions.rst https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-f90b49551cffebbcf39b3c70c3b6305b7de7f5681b19a13f03241bf632f5885d
conf.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-85933aa74a2d66c3e4dcdf7a9ad8397f5a7971080d34ef1108296a7c6b69e7e3
index.rst https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8d068e8797e88947c320f79e856c3e16a72b730124a8f9d7031e2c4680dfa534
revisions.rst https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-6377a204d3bca90702d76b01ea515277080e1e9e786de76f2930930c13d09af1
pyproject.toml https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
blkcntnr.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-c3412b563d2f34a04006ee2658cf010fc11364d4c792f0b2b240a687dd3ce605
document.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8b5aed35cea2e719e419af099e5d7d2f6ff97b5737b5329dcf66c57031999541
__init__.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-4b1c4dcf03dbdf6a05c491cae8d35f84d025d0bf7669079faaca026b5a9409ef
document.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-1d2ec0198243ed7da797b770b4d554515258f7867df51e2eed4c267f72c485c1
revision.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-7839978bb71002486d0e24873c0fe3d8cfbadf58726145eb7a41bc37e7149c29
settings.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-19835c1e0c13c9be55a81d31c74a7f8af1667d132cc8a3e40bc3c49d763757ee
paragraph.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-047abfba31a9cd4defdf596705a3a6e8b0a5ba267cf27d7fe755297d14ecd476
revision.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-01c14ee6e2e53d1563765cf00d77d08257d52f8d58f785f377249b7be14cb71f
settings.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-fc03a86b4d14b7c47e56fc8c14eecec9b15f3e53a4e49185572dfaed8100cb1b
paragraph.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-97eceaeb4ca0c9bd77aa456168dff469c3196b2dd4891f694d9f66c2c8fe4da0
run.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-93a63e78713879c0fd787128dfc3a563806eff684b68e9ba3a3fd0cd11e47e45
test_revision.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-45a446cd07881f4802d413658f505ccd6759a4e416f282440989d29d8a9b4d26
cxml.py https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-6b68969de389b2745b6098845e82aa34abb743522724c812d0dc9f816cbfe434
.gitignorehttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/.gitignore
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-bc37d034bad564583790a46f19d807abfe519c5671395fd494d8cce506c42947
docs/api/revisions.rsthttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-f90b49551cffebbcf39b3c70c3b6305b7de7f5681b19a13f03241bf632f5885d
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/docs/api/revisions.rst
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
docs/conf.pyhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-85933aa74a2d66c3e4dcdf7a9ad8397f5a7971080d34ef1108296a7c6b69e7e3
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/docs/conf.py
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-85933aa74a2d66c3e4dcdf7a9ad8397f5a7971080d34ef1108296a7c6b69e7e3
docs/index.rsthttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8d068e8797e88947c320f79e856c3e16a72b730124a8f9d7031e2c4680dfa534
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/docs/index.rst
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8d068e8797e88947c320f79e856c3e16a72b730124a8f9d7031e2c4680dfa534
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8d068e8797e88947c320f79e856c3e16a72b730124a8f9d7031e2c4680dfa534
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-8d068e8797e88947c320f79e856c3e16a72b730124a8f9d7031e2c4680dfa534
docs/user/revisions.rsthttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-6377a204d3bca90702d76b01ea515277080e1e9e786de76f2930930c13d09af1
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/docs/user/revisions.rst
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
pyproject.tomlhttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
View file https://patch-diff.githubusercontent.com/python-openxml/python-docx/blob/b9a50d10d1d6f2601561bf6742cb6bca78a378f7/pyproject.toml
Open in desktop https://desktop.github.com
https://github.co/hiddenchars
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/{{ revealButtonHref }}
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
https://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files#diff-50c86b7ed8ac2cf95bd48334961bf0530cdc77b5a56f852c5c61b89d735fd711
Please reload this pagehttps://patch-diff.githubusercontent.com/python-openxml/python-docx/pull/1534/files
https://github.com
Termshttps://docs.github.com/site-policy/github-terms/github-terms-of-service
Privacyhttps://docs.github.com/site-policy/privacy-policies/github-privacy-statement
Securityhttps://github.com/security
Statushttps://www.githubstatus.com/
Communityhttps://github.community/
Docshttps://docs.github.com/
Contacthttps://support.github.com?tags=dotcom-footer

Viewport: width=device-width


URLs of crawlers that visited me.