Home
last modified time | relevance | path

Searched hist:"0 fbee1892eb8b7339ce48e27e48e3fc821a8695f" (Results 1 – 25 of 31) sorted by relevance

12

/plugin/totext/Extractor/
H A DAbstractOdfExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DExtractionResult.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DAbstractOoxmlExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DExtractorInterface.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DPptxExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DExtractorFactory.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DOdsExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DOdpExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DOdtExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DTextExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DDocxExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DAbstractZipXmlExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DXlsxExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DImageExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DPdfExtractor.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

/plugin/totext/
H A Dcli.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A Dhelper.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A Dplugin.info.txt0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

/plugin/totext/Exception/
H A DExtractionException.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

/plugin/totext/_test/
H A DHelperTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DPptxExtractorTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DTextExtractorTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DXlsxExtractorTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DOdtExtractorTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

H A DExtractorFactoryTest.php0fbee1892eb8b7339ce48e27e48e3fc821a8695f Mon Jun 22 13:32:54 UTC 2026 Andreas Gohr <gohr@cosmocode.de> Return body text and metadata from a single extraction

Every extractor now returns an ExtractionResult (body text plus a
normalised metadata map) from one parse of the file, instead of just a
text string. Metadata keys are a single canonical vocabulary shared
across all formats - Title, Author, Subject, Keywords, Description,
Created, Modified, Language, Producer, plus Copyright (image-only) - so
consumers never have to special-case the source format.

- ExtractionResult: final readonly value object carrying $text,
$metadata and a per-half ?Throwable $textError / $metadataError (with
isComplete()). Text and metadata are extracted independently: an
extractor throws only at its total-failure gate (container won't unzip,
PDF won't parse, file unreadable) and otherwise records a failed half's
error while still returning the salvaged half.

- OOXML/ODF metadata: new AbstractOoxmlExtractor and AbstractOdfExtractor
intermediaries declare each family's source map once (docProps/core.xml
+ app.xml; meta.xml); the concrete extractors only switch their extends
clause. AbstractZipXmlExtractor gains a generic mapMetadataFromXml()
walker.

- PDF: reads the Info dictionary (Title/Author/Subject/Keywords/Created/
Modified/Producer-else-Creator) alongside the body text from the same
parse. normalizePdfString() is a temporary shim for UTF-16BE literal
strings that prinsfrank <= v3.1.0 returns mojibake-expanded.

- Images: now metadata-only (text is ''); field-map keys renamed to the
canonical vocabulary (Caption->Description, Date->Created,
Camera->Producer).

- helper: extract() and extractMetadata() added; extractText() keeps its
string return and its throw-on-failure contract (rethrows textError),
so the docsearch plugin keeps working unchanged.

- cli: prints body text followed by metadata by default; --text/-t and
--meta/-m restrict to one. A salvaged-but-partial extraction warns on
STDERR and exits 0; nothing usable exits non-zero.

- ExtractionException::wrap() centralises wrapping a caught error as an
ExtractionException (passing one through if it already is).

Tests assert the real Tika samples' embedded metadata and the
partial-failure paths. The pre-existing PDF body-text Form-XObject
failure is unchanged.

12