pdf-oxide 0.3.24 → 0.3.29

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.
Files changed (271) hide show
  1. package/lib/builders/annotation-builder.d.ts +199 -0
  2. package/lib/builders/annotation-builder.d.ts.map +1 -0
  3. package/lib/builders/annotation-builder.js +318 -0
  4. package/lib/builders/annotation-builder.js.map +1 -0
  5. package/lib/builders/conversion-options-builder.d.ts +107 -0
  6. package/lib/builders/conversion-options-builder.d.ts.map +1 -0
  7. package/lib/builders/conversion-options-builder.js +215 -0
  8. package/lib/builders/conversion-options-builder.js.map +1 -0
  9. package/{src/builders/index.ts → lib/builders/index.d.ts} +1 -1
  10. package/lib/builders/index.d.ts.map +1 -0
  11. package/lib/builders/index.js +12 -0
  12. package/lib/builders/index.js.map +1 -0
  13. package/lib/builders/metadata-builder.d.ts +202 -0
  14. package/lib/builders/metadata-builder.d.ts.map +1 -0
  15. package/lib/builders/metadata-builder.js +286 -0
  16. package/lib/builders/metadata-builder.js.map +1 -0
  17. package/lib/builders/pdf-builder.d.ts +215 -0
  18. package/lib/builders/pdf-builder.d.ts.map +1 -0
  19. package/lib/builders/pdf-builder.js +339 -0
  20. package/lib/builders/pdf-builder.js.map +1 -0
  21. package/lib/builders/search-options-builder.d.ts +74 -0
  22. package/lib/builders/search-options-builder.d.ts.map +1 -0
  23. package/lib/builders/search-options-builder.js +130 -0
  24. package/lib/builders/search-options-builder.js.map +1 -0
  25. package/lib/document-editor-manager.d.ts +140 -0
  26. package/lib/document-editor-manager.d.ts.map +1 -0
  27. package/lib/document-editor-manager.js +257 -0
  28. package/lib/document-editor-manager.js.map +1 -0
  29. package/lib/errors.d.ts +383 -0
  30. package/lib/errors.d.ts.map +1 -0
  31. package/lib/errors.js +1117 -0
  32. package/lib/errors.js.map +1 -0
  33. package/lib/form-field-manager.d.ts +300 -0
  34. package/lib/form-field-manager.d.ts.map +1 -0
  35. package/lib/form-field-manager.js +567 -0
  36. package/lib/form-field-manager.js.map +1 -0
  37. package/lib/hybrid-ml-manager.d.ts +143 -0
  38. package/lib/hybrid-ml-manager.d.ts.map +1 -0
  39. package/lib/hybrid-ml-manager.js +209 -0
  40. package/lib/hybrid-ml-manager.js.map +1 -0
  41. package/lib/index.d.ts +23 -0
  42. package/lib/index.d.ts.map +1 -0
  43. package/lib/index.js +280 -0
  44. package/lib/index.js.map +1 -0
  45. package/lib/managers/accessibility-manager.d.ts +149 -0
  46. package/lib/managers/accessibility-manager.d.ts.map +1 -0
  47. package/lib/managers/accessibility-manager.js +224 -0
  48. package/lib/managers/accessibility-manager.js.map +1 -0
  49. package/lib/managers/annotation-manager.d.ts +220 -0
  50. package/lib/managers/annotation-manager.d.ts.map +1 -0
  51. package/lib/managers/annotation-manager.js +360 -0
  52. package/lib/managers/annotation-manager.js.map +1 -0
  53. package/lib/managers/barcode-manager.d.ts +80 -0
  54. package/lib/managers/barcode-manager.d.ts.map +1 -0
  55. package/lib/managers/barcode-manager.js +226 -0
  56. package/lib/managers/barcode-manager.js.map +1 -0
  57. package/lib/managers/batch-manager.d.ts +186 -0
  58. package/lib/managers/batch-manager.d.ts.map +1 -0
  59. package/lib/managers/batch-manager.js +389 -0
  60. package/lib/managers/batch-manager.js.map +1 -0
  61. package/lib/managers/cache-manager.d.ts +182 -0
  62. package/lib/managers/cache-manager.d.ts.map +1 -0
  63. package/lib/managers/cache-manager.js +387 -0
  64. package/lib/managers/cache-manager.js.map +1 -0
  65. package/lib/managers/compliance-manager.d.ts +104 -0
  66. package/lib/managers/compliance-manager.d.ts.map +1 -0
  67. package/lib/managers/compliance-manager.js +415 -0
  68. package/lib/managers/compliance-manager.js.map +1 -0
  69. package/lib/managers/content-manager.d.ts +121 -0
  70. package/lib/managers/content-manager.d.ts.map +1 -0
  71. package/lib/managers/content-manager.js +295 -0
  72. package/lib/managers/content-manager.js.map +1 -0
  73. package/lib/managers/document-utility-manager.d.ts +370 -0
  74. package/lib/managers/document-utility-manager.d.ts.map +1 -0
  75. package/lib/managers/document-utility-manager.js +731 -0
  76. package/lib/managers/document-utility-manager.js.map +1 -0
  77. package/lib/managers/dom-pdf-creator.d.ts +105 -0
  78. package/lib/managers/dom-pdf-creator.d.ts.map +1 -0
  79. package/lib/managers/dom-pdf-creator.js +300 -0
  80. package/lib/managers/dom-pdf-creator.js.map +1 -0
  81. package/lib/managers/editing-manager.d.ts +249 -0
  82. package/lib/managers/editing-manager.d.ts.map +1 -0
  83. package/lib/managers/editing-manager.js +388 -0
  84. package/lib/managers/editing-manager.js.map +1 -0
  85. package/lib/managers/enterprise-manager.d.ts +193 -0
  86. package/lib/managers/enterprise-manager.d.ts.map +1 -0
  87. package/lib/managers/enterprise-manager.js +305 -0
  88. package/lib/managers/enterprise-manager.js.map +1 -0
  89. package/lib/managers/extended-managers.d.ts +123 -0
  90. package/lib/managers/extended-managers.d.ts.map +1 -0
  91. package/lib/managers/extended-managers.js +658 -0
  92. package/lib/managers/extended-managers.js.map +1 -0
  93. package/lib/managers/extraction-manager.d.ts +247 -0
  94. package/lib/managers/extraction-manager.d.ts.map +1 -0
  95. package/lib/managers/extraction-manager.js +478 -0
  96. package/lib/managers/extraction-manager.js.map +1 -0
  97. package/lib/managers/final-utilities.d.ts +128 -0
  98. package/lib/managers/final-utilities.d.ts.map +1 -0
  99. package/lib/managers/final-utilities.js +653 -0
  100. package/lib/managers/final-utilities.js.map +1 -0
  101. package/lib/managers/hybrid-ml-advanced.d.ts +137 -0
  102. package/lib/managers/hybrid-ml-advanced.d.ts.map +1 -0
  103. package/lib/managers/hybrid-ml-advanced.js +707 -0
  104. package/lib/managers/hybrid-ml-advanced.js.map +1 -0
  105. package/lib/managers/index.d.ts +65 -0
  106. package/lib/managers/index.d.ts.map +1 -0
  107. package/lib/managers/index.js +70 -0
  108. package/lib/managers/index.js.map +1 -0
  109. package/lib/managers/layer-manager.d.ts +204 -0
  110. package/lib/managers/layer-manager.d.ts.map +1 -0
  111. package/lib/managers/layer-manager.js +403 -0
  112. package/lib/managers/layer-manager.js.map +1 -0
  113. package/lib/managers/metadata-manager.d.ts +149 -0
  114. package/lib/managers/metadata-manager.d.ts.map +1 -0
  115. package/lib/managers/metadata-manager.js +281 -0
  116. package/lib/managers/metadata-manager.js.map +1 -0
  117. package/lib/managers/ocr-manager.d.ts +195 -0
  118. package/lib/managers/ocr-manager.d.ts.map +1 -0
  119. package/lib/managers/ocr-manager.js +583 -0
  120. package/lib/managers/ocr-manager.js.map +1 -0
  121. package/lib/managers/optimization-manager.d.ts +103 -0
  122. package/lib/managers/optimization-manager.d.ts.map +1 -0
  123. package/lib/managers/optimization-manager.js +194 -0
  124. package/lib/managers/optimization-manager.js.map +1 -0
  125. package/lib/managers/outline-manager.d.ts +102 -0
  126. package/lib/managers/outline-manager.d.ts.map +1 -0
  127. package/lib/managers/outline-manager.js +170 -0
  128. package/lib/managers/outline-manager.js.map +1 -0
  129. package/lib/managers/page-manager.d.ts +143 -0
  130. package/lib/managers/page-manager.d.ts.map +1 -0
  131. package/lib/managers/page-manager.js +237 -0
  132. package/lib/managers/page-manager.js.map +1 -0
  133. package/lib/managers/pattern-detection.d.ts +170 -0
  134. package/lib/managers/pattern-detection.d.ts.map +1 -0
  135. package/lib/managers/pattern-detection.js +325 -0
  136. package/lib/managers/pattern-detection.js.map +1 -0
  137. package/lib/managers/rendering-manager.d.ts +354 -0
  138. package/lib/managers/rendering-manager.d.ts.map +1 -0
  139. package/lib/managers/rendering-manager.js +680 -0
  140. package/lib/managers/rendering-manager.js.map +1 -0
  141. package/lib/managers/search-manager.d.ts +236 -0
  142. package/lib/managers/search-manager.d.ts.map +1 -0
  143. package/lib/managers/search-manager.js +330 -0
  144. package/lib/managers/search-manager.js.map +1 -0
  145. package/lib/managers/security-manager.d.ts +162 -0
  146. package/lib/managers/security-manager.d.ts.map +1 -0
  147. package/lib/managers/security-manager.js +293 -0
  148. package/lib/managers/security-manager.js.map +1 -0
  149. package/lib/managers/signature-manager.d.ts +725 -0
  150. package/lib/managers/signature-manager.d.ts.map +1 -0
  151. package/lib/managers/signature-manager.js +1365 -0
  152. package/lib/managers/signature-manager.js.map +1 -0
  153. package/lib/managers/streams.d.ts +263 -0
  154. package/lib/managers/streams.d.ts.map +1 -0
  155. package/lib/managers/streams.js +472 -0
  156. package/lib/managers/streams.js.map +1 -0
  157. package/lib/managers/xfa-manager.d.ts +228 -0
  158. package/lib/managers/xfa-manager.d.ts.map +1 -0
  159. package/lib/managers/xfa-manager.js +490 -0
  160. package/lib/managers/xfa-manager.js.map +1 -0
  161. package/lib/pdf-creator-manager.d.ts +201 -0
  162. package/lib/pdf-creator-manager.d.ts.map +1 -0
  163. package/lib/pdf-creator-manager.js +379 -0
  164. package/lib/pdf-creator-manager.js.map +1 -0
  165. package/lib/properties.d.ts +80 -0
  166. package/lib/properties.d.ts.map +1 -0
  167. package/lib/properties.js +455 -0
  168. package/lib/properties.js.map +1 -0
  169. package/lib/result-accessors-manager.d.ts +347 -0
  170. package/lib/result-accessors-manager.d.ts.map +1 -0
  171. package/lib/result-accessors-manager.js +705 -0
  172. package/lib/result-accessors-manager.js.map +1 -0
  173. package/lib/thumbnail-manager.d.ts +122 -0
  174. package/lib/thumbnail-manager.d.ts.map +1 -0
  175. package/lib/thumbnail-manager.js +206 -0
  176. package/lib/thumbnail-manager.js.map +1 -0
  177. package/lib/types/common.d.ts +93 -0
  178. package/lib/types/common.d.ts.map +1 -0
  179. package/lib/types/common.js +5 -0
  180. package/lib/types/common.js.map +1 -0
  181. package/lib/types/document-types.d.ts +353 -0
  182. package/lib/types/document-types.d.ts.map +1 -0
  183. package/lib/types/document-types.js +83 -0
  184. package/lib/types/document-types.js.map +1 -0
  185. package/{src/types/index.ts → lib/types/index.d.ts} +1 -1
  186. package/lib/types/index.d.ts.map +1 -0
  187. package/lib/types/index.js +6 -0
  188. package/lib/types/index.js.map +1 -0
  189. package/lib/types/manager-types.d.ts +180 -0
  190. package/lib/types/manager-types.d.ts.map +1 -0
  191. package/lib/types/manager-types.js +99 -0
  192. package/lib/types/manager-types.js.map +1 -0
  193. package/lib/types/native-bindings.d.ts +440 -0
  194. package/lib/types/native-bindings.d.ts.map +1 -0
  195. package/lib/types/native-bindings.js +8 -0
  196. package/lib/types/native-bindings.js.map +1 -0
  197. package/{src/workers/index.ts → lib/workers/index.d.ts} +1 -1
  198. package/lib/workers/index.d.ts.map +1 -0
  199. package/lib/workers/index.js +6 -0
  200. package/lib/workers/index.js.map +1 -0
  201. package/lib/workers/pool.d.ts +65 -0
  202. package/lib/workers/pool.d.ts.map +1 -0
  203. package/lib/workers/pool.js +195 -0
  204. package/lib/workers/pool.js.map +1 -0
  205. package/lib/workers/worker.d.ts +6 -0
  206. package/lib/workers/worker.d.ts.map +1 -0
  207. package/lib/workers/worker.js +100 -0
  208. package/lib/workers/worker.js.map +1 -0
  209. package/package.json +12 -22
  210. package/prebuilds/darwin-arm64/pdf_oxide.node +0 -0
  211. package/prebuilds/darwin-x64/pdf_oxide.node +0 -0
  212. package/prebuilds/linux-arm64/pdf_oxide.node +0 -0
  213. package/prebuilds/linux-x64/pdf_oxide.node +0 -0
  214. package/prebuilds/win32-x64/pdf_oxide.node +0 -0
  215. package/binding.gyp +0 -35
  216. package/src/builders/annotation-builder.ts +0 -367
  217. package/src/builders/conversion-options-builder.ts +0 -257
  218. package/src/builders/metadata-builder.ts +0 -317
  219. package/src/builders/pdf-builder.ts +0 -386
  220. package/src/builders/search-options-builder.ts +0 -151
  221. package/src/document-editor-manager.ts +0 -318
  222. package/src/errors.ts +0 -1629
  223. package/src/form-field-manager.ts +0 -666
  224. package/src/hybrid-ml-manager.ts +0 -283
  225. package/src/index.ts +0 -453
  226. package/src/managers/accessibility-manager.ts +0 -338
  227. package/src/managers/annotation-manager.ts +0 -439
  228. package/src/managers/barcode-manager.ts +0 -235
  229. package/src/managers/batch-manager.ts +0 -533
  230. package/src/managers/cache-manager.ts +0 -486
  231. package/src/managers/compliance-manager.ts +0 -375
  232. package/src/managers/content-manager.ts +0 -339
  233. package/src/managers/document-utility-manager.ts +0 -922
  234. package/src/managers/dom-pdf-creator.ts +0 -365
  235. package/src/managers/editing-manager.ts +0 -514
  236. package/src/managers/enterprise-manager.ts +0 -478
  237. package/src/managers/extended-managers.ts +0 -437
  238. package/src/managers/extraction-manager.ts +0 -583
  239. package/src/managers/final-utilities.ts +0 -429
  240. package/src/managers/hybrid-ml-advanced.ts +0 -479
  241. package/src/managers/index.ts +0 -239
  242. package/src/managers/layer-manager.ts +0 -500
  243. package/src/managers/metadata-manager.ts +0 -303
  244. package/src/managers/ocr-manager.ts +0 -756
  245. package/src/managers/optimization-manager.ts +0 -262
  246. package/src/managers/outline-manager.ts +0 -196
  247. package/src/managers/page-manager.ts +0 -289
  248. package/src/managers/pattern-detection.ts +0 -440
  249. package/src/managers/rendering-manager.ts +0 -863
  250. package/src/managers/search-manager.ts +0 -385
  251. package/src/managers/security-manager.ts +0 -345
  252. package/src/managers/signature-manager.ts +0 -1664
  253. package/src/managers/streams.ts +0 -618
  254. package/src/managers/xfa-manager.ts +0 -500
  255. package/src/pdf-creator-manager.ts +0 -494
  256. package/src/properties.ts +0 -522
  257. package/src/result-accessors-manager.ts +0 -867
  258. package/src/tests/advanced-features.test.ts +0 -414
  259. package/src/tests/advanced.test.ts +0 -266
  260. package/src/tests/extended-managers.test.ts +0 -316
  261. package/src/tests/final-utilities.test.ts +0 -455
  262. package/src/tests/foundation.test.ts +0 -315
  263. package/src/tests/high-demand.test.ts +0 -257
  264. package/src/tests/specialized.test.ts +0 -97
  265. package/src/thumbnail-manager.ts +0 -272
  266. package/src/types/common.ts +0 -142
  267. package/src/types/document-types.ts +0 -457
  268. package/src/types/manager-types.ts +0 -284
  269. package/src/types/native-bindings.ts +0 -517
  270. package/src/workers/pool.ts +0 -274
  271. package/src/workers/worker.ts +0 -131
