brewdoc-linux-x64-glibc 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,40 +3,46 @@
3
3
  [![PyPI](https://img.shields.io/pypi/v/brewdoc)](https://pypi.org/project/brewdoc/)
4
4
  [![CI](https://github.com/kochetkov-ma/brewdoc/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/kochetkov-ma/brewdoc/actions/workflows/ci.yml)
5
5
  [![Release](https://img.shields.io/github/v/release/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/releases/latest)
6
- [![MIT](https://img.shields.io/github/license/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/LICENSE)
6
+ [![MIT](https://img.shields.io/github/license/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/LICENSE)
7
7
 
8
8
  Fast, deterministic document-to-Markdown conversion for agent systems. Easy to install. No model weights, OCR or external services.
9
9
 
10
10
  Local conversion runs offline after installation, with no runtime component downloads.
11
11
  Supported documents become one Markdown file and a JSON receipt describing omissions.
12
- See [formats and limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md).
13
- Version 0.4.1 adds [selected ZIP/XML reader budgets](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#zipxml-reader-limits)
12
+ See [formats and limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md).
13
+ Version 0.4.1 added [selected ZIP/XML reader budgets](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#zipxml-reader-limits)
14
14
  for DOCX/PPTX and workbook metadata/artifacts. Excessive work refuses before output
15
15
  writes; native workbook values and total process memory remain outside those bounds.
16
16
 
17
- ## Install
17
+ Version 0.5.0 added ODT/ODP text and tables, selected MIME email bodies and exact UTF-8
18
+ Markdown/text pass-through. It preserved workbook Unicode and exposed datetime precision,
19
+ and selected one DOCX compatibility fallback.
20
+ It also added textless PDF page facts and selected caption, table and math-spacing fixes.
21
+ Version 0.6.0 writes cleaner Markdown with minimal escaping, adds `--body-only`, accepts
22
+ documents through `--url`, decodes legacy HTML charsets and falls back to the whole page in
23
+ article mode.
18
24
 
19
- These examples select 0.4.1. Use a channel listed as available in [that release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.4.1). Choose one method:
25
+ ## Install
20
26
 
21
- Article mode is introduced in 0.4.0. Channel availability is listed in the release.
27
+ These examples select 0.6.0. Use a channel listed as available in [that release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.6.0). Choose one method:
22
28
 
23
29
  ```sh
24
- python -m pip install "brewdoc==0.4.1"
25
- uv tool install --python 3.12 "brewdoc==0.4.1"
26
- pipx install --python 3.12 "brewdoc==0.4.1"
30
+ python -m pip install "brewdoc==0.6.0"
31
+ uv tool install --python 3.12 "brewdoc==0.6.0"
32
+ pipx install --python 3.12 "brewdoc==0.6.0"
27
33
  ```
28
34
 
29
- Use a virtual environment for pip. Python 3.12+ is required; HTML/URL need CPython 3.12-3.14.
30
- [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md) covers prerequisites, Windows, uvx, PATH, update and removal.
35
+ Use a virtual environment for pip. Python 3.12+ is required; local and URL HTML need CPython 3.12-3.14.
36
+ [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md) covers prerequisites, Windows, uvx, PATH, update and removal.
31
37
  [Latest release](https://github.com/kochetkov-ma/brewdoc/releases/latest) lists actual assets and channel availability.
32
38
 
33
39
  ### Standalone downloads
34
40
 
35
- Use downloads listed as available in the release. Python and dependencies are bundled. Verify [SHA256SUMS](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/SHA256SUMS) and keep the entire extracted directory.
41
+ Use downloads listed as available in the release. Python and dependencies are bundled. Verify [SHA256SUMS](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/SHA256SUMS) and keep the entire extracted directory.
36
42
 
37
- [![Linux x64 download](https://img.shields.io/badge/Linux_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-linux-x64.tar.gz)
38
- [![Windows x64 download](https://img.shields.io/badge/Windows_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-windows-x64.zip)
39
- [![macOS ARM64 download](https://img.shields.io/badge/macOS_ARM64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-macos-arm64.tar.gz)
43
+ [![Linux x64 download](https://img.shields.io/badge/Linux_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-linux-x64.tar.gz)
44
+ [![Windows x64 download](https://img.shields.io/badge/Windows_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-windows-x64.zip)
45
+ [![macOS ARM64 download](https://img.shields.io/badge/macOS_ARM64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-macos-arm64.tar.gz)
40
46
 
41
47
  | Native target | Verification environment | JavaScript |
42
48
  |---|---|---|
@@ -46,20 +52,27 @@ Use downloads listed as available in the release. Python and dependencies are bu
46
52
 
47
53
  Older OSes, Linux musl/ARM64 and macOS Intel are outside this binary set.
48
54
  Windows is unsigned; macOS has an ad hoc signature without Developer ID/notarization.
49
- Linux archives have checksums, without a detached publisher signature. [Download and launch](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md#standalone).
55
+ Linux archives have checksums, without a detached publisher signature. [Download and launch](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#standalone).
50
56
 
51
57
  ### npm
52
58
 
53
59
  [![npm](https://img.shields.io/npm/v/brewdoc)](https://www.npmjs.com/package/brewdoc)
54
60
 
55
61
  npm targets Linux x64/glibc and macOS ARM64. Windows uses the GitHub native download or Python package.
56
- Use npm/npx only when listed as available in [the release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.4.1).
57
- [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md#npm-and-npx) contains exact-version installation, update and removal instructions.
62
+ Use npm/npx only when listed as available in [the release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.6.0).
63
+ [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#npm-and-npx) contains exact-version installation, update and removal instructions.
64
+
65
+ ### Homebrew
66
+
67
+ Use `kochetkov-ma/brew/brewdoc` only when the release lists it as available.
68
+ It installs the complete native bundle on macOS 15+ ARM64 or Linux x64 with system
69
+ glibc 2.35+. See [installation and lifecycle](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#homebrew).
58
70
 
59
71
  ## Usage
60
72
 
61
73
  ```sh
62
74
  brewdoc file.pdf --out file.md
75
+ brewdoc --body-only paper.pdf --out paper.md
63
76
  brewdoc book.epub --out book.md
64
77
  brewdoc file.xlsx --sheet Calc --sheet Inputs --out book.md
65
78
  brewdoc file.xlsm --artifact formula/sheet/000002=formulas.json
@@ -71,15 +84,24 @@ brewdoc --self-check
71
84
  caller order retains full-workbook ordinals. Artifact keys come from the Markdown artifact table.
72
85
  Requests and output collisions are validated before writes. Paths resolve against the caller's directory;
73
86
  `--out` creates parents. Refusal preserves existing output. Self-check is offline and has its own output.
87
+ `--body-only` drops the title, metadata, omissions, contents and unit anchors; unit headings stay
88
+ only for several units. The receipt is unchanged. See [body-only output](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#body-only-output).
74
89
 
75
90
  ## Markdown and receipts
76
91
 
77
- Successful output uses `brewdoc.markdown/2`: quoted source title, Metadata, Artifacts,
92
+ Parsed document output uses `brewdoc.markdown/2`: quoted source title, Metadata, Artifacts,
78
93
  Known omissions, Contents, then anchored units. PDF uses `page/000001`, workbooks `sheet/000001`,
79
- PPTX `slide/000001`, and DOCX/EPUB/HTML `chapter/000001`. Empty declared units remain navigable.
94
+ PPTX/ODP `slide/000001`, and DOCX/EPUB/HTML/ODT/EML `chapter/000001`.
95
+ Empty declared units remain navigable. Escaping is minimal; HTML, EPUB and EML omit form
96
+ controls and write images with alt text as `![alt](src)`. See [Markdown escaping](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#markdown-escaping).
80
97
  Metadata holds source/selection/content hashes, conversion tallies and artifact capabilities;
81
98
  it excludes paths, timestamps, permissions and host data. EPUB retains declared publication metadata.
82
99
 
100
+ UTF-8 `.md` and `.txt` use `brewdoc.markdown/passthrough/1`: exact source bytes with
101
+ no generated envelope, contents or anchors. BOM, whitespace, newline variants and absent
102
+ final newline survive; empty input succeeds. The receipt reports route `text`, kind `none`
103
+ and zero units. Without `--out`, the JSON receipt precedes the unchanged body bytes.
104
+
83
105
  Conversion prints one JSON receipt line first. With `--out`, Markdown goes to the file;
84
106
  without it, Markdown follows on stdout. Local receipts use `brewdoc.receipt/1`; URL receipts use `brewdoc.receipt/2`.
85
107
 
@@ -97,7 +119,8 @@ without it, Markdown follows on stdout. Local receipts use `brewdoc.receipt/1`;
97
119
  | `acquisition` | URL provenance, frozen snapshot and capture status |
98
120
 
99
121
  Exit 0 means conversion, 1 refusal and 2 invalid usage. Success does not prove content fidelity or complete JavaScript.
100
- PDF/DOCX/PPTX/workbooks emit ASCII; HTML/EPUB emit UTF-8 without BOM, with LF newlines. JSON keeps ASCII escaping.
122
+ PDF/DOCX/PPTX emit ASCII; workbooks/HTML/EPUB/ODT/ODP/EML emit UTF-8 without BOM, with LF newlines.
123
+ Text pass-through retains the source UTF-8 encoding and newlines. JSON keeps ASCII escaping.
101
124
  The same local file or frozen snapshot produces identical bytes; live pages can change.
102
125
 
103
126
  ## Python API
@@ -111,16 +134,18 @@ refs = brewdoc.list_book_artifacts("book.xlsm", sheets=("Calc",))
111
134
  payload = brewdoc.read_book_artifact("book.xlsm", refs[0].key, sheets=("Calc",))
112
135
  ```
113
136
 
114
- `run` accepts `sheets` and an `artifact_outputs` key-to-path mapping. Renderers include
137
+ `run` accepts `sheets`, an `artifact_outputs` key-to-path mapping, `article` and `body_only`. Renderers include
115
138
  `render_pdf`, `render_doc`, `render_presentation`, `render_epub`, `render_html` and `render_book`.
116
139
  `read_formulas` provides typed formulas; `self_check` verifies installed routes. Local APIs never acquire URLs.
117
140
 
118
141
  ## Explicit URL acquisition
119
142
 
120
- `--url` deliberately acquires a public HTTP(S) page before local conversion.
143
+ `--url` deliberately acquires a public HTTP(S) page or supported document before local conversion.
144
+ Content-Type and magic bytes pick the route: HTML, PDF, Office, OpenDocument, EPUB, EML or text.
121
145
 
122
146
  ```sh
123
147
  brewdoc --url https://example.com/article --out article.md
148
+ brewdoc --url https://arxiv.org/pdf/1706.03762 --out attention.md
124
149
  brewdoc --url https://example.com/article --render-js --timeout 30 --out article.md
125
150
  ```
126
151
 
@@ -128,12 +153,12 @@ brewdoc --url https://example.com/article --render-js --timeout 30 --out article
128
153
  Public destinations, DNS, redirects, TLS, requests and bytes are validated. Ordinary requests use GET;
129
154
  JS admits only the narrow credential-free HN Algolia XHR POST exception. Local HTML never fetches or runs scripts.
130
155
  Optional JS needs installed/bundled prerequisites, refuses unsupported runtimes before HTTP and downloads no engine.
131
- Timing-only expiry can preserve valid partial content; hard failures refuse output. [Full URL/JS limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#url-acquisition).
156
+ Timing-only expiry can preserve valid partial content; hard failures refuse output. [Full URL/JS limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#url-acquisition).
132
157
 
133
158
  ## Article mode
134
159
 
135
160
  Introduced in 0.4.0; use a channel listed as available in the release. For Python JS capture, install
136
- `brewdoc[render-js]==0.4.1`; supported standalone bundles include its prerequisites.
161
+ `brewdoc[render-js]==0.6.0`; supported standalone bundles include its prerequisites.
137
162
 
138
163
  ```sh
139
164
  brewdoc page.html --article --out article.md
@@ -146,30 +171,31 @@ code, receipt, markdown = brewdoc.run("page.html", article=True)
146
171
  markdown, tally = brewdoc.render_html("page.html", article=True)
147
172
  ```
148
173
 
149
- Article mode selects one explicit article or a qualified main subtree. It suits single articles
150
- and documentation pages with those literal HTML elements. Feeds with peer articles, ambiguous
151
- main regions and pages without a qualified subtree refuse. A visible form disqualifies main
152
- fallback; an explicit article can retain forms. There is no full-page fallback or text scoring.
153
- Selection uses the recovered static HTML or frozen JS snapshot,
174
+ Article mode keeps visible `main` (or role main) content, or outer `article` content when no main
175
+ exists; articles outside a main are dropped when one exists. Page-chrome landmarks are skipped, but
176
+ a header inside an article or a nav inside main stays.
177
+ Peer articles and multiple mains render in DOM order. When no candidate renders, the whole clean
178
+ page renders and the receipt adds `article_fallback: true`; selection never refuses for page
179
+ structure. There is no text scoring. Selection uses the recovered static HTML or frozen JS snapshot,
154
180
  without layout or inferred author/date metadata. The source title is unchanged.
155
181
 
156
- The receipt's `not_carried` and successful Markdown's Known omissions declare:
182
+ When content is selected, the receipt's `not_carried` and Markdown's Known omissions declare:
157
183
  `body content outside the selected article or main subtree; complete page coverage is not claimed`.
158
- The [article contract](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#article-selection)
159
- defines selection, refusals and limits.
184
+ The [article contract](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#article-selection)
185
+ defines selection, fallback and limits.
160
186
 
161
- [Source-package CI](https://github.com/kochetkov-ma/brewdoc/actions/runs/38431645006) passed on
187
+ [Earlier source-package CI](https://github.com/kochetkov-ma/brewdoc/actions/runs/38431645006) passed on
162
188
  Ubuntu 22.04 x64/glibc with CPython 3.13.15, and macOS 15 ARM64/Windows Server 2025 x64
163
189
  with CPython 3.14.7. Each passed four independent wheel/sdist base/optional installs;
164
190
  optional JS executed on Unix and refused before requests on Windows. These are selected
165
- tested patches, not a claim about newer versions. CPython 3.12.14 retains the local macOS
166
- full-suite baseline and existing CI smoke checks. Package evidence is separate from the
167
- standalone binaries; other OS/minor combinations, free-threaded CPython and other
191
+ tested patches, not a claim about newer versions. These results predate the 0.5.0 changes.
192
+ CPython 3.12.14 retains the local macOS full-suite baseline and existing CI smoke checks.
193
+ Package evidence is separate from standalone binaries; other OS/minor combinations, free-threaded CPython and other
168
194
  architectures remain untested here.
169
- See [package compatibility](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#python-package-compatibility).
195
+ See [package compatibility](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#python-package-compatibility).
170
196
 
171
- [Format contracts](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md) | [Corpus](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/CATALOG.md) | [Measurements](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/METHODOLOGY.md) | [Results](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/results/README.md)
172
- [Releasing](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/RELEASING.md) | [Agent entry point](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/llms.txt) | [MIT license](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/LICENSE)
197
+ [Format contracts](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md) | [Corpus](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/CATALOG.md) | [Measurements](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/METHODOLOGY.md) | [Results](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/results/README.md)
198
+ [Releasing](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/RELEASING.md) | [Agent entry point](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/llms.txt) | [MIT license](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/LICENSE)
173
199
 
174
200
  ## Related projects
175
201
 
Binary file
@@ -2,6 +2,7 @@
2
2
  const hostGlobal = globalThis;
3
3
  let nextId = 1;
4
4
  let clock = 0;
5
+ let frameTime;
5
6
  let baseURL = '';
6
7
  const requests = [];
7
8
  const pending = new Map();
@@ -439,7 +440,7 @@
439
440
  defineProperty(globalThis, 'localStorage', { configurable: true, get() { touch(); return storage; } });
440
441
  }
441
442
 
442
- function anchorURL(value) {
443
+ function anchorURL(value, baseText) {
443
444
  const raw = String(value);
444
445
  if (raw.length > 8192 || encodeURL(raw).replace(/%[0-9a-f]{2}/gi, '_').length > 8192 ||
445
446
  /[\u0000-\u0020\u007f\\]/.test(raw) || /%(?![0-9a-f]{2})/i.test(raw))
@@ -457,7 +458,7 @@
457
458
  let parsed;
458
459
  if (/^https?:\/\//i.test(raw)) parsed = absolute(raw);
459
460
  else {
460
- const base = absolute(pageDocument.baseURI);
461
+ const base = absolute(baseText ?? pageDocument.baseURI);
461
462
  if (raw.startsWith('//')) parsed = absolute(base.protocol + raw);
462
463
  else {
463
464
  if (/^[a-z][a-z0-9+.-]*:/i.test(raw)) throw new TypeError('anchor URL scheme unsupported');
@@ -480,6 +481,68 @@
480
481
  return parsed;
481
482
  }
482
483
 
484
+ const urlParts = new WeakMap();
485
+ const urlQueries = new WeakMap();
486
+ const queryOwners = new WeakMap();
487
+ const formEncode = text => encodeURL(text).replace(/%20/g, '+')
488
+ .replace(/[!'()~]/g, letter => '%' + letter.charCodeAt(0).toString(16).toUpperCase());
489
+ const formDecode = text => { try { return decodeURIComponent(text.replace(/\+/g, ' ')); } catch { return text; } };
490
+ class URLSearchParams {
491
+ #list = [];
492
+ constructor(init = '') {
493
+ if (init && typeof init === 'object')
494
+ for (const [key, value] of Symbol.iterator in init ? init : entries(init)) this.#list.push([String(key), String(value)]);
495
+ else for (const pair of String(init).replace(/^\?/, '').split('&')) {
496
+ const at = pair.indexOf('=');
497
+ if (pair) this.#list.push(at < 0 ? [formDecode(pair), ''] : [formDecode(pair.slice(0, at)), formDecode(pair.slice(at + 1))]);
498
+ }
499
+ }
500
+ #changed() { queryOwners.get(this)?.(this.toString()); }
501
+ get(name) { return this.#list.find(([key]) => key === String(name))?.[1] ?? null; }
502
+ has(name) { return this.#list.some(([key]) => key === String(name)); }
503
+ append(name, value) { this.#list.push([String(name), String(value)]); this.#changed(); }
504
+ delete(name) { this.#list = this.#list.filter(([key]) => key !== String(name)); this.#changed(); }
505
+ set(name, value) {
506
+ const index = this.#list.findIndex(([key]) => key === String(name));
507
+ this.#list = this.#list.filter(([key]) => key !== String(name));
508
+ this.#list.splice(index < 0 ? this.#list.length : index, 0, [String(name), String(value)]);
509
+ this.#changed();
510
+ }
511
+ entries() { return this.#list.map(([key, value]) => [key, value]).values(); }
512
+ [Symbol.iterator]() { return this.entries(); }
513
+ toString() { return this.#list.map(([key, value]) => formEncode(key) + '=' + formEncode(value)).join('&'); }
514
+ }
515
+ class URL {
516
+ constructor(url, base) {
517
+ if (base === undefined && !/^https?:\/\//i.test(String(url))) throw new TypeError('URL without base must be absolute');
518
+ urlParts.set(this, anchorURL(url, base === undefined ? undefined : new URL(base).href));
519
+ }
520
+ get origin() { return this.protocol + '//' + this.host; }
521
+ get searchParams() {
522
+ if (!urlQueries.has(this)) {
523
+ const query = new URLSearchParams(this.search);
524
+ queryOwners.set(query, text => { this.search = text; urlQueries.set(this, query); });
525
+ urlQueries.set(this, query);
526
+ }
527
+ return urlQueries.get(this);
528
+ }
529
+ toString() { return this.href; }
530
+ toJSON() { return this.href; }
531
+ }
532
+ // Only href, pathname, search and hash are writable; other components stay read-only.
533
+ for (const name of ['href', 'protocol', 'host', 'hostname', 'port', 'pathname', 'search', 'hash']) {
534
+ const prefix = { pathname: '/', search: '?', hash: '#' }[name];
535
+ defineProperty(URL.prototype, name, {
536
+ configurable: true, enumerable: true, get() { return urlParts.get(this)[name]; },
537
+ set: name === 'href' || prefix ? function (value) {
538
+ const parts = { ...urlParts.get(this), [name]: String(value) };
539
+ if (prefix && parts[name] && !parts[name].startsWith(prefix)) parts[name] = prefix + parts[name];
540
+ urlParts.set(this, anchorURL(name === 'href' ? parts.href : parts.protocol + '//' + parts.host + parts.pathname + parts.search + parts.hash));
541
+ urlQueries.delete(this);
542
+ } : undefined
543
+ });
544
+ }
545
+
483
546
  class Headers {
484
547
  constructor(source = {}) {
485
548
  this.values = new Map(Object.entries(source).map(([key, value]) => [key.toLowerCase(), String(value)]));
@@ -567,12 +630,12 @@
567
630
  });
568
631
  }
569
632
 
570
- function setTimer(callback, delay = 0, repeat = false, args = []) {
633
+ function setTimer(callback, delay = 0, repeat = false, args = [], frame = false) {
571
634
  if (typeof callback !== 'function') throw new TypeError('string timers unsupported');
572
635
  if (timers.size >= 200) { violation = true; throw new RangeError('timer count exceeded'); }
573
636
  const id = nextId++;
574
637
  const milliseconds = Math.max(0, Math.min(2147483647, Number(delay) || 0));
575
- timers.set(id, { callback, args, delay: milliseconds, due: clock + milliseconds, repeat });
638
+ timers.set(id, { callback, args, delay: milliseconds, due: clock + milliseconds, repeat, frame });
576
639
  return id;
577
640
  }
578
641
 
@@ -582,8 +645,14 @@
582
645
  parsedView = undefined;
583
646
  baseURL = url;
584
647
  installStorage();
585
- globalThis.window = view;
648
+ globalThis.window = globalThis.self = view;
586
649
  globalThis.document = view.document;
650
+ Object.defineProperty(view.document, 'currentScript', { get: () => currentScript ?? null });
651
+ Object.defineProperty(view.document, 'cookie', { get: () => '', set() {} });
652
+ const silent = () => {};
653
+ globalThis.console = { log: silent, info: silent, warn: silent, error: silent, debug: silent };
654
+ globalThis.URL = URL;
655
+ globalThis.URLSearchParams = URLSearchParams;
587
656
  pageDocument = view.document;
588
657
  pageWindow = view;
589
658
  const htmlConstructor = view.HTMLElement;
@@ -643,7 +712,7 @@
643
712
  globalThis[key] = view[key];
644
713
  Object.defineProperty(document, 'readyState', { value: 'loading', writable: true });
645
714
  Object.defineProperty(document, 'baseURI', { value: url, writable: true });
646
- globalThis.location = parse(locationJSON);
715
+ globalThis.location = { ...parse(locationJSON), toString() { return this.href; } };
647
716
  Object.defineProperty(globalThis, 'history', { value: Object.freeze({ length: 1, state: null }) });
648
717
  const anchorPrototype = view.HTMLAnchorElement.prototype;
649
718
  const href = Object.getOwnPropertyDescriptor(anchorPrototype, 'href');
@@ -680,6 +749,9 @@
680
749
  globalThis.setInterval = (callback, delay, ...args) => setTimer(callback, delay, true, args);
681
750
  globalThis.clearTimeout = id => timers.delete(id);
682
751
  globalThis.clearInterval = globalThis.clearTimeout;
752
+ // Frames are due at once so one always runs on the next pump pass, which never waits for them.
753
+ globalThis.requestAnimationFrame = callback => setTimer(callback, 0, false, [clock], true);
754
+ globalThis.cancelAnimationFrame = globalThis.clearTimeout;
683
755
  globalThis.AbortController = class {
684
756
  constructor() { this.signal = new EventTarget(); this.signal.aborted = false; }
685
757
  abort() { this.signal.aborted = true; this.signal.dispatchEvent(new Event('abort')); }
@@ -807,16 +879,18 @@
807
879
  if (record.error) state.reject(error(record.name || 'TypeError', record.error));
808
880
  else state.resolve(new Response(record));
809
881
  };
810
- globalThis.__smallTimers = () => controlJSON([...timers].map(([id, timer]) => ({ id, due: timer.due })));
882
+ globalThis.__smallTimers = () => controlJSON([...timers].map(([id, timer]) => ({ id, due: timer.due, repeat: timer.repeat, frame: timer.frame })));
811
883
  globalThis.__smallRunTimer = (id, now) => {
812
884
  clock = now;
813
885
  const timer = timers.get(id);
814
886
  if (!timer) return;
815
887
  if (timer.repeat) timer.due = now + Math.max(1, timer.delay);
816
888
  else timers.delete(id);
817
- try { timer.callback(...timer.args); } catch (reason) { errors.push(String(reason)); }
889
+ // One pump pass is one frame: its frames share the earliest request time, keeping output deterministic.
890
+ const args = timer.frame ? [frameTime ??= timer.args[0]] : timer.args;
891
+ try { timer.callback(...args); } catch (reason) { errors.push(String(reason)); }
818
892
  };
819
- globalThis.__smallClock = now => { clock = now; };
893
+ globalThis.__smallClock = now => { clock = now; frameTime = undefined; };
820
894
  globalThis.__smallErrors = () => {
821
895
  const descriptor = ownDescriptor(hostGlobal, 'Promise');
822
896
  if (!descriptor || descriptor.get !== promiseGetter || descriptor.set !== promiseSetter ||
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: brewdoc
3
- Version: 0.4.1
3
+ Version: 0.6.0
4
4
  Summary: Fast, deterministic document-to-Markdown conversion for agent systems. Easy to install. No model weights, OCR or external services.
5
5
  Project-URL: Homepage, https://github.com/kochetkov-ma/brewdoc
6
6
  Project-URL: Repository, https://github.com/kochetkov-ma/brewdoc
@@ -31,40 +31,46 @@ Description-Content-Type: text/markdown
31
31
  [![PyPI](https://img.shields.io/pypi/v/brewdoc)](https://pypi.org/project/brewdoc/)
32
32
  [![CI](https://github.com/kochetkov-ma/brewdoc/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/kochetkov-ma/brewdoc/actions/workflows/ci.yml)
33
33
  [![Release](https://img.shields.io/github/v/release/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/releases/latest)
34
- [![MIT](https://img.shields.io/github/license/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/LICENSE)
34
+ [![MIT](https://img.shields.io/github/license/kochetkov-ma/brewdoc)](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/LICENSE)
35
35
 
36
36
  Fast, deterministic document-to-Markdown conversion for agent systems. Easy to install. No model weights, OCR or external services.
37
37
 
38
38
  Local conversion runs offline after installation, with no runtime component downloads.
39
39
  Supported documents become one Markdown file and a JSON receipt describing omissions.
40
- See [formats and limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md).
41
- Version 0.4.1 adds [selected ZIP/XML reader budgets](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#zipxml-reader-limits)
40
+ See [formats and limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md).
41
+ Version 0.4.1 added [selected ZIP/XML reader budgets](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#zipxml-reader-limits)
42
42
  for DOCX/PPTX and workbook metadata/artifacts. Excessive work refuses before output
43
43
  writes; native workbook values and total process memory remain outside those bounds.
44
44
 
45
- ## Install
45
+ Version 0.5.0 added ODT/ODP text and tables, selected MIME email bodies and exact UTF-8
46
+ Markdown/text pass-through. It preserved workbook Unicode and exposed datetime precision,
47
+ and selected one DOCX compatibility fallback.
48
+ It also added textless PDF page facts and selected caption, table and math-spacing fixes.
49
+ Version 0.6.0 writes cleaner Markdown with minimal escaping, adds `--body-only`, accepts
50
+ documents through `--url`, decodes legacy HTML charsets and falls back to the whole page in
51
+ article mode.
46
52
 
47
- These examples select 0.4.1. Use a channel listed as available in [that release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.4.1). Choose one method:
53
+ ## Install
48
54
 
49
- Article mode is introduced in 0.4.0. Channel availability is listed in the release.
55
+ These examples select 0.6.0. Use a channel listed as available in [that release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.6.0). Choose one method:
50
56
 
51
57
  ```sh
52
- python -m pip install "brewdoc==0.4.1"
53
- uv tool install --python 3.12 "brewdoc==0.4.1"
54
- pipx install --python 3.12 "brewdoc==0.4.1"
58
+ python -m pip install "brewdoc==0.6.0"
59
+ uv tool install --python 3.12 "brewdoc==0.6.0"
60
+ pipx install --python 3.12 "brewdoc==0.6.0"
55
61
  ```
56
62
 
57
- Use a virtual environment for pip. Python 3.12+ is required; HTML/URL need CPython 3.12-3.14.
58
- [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md) covers prerequisites, Windows, uvx, PATH, update and removal.
63
+ Use a virtual environment for pip. Python 3.12+ is required; local and URL HTML need CPython 3.12-3.14.
64
+ [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md) covers prerequisites, Windows, uvx, PATH, update and removal.
59
65
  [Latest release](https://github.com/kochetkov-ma/brewdoc/releases/latest) lists actual assets and channel availability.
60
66
 
61
67
  ### Standalone downloads
62
68
 
63
- Use downloads listed as available in the release. Python and dependencies are bundled. Verify [SHA256SUMS](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/SHA256SUMS) and keep the entire extracted directory.
69
+ Use downloads listed as available in the release. Python and dependencies are bundled. Verify [SHA256SUMS](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/SHA256SUMS) and keep the entire extracted directory.
64
70
 
65
- [![Linux x64 download](https://img.shields.io/badge/Linux_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-linux-x64.tar.gz)
66
- [![Windows x64 download](https://img.shields.io/badge/Windows_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-windows-x64.zip)
67
- [![macOS ARM64 download](https://img.shields.io/badge/macOS_ARM64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.4.1/brewdoc-0.4.1-macos-arm64.tar.gz)
71
+ [![Linux x64 download](https://img.shields.io/badge/Linux_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-linux-x64.tar.gz)
72
+ [![Windows x64 download](https://img.shields.io/badge/Windows_x64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-windows-x64.zip)
73
+ [![macOS ARM64 download](https://img.shields.io/badge/macOS_ARM64-download-blue)](https://github.com/kochetkov-ma/brewdoc/releases/download/v0.6.0/brewdoc-0.6.0-macos-arm64.tar.gz)
68
74
 
69
75
  | Native target | Verification environment | JavaScript |
70
76
  |---|---|---|
@@ -74,20 +80,27 @@ Use downloads listed as available in the release. Python and dependencies are bu
74
80
 
75
81
  Older OSes, Linux musl/ARM64 and macOS Intel are outside this binary set.
76
82
  Windows is unsigned; macOS has an ad hoc signature without Developer ID/notarization.
77
- Linux archives have checksums, without a detached publisher signature. [Download and launch](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md#standalone).
83
+ Linux archives have checksums, without a detached publisher signature. [Download and launch](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#standalone).
78
84
 
79
85
  ### npm
80
86
 
81
87
  [![npm](https://img.shields.io/npm/v/brewdoc)](https://www.npmjs.com/package/brewdoc)
82
88
 
83
89
  npm targets Linux x64/glibc and macOS ARM64. Windows uses the GitHub native download or Python package.
84
- Use npm/npx only when listed as available in [the release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.4.1).
85
- [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/INSTALL.md#npm-and-npx) contains exact-version installation, update and removal instructions.
90
+ Use npm/npx only when listed as available in [the release](https://github.com/kochetkov-ma/brewdoc/releases/tag/v0.6.0).
91
+ [INSTALL.md](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#npm-and-npx) contains exact-version installation, update and removal instructions.
92
+
93
+ ### Homebrew
94
+
95
+ Use `kochetkov-ma/brew/brewdoc` only when the release lists it as available.
96
+ It installs the complete native bundle on macOS 15+ ARM64 or Linux x64 with system
97
+ glibc 2.35+. See [installation and lifecycle](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/INSTALL.md#homebrew).
86
98
 
87
99
  ## Usage
88
100
 
89
101
  ```sh
90
102
  brewdoc file.pdf --out file.md
103
+ brewdoc --body-only paper.pdf --out paper.md
91
104
  brewdoc book.epub --out book.md
92
105
  brewdoc file.xlsx --sheet Calc --sheet Inputs --out book.md
93
106
  brewdoc file.xlsm --artifact formula/sheet/000002=formulas.json
@@ -99,15 +112,24 @@ brewdoc --self-check
99
112
  caller order retains full-workbook ordinals. Artifact keys come from the Markdown artifact table.
100
113
  Requests and output collisions are validated before writes. Paths resolve against the caller's directory;
101
114
  `--out` creates parents. Refusal preserves existing output. Self-check is offline and has its own output.
115
+ `--body-only` drops the title, metadata, omissions, contents and unit anchors; unit headings stay
116
+ only for several units. The receipt is unchanged. See [body-only output](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#body-only-output).
102
117
 
103
118
  ## Markdown and receipts
104
119
 
105
- Successful output uses `brewdoc.markdown/2`: quoted source title, Metadata, Artifacts,
120
+ Parsed document output uses `brewdoc.markdown/2`: quoted source title, Metadata, Artifacts,
106
121
  Known omissions, Contents, then anchored units. PDF uses `page/000001`, workbooks `sheet/000001`,
107
- PPTX `slide/000001`, and DOCX/EPUB/HTML `chapter/000001`. Empty declared units remain navigable.
122
+ PPTX/ODP `slide/000001`, and DOCX/EPUB/HTML/ODT/EML `chapter/000001`.
123
+ Empty declared units remain navigable. Escaping is minimal; HTML, EPUB and EML omit form
124
+ controls and write images with alt text as `![alt](src)`. See [Markdown escaping](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#markdown-escaping).
108
125
  Metadata holds source/selection/content hashes, conversion tallies and artifact capabilities;
109
126
  it excludes paths, timestamps, permissions and host data. EPUB retains declared publication metadata.
110
127
 
128
+ UTF-8 `.md` and `.txt` use `brewdoc.markdown/passthrough/1`: exact source bytes with
129
+ no generated envelope, contents or anchors. BOM, whitespace, newline variants and absent
130
+ final newline survive; empty input succeeds. The receipt reports route `text`, kind `none`
131
+ and zero units. Without `--out`, the JSON receipt precedes the unchanged body bytes.
132
+
111
133
  Conversion prints one JSON receipt line first. With `--out`, Markdown goes to the file;
112
134
  without it, Markdown follows on stdout. Local receipts use `brewdoc.receipt/1`; URL receipts use `brewdoc.receipt/2`.
113
135
 
@@ -125,7 +147,8 @@ without it, Markdown follows on stdout. Local receipts use `brewdoc.receipt/1`;
125
147
  | `acquisition` | URL provenance, frozen snapshot and capture status |
126
148
 
127
149
  Exit 0 means conversion, 1 refusal and 2 invalid usage. Success does not prove content fidelity or complete JavaScript.
128
- PDF/DOCX/PPTX/workbooks emit ASCII; HTML/EPUB emit UTF-8 without BOM, with LF newlines. JSON keeps ASCII escaping.
150
+ PDF/DOCX/PPTX emit ASCII; workbooks/HTML/EPUB/ODT/ODP/EML emit UTF-8 without BOM, with LF newlines.
151
+ Text pass-through retains the source UTF-8 encoding and newlines. JSON keeps ASCII escaping.
129
152
  The same local file or frozen snapshot produces identical bytes; live pages can change.
130
153
 
131
154
  ## Python API
@@ -139,16 +162,18 @@ refs = brewdoc.list_book_artifacts("book.xlsm", sheets=("Calc",))
139
162
  payload = brewdoc.read_book_artifact("book.xlsm", refs[0].key, sheets=("Calc",))
140
163
  ```
141
164
 
142
- `run` accepts `sheets` and an `artifact_outputs` key-to-path mapping. Renderers include
165
+ `run` accepts `sheets`, an `artifact_outputs` key-to-path mapping, `article` and `body_only`. Renderers include
143
166
  `render_pdf`, `render_doc`, `render_presentation`, `render_epub`, `render_html` and `render_book`.
144
167
  `read_formulas` provides typed formulas; `self_check` verifies installed routes. Local APIs never acquire URLs.
145
168
 
146
169
  ## Explicit URL acquisition
147
170
 
148
- `--url` deliberately acquires a public HTTP(S) page before local conversion.
171
+ `--url` deliberately acquires a public HTTP(S) page or supported document before local conversion.
172
+ Content-Type and magic bytes pick the route: HTML, PDF, Office, OpenDocument, EPUB, EML or text.
149
173
 
150
174
  ```sh
151
175
  brewdoc --url https://example.com/article --out article.md
176
+ brewdoc --url https://arxiv.org/pdf/1706.03762 --out attention.md
152
177
  brewdoc --url https://example.com/article --render-js --timeout 30 --out article.md
153
178
  ```
154
179
 
@@ -156,12 +181,12 @@ brewdoc --url https://example.com/article --render-js --timeout 30 --out article
156
181
  Public destinations, DNS, redirects, TLS, requests and bytes are validated. Ordinary requests use GET;
157
182
  JS admits only the narrow credential-free HN Algolia XHR POST exception. Local HTML never fetches or runs scripts.
158
183
  Optional JS needs installed/bundled prerequisites, refuses unsupported runtimes before HTTP and downloads no engine.
159
- Timing-only expiry can preserve valid partial content; hard failures refuse output. [Full URL/JS limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#url-acquisition).
184
+ Timing-only expiry can preserve valid partial content; hard failures refuse output. [Full URL/JS limits](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#url-acquisition).
160
185
 
161
186
  ## Article mode
162
187
 
163
188
  Introduced in 0.4.0; use a channel listed as available in the release. For Python JS capture, install
164
- `brewdoc[render-js]==0.4.1`; supported standalone bundles include its prerequisites.
189
+ `brewdoc[render-js]==0.6.0`; supported standalone bundles include its prerequisites.
165
190
 
166
191
  ```sh
167
192
  brewdoc page.html --article --out article.md
@@ -174,30 +199,31 @@ code, receipt, markdown = brewdoc.run("page.html", article=True)
174
199
  markdown, tally = brewdoc.render_html("page.html", article=True)
175
200
  ```
176
201
 
177
- Article mode selects one explicit article or a qualified main subtree. It suits single articles
178
- and documentation pages with those literal HTML elements. Feeds with peer articles, ambiguous
179
- main regions and pages without a qualified subtree refuse. A visible form disqualifies main
180
- fallback; an explicit article can retain forms. There is no full-page fallback or text scoring.
181
- Selection uses the recovered static HTML or frozen JS snapshot,
202
+ Article mode keeps visible `main` (or role main) content, or outer `article` content when no main
203
+ exists; articles outside a main are dropped when one exists. Page-chrome landmarks are skipped, but
204
+ a header inside an article or a nav inside main stays.
205
+ Peer articles and multiple mains render in DOM order. When no candidate renders, the whole clean
206
+ page renders and the receipt adds `article_fallback: true`; selection never refuses for page
207
+ structure. There is no text scoring. Selection uses the recovered static HTML or frozen JS snapshot,
182
208
  without layout or inferred author/date metadata. The source title is unchanged.
183
209
 
184
- The receipt's `not_carried` and successful Markdown's Known omissions declare:
210
+ When content is selected, the receipt's `not_carried` and Markdown's Known omissions declare:
185
211
  `body content outside the selected article or main subtree; complete page coverage is not claimed`.
186
- The [article contract](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#article-selection)
187
- defines selection, refusals and limits.
212
+ The [article contract](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#article-selection)
213
+ defines selection, fallback and limits.
188
214
 
189
- [Source-package CI](https://github.com/kochetkov-ma/brewdoc/actions/runs/38431645006) passed on
215
+ [Earlier source-package CI](https://github.com/kochetkov-ma/brewdoc/actions/runs/38431645006) passed on
190
216
  Ubuntu 22.04 x64/glibc with CPython 3.13.15, and macOS 15 ARM64/Windows Server 2025 x64
191
217
  with CPython 3.14.7. Each passed four independent wheel/sdist base/optional installs;
192
218
  optional JS executed on Unix and refused before requests on Windows. These are selected
193
- tested patches, not a claim about newer versions. CPython 3.12.14 retains the local macOS
194
- full-suite baseline and existing CI smoke checks. Package evidence is separate from the
195
- standalone binaries; other OS/minor combinations, free-threaded CPython and other
219
+ tested patches, not a claim about newer versions. These results predate the 0.5.0 changes.
220
+ CPython 3.12.14 retains the local macOS full-suite baseline and existing CI smoke checks.
221
+ Package evidence is separate from standalone binaries; other OS/minor combinations, free-threaded CPython and other
196
222
  architectures remain untested here.
197
- See [package compatibility](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md#python-package-compatibility).
223
+ See [package compatibility](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md#python-package-compatibility).
198
224
 
199
- [Format contracts](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/FORMATS.md) | [Corpus](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/CATALOG.md) | [Measurements](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/METHODOLOGY.md) | [Results](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/benchmarks/results/README.md)
200
- [Releasing](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/RELEASING.md) | [Agent entry point](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/llms.txt) | [MIT license](https://github.com/kochetkov-ma/brewdoc/blob/v0.4.1/LICENSE)
225
+ [Format contracts](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/FORMATS.md) | [Corpus](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/CATALOG.md) | [Measurements](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/METHODOLOGY.md) | [Results](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/benchmarks/results/README.md)
226
+ [Releasing](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/RELEASING.md) | [Agent entry point](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/llms.txt) | [MIT license](https://github.com/kochetkov-ma/brewdoc/blob/v0.6.0/LICENSE)
201
227
 
202
228
  ## Related projects
203
229
 
@@ -0,0 +1,33 @@
1
+ ../../../bin/brewdoc,sha256=hW7-J20fv5kgKe6aQaU2M093v_W6KUBS3LAXTQ4qJEg,341
2
+ brewdoc-0.6.0.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
3
+ brewdoc-0.6.0.dist-info/METADATA,sha256=c8MXeRPbOqaAz4Wl0zFYz9m3edVuHR1zTt04vyHZX9o,14751
4
+ brewdoc-0.6.0.dist-info/RECORD,,
5
+ brewdoc-0.6.0.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ brewdoc-0.6.0.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
7
+ brewdoc-0.6.0.dist-info/direct_url.json,sha256=lBmpf7xtJUimAQXBGICgOAv2a_Ol_GHUAtujwpN3lwU,102
8
+ brewdoc-0.6.0.dist-info/entry_points.txt,sha256=avLrj5Y-MJ1yq0XFkjH5dbZW9QwYQkpn_hz6sNydbA4,45
9
+ brewdoc-0.6.0.dist-info/licenses/LICENSE,sha256=DNUrRveB3NXcyWxUr8csAHYmvrOmAzFDDAKv3iXNYKk,1073
10
+ brewdoc-0.6.0.dist-info/uv_cache.json,sha256=xbEqjMY7NY_1dPJ_lgNqfM2UD5Il7ra0BM_7gyBTqRo,127
11
+ brewdoc/__init__.py,sha256=IyLGlv-WYbGMathise30JzWRf1AFRjqYE0TGnT6w-BE,867
12
+ brewdoc/_standalone.py,sha256=-zfCo75E8YlQexHuPoTu1tl1SJGMNftH1JXSt6qilxo,4705
13
+ brewdoc/_urljs/__init__.py,sha256=SrVyNMaD02iahY2zp3kggkW7KGJ1xv-C5d4DK1-JYWw,51
14
+ brewdoc/_urljs/glue.js,sha256=FLE1gUULoiMZNHH_RmwV0pFMx2BOc5tBMRBG8ahklgQ,45856
15
+ brewdoc/_urljs/native.py,sha256=HadpXlktvsFQyl52A7YjMNgL0N5S8qC2-K4hTk0qIE8,44208
16
+ brewdoc/_vendor/THIRD_PARTY_NOTICES.txt,sha256=Mg3dxJ1SNPASEu4_ruk2j-7WM0lZmrfulGCUpNoOZak,26003
17
+ brewdoc/_vendor/linkedom-worker.js,sha256=6p8d5psAnSEJaN2PTT9OzxCVvt-A04nsgyRMFxNXgog,411521
18
+ brewdoc/cli.py,sha256=Kd8bx983MrIJs9NSVE1Hr6DmFcsaRgw6gi6dbLZQhHM,6658
19
+ brewdoc/common.py,sha256=r4w2_BegIDVU5r89Y9vH-UQAcwKgP5dITMfi5UMPQA4,51045
20
+ brewdoc/docx.py,sha256=w5fzxManQw7E34p70-YOT3-hfE0E4Z9SBHaiIqY3ke0,6154
21
+ brewdoc/eml.py,sha256=KYWPD9K16JMiNtubtnQt8w9k5PejVQdXnEO29Vn5zSY,7433
22
+ brewdoc/epub.py,sha256=j9kcZAclfbGrvxHcvaImsGkUrmUzWrip-pvBzh2Zz5U,49436
23
+ brewdoc/htmljs.py,sha256=yxkqeMPdQ7uK-p0H_71BjjtSokXUv1czeicQhHU9heY,42516
24
+ brewdoc/htmltext.py,sha256=3ENBVSjDUiQ4xrM_SBEWikF2Pfum1s9RPhFywVPKzj8,38611
25
+ brewdoc/htmlurl.py,sha256=8yiqYCDcOB_rTfyd31nYksOiHy-YZIo5NltafUzc0fg,44737
26
+ brewdoc/odf.py,sha256=M5OZwNmZKQx68zpQRf158MUXMTHmnnKmtBam6sPi0YI,15467
27
+ brewdoc/output.py,sha256=aMgDoB5UDbRWYr9pBxlH402jEiUl8OSEqhox31O0ljk,4123
28
+ brewdoc/pdf.py,sha256=6qU5tPMjcAeYgqEVIPR8u8xk-FydNCTuD8onQldkTlU,66444
29
+ brewdoc/pptx.py,sha256=OYE42ZMgifyhWW8uj0M7JHsasaxXkcfLfSKVsp77is0,17844
30
+ brewdoc/selfcheck.py,sha256=4MGa8Jg3sxDW4f7WBOSiB2cwtyFCN_Uzg0QVTXdSW1s,28042
31
+ brewdoc/service.py,sha256=Qix2cgYeUQm9xNrX3JEV27rG-IzEVSYWEphfcOoXzL0,7733
32
+ brewdoc/sheets.py,sha256=qgvSxj4MnwPELvwzb3oSmffIOO5LIaAcTzC65TkYp6c,17411
33
+ brewdoc/text.py,sha256=OCrVnR3t4_FSn5rpxmQhItKg2oagKNhFhyp8XcJYHNw,602
@@ -0,0 +1 @@
1
+ {"url":"file:///home/runner/work/_temp/ci-dist/dist/brewdoc-0.6.0-py3-none-any.whl","archive_info":{}}
@@ -0,0 +1 @@
1
+ {"timestamp":{"secs_since_epoch":1792356853,"nanos_since_epoch":251470639},"commit":null,"tags":null,"env":{},"directories":{}}
package/binary/brewdoc CHANGED
Binary file
@@ -1,6 +1,6 @@
1
1
  [
2
2
  {
3
- "path": "licenses/installed/brewdoc/brewdoc-0.4.1.dist-info/licenses/LICENSE",
3
+ "path": "licenses/installed/brewdoc/brewdoc-0.6.0.dist-info/licenses/LICENSE",
4
4
  "bytes": 1073,
5
5
  "sha256": "0cd52b46f781dcd5dcc96c54afc72c007626beb3a60331430c02afde25cd60a9"
6
6
  },
@@ -1,6 +1,6 @@
1
1
  {
2
- "version": "0.4.1",
3
- "source_sha": "00b857115b1ec1cbe14d09f5c911842908a4dc30",
2
+ "version": "0.6.0",
3
+ "source_sha": "49abdfac86a7459443ba7c3305edec9694f97af8",
4
4
  "python": "3.12.14",
5
5
  "target": "linux-x64"
6
6
  }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "archive": {
3
- "bytes": 42001361,
4
- "filename": "brewdoc-0.4.1-linux-x64.tar.gz",
5
- "sha256": "789915a7844f3a3b5d636bf79f3aed74062a7b0a051acb60558022528bf8f8f6"
3
+ "bytes": 42049000,
4
+ "filename": "brewdoc-0.6.0-linux-x64.tar.gz",
5
+ "sha256": "c4e7893298d20240b24aeb8a6974801cb24b00585b414d12db3a34fe5632f96b"
6
6
  },
7
7
  "executable": "brewdoc/brewdoc",
8
8
  "inventory": {
@@ -76,83 +76,83 @@
76
76
  "bytes": 1333490,
77
77
  "kind": "file",
78
78
  "mode": 420,
79
- "sha256": "890e16c954fb938640304c2d0811db27b974c97fc9ceecdddaf385b272067120"
79
+ "sha256": "3cbb9333ec36e6118f47af1e426bdcd7cd307c132a396fe31571f0f90a2d19e4"
80
80
  },
81
81
  "brewdoc/_internal/brewdoc": {
82
82
  "kind": "directory",
83
83
  "mode": 493
84
84
  },
85
- "brewdoc/_internal/brewdoc-0.4.1.dist-info": {
85
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info": {
86
86
  "kind": "directory",
87
87
  "mode": 493
88
88
  },
89
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/INSTALLER": {
89
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/INSTALLER": {
90
90
  "bytes": 2,
91
91
  "kind": "file",
92
92
  "mode": 420,
93
93
  "sha256": "e6184ce10e266134fdcfa401e8f1a95005bcd4f18d16b62b757323e2833fe9a9"
94
94
  },
95
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/METADATA": {
96
- "bytes": 12690,
95
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/METADATA": {
96
+ "bytes": 14751,
97
97
  "kind": "file",
98
98
  "mode": 420,
99
- "sha256": "17876281ac4270c4f2965baf25a30cc61fd2791efd9364da958367e449135b45"
99
+ "sha256": "73c3177913db3aa680cf85a5d33158cfd9b779d56e1d1d734edd38bf21d95fda"
100
100
  },
101
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/RECORD": {
102
- "bytes": 2390,
101
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/RECORD": {
102
+ "bytes": 2604,
103
103
  "kind": "file",
104
104
  "mode": 420,
105
- "sha256": "d2a4515d66294cc71f714a6513aa961f541ad4683268601e6ee75a290cd6eeaa"
105
+ "sha256": "63cf993b744c69ec51378d31b0d899ef83af4127b2a6dd5a4e54ca56ae19045e"
106
106
  },
107
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/REQUESTED": {
107
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/REQUESTED": {
108
108
  "bytes": 0,
109
109
  "kind": "file",
110
110
  "mode": 420,
111
111
  "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
112
112
  },
113
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/WHEEL": {
113
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/WHEEL": {
114
114
  "bytes": 87,
115
115
  "kind": "file",
116
116
  "mode": 420,
117
117
  "sha256": "5b77e4a649bbfb07fdbc123967eeecd1e5a478cfaca6eefc23c35e6fdf037848"
118
118
  },
119
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/direct_url.json": {
119
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/direct_url.json": {
120
120
  "bytes": 102,
121
121
  "kind": "file",
122
122
  "mode": 420,
123
- "sha256": "0e0e7899bf115cbe83baa8aec4cf0095ba715fd216b9a8f6bc7234a3d169a58d"
123
+ "sha256": "9419a97fbc6d2548a60105c11880a0380bf66bf3a5fc61d402dba3c293779705"
124
124
  },
125
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/entry_points.txt": {
125
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/entry_points.txt": {
126
126
  "bytes": 45,
127
127
  "kind": "file",
128
128
  "mode": 420,
129
129
  "sha256": "6af2eb8f963e309d72ab45c59231f975b656f50c18424a67fe1cfab0dc9d6c0e"
130
130
  },
131
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/licenses": {
131
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/licenses": {
132
132
  "kind": "directory",
133
133
  "mode": 493
134
134
  },
135
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/licenses/LICENSE": {
135
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/licenses/LICENSE": {
136
136
  "bytes": 1073,
137
137
  "kind": "file",
138
138
  "mode": 420,
139
139
  "sha256": "0cd52b46f781dcd5dcc96c54afc72c007626beb3a60331430c02afde25cd60a9"
140
140
  },
141
- "brewdoc/_internal/brewdoc-0.4.1.dist-info/uv_cache.json": {
141
+ "brewdoc/_internal/brewdoc-0.6.0.dist-info/uv_cache.json": {
142
142
  "bytes": 127,
143
143
  "kind": "file",
144
144
  "mode": 420,
145
- "sha256": "fc4d1cef18eccddbedeeac6c8a0e4a45deb93fad0c9e726289b1a7d3fede8762"
145
+ "sha256": "c5b12a8cc63b358ff574f27f96036a7ccd940f9225eeb6b404cffb832053a91a"
146
146
  },
147
147
  "brewdoc/_internal/brewdoc/_urljs": {
148
148
  "kind": "directory",
149
149
  "mode": 493
150
150
  },
151
151
  "brewdoc/_internal/brewdoc/_urljs/glue.js": {
152
- "bytes": 41449,
152
+ "bytes": 45856,
153
153
  "kind": "file",
154
154
  "mode": 420,
155
- "sha256": "694ea584c33165c3f165235cb5f51df97f7582457a9a0125585155fd29d45aa3"
155
+ "sha256": "14b13581450ba223193471ff466c15d2914cc7604e739b41311046f1a8649604"
156
156
  },
157
157
  "brewdoc/_internal/brewdoc/_vendor": {
158
158
  "kind": "directory",
@@ -2235,10 +2235,10 @@
2235
2235
  "sha256": "fe0f992e9acf81baafec12ecf9611ef0885b0ddfd04dc7e2af3fcd132475630c"
2236
2236
  },
2237
2237
  "brewdoc/brewdoc": {
2238
- "bytes": 3895288,
2238
+ "bytes": 3940360,
2239
2239
  "kind": "file",
2240
2240
  "mode": 493,
2241
- "sha256": "394518f65ab99bfcc2e9f9fe2c217a332165d9d7dbe88164c574334d1cd4c937"
2241
+ "sha256": "1ec5606b8ac9f1ac8703ee05981d4dd3964adf454aee11b848e60f05a7229bd7"
2242
2242
  },
2243
2243
  "brewdoc/licenses": {
2244
2244
  "kind": "directory",
@@ -2252,7 +2252,7 @@
2252
2252
  "bytes": 8410,
2253
2253
  "kind": "file",
2254
2254
  "mode": 420,
2255
- "sha256": "42c764bbacb0f5ecc3dedb1dcc3659c4485c7425545db844cbcbaddc0c2ae0c4"
2255
+ "sha256": "832e3095cd2e96d15d02ee2a70595aa6034d98d481b57d5cb64ecfffc2227e44"
2256
2256
  },
2257
2257
  "brewdoc/licenses/installed/brewdoc": {
2258
2258
  "kind": "directory",
@@ -2262,15 +2262,15 @@
2262
2262
  "kind": "directory",
2263
2263
  "mode": 493
2264
2264
  },
2265
- "brewdoc/licenses/installed/brewdoc/brewdoc-0.4.1.dist-info": {
2265
+ "brewdoc/licenses/installed/brewdoc/brewdoc-0.6.0.dist-info": {
2266
2266
  "kind": "directory",
2267
2267
  "mode": 493
2268
2268
  },
2269
- "brewdoc/licenses/installed/brewdoc/brewdoc-0.4.1.dist-info/licenses": {
2269
+ "brewdoc/licenses/installed/brewdoc/brewdoc-0.6.0.dist-info/licenses": {
2270
2270
  "kind": "directory",
2271
2271
  "mode": 493
2272
2272
  },
2273
- "brewdoc/licenses/installed/brewdoc/brewdoc-0.4.1.dist-info/licenses/LICENSE": {
2273
+ "brewdoc/licenses/installed/brewdoc/brewdoc-0.6.0.dist-info/licenses/LICENSE": {
2274
2274
  "bytes": 1073,
2275
2275
  "kind": "file",
2276
2276
  "mode": 420,
@@ -4156,18 +4156,19 @@
4156
4156
  "bytes": 133,
4157
4157
  "kind": "file",
4158
4158
  "mode": 420,
4159
- "sha256": "53205d616f0a7ffa473702200af3d979f7d7f4a7e4f784da9f4369575d3c77ce"
4159
+ "sha256": "1c6ce3da091df992945207ea761ec298c49804c0dc5c471d4bc31499d2503511"
4160
4160
  }
4161
4161
  },
4162
- "lock_sha256": "5a78b42211f87ff1877b72efd1cb5de957d23f78c236601dd887a30271b7926d",
4162
+ "lock_sha256": "aaa02ff5914201a5696adae87176158d20d6e1dc37623cdffbbc67d8a005e81e",
4163
4163
  "minimum_tested": "Ubuntu 22.04, glibc 2.35",
4164
4164
  "oracle": [],
4165
4165
  "probes": [
4166
4166
  {
4167
4167
  "bytes_base64": "UEsDBBQAAAAAAAAAIVBvYassFAAAABQAAAAIAAAAbWltZXR5cGVhcHBsaWNhdGlvbi9lcHViK3ppcFBLAwQUAAAAAAAAACFQZsMSuMMAAADDAAAAFgAAAE1FVEEtSU5GL2NvbnRhaW5lci54bWw8Y29udGFpbmVyIHhtbG5zPSJ1cm46b2FzaXM6bmFtZXM6dGM6b3BlbmRvY3VtZW50OnhtbG5zOmNvbnRhaW5lciIgdmVyc2lvbj0iMS4wIj48cm9vdGZpbGVzPjxyb290ZmlsZSBmdWxsLXBhdGg9Ik9QUy9ib29rLm9wZiIgbWVkaWEtdHlwZT0iYXBwbGljYXRpb24vb2VicHMtcGFja2FnZSt4bWwiLz48L3Jvb3RmaWxlcz48L2NvbnRhaW5lcj5QSwMEFAAAAAAAAAAhUFm2frB9AgAAfQIAAAwAAABPUFMvYm9vay5vcGY8cGFja2FnZSB4bWxucz0iaHR0cDovL3d3dy5pZHBmLm9yZy8yMDA3L29wZiIgdmVyc2lvbj0iMi4wIiB1bmlxdWUtaWRlbnRpZmllcj0iYm9vay1pZCI+PG1ldGFkYXRhIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOnRpdGxlPmNhZsOpIOadseS6rDwvZGM6dGl0bGU+PGRjOmNyZWF0b3I+Rmlyc3Q8L2RjOmNyZWF0b3I+PGRjOmNyZWF0b3I+Rmlyc3Q8L2RjOmNyZWF0b3I+PGRjOmxhbmd1YWdlPmZyPC9kYzpsYW5ndWFnZT48ZGM6aWRlbnRpZmllciBpZD0iYm9vay1pZCI+dXJuOnN5bnRoZXRpYzwvZGM6aWRlbnRpZmllcj48L21ldGFkYXRhPjxtYW5pZmVzdD48aXRlbSBpZD0iYSIgaHJlZj0iYS54aHRtbCIgbWVkaWEtdHlwZT0iYXBwbGljYXRpb24veGh0bWwreG1sIi8+PGl0ZW0gaWQ9ImIiIGhyZWY9ImIueGh0bWwiIG1lZGlhLXR5cGU9ImFwcGxpY2F0aW9uL3hodG1sK3htbCIvPjxpdGVtIGlkPSJ0b2MiIGhyZWY9InRvYy5uY3giIG1lZGlhLXR5cGU9ImFwcGxpY2F0aW9uL3gtZHRibmN4K3htbCIvPjwvbWFuaWZlc3Q+PHNwaW5lIHRvYz0idG9jIj48aXRlbXJlZiBpZHJlZj0iYiIvPjxpdGVtcmVmIGlkcmVmPSJhIiBsaW5lYXI9Im5vIi8+PC9zcGluZT48L3BhY2thZ2U+UEsDBBQAAAAAAAAAIVBwt4eVgQAAAIEAAAALAAAAT1BTL2EueGh0bWw8aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+PGhlYWQ+PHRpdGxlPkZhbGxiYWNrPC90aXRsZT48L2hlYWQ+PGJvZHk+PHA+Rmlyc3QgZSYjeDMwMTvCoHdvcmTCrS48L3A+PC9ib2R5PjwvaHRtbD5QSwMEFAAAAAAAAAAhUOMm2fN2AAAAdgAAAAsAAABPUFMvYi54aHRtbDxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj48aGVhZD48dGl0bGU+RmFsbGJhY2s8L3RpdGxlPjwvaGVhZD48Ym9keT48cD5jYWbDqSDmnbHkuqw8L3A+PC9ib2R5PjwvaHRtbD5QSwMEFAAAAAAAAAAhUP4OjIloAQAAaAEAAAsAAABPUFMvdG9jLm5jeDxuY3ggeG1sbnM9Imh0dHA6Ly93d3cuZGFpc3kub3JnL3ozOTg2LzIwMDUvbmN4LyIgdmVyc2lvbj0iMjAwNS0xIj48aGVhZC8+PGRvY1RpdGxlPjx0ZXh0PlB1YmxpY2F0aW9uPC90ZXh0PjwvZG9jVGl0bGU+PG5hdk1hcD48bmF2UG9pbnQgaWQ9Im5hdi1hIiBwbGF5T3JkZXI9IjkiPjxuYXZMYWJlbD48dGV4dD5BbHBoYTwvdGV4dD48L25hdkxhYmVsPjxjb250ZW50IHNyYz0iYS54aHRtbCIvPjwvbmF2UG9pbnQ+PG5hdlBvaW50IGlkPSJuYXYtYiIgcGxheU9yZGVyPSIxIj48bmF2TGFiZWw+PHRleHQ+zrJldGE8L3RleHQ+PC9uYXZMYWJlbD48Y29udGVudCBzcmM9ImIueGh0bWwiLz48L25hdlBvaW50PjwvbmF2TWFwPjwvbmN4PlBLAQIUAxQAAAAAAAAAIVBvYassFAAAABQAAAAIAAAAAAAAAAAAAACAAQAAAABtaW1ldHlwZVBLAQIUAxQAAAAAAAAAIVBmwxK4wwAAAMMAAAAWAAAAAAAAAAAAAACAAToAAABNRVRBLUlORi9jb250YWluZXIueG1sUEsBAhQDFAAAAAAAAAAhUFm2frB9AgAAfQIAAAwAAAAAAAAAAAAAAIABMQEAAE9QUy9ib29rLm9wZlBLAQIUAxQAAAAAAAAAIVBwt4eVgQAAAIEAAAALAAAAAAAAAAAAAACAAdgDAABPUFMvYS54aHRtbFBLAQIUAxQAAAAAAAAAIVDjJtnzdgAAAHYAAAALAAAAAAAAAAAAAACAAYIEAABPUFMvYi54aHRtbFBLAQIUAxQAAAAAAAAAIVD+DoyJaAEAAGgBAAALAAAAAAAAAAAAAACAASEFAABPUFMvdG9jLm5jeFBLBQYAAAAABgAGAF8BAACyBgAAAAA=",
4168
4168
  "code": 0,
4169
- "markdown_bytes": 2130,
4170
- "markdown_sha256": "4beea667419922013009835a826395558e270bf5a05446f9ec8d79390f25c7ec",
4169
+ "markdown_bytes": 2152,
4170
+ "markdown_encoding": "utf-8",
4171
+ "markdown_sha256": "1577635ebf9956eac94c763bf2d8eb6b01afea59f1944abbfc2a81de698b3ba7",
4171
4172
  "path": "sample.epub",
4172
4173
  "probe": "epub2",
4173
4174
  "receipt": {
@@ -4190,7 +4191,7 @@
4190
4191
  "not_carried": [
4191
4192
  "CSS, layout, pagination and font rendering",
4192
4193
  "scripts, forms and active media",
4193
- "image pixels and graphical SVG content",
4194
+ "image pixels, images without alt text and graphical SVG content",
4194
4195
  "unsupported SVG and MathML semantics",
4195
4196
  "navigation semantics beyond declared TOC hierarchy"
4196
4197
  ],
@@ -4214,12 +4215,13 @@
4214
4215
  "artifact": {
4215
4216
  "bytes": 664,
4216
4217
  "key": "formula/sheet/000002",
4217
- "sha256": "1be078c4f9f5819b73294c701b8172ba753be8cafbc44a251128f460953b3435"
4218
+ "sha256": "0960fd47ad482c8a6a81ffe26b440f84d918c152063496336632d8fdddc34d19"
4218
4219
  },
4219
- "bytes_base64": "UEsDBBQAAAAAALCrTV3ZAU4y4wIAAOMCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbDw/eG1sIHZlcnNpb249IjEuMCI/PjxUeXBlcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIj48RGVmYXVsdCBFeHRlbnNpb249InJlbHMiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtib29rLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIi8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvd29ya3NoZWV0cy9zaGVldDEueG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtzaGVldHMvc2hlZXQyLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWwiLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0My54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIi8+PC9UeXBlcz5QSwMEFAAAAAAAsKtNXUuDozoFAQAABQEAAAsAAABfcmVscy8ucmVsczw/eG1sIHZlcnNpb249IjEuMCI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPlBLAwQUAAAAAACwq01dImE/o1IBAABSAQAADwAAAHhsL3dvcmtib29rLnhtbDw/eG1sIHZlcnNpb249IjEuMCI/Pjx3b3JrYm9vayB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48c2hlZXRzPjxzaGVldCBuYW1lPSJJbnB1dHMiIHNoZWV0SWQ9IjEiIHI6aWQ9InJJZDEiLz48c2hlZXQgbmFtZT0iQ2FsYyIgc2hlZXRJZD0iMiIgcjppZD0icklkMiIvPjxzaGVldCBuYW1lPSJFbXB0eSIgc2hlZXRJZD0iMyIgcjppZD0icklkMyIvPjwvc2hlZXRzPjwvd29ya2Jvb2s+UEsDBBQAAAAAALCrTV3JpmJ5IAIAACACAAAaAAAAeGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHM8P3htbCB2ZXJzaW9uPSIxLjAiPz48UmVsYXRpb25zaGlwcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIj48UmVsYXRpb25zaGlwIElkPSJySWQxIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0MS54bWwiLz48UmVsYXRpb25zaGlwIElkPSJySWQyIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0Mi54bWwiLz48UmVsYXRpb25zaGlwIElkPSJySWQzIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0My54bWwiLz48L1JlbGF0aW9uc2hpcHM+UEsDBBQAAAAAALCrTV3hQA/x9gAAAPYAAAAYAAAAeGwvd29ya3NoZWV0cy9zaGVldDEueG1sPHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXREYXRhPjxyb3cgcj0iMSI+PGMgcj0iQTEiPjx2PjE8L3Y+PC9jPjwvcm93Pjxyb3cgcj0iMiI+PGMgcj0iQTIiPjx2PjI8L3Y+PC9jPjwvcm93Pjxyb3cgcj0iMyI+PGMgcj0iQTMiPjxmPlNVTShBMTpBMik8L2Y+PHY+Mzwvdj48L2M+PC9yb3c+PC9zaGVldERhdGE+PC93b3Jrc2hlZXQ+UEsDBBQAAAAAALCrTV3R4blYmQEAAJkBAAAYAAAAeGwvd29ya3NoZWV0cy9zaGVldDIueG1sPHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXREYXRhPjxyb3cgcj0iMSI+PGMgcj0iQTEiPjxmPlNVTShJbnB1dHMhQTE6QTIpPC9mPjx2PjM8L3Y+PC9jPjxjIHI9IkIxIj48ZiB0PSJzaGFyZWQiIHJlZj0iQjE6QjIiIHNpPSI3Ij5JbnB1dHMhQTEqMjwvZj48dj4yPC92PjwvYz48L3Jvdz48cm93IHI9IjIiPjxjIHI9IkIyIj48ZiBzaT0iNyIgdD0ic2hhcmVkIi8+PHY+NDwvdj48L2M+PC9yb3c+PHJvdyByPSIzIj48YyByPSJDMyI+PGYgYng9IjAiIGFjYT0iMSI+SUYoQTEmbHQ7NCwmcXVvdDtjYWbDqSZxdW90OywmcXVvdDsmcXVvdDspPC9mPjx2PjE8L3Y+PC9jPjwvcm93Pjwvc2hlZXREYXRhPjwvd29ya3NoZWV0PlBLAwQUAAAAAACwq01dCntq/2UAAABlAAAAGAAAAHhsL3dvcmtzaGVldHMvc2hlZXQzLnhtbDx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI+PHNoZWV0RGF0YS8+PC93b3Jrc2hlZXQ+UEsBAhQDFAAAAAAAsKtNXdkBTjLjAgAA4wIAABMAAAAAAAAAAAAAAIABAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECFAMUAAAAAACwq01dS4OjOgUBAAAFAQAACwAAAAAAAAAAAAAAgAEUAwAAX3JlbHMvLnJlbHNQSwECFAMUAAAAAACwq01dImE/o1IBAABSAQAADwAAAAAAAAAAAAAAgAFCBAAAeGwvd29ya2Jvb2sueG1sUEsBAhQDFAAAAAAAsKtNXcmmYnkgAgAAIAIAABoAAAAAAAAAAAAAAIABwQUAAHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzUEsBAhQDFAAAAAAAsKtNXeFAD/H2AAAA9gAAABgAAAAAAAAAAAAAAIABGQgAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbFBLAQIUAxQAAAAAALCrTV3R4blYmQEAAJkBAAAYAAAAAAAAAAAAAACAAUUJAAB4bC93b3Jrc2hlZXRzL3NoZWV0Mi54bWxQSwECFAMUAAAAAACwq01dCntq/2UAAABlAAAAGAAAAAAAAAAAAAAAgAEUCwAAeGwvd29ya3NoZWV0cy9zaGVldDMueG1sUEsFBgAAAAAHAAcA0QEAAK8LAAAAAA==",
4220
+ "bytes_base64": "UEsDBBQAAAAAAMimUl3ZAU4y4wIAAOMCAAATAAAAW0NvbnRlbnRfVHlwZXNdLnhtbDw/eG1sIHZlcnNpb249IjEuMCI/PjxUeXBlcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9jb250ZW50LXR5cGVzIj48RGVmYXVsdCBFeHRlbnNpb249InJlbHMiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtcGFja2FnZS5yZWxhdGlvbnNoaXBzK3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtib29rLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLnNoZWV0Lm1haW4reG1sIi8+PE92ZXJyaWRlIFBhcnROYW1lPSIveGwvd29ya3NoZWV0cy9zaGVldDEueG1sIiBDb250ZW50VHlwZT0iYXBwbGljYXRpb24vdm5kLm9wZW54bWxmb3JtYXRzLW9mZmljZWRvY3VtZW50LnNwcmVhZHNoZWV0bWwud29ya3NoZWV0K3htbCIvPjxPdmVycmlkZSBQYXJ0TmFtZT0iL3hsL3dvcmtzaGVldHMvc2hlZXQyLnhtbCIgQ29udGVudFR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5vcGVueG1sZm9ybWF0cy1vZmZpY2Vkb2N1bWVudC5zcHJlYWRzaGVldG1sLndvcmtzaGVldCt4bWwiLz48T3ZlcnJpZGUgUGFydE5hbWU9Ii94bC93b3Jrc2hlZXRzL3NoZWV0My54bWwiIENvbnRlbnRUeXBlPSJhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC53b3Jrc2hlZXQreG1sIi8+PC9UeXBlcz5QSwMEFAAAAAAAyKZSXUuDozoFAQAABQEAAAsAAABfcmVscy8ucmVsczw/eG1sIHZlcnNpb249IjEuMCI/PjxSZWxhdGlvbnNoaXBzIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvcGFja2FnZS8yMDA2L3JlbGF0aW9uc2hpcHMiPjxSZWxhdGlvbnNoaXAgSWQ9InJJZDEiIFR5cGU9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9vZmZpY2VEb2N1bWVudC8yMDA2L3JlbGF0aW9uc2hpcHMvb2ZmaWNlRG9jdW1lbnQiIFRhcmdldD0ieGwvd29ya2Jvb2sueG1sIi8+PC9SZWxhdGlvbnNoaXBzPlBLAwQUAAAAAADIplJdImE/o1IBAABSAQAADwAAAHhsL3dvcmtib29rLnhtbDw/eG1sIHZlcnNpb249IjEuMCI/Pjx3b3JrYm9vayB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIiB4bWxuczpyPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzIj48c2hlZXRzPjxzaGVldCBuYW1lPSJJbnB1dHMiIHNoZWV0SWQ9IjEiIHI6aWQ9InJJZDEiLz48c2hlZXQgbmFtZT0iQ2FsYyIgc2hlZXRJZD0iMiIgcjppZD0icklkMiIvPjxzaGVldCBuYW1lPSJFbXB0eSIgc2hlZXRJZD0iMyIgcjppZD0icklkMyIvPjwvc2hlZXRzPjwvd29ya2Jvb2s+UEsDBBQAAAAAAMimUl3JpmJ5IAIAACACAAAaAAAAeGwvX3JlbHMvd29ya2Jvb2sueG1sLnJlbHM8P3htbCB2ZXJzaW9uPSIxLjAiPz48UmVsYXRpb25zaGlwcyB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3BhY2thZ2UvMjAwNi9yZWxhdGlvbnNoaXBzIj48UmVsYXRpb25zaGlwIElkPSJySWQxIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0MS54bWwiLz48UmVsYXRpb25zaGlwIElkPSJySWQyIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0Mi54bWwiLz48UmVsYXRpb25zaGlwIElkPSJySWQzIiBUeXBlPSJodHRwOi8vc2NoZW1hcy5vcGVueG1sZm9ybWF0cy5vcmcvb2ZmaWNlRG9jdW1lbnQvMjAwNi9yZWxhdGlvbnNoaXBzL3dvcmtzaGVldCIgVGFyZ2V0PSJ3b3Jrc2hlZXRzL3NoZWV0My54bWwiLz48L1JlbGF0aW9uc2hpcHM+UEsDBBQAAAAAAMimUl3hQA/x9gAAAPYAAAAYAAAAeGwvd29ya3NoZWV0cy9zaGVldDEueG1sPHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXREYXRhPjxyb3cgcj0iMSI+PGMgcj0iQTEiPjx2PjE8L3Y+PC9jPjwvcm93Pjxyb3cgcj0iMiI+PGMgcj0iQTIiPjx2PjI8L3Y+PC9jPjwvcm93Pjxyb3cgcj0iMyI+PGMgcj0iQTMiPjxmPlNVTShBMTpBMik8L2Y+PHY+Mzwvdj48L2M+PC9yb3c+PC9zaGVldERhdGE+PC93b3Jrc2hlZXQ+UEsDBBQAAAAAAMimUl3R4blYmQEAAJkBAAAYAAAAeGwvd29ya3NoZWV0cy9zaGVldDIueG1sPHdvcmtzaGVldCB4bWxucz0iaHR0cDovL3NjaGVtYXMub3BlbnhtbGZvcm1hdHMub3JnL3NwcmVhZHNoZWV0bWwvMjAwNi9tYWluIj48c2hlZXREYXRhPjxyb3cgcj0iMSI+PGMgcj0iQTEiPjxmPlNVTShJbnB1dHMhQTE6QTIpPC9mPjx2PjM8L3Y+PC9jPjxjIHI9IkIxIj48ZiB0PSJzaGFyZWQiIHJlZj0iQjE6QjIiIHNpPSI3Ij5JbnB1dHMhQTEqMjwvZj48dj4yPC92PjwvYz48L3Jvdz48cm93IHI9IjIiPjxjIHI9IkIyIj48ZiBzaT0iNyIgdD0ic2hhcmVkIi8+PHY+NDwvdj48L2M+PC9yb3c+PHJvdyByPSIzIj48YyByPSJDMyI+PGYgYng9IjAiIGFjYT0iMSI+SUYoQTEmbHQ7NCwmcXVvdDtjYWbDqSZxdW90OywmcXVvdDsmcXVvdDspPC9mPjx2PjE8L3Y+PC9jPjwvcm93Pjwvc2hlZXREYXRhPjwvd29ya3NoZWV0PlBLAwQUAAAAAADIplJdCntq/2UAAABlAAAAGAAAAHhsL3dvcmtzaGVldHMvc2hlZXQzLnhtbDx3b3Jrc2hlZXQgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm9wZW54bWxmb3JtYXRzLm9yZy9zcHJlYWRzaGVldG1sLzIwMDYvbWFpbiI+PHNoZWV0RGF0YS8+PC93b3Jrc2hlZXQ+UEsBAhQDFAAAAAAAyKZSXdkBTjLjAgAA4wIAABMAAAAAAAAAAAAAAIABAAAAAFtDb250ZW50X1R5cGVzXS54bWxQSwECFAMUAAAAAADIplJdS4OjOgUBAAAFAQAACwAAAAAAAAAAAAAAgAEUAwAAX3JlbHMvLnJlbHNQSwECFAMUAAAAAADIplJdImE/o1IBAABSAQAADwAAAAAAAAAAAAAAgAFCBAAAeGwvd29ya2Jvb2sueG1sUEsBAhQDFAAAAAAAyKZSXcmmYnkgAgAAIAIAABoAAAAAAAAAAAAAAIABwQUAAHhsL19yZWxzL3dvcmtib29rLnhtbC5yZWxzUEsBAhQDFAAAAAAAyKZSXeFAD/H2AAAA9gAAABgAAAAAAAAAAAAAAIABGQgAAHhsL3dvcmtzaGVldHMvc2hlZXQxLnhtbFBLAQIUAxQAAAAAAMimUl3R4blYmQEAAJkBAAAYAAAAAAAAAAAAAACAAUUJAAB4bC93b3Jrc2hlZXRzL3NoZWV0Mi54bWxQSwECFAMUAAAAAADIplJdCntq/2UAAABlAAAAGAAAAAAAAAAAAAAAgAEUCwAAeGwvd29ya3NoZWV0cy9zaGVldDMueG1sUEsFBgAAAAAHAAcA0QEAAK8LAAAAAA==",
4220
4221
  "code": 0,
4221
- "markdown_bytes": 2285,
4222
- "markdown_sha256": "b9a0e2f41909a3e919098ac0c277e16aaae781d9b1e120bdf8f143f82680c62b",
4222
+ "markdown_bytes": 2282,
4223
+ "markdown_encoding": "utf-8",
4224
+ "markdown_sha256": "47230696703e61c290112e56ce9b6cfbdef772fd8c5e9cf14a58e395fad02bc8",
4223
4225
  "path": "formulas.xlsx",
4224
4226
  "probe": "formula",
4225
4227
  "receipt": {
@@ -4283,7 +4285,7 @@
4283
4285
  "unit_kind": "sheet",
4284
4286
  "units": 3
4285
4287
  },
4286
- "source_sha256": "212f3098fffbd76efa2220970c00e7060c60cd687ab3c8fd74befa1a4372336d"
4288
+ "source_sha256": "0e4f99c8a23f4e1ceffc2dd0bb678a1340bb9a8ab73f9410df2ef8ee7e6b349b"
4287
4289
  }
4288
4290
  ],
4289
4291
  "python": "3.12.14",
@@ -4421,6 +4423,10 @@
4421
4423
  "name": "pdfplumber",
4422
4424
  "version": "0.11.10"
4423
4425
  },
4426
+ {
4427
+ "name": "brewdoc",
4428
+ "version": "0.6.0"
4429
+ },
4424
4430
  {
4425
4431
  "name": "cffi",
4426
4432
  "version": "2.1.1"
@@ -4445,10 +4451,6 @@
4445
4451
  "name": "selectolax",
4446
4452
  "version": "0.4.13"
4447
4453
  },
4448
- {
4449
- "name": "brewdoc",
4450
- "version": "0.4.1"
4451
- },
4452
4454
  {
4453
4455
  "name": "python-calamine",
4454
4456
  "version": "0.8.2"
@@ -4466,9 +4468,9 @@
4466
4468
  "macos": "Ad hoc build signature; no Developer ID signing or notarization",
4467
4469
  "windows": "Unsigned; publisher signing has not been configured"
4468
4470
  },
4469
- "source_sha": "00b857115b1ec1cbe14d09f5c911842908a4dc30",
4471
+ "source_sha": "49abdfac86a7459443ba7c3305edec9694f97af8",
4470
4472
  "target": "linux-x64",
4471
4473
  "verification_scope": "smoke",
4472
- "version": "0.4.1",
4473
- "wheel_sha256": "6e5009589d940a8c09d2f1bde622574d8b0635f43707beee890a2f1f0dde4370"
4474
+ "version": "0.6.0",
4475
+ "wheel_sha256": "3e6693bbac7f3c426542df374afb7ee65ac8bc8fac956add4e76ed61245b6b82"
4474
4476
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "archive_sha256": "789915a7844f3a3b5d636bf79f3aed74062a7b0a051acb60558022528bf8f8f6",
2
+ "archive_sha256": "c4e7893298d20240b24aeb8a6974801cb24b00585b414d12db3a34fe5632f96b",
3
3
  "children": {
4
4
  "dns": [
5
5
  "::1",
@@ -80,8 +80,8 @@
80
80
  "response": {
81
81
  "body_bytes": 577,
82
82
  "body_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484",
83
- "entity_bytes": 577,
84
- "entity_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484"
83
+ "entity_bytes": 400,
84
+ "entity_sha256": "98045c75d902d8de112d0dce14a4408e02f754155c60c2c9ccf4f9adeb358e74"
85
85
  },
86
86
  "snapshot": {
87
87
  "bytes": 589,
@@ -123,7 +123,9 @@
123
123
  "active media and embeds",
124
124
  "inline code layout outside tables: rendered as fenced blocks",
125
125
  "inline code monospace inside table cells",
126
- "hidden inputs and supplied password or file values"
126
+ "form controls and their values",
127
+ "images without alt text",
128
+ "navigation, header, footer and aside landmarks outside main or article content"
127
129
  ],
128
130
  "out": null,
129
131
  "reason": "html rendered: 1 chapters, 0 tables, 1 text regions, 0 column splits",
@@ -152,7 +154,7 @@
152
154
  "errors": [
153
155
  {
154
156
  "category": "tls",
155
- "resource_url": null
157
+ "resource_url": "https://self-signed.badssl.com/"
156
158
  }
157
159
  ],
158
160
  "final_url": null,
@@ -210,7 +212,9 @@
210
212
  "active media and embeds",
211
213
  "inline code layout outside tables: rendered as fenced blocks",
212
214
  "inline code monospace inside table cells",
213
- "hidden inputs and supplied password or file values"
215
+ "form controls and their values",
216
+ "images without alt text",
217
+ "navigation, header, footer and aside landmarks outside main or article content"
214
218
  ],
215
219
  "out": null,
216
220
  "reason": "URL acquisition refused during tls",
@@ -258,8 +262,8 @@
258
262
  "response": {
259
263
  "body_bytes": 577,
260
264
  "body_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484",
261
- "entity_bytes": 577,
262
- "entity_sha256": "25ddf2c883e0d1958ea971d279a7e4f0fd446724ee3db7db19dadabd4a62e484"
265
+ "entity_bytes": 400,
266
+ "entity_sha256": "98045c75d902d8de112d0dce14a4408e02f754155c60c2c9ccf4f9adeb358e74"
263
267
  },
264
268
  "snapshot": {
265
269
  "bytes": 1876,
@@ -267,7 +271,7 @@
267
271
  "sha256": "086e96ba433e0faf6f65f05f504aa7ea23c6a64322784e703d19865859887e48"
268
272
  },
269
273
  "soft_window_origin": "request",
270
- "soft_window_seconds": 5.0,
274
+ "soft_window_seconds": 2.5,
271
275
  "timeout_seconds": 5.0,
272
276
  "unsupported_resources": [
273
277
  "stylesheets",
@@ -309,7 +313,9 @@
309
313
  "active media and embeds",
310
314
  "inline code layout outside tables: rendered as fenced blocks",
311
315
  "inline code monospace inside table cells",
312
- "hidden inputs and supplied password or file values"
316
+ "form controls and their values",
317
+ "images without alt text",
318
+ "navigation, header, footer and aside landmarks outside main or article content"
313
319
  ],
314
320
  "out": null,
315
321
  "reason": "html rendered: 1 chapters, 0 tables, 7 text regions, 0 column splits",
@@ -330,9 +336,9 @@
330
336
  ],
331
337
  "schema": 1,
332
338
  "self_check": 38,
333
- "source_sha": "00b857115b1ec1cbe14d09f5c911842908a4dc30",
339
+ "source_sha": "49abdfac86a7459443ba7c3305edec9694f97af8",
334
340
  "target": "linux-x64",
335
341
  "verdict": "PASS",
336
342
  "verification_scope": "smoke",
337
- "version": "0.4.1"
343
+ "version": "0.6.0"
338
344
  }
package/package.json CHANGED
@@ -25,5 +25,5 @@
25
25
  "type": "git",
26
26
  "url": "git+https://github.com/kochetkov-ma/brewdoc.git"
27
27
  },
28
- "version": "0.4.1"
28
+ "version": "0.6.0"
29
29
  }
@@ -1,30 +0,0 @@
1
- ../../../bin/brewdoc,sha256=hW7-J20fv5kgKe6aQaU2M093v_W6KUBS3LAXTQ4qJEg,341
2
- brewdoc-0.4.1.dist-info/INSTALLER,sha256=5hhM4Q4mYTT9z6QB6PGpUAW81PGNFrYrdXMj4oM_6ak,2
3
- brewdoc-0.4.1.dist-info/METADATA,sha256=F4digaxCcMTylluvJaMMxh_SeR79k2TalYNn5EkTW0U,12690
4
- brewdoc-0.4.1.dist-info/RECORD,,
5
- brewdoc-0.4.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
- brewdoc-0.4.1.dist-info/WHEEL,sha256=W3fkpkm7-wf9vBI5Z-7s0eWkeM-spu78I8Neb98DeEg,87
7
- brewdoc-0.4.1.dist-info/direct_url.json,sha256=Dg54mb8RXL6DuqiuxM8AlbpxX9IWuaj2vHI0o9FppY0,102
8
- brewdoc-0.4.1.dist-info/entry_points.txt,sha256=avLrj5Y-MJ1yq0XFkjH5dbZW9QwYQkpn_hz6sNydbA4,45
9
- brewdoc-0.4.1.dist-info/licenses/LICENSE,sha256=DNUrRveB3NXcyWxUr8csAHYmvrOmAzFDDAKv3iXNYKk,1073
10
- brewdoc-0.4.1.dist-info/uv_cache.json,sha256=_E0c7xjszdvt7qxsig5KRd65P60MnnJiibGn0_7eh2I,127
11
- brewdoc/__init__.py,sha256=vwp3jjiFMEC804Zmexh7AZAmgM2UZNeN6_ewXX0Kzlk,867
12
- brewdoc/_standalone.py,sha256=-zfCo75E8YlQexHuPoTu1tl1SJGMNftH1JXSt6qilxo,4705
13
- brewdoc/_urljs/__init__.py,sha256=SrVyNMaD02iahY2zp3kggkW7KGJ1xv-C5d4DK1-JYWw,51
14
- brewdoc/_urljs/glue.js,sha256=aU6lhMMxZcPxZSNctfUd-X91gkV6mgElWFFV_SnUWqM,41449
15
- brewdoc/_urljs/native.py,sha256=ggTisaUThjXp6RN973T06krxCDglvzytF05_2NEraWs,44168
16
- brewdoc/_vendor/THIRD_PARTY_NOTICES.txt,sha256=Mg3dxJ1SNPASEu4_ruk2j-7WM0lZmrfulGCUpNoOZak,26003
17
- brewdoc/_vendor/linkedom-worker.js,sha256=6p8d5psAnSEJaN2PTT9OzxCVvt-A04nsgyRMFxNXgog,411521
18
- brewdoc/cli.py,sha256=Gq_SNSzmGB7uCwjxVbT27G9PHeb7aTIx1-3qqgLZApw,5995
19
- brewdoc/common.py,sha256=aYtUap2uFypFr6fK3ToyUMuPBHnMNcHhTLsH7DD4uds,33134
20
- brewdoc/docx.py,sha256=eVRxjGzgQ-LK8CwhlKriiTmr1URnuSIk2RsYedI_QZU,5501
21
- brewdoc/epub.py,sha256=g97-YQhmTr3ufzDxxwsIuB6eRzPiDc_VhvgHBk-mCYk,50502
22
- brewdoc/htmljs.py,sha256=lTfAN1ycDiRh0d7kB1bLX6Cd33sGcnPVrYnmj61P_AY,41410
23
- brewdoc/htmltext.py,sha256=F0IjoF0zPcsSKQRsEJrtZTjFKKYTPNzJ2fPLuHWhRxQ,40566
24
- brewdoc/htmlurl.py,sha256=RV8Cvp3Qle_y_6m--FMdeeJ19YWCOX6B--w27sJ8Z38,36862
25
- brewdoc/output.py,sha256=aMgDoB5UDbRWYr9pBxlH402jEiUl8OSEqhox31O0ljk,4123
26
- brewdoc/pdf.py,sha256=FVpRvH81yDTaUuPDIl8VoeXvnYeCMaipunbjtygKrMY,59185
27
- brewdoc/pptx.py,sha256=OYE42ZMgifyhWW8uj0M7JHsasaxXkcfLfSKVsp77is0,17844
28
- brewdoc/selfcheck.py,sha256=2jAYsCiL4G38Jt5Z_YLkJN1d8EYGpPE17zIBUDLOavM,24858
29
- brewdoc/service.py,sha256=fp61HaSSSoLzHHJnmubXgiyJwsA9nLQehEiCR1hzIqA,6808
30
- brewdoc/sheets.py,sha256=WVZW6aqxXe2vk7qKSdWM8hmfePwWlg7TE3bz0pVxZE4,17049
@@ -1 +0,0 @@
1
- {"url":"file:///home/runner/work/_temp/ci-dist/dist/brewdoc-0.4.1-py3-none-any.whl","archive_info":{}}
@@ -1 +0,0 @@
1
- {"timestamp":{"secs_since_epoch":1791926970,"nanos_since_epoch":293263739},"commit":null,"tags":null,"env":{},"directories":{}}