@@ -1,385 +0,0 @@
1
- /**
2
- * Manager for text search operations in PDF documents
3
- *
4
- * Caching is handled automatically at the Rust FFI layer, eliminating
5
- * the need for duplicate cache implementations in the binding.
6
- *
7
- * @example
8
- * ```typescript
9
- * import { SearchManager, SearchOptionsBuilder } from 'pdf_oxide';
10
- *
11
- * const doc = PdfDocument.open('document.pdf');
12
- * const searchManager = new SearchManager(doc);
13
- *
14
- * // Simple search
15
- * const results = searchManager.search('keyword');
16
- *
17
- * // Search with options
18
- * const options = SearchOptionsBuilder.strict().build();
19
- * const results = searchManager.search('keyword', options);
20
- *
21
- * // Count occurrences
22
- * const count = searchManager.countOccurrences('keyword');
23
- * ```
24
- */
25
-
26
- export interface SearchResult {
27
- text?: string;
28
- pageIndex?: number;
29
- position?: number;
30
- boundingBox?: Record<string, number>;
31
- [key: string]: any;
32
- }
33
-
34
- export interface SearchStatistics {
35
- searchText: string;
36
- totalOccurrences: number;
37
- pagesContaining: number;
38
- firstMatchPage: number;
39
- lastMatchPage: number;
40
- pages: number[];
41
- occurrencesPerPage: Array<{
42
- pageIndex: number;
43
- pageNumber: number;
44
- count: number;
45
- }>;
46
- }
47
-
48
- export interface SearchCapabilities {
49
- caseSensitiveSearch: boolean;
50
- wholeWordSearch: boolean;
51
- regexSearch: boolean;
52
- annotationSearch: boolean;
53
- maxResults: number;
54
- isSearchable: boolean;
55
- }
56
-
57
- export class SearchManager {
58
- private _document: any;
59
-
60
- /**
61
- * Creates a new SearchManager for the given document
62
- * @param document - The PDF document
63
- * @throws Error if document is null or undefined
64
- */
65
- constructor(document: any) {
66
- if (!document) {
67
- throw new Error('Document is required');
68
- }
69
- this._document = document;
70
- }
71
-
72
- /**
73
- * Searches for text in a specific page.
74
- * Results are automatically cached at the FFI layer.
75
- * @param searchText - Text to search for
76
- * @param pageIndex - Zero-based page index
77
- * @param options - Search options (caseSensitive, wholeWords, useRegex, etc.)
78
- * @returns Array of search results
79
- * @throws Error if parameters are invalid
80
- *
81
- * @example
82
- * ```typescript
83
- * const results = manager.search('error', 0);
84
- * results.forEach(result => {
85
- * console.log(`Found at position ${result.position}`);
86
- * });
87
- * ```
88
- */
89
- search(searchText: string, pageIndex: number, options?: Record<string, any>): SearchResult[] {
90
- if (!searchText || typeof searchText !== 'string') {
91
- throw new Error('Search text must be a non-empty string');
92
- }
93
-
94
- if (typeof pageIndex !== 'number' || pageIndex < 0) {
95
- throw new Error('Page index must be a non-negative number');
96
- }
97
-
98
- if (pageIndex >= this._document.pageCount) {
99
- throw new Error(`Page index ${pageIndex} out of range`);
100
- }
101
-
102
- try {
103
- return this._document.search(searchText, pageIndex, options) || [];
104
- } catch (error) {
105
- throw new Error(`Search failed: ${(error as Error).message}`);
106
- }
107
- }
108
-
109
- /**
110
- * Searches for text across all pages
111
- * @param searchText - Text to search for
112
- * @param options - Search options
113
- * @returns Array of search results with page information
114
- *
115
- * @example
116
- * ```typescript
117
- * const results = manager.searchAll('important');
118
- * console.log(`Found ${results.length} occurrences`);
119
- * ```
120
- */
121
- searchAll(searchText: string, options?: Record<string, any>): SearchResult[] {
122
- if (!searchText || typeof searchText !== 'string') {
123
- throw new Error('Search text must be a non-empty string');
124
- }
125
-
126
- const allResults: SearchResult[] = [];
127
-
128
- try {
129
- for (let i = 0; i < this._document.pageCount; i++) {
130
- const results = this.search(searchText, i, options);
131
- results.forEach(result => {
132
- result.pageIndex = i;
133
- result.pageNumber = i + 1;
134
- });
135
- allResults.push(...results);
136
- }
137
-
138
- return allResults;
139
- } catch (error) {
140
- throw new Error(`Search all failed: ${(error as Error).message}`);
141
- }
142
- }
143
-
144
- /**
145
- * Counts occurrences of text in a page
146
- * @param searchText - Text to search for
147
- * @param pageIndex - Zero-based page index
148
- * @param options - Search options
149
- * @returns Number of occurrences found
150
- *
151
- * @example
152
- * ```typescript
153
- * const count = manager.countOccurrences('the', 0);
154
- * console.log(`"the" appears ${count} times on page 1`);
155
- * ```
156
- */
157
- countOccurrences(searchText: string, pageIndex: number, options?: Record<string, any>): number {
158
- const results = this.search(searchText, pageIndex, options);
159
- return results.length;
160
- }
161
-
162
- /**
163
- * Counts occurrences of text across all pages
164
- * @param searchText - Text to search for
165
- * @param options - Search options
166
- * @returns Total occurrences
167
- *
168
- * @example
169
- * ```typescript
170
- * const totalCount = manager.countAllOccurrences('the');
171
- * console.log(`"the" appears ${totalCount} times in document`);
172
- * ```
173
- */
174
- countAllOccurrences(searchText: string, options?: Record<string, any>): number {
175
- const results = this.searchAll(searchText, options);
176
- return results.length;
177
- }
178
-
179
- /**
180
- * Checks if text exists in a page
181
- * @param searchText - Text to search for
182
- * @param pageIndex - Zero-based page index
183
- * @param options - Search options
184
- * @returns True if text found
185
- *
186
- * @example
187
- * ```typescript
188
- * if (manager.contains('error', 0)) {
189
- * console.log('Page contains "error"');
190
- * }
191
- * ```
192
- */
193
- contains(searchText: string, pageIndex: number, options?: Record<string, any>): boolean {
194
- const results = this.search(searchText, pageIndex, options);
195
- return results.length > 0;
196
- }
197
-
198
- /**
199
- * Checks if text exists anywhere in document
200
- * @param searchText - Text to search for
201
- * @param options - Search options
202
- * @returns True if text found anywhere
203
- *
204
- * @example
205
- * ```typescript
206
- * if (manager.containsAnywhere('copyright')) {
207
- * console.log('Document contains copyright notice');
208
- * }
209
- * ```
210
- */
211
- containsAnywhere(searchText: string, options?: Record<string, any>): boolean {
212
- const results = this.searchAll(searchText, options);
213
- return results.length > 0;
214
- }
215
-
216
- /**
217
- * Gets pages containing the search text
218
- * @param searchText - Text to search for
219
- * @param options - Search options
220
- * @returns Array of page indices (zero-based) containing the text
221
- *
222
- * @example
223
- * ```typescript
224
- * const pages = manager.getPagesContaining('error');
225
- * console.log(`"error" found on pages: ${pages.map(p => p + 1).join(', ')}`);
226
- * ```
227
- */
228
- getPagesContaining(searchText: string, options?: Record<string, any>): number[] {
229
- const results = this.searchAll(searchText, options);
230
- const pageSet = new Set(results.map(r => r.pageIndex || 0));
231
- return Array.from(pageSet).sort((a, b) => a - b);
232
- }
233
-
234
- /**
235
- * Gets statistics for search results
236
- * @param searchText - Text to search for
237
- * @param options - Search options
238
- * @returns Search statistics
239
- *
240
- * @example
241
- * ```typescript
242
- * const stats = manager.getSearchStatistics('error');
243
- * console.log(`Found ${stats.totalOccurrences} occurrences`);
244
- * console.log(`On ${stats.pagesContaining} pages`);
245
- * console.log(`First match on page ${stats.firstMatchPage + 1}`);
246
- * ```
247
- */
248
- getSearchStatistics(searchText: string, options?: Record<string, any>): SearchStatistics {
249
- const results = this.searchAll(searchText, options);
250
-
251
- // Extract unique pages and calculate per-page counts in single pass
252
- const pageMap = new Map<number, number>();
253
- for (const result of results) {
254
- const pageIdx = result.pageIndex || 0;
255
- if (!pageMap.has(pageIdx)) {
256
- pageMap.set(pageIdx, 0);
257
- }
258
- pageMap.set(pageIdx, (pageMap.get(pageIdx) || 0) + 1);
259
- }
260
-
261
- const pages = Array.from(pageMap.keys()).sort((a, b) => a - b);
262
-
263
- return {
264
- searchText,
265
- totalOccurrences: results.length,
266
- pagesContaining: pages.length,
267
- firstMatchPage: pages.length > 0 ? (pages[0] as number) : -1,
268
- lastMatchPage: pages.length > 0 ? (pages[pages.length - 1] as number) : -1,
269
- pages,
270
- occurrencesPerPage: pages.map(p => ({
271
- pageIndex: p,
272
- pageNumber: p + 1,
273
- count: pageMap.get(p) || 0,
274
- })),
275
- };
276
- }
277
-
278
- /**
279
- * Searches with a regular expression
280
- * @param pattern - Regular expression pattern
281
- * @param options - Search options (will set useRegex: true)
282
- * @returns Array of search results
283
- *
284
- * @example
285
- * ```typescript
286
- * const results = manager.searchRegex(/error\d+/i);
287
- * // Finds "error1", "ERROR2", "Error3", etc.
288
- * ```
289
- */
290
- searchRegex(pattern: RegExp | string, options: Record<string, any> = {}): SearchResult[] {
291
- const regexStr = pattern instanceof RegExp ? pattern.source : pattern;
292
-
293
- if (!regexStr || typeof regexStr !== 'string') {
294
- throw new Error('Pattern must be a valid regular expression');
295
- }
296
-
297
- // Merge options and ensure useRegex is true
298
- const searchOptions = {
299
- ...options,
300
- useRegex: true,
301
- };
302
-
303
- try {
304
- return this.searchAll(regexStr, searchOptions);
305
- } catch (error) {
306
- throw new Error(`Regex search failed: ${(error as Error).message}`);
307
- }
308
- }
309
-
310
- /**
311
- * Finds first occurrence of text
312
- * @param searchText - Text to search for
313
- * @param options - Search options
314
- * @returns First search result or null if not found
315
- *
316
- * @example
317
- * ```typescript
318
- * const first = manager.findFirst('chapter');
319
- * if (first) {
320
- * console.log(`First "chapter" found on page ${first.pageNumber}`);
321
- * }
322
- * ```
323
- */
324
- findFirst(searchText: string, options?: Record<string, any>): SearchResult | null {
325
- const results = this.searchAll(searchText, options);
326
- return results.length > 0 ? (results[0] as SearchResult) : null;
327
- }
328
-
329
- /**
330
- * Finds last occurrence of text
331
- * @param searchText - Text to search for
332
- * @param options - Search options
333
- * @returns Last search result or null if not found
334
- */
335
- findLast(searchText: string, options?: Record<string, any>): SearchResult | null {
336
- const results = this.searchAll(searchText, options);
337
- return results.length > 0 ? (results[results.length - 1] as SearchResult) : null;
338
- }
339
-
340
- /**
341
- * Replaces text occurrences with highlighted versions (view only)
342
- * Gets all occurrences for highlighting without modification
343
- * @param searchText - Text to find
344
- * @param options - Search options
345
- * @returns Results formatted for highlighting
346
- *
347
- * @example
348
- * ```typescript
349
- * const highlights = manager.highlightMatches('important');
350
- * // Use results for UI highlighting
351
- * ```
352
- */
353
- highlightMatches(searchText: string, options?: Record<string, any>): SearchResult[] {
354
- return this.searchAll(searchText, options);
355
- }
356
-
357
- /**
358
- * Checks if document is searchable
359
- * @returns True if document supports text search
360
- */
361
- isSearchable(): boolean {
362
- try {
363
- // Try searching for common text to verify searchability
364
- this.searchAll('test');
365
- return true;
366
- } catch (error) {
367
- return false;
368
- }
369
- }
370
-
371
- /**
372
- * Gets search capabilities summary
373
- * @returns Search capabilities information
374
- */
375
- getCapabilities(): SearchCapabilities {
376
- return {
377
- caseSensitiveSearch: true,
378
- wholeWordSearch: true,
379
- regexSearch: true,
380
- annotationSearch: true,
381
- maxResults: 1000,
382
- isSearchable: this.isSearchable(),
383
- };
384
- }
385
- }