@embedpdf/plugin-search 1.0.10 → 1.0.12

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 (38) hide show
  1. package/dist/index.cjs +2 -306
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.ts +1 -231
  4. package/dist/index.js +16 -26
  5. package/dist/index.js.map +1 -1
  6. package/dist/lib/actions.d.ts +47 -0
  7. package/dist/lib/index.d.ts +10 -0
  8. package/dist/lib/manifest.d.ts +4 -0
  9. package/dist/lib/reducer.d.ts +5 -0
  10. package/dist/lib/search-plugin.d.ts +33 -0
  11. package/dist/{index.d.cts → lib/types.d.ts} +6 -85
  12. package/dist/preact/adapter.d.ts +5 -0
  13. package/dist/preact/core.d.ts +1 -0
  14. package/dist/preact/index.cjs +2 -116
  15. package/dist/preact/index.cjs.map +1 -1
  16. package/dist/preact/index.d.ts +1 -31
  17. package/dist/preact/index.js +12 -15
  18. package/dist/preact/index.js.map +1 -1
  19. package/dist/react/adapter.d.ts +2 -0
  20. package/dist/react/core.d.ts +1 -0
  21. package/dist/react/index.cjs +2 -116
  22. package/dist/react/index.cjs.map +1 -1
  23. package/dist/react/index.d.ts +1 -29
  24. package/dist/react/index.js +11 -15
  25. package/dist/react/index.js.map +1 -1
  26. package/dist/shared-preact/components/index.d.ts +1 -0
  27. package/dist/shared-preact/components/search-layer.d.ts +10 -0
  28. package/dist/shared-preact/hooks/index.d.ts +1 -0
  29. package/dist/shared-preact/hooks/use-search.d.ts +15 -0
  30. package/dist/shared-preact/index.d.ts +2 -0
  31. package/dist/shared-react/components/index.d.ts +1 -0
  32. package/dist/shared-react/components/search-layer.d.ts +10 -0
  33. package/dist/shared-react/hooks/index.d.ts +1 -0
  34. package/dist/shared-react/hooks/use-search.d.ts +15 -0
  35. package/dist/shared-react/index.d.ts +2 -0
  36. package/package.json +14 -13
  37. package/dist/preact/index.d.cts +0 -31
  38. package/dist/react/index.d.cts +0 -29
package/dist/index.cjs CHANGED
@@ -1,306 +1,2 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/index.ts
21
- var index_exports = {};
22
- __export(index_exports, {
23
- SEARCH_PLUGIN_ID: () => SEARCH_PLUGIN_ID,
24
- SearchPlugin: () => SearchPlugin,
25
- SearchPluginPackage: () => SearchPluginPackage,
26
- initialState: () => initialState,
27
- manifest: () => manifest
28
- });
29
- module.exports = __toCommonJS(index_exports);
30
-
31
- // src/lib/search-plugin.ts
32
- var import_core = require("@embedpdf/core");
33
-
34
- // src/lib/actions.ts
35
- var START_SEARCH_SESSION = "START_SEARCH_SESSION";
36
- var STOP_SEARCH_SESSION = "STOP_SEARCH_SESSION";
37
- var SET_SEARCH_FLAGS = "SET_SEARCH_FLAGS";
38
- var SET_SHOW_ALL_RESULTS = "SET_SHOW_ALL_RESULTS";
39
- var START_SEARCH = "START_SEARCH";
40
- var SET_SEARCH_RESULTS = "SET_SEARCH_RESULTS";
41
- var SET_ACTIVE_RESULT_INDEX = "SET_ACTIVE_RESULT_INDEX";
42
- function startSearchSession() {
43
- return { type: START_SEARCH_SESSION };
44
- }
45
- function stopSearchSession() {
46
- return { type: STOP_SEARCH_SESSION };
47
- }
48
- function setSearchFlags(flags) {
49
- return { type: SET_SEARCH_FLAGS, payload: flags };
50
- }
51
- function setShowAllResults(showAll) {
52
- return { type: SET_SHOW_ALL_RESULTS, payload: showAll };
53
- }
54
- function startSearch(query) {
55
- return { type: START_SEARCH, payload: query };
56
- }
57
- function setSearchResults(results, total, activeResultIndex) {
58
- return { type: SET_SEARCH_RESULTS, payload: { results, total, activeResultIndex } };
59
- }
60
- function setActiveResultIndex(index) {
61
- return { type: SET_ACTIVE_RESULT_INDEX, payload: index };
62
- }
63
-
64
- // src/lib/search-plugin.ts
65
- var SearchPlugin = class extends import_core.BasePlugin {
66
- constructor(id, registry, engine) {
67
- super(id, registry);
68
- this.searchStop$ = (0, import_core.createBehaviorEmitter)();
69
- this.searchStart$ = (0, import_core.createBehaviorEmitter)();
70
- this.searchResult$ = (0, import_core.createBehaviorEmitter)();
71
- this.searchActiveResultChange$ = (0, import_core.createBehaviorEmitter)();
72
- this.searchResultState$ = (0, import_core.createBehaviorEmitter)();
73
- this.searchState$ = (0, import_core.createBehaviorEmitter)();
74
- this.engine = engine;
75
- this.loader = this.registry.getPlugin("loader").provides();
76
- this.loader.onDocumentLoaded(this.handleDocumentLoaded.bind(this));
77
- this.loader.onLoaderEvent(this.handleLoaderEvent.bind(this));
78
- }
79
- handleDocumentLoaded(doc) {
80
- this.currentDocument = doc;
81
- if (this.state.active) {
82
- this.startSearchSession();
83
- }
84
- }
85
- handleLoaderEvent(event) {
86
- if (event.type === "error" || event.type === "start" && this.currentDocument) {
87
- if (this.state.active) {
88
- this.stopSearchSession();
89
- }
90
- this.currentDocument = void 0;
91
- }
92
- }
93
- async initialize(config) {
94
- this.dispatch(setSearchFlags(config.flags || []));
95
- this.dispatch(
96
- setShowAllResults(config.showAllResults !== void 0 ? config.showAllResults : true)
97
- );
98
- }
99
- onStoreUpdated(_prevState, newState) {
100
- this.searchResultState$.emit({
101
- results: newState.results,
102
- activeResultIndex: newState.activeResultIndex,
103
- showAllResults: newState.showAllResults,
104
- active: newState.active
105
- });
106
- this.searchState$.emit(newState);
107
- }
108
- buildCapability() {
109
- return {
110
- startSearch: this.startSearchSession.bind(this),
111
- stopSearch: this.stopSearchSession.bind(this),
112
- searchAllPages: this.searchAllPages.bind(this),
113
- nextResult: this.nextResult.bind(this),
114
- previousResult: this.previousResult.bind(this),
115
- goToResult: this.goToResult.bind(this),
116
- setShowAllResults: (showAll) => this.dispatch(setShowAllResults(showAll)),
117
- getShowAllResults: () => this.state.showAllResults,
118
- onSearchResult: this.searchResult$.on,
119
- onSearchStart: this.searchStart$.on,
120
- onSearchStop: this.searchStop$.on,
121
- onActiveResultChange: this.searchActiveResultChange$.on,
122
- onSearchResultStateChange: this.searchResultState$.on,
123
- onStateChange: this.searchState$.on,
124
- getFlags: () => this.state.flags,
125
- setFlags: (flags) => this.setFlags(flags),
126
- getState: () => this.state
127
- };
128
- }
129
- setFlags(flags) {
130
- this.dispatch(setSearchFlags(flags));
131
- if (this.state.active) {
132
- this.searchAllPages(this.state.query, true);
133
- }
134
- }
135
- notifySearchStart() {
136
- this.searchStart$.emit();
137
- }
138
- notifySearchStop() {
139
- this.searchStop$.emit();
140
- }
141
- notifyActiveResultChange(index) {
142
- this.searchActiveResultChange$.emit(index);
143
- }
144
- startSearchSession() {
145
- if (!this.currentDocument) {
146
- return;
147
- }
148
- this.dispatch(startSearchSession());
149
- this.notifySearchStart();
150
- }
151
- stopSearchSession() {
152
- if (!this.currentDocument || !this.getState().active) {
153
- return;
154
- }
155
- this.dispatch(stopSearchSession());
156
- this.notifySearchStop();
157
- }
158
- async searchAllPages(keyword, force = false) {
159
- const trimmedKeyword = keyword.trim();
160
- if (this.state.query === trimmedKeyword && !force) {
161
- return { results: this.state.results, total: this.state.total };
162
- }
163
- this.dispatch(startSearch(trimmedKeyword));
164
- if (!trimmedKeyword) {
165
- this.dispatch(setSearchResults([], 0, -1));
166
- return { results: [], total: 0 };
167
- }
168
- if (!this.currentDocument) {
169
- this.dispatch(setSearchResults([], 0, -1));
170
- return { results: [], total: 0 };
171
- }
172
- if (!this.state.active) {
173
- this.startSearchSession();
174
- }
175
- return new Promise((resolve) => {
176
- this.engine.searchAllPages(this.currentDocument, trimmedKeyword, this.state.flags).wait(
177
- (results) => {
178
- const activeResultIndex = results.total > 0 ? 0 : -1;
179
- this.dispatch(setSearchResults(results.results, results.total, activeResultIndex));
180
- this.searchResult$.emit(results);
181
- if (results.total > 0) {
182
- this.notifyActiveResultChange(0);
183
- }
184
- resolve(results);
185
- },
186
- (error) => {
187
- console.error("Error during search:", error);
188
- this.dispatch(setSearchResults([], 0, -1));
189
- resolve({ results: [], total: 0 });
190
- }
191
- );
192
- });
193
- }
194
- nextResult() {
195
- if (this.state.results.length === 0) {
196
- return -1;
197
- }
198
- const nextIndex = this.state.activeResultIndex >= this.state.results.length - 1 ? 0 : this.state.activeResultIndex + 1;
199
- return this.goToResult(nextIndex);
200
- }
201
- previousResult() {
202
- if (this.state.results.length === 0) {
203
- return -1;
204
- }
205
- const prevIndex = this.state.activeResultIndex <= 0 ? this.state.results.length - 1 : this.state.activeResultIndex - 1;
206
- return this.goToResult(prevIndex);
207
- }
208
- goToResult(index) {
209
- if (this.state.results.length === 0 || index < 0 || index >= this.state.results.length) {
210
- return -1;
211
- }
212
- this.dispatch(setActiveResultIndex(index));
213
- this.notifyActiveResultChange(index);
214
- return index;
215
- }
216
- async destroy() {
217
- if (this.state.active && this.currentDocument) {
218
- this.stopSearchSession();
219
- }
220
- this.searchResult$.clear();
221
- this.searchStart$.clear();
222
- this.searchStop$.clear();
223
- this.searchActiveResultChange$.clear();
224
- this.searchResultState$.clear();
225
- this.searchState$.clear();
226
- }
227
- };
228
- SearchPlugin.id = "search";
229
-
230
- // src/lib/manifest.ts
231
- var SEARCH_PLUGIN_ID = "search";
232
- var manifest = {
233
- id: SEARCH_PLUGIN_ID,
234
- name: "Search Plugin",
235
- version: "1.0.0",
236
- provides: ["search"],
237
- requires: ["loader"],
238
- optional: [],
239
- defaultConfig: {
240
- enabled: true,
241
- flags: []
242
- }
243
- };
244
-
245
- // src/lib/reducer.ts
246
- var initialState = {
247
- flags: [],
248
- results: [],
249
- total: 0,
250
- activeResultIndex: -1,
251
- showAllResults: true,
252
- query: "",
253
- loading: false,
254
- active: false
255
- };
256
- var searchReducer = (state = initialState, action) => {
257
- switch (action.type) {
258
- case START_SEARCH_SESSION:
259
- return { ...state, active: true };
260
- case STOP_SEARCH_SESSION:
261
- return {
262
- ...state,
263
- results: [],
264
- total: 0,
265
- activeResultIndex: -1,
266
- query: "",
267
- loading: false,
268
- active: false
269
- };
270
- case SET_SEARCH_FLAGS:
271
- return { ...state, flags: action.payload };
272
- case SET_SHOW_ALL_RESULTS:
273
- return { ...state, showAllResults: action.payload };
274
- case START_SEARCH:
275
- return { ...state, loading: true, query: action.payload };
276
- case SET_SEARCH_RESULTS:
277
- return {
278
- ...state,
279
- results: action.payload.results,
280
- total: action.payload.total,
281
- activeResultIndex: action.payload.activeResultIndex,
282
- loading: false
283
- };
284
- case SET_ACTIVE_RESULT_INDEX:
285
- return { ...state, activeResultIndex: action.payload };
286
- default:
287
- return state;
288
- }
289
- };
290
-
291
- // src/lib/index.ts
292
- var SearchPluginPackage = {
293
- manifest,
294
- create: (registry, engine) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, engine),
295
- reducer: searchReducer,
296
- initialState
297
- };
298
- // Annotate the CommonJS export names for ESM import in node:
299
- 0 && (module.exports = {
300
- SEARCH_PLUGIN_ID,
301
- SearchPlugin,
302
- SearchPluginPackage,
303
- initialState,
304
- manifest
305
- });
306
- //# sourceMappingURL=index.cjs.map
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("@embedpdf/core"),e="START_SEARCH_SESSION",s="STOP_SEARCH_SESSION",a="SET_SEARCH_FLAGS",i="SET_SHOW_ALL_RESULTS",r="START_SEARCH",h="SET_SEARCH_RESULTS",l="SET_ACTIVE_RESULT_INDEX";function n(t){return{type:a,payload:t}}function o(t){return{type:i,payload:t}}function c(t,e,s){return{type:h,payload:{results:t,total:e,activeResultIndex:s}}}const u=class extends t.BasePlugin{constructor(e,s,a){super(e,s),this.searchStop$=t.createBehaviorEmitter(),this.searchStart$=t.createBehaviorEmitter(),this.searchResult$=t.createBehaviorEmitter(),this.searchActiveResultChange$=t.createBehaviorEmitter(),this.searchResultState$=t.createBehaviorEmitter(),this.searchState$=t.createBehaviorEmitter(),this.engine=a,this.loader=this.registry.getPlugin("loader").provides(),this.loader.onDocumentLoaded(this.handleDocumentLoaded.bind(this)),this.loader.onLoaderEvent(this.handleLoaderEvent.bind(this))}handleDocumentLoaded(t){this.currentDocument=t,this.state.active&&this.startSearchSession()}handleLoaderEvent(t){("error"===t.type||"start"===t.type&&this.currentDocument)&&(this.state.active&&this.stopSearchSession(),this.currentDocument=void 0)}async initialize(t){this.dispatch(n(t.flags||[])),this.dispatch(o(void 0===t.showAllResults||t.showAllResults))}onStoreUpdated(t,e){this.searchResultState$.emit({results:e.results,activeResultIndex:e.activeResultIndex,showAllResults:e.showAllResults,active:e.active}),this.searchState$.emit(e)}buildCapability(){return{startSearch:this.startSearchSession.bind(this),stopSearch:this.stopSearchSession.bind(this),searchAllPages:this.searchAllPages.bind(this),nextResult:this.nextResult.bind(this),previousResult:this.previousResult.bind(this),goToResult:this.goToResult.bind(this),setShowAllResults:t=>this.dispatch(o(t)),getShowAllResults:()=>this.state.showAllResults,onSearchResult:this.searchResult$.on,onSearchStart:this.searchStart$.on,onSearchStop:this.searchStop$.on,onActiveResultChange:this.searchActiveResultChange$.on,onSearchResultStateChange:this.searchResultState$.on,onStateChange:this.searchState$.on,getFlags:()=>this.state.flags,setFlags:t=>this.setFlags(t),getState:()=>this.state}}setFlags(t){this.dispatch(n(t)),this.state.active&&this.searchAllPages(this.state.query,!0)}notifySearchStart(){this.searchStart$.emit()}notifySearchStop(){this.searchStop$.emit()}notifyActiveResultChange(t){this.searchActiveResultChange$.emit(t)}startSearchSession(){this.currentDocument&&(this.dispatch({type:e}),this.notifySearchStart())}stopSearchSession(){this.currentDocument&&this.getState().active&&(this.dispatch({type:s}),this.notifySearchStop())}async searchAllPages(t,e=!1){const s=t.trim();return this.state.query!==s||e?(this.dispatch({type:r,payload:s}),s&&this.currentDocument?(this.state.active||this.startSearchSession(),new Promise((t=>{this.engine.searchAllPages(this.currentDocument,s,this.state.flags).wait((e=>{const s=e.total>0?0:-1;this.dispatch(c(e.results,e.total,s)),this.searchResult$.emit(e),e.total>0&&this.notifyActiveResultChange(0),t(e)}),(e=>{console.error("Error during search:",e),this.dispatch(c([],0,-1)),t({results:[],total:0})}))}))):(this.dispatch(c([],0,-1)),{results:[],total:0})):{results:this.state.results,total:this.state.total}}nextResult(){if(0===this.state.results.length)return-1;const t=this.state.activeResultIndex>=this.state.results.length-1?0:this.state.activeResultIndex+1;return this.goToResult(t)}previousResult(){if(0===this.state.results.length)return-1;const t=this.state.activeResultIndex<=0?this.state.results.length-1:this.state.activeResultIndex-1;return this.goToResult(t)}goToResult(t){return 0===this.state.results.length||t<0||t>=this.state.results.length?-1:(this.dispatch(function(t){return{type:l,payload:t}}(t)),this.notifyActiveResultChange(t),t)}async destroy(){this.state.active&&this.currentDocument&&this.stopSearchSession(),this.searchResult$.clear(),this.searchStart$.clear(),this.searchStop$.clear(),this.searchActiveResultChange$.clear(),this.searchResultState$.clear(),this.searchState$.clear()}};u.id="search";let S=u;const d="search",p={id:d,name:"Search Plugin",version:"1.0.0",provides:["search"],requires:["loader"],optional:[],defaultConfig:{enabled:!0,flags:[]}},R={flags:[],results:[],total:0,activeResultIndex:-1,showAllResults:!0,query:"",loading:!1,active:!1},g={manifest:p,create:(t,e)=>new S(d,t,e),reducer:(t=R,n)=>{switch(n.type){case e:return{...t,active:!0};case s:return{...t,results:[],total:0,activeResultIndex:-1,query:"",loading:!1,active:!1};case a:return{...t,flags:n.payload};case i:return{...t,showAllResults:n.payload};case r:return{...t,loading:!0,query:n.payload};case h:return{...t,results:n.payload.results,total:n.payload.total,activeResultIndex:n.payload.activeResultIndex,loading:!1};case l:return{...t,activeResultIndex:n.payload};default:return t}},initialState:R};exports.SEARCH_PLUGIN_ID=d,exports.SearchPlugin=S,exports.SearchPluginPackage=g,exports.initialState=R,exports.manifest=p;
2
+ //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/lib/search-plugin.ts","../src/lib/actions.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["export * from './lib';\n","import { BasePlugin, createBehaviorEmitter, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n PdfDocumentObject,\n SearchAllPagesResult,\n TaskError,\n PdfEngine,\n} from '@embedpdf/models';\nimport { SearchPluginConfig, SearchCapability, SearchState, SearchResultState } from './types';\nimport { LoaderCapability, LoaderEvent, LoaderPlugin } from '@embedpdf/plugin-loader';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n SearchAction,\n} from './actions';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n private loader: LoaderCapability;\n private currentDocument?: PdfDocumentObject;\n private engine: PdfEngine;\n\n private readonly searchStop$ = createBehaviorEmitter();\n private readonly searchStart$ = createBehaviorEmitter();\n private readonly searchResult$ = createBehaviorEmitter<SearchAllPagesResult>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<number>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultState>();\n private readonly searchState$ = createBehaviorEmitter<SearchState>();\n\n constructor(id: string, registry: PluginRegistry, engine: PdfEngine) {\n super(id, registry);\n this.engine = engine;\n this.loader = this.registry.getPlugin<LoaderPlugin>('loader')!.provides();\n\n this.loader.onDocumentLoaded(this.handleDocumentLoaded.bind(this));\n this.loader.onLoaderEvent(this.handleLoaderEvent.bind(this));\n }\n\n private handleDocumentLoaded(doc: PdfDocumentObject): void {\n this.currentDocument = doc;\n if (this.state.active) {\n this.startSearchSession();\n }\n }\n\n private handleLoaderEvent(event: LoaderEvent): void {\n if (event.type === 'error' || (event.type === 'start' && this.currentDocument)) {\n if (this.state.active) {\n this.stopSearchSession();\n }\n this.currentDocument = undefined;\n }\n }\n\n async initialize(config: SearchPluginConfig): Promise<void> {\n this.dispatch(setSearchFlags(config.flags || []));\n this.dispatch(\n setShowAllResults(config.showAllResults !== undefined ? config.showAllResults : true),\n );\n }\n\n override onStoreUpdated(_prevState: SearchState, newState: SearchState): void {\n this.searchResultState$.emit({\n results: newState.results,\n activeResultIndex: newState.activeResultIndex,\n showAllResults: newState.showAllResults,\n active: newState.active,\n });\n this.searchState$.emit(newState);\n }\n\n protected buildCapability(): SearchCapability {\n return {\n startSearch: this.startSearchSession.bind(this),\n stopSearch: this.stopSearchSession.bind(this),\n searchAllPages: this.searchAllPages.bind(this),\n nextResult: this.nextResult.bind(this),\n previousResult: this.previousResult.bind(this),\n goToResult: this.goToResult.bind(this),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(showAll)),\n getShowAllResults: () => this.state.showAllResults,\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n getFlags: () => this.state.flags,\n setFlags: (flags) => this.setFlags(flags),\n getState: () => this.state,\n };\n }\n\n private setFlags(flags: MatchFlag[]): void {\n this.dispatch(setSearchFlags(flags));\n if (this.state.active) {\n this.searchAllPages(this.state.query, true);\n }\n }\n\n private notifySearchStart(): void {\n this.searchStart$.emit();\n }\n\n private notifySearchStop(): void {\n this.searchStop$.emit();\n }\n\n private notifyActiveResultChange(index: number): void {\n this.searchActiveResultChange$.emit(index);\n }\n\n private startSearchSession(): void {\n if (!this.currentDocument) {\n return;\n }\n this.dispatch(startSearchSession());\n this.notifySearchStart();\n }\n\n private stopSearchSession(): void {\n if (!this.currentDocument || !this.getState().active) {\n return;\n }\n this.dispatch(stopSearchSession());\n this.notifySearchStop();\n }\n\n private async searchAllPages(\n keyword: string,\n force: boolean = false,\n ): Promise<SearchAllPagesResult> {\n const trimmedKeyword = keyword.trim();\n\n if (this.state.query === trimmedKeyword && !force) {\n return { results: this.state.results, total: this.state.total };\n }\n\n this.dispatch(startSearch(trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults([], 0, -1));\n return { results: [], total: 0 };\n }\n if (!this.currentDocument) {\n this.dispatch(setSearchResults([], 0, -1));\n return { results: [], total: 0 };\n }\n\n if (!this.state.active) {\n this.startSearchSession();\n }\n\n return new Promise<SearchAllPagesResult>((resolve) => {\n this.engine.searchAllPages(this.currentDocument!, trimmedKeyword, this.state.flags).wait(\n (results) => {\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(setSearchResults(results.results, results.total, activeResultIndex));\n this.searchResult$.emit(results);\n if (results.total > 0) {\n this.notifyActiveResultChange(0);\n }\n resolve(results);\n },\n (error: TaskError<any>) => {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults([], 0, -1));\n resolve({ results: [], total: 0 });\n },\n );\n });\n }\n\n private nextResult(): number {\n if (this.state.results.length === 0) {\n return -1;\n }\n const nextIndex =\n this.state.activeResultIndex >= this.state.results.length - 1\n ? 0\n : this.state.activeResultIndex + 1;\n return this.goToResult(nextIndex);\n }\n\n private previousResult(): number {\n if (this.state.results.length === 0) {\n return -1;\n }\n const prevIndex =\n this.state.activeResultIndex <= 0\n ? this.state.results.length - 1\n : this.state.activeResultIndex - 1;\n return this.goToResult(prevIndex);\n }\n\n private goToResult(index: number): number {\n if (this.state.results.length === 0 || index < 0 || index >= this.state.results.length) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(index));\n this.notifyActiveResultChange(index);\n return index;\n }\n\n async destroy(): Promise<void> {\n if (this.state.active && this.currentDocument) {\n this.stopSearchSession();\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n }\n}\n","import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\n\n// Action Types\nexport const START_SEARCH_SESSION = 'START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SET_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: MatchFlag[];\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: boolean;\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: string;\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: number;\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function startSearchSession(): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION };\n}\n\nexport function stopSearchSession(): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION };\n}\n\nexport function setSearchFlags(flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: flags };\n}\n\nexport function setShowAllResults(showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: showAll };\n}\n\nexport function startSearch(query: string): StartSearchAction {\n return { type: START_SEARCH, payload: query };\n}\n\nexport function setSearchResults(\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { results, total, activeResultIndex } };\n}\n\nexport function setActiveResultIndex(index: number): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: index };\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: ['loader'],\n optional: [],\n defaultConfig: {\n enabled: true,\n flags: [],\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n} from './actions';\n\nexport const initialState: SearchState = {\n flags: [],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case START_SEARCH_SESSION:\n return { ...state, active: true };\n\n case STOP_SEARCH_SESSION:\n return {\n ...state,\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n };\n\n case SET_SEARCH_FLAGS:\n return { ...state, flags: action.payload };\n\n case SET_SHOW_ALL_RESULTS:\n return { ...state, showAllResults: action.payload };\n\n case START_SEARCH:\n return { ...state, loading: true, query: action.payload };\n\n case SET_SEARCH_RESULTS:\n return {\n ...state,\n results: action.payload.results,\n total: action.payload.total,\n activeResultIndex: action.payload.activeResultIndex,\n loading: false,\n };\n\n case SET_ACTIVE_RESULT_INDEX:\n return { ...state, activeResultIndex: action.payload };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, engine) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, engine),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState };\n"],"mappings":"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","names":[]}
1
+ {"version":3,"file":"index.cjs","sources":["../src/lib/actions.ts","../src/lib/search-plugin.ts","../src/lib/manifest.ts","../src/lib/reducer.ts","../src/lib/index.ts"],"sourcesContent":["import { Action } from '@embedpdf/core';\nimport { MatchFlag, SearchResult } from '@embedpdf/models';\n\n// Action Types\nexport const START_SEARCH_SESSION = 'START_SEARCH_SESSION';\nexport const STOP_SEARCH_SESSION = 'STOP_SEARCH_SESSION';\nexport const SET_SEARCH_FLAGS = 'SET_SEARCH_FLAGS';\nexport const SET_SHOW_ALL_RESULTS = 'SET_SHOW_ALL_RESULTS';\nexport const START_SEARCH = 'START_SEARCH';\nexport const SET_SEARCH_RESULTS = 'SET_SEARCH_RESULTS';\nexport const SET_ACTIVE_RESULT_INDEX = 'SET_ACTIVE_RESULT_INDEX';\n\n// Action Interfaces\nexport interface StartSearchSessionAction extends Action {\n type: typeof START_SEARCH_SESSION;\n}\n\nexport interface StopSearchSessionAction extends Action {\n type: typeof STOP_SEARCH_SESSION;\n}\n\nexport interface SetSearchFlagsAction extends Action {\n type: typeof SET_SEARCH_FLAGS;\n payload: MatchFlag[];\n}\n\nexport interface SetShowAllResultsAction extends Action {\n type: typeof SET_SHOW_ALL_RESULTS;\n payload: boolean;\n}\n\nexport interface StartSearchAction extends Action {\n type: typeof START_SEARCH;\n payload: string;\n}\n\nexport interface SetSearchResultsAction extends Action {\n type: typeof SET_SEARCH_RESULTS;\n payload: {\n results: SearchResult[];\n total: number;\n activeResultIndex: number;\n };\n}\n\nexport interface SetActiveResultIndexAction extends Action {\n type: typeof SET_ACTIVE_RESULT_INDEX;\n payload: number;\n}\n\n// Union Type for All Actions\nexport type SearchAction =\n | StartSearchSessionAction\n | StopSearchSessionAction\n | SetSearchFlagsAction\n | SetShowAllResultsAction\n | StartSearchAction\n | SetSearchResultsAction\n | SetActiveResultIndexAction;\n\n// Action Creators\nexport function startSearchSession(): StartSearchSessionAction {\n return { type: START_SEARCH_SESSION };\n}\n\nexport function stopSearchSession(): StopSearchSessionAction {\n return { type: STOP_SEARCH_SESSION };\n}\n\nexport function setSearchFlags(flags: MatchFlag[]): SetSearchFlagsAction {\n return { type: SET_SEARCH_FLAGS, payload: flags };\n}\n\nexport function setShowAllResults(showAll: boolean): SetShowAllResultsAction {\n return { type: SET_SHOW_ALL_RESULTS, payload: showAll };\n}\n\nexport function startSearch(query: string): StartSearchAction {\n return { type: START_SEARCH, payload: query };\n}\n\nexport function setSearchResults(\n results: SearchResult[],\n total: number,\n activeResultIndex: number,\n): SetSearchResultsAction {\n return { type: SET_SEARCH_RESULTS, payload: { results, total, activeResultIndex } };\n}\n\nexport function setActiveResultIndex(index: number): SetActiveResultIndexAction {\n return { type: SET_ACTIVE_RESULT_INDEX, payload: index };\n}\n","import { BasePlugin, createBehaviorEmitter, PluginRegistry } from '@embedpdf/core';\nimport {\n MatchFlag,\n PdfDocumentObject,\n SearchAllPagesResult,\n TaskError,\n PdfEngine,\n} from '@embedpdf/models';\nimport { SearchPluginConfig, SearchCapability, SearchState, SearchResultState } from './types';\nimport { LoaderCapability, LoaderEvent, LoaderPlugin } from '@embedpdf/plugin-loader';\nimport {\n startSearchSession,\n stopSearchSession,\n setSearchFlags,\n setShowAllResults,\n startSearch,\n setSearchResults,\n setActiveResultIndex,\n SearchAction,\n} from './actions';\n\nexport class SearchPlugin extends BasePlugin<\n SearchPluginConfig,\n SearchCapability,\n SearchState,\n SearchAction\n> {\n static readonly id = 'search' as const;\n private loader: LoaderCapability;\n private currentDocument?: PdfDocumentObject;\n private engine: PdfEngine;\n\n private readonly searchStop$ = createBehaviorEmitter();\n private readonly searchStart$ = createBehaviorEmitter();\n private readonly searchResult$ = createBehaviorEmitter<SearchAllPagesResult>();\n private readonly searchActiveResultChange$ = createBehaviorEmitter<number>();\n private readonly searchResultState$ = createBehaviorEmitter<SearchResultState>();\n private readonly searchState$ = createBehaviorEmitter<SearchState>();\n\n constructor(id: string, registry: PluginRegistry, engine: PdfEngine) {\n super(id, registry);\n this.engine = engine;\n this.loader = this.registry.getPlugin<LoaderPlugin>('loader')!.provides();\n\n this.loader.onDocumentLoaded(this.handleDocumentLoaded.bind(this));\n this.loader.onLoaderEvent(this.handleLoaderEvent.bind(this));\n }\n\n private handleDocumentLoaded(doc: PdfDocumentObject): void {\n this.currentDocument = doc;\n if (this.state.active) {\n this.startSearchSession();\n }\n }\n\n private handleLoaderEvent(event: LoaderEvent): void {\n if (event.type === 'error' || (event.type === 'start' && this.currentDocument)) {\n if (this.state.active) {\n this.stopSearchSession();\n }\n this.currentDocument = undefined;\n }\n }\n\n async initialize(config: SearchPluginConfig): Promise<void> {\n this.dispatch(setSearchFlags(config.flags || []));\n this.dispatch(\n setShowAllResults(config.showAllResults !== undefined ? config.showAllResults : true),\n );\n }\n\n override onStoreUpdated(_prevState: SearchState, newState: SearchState): void {\n this.searchResultState$.emit({\n results: newState.results,\n activeResultIndex: newState.activeResultIndex,\n showAllResults: newState.showAllResults,\n active: newState.active,\n });\n this.searchState$.emit(newState);\n }\n\n protected buildCapability(): SearchCapability {\n return {\n startSearch: this.startSearchSession.bind(this),\n stopSearch: this.stopSearchSession.bind(this),\n searchAllPages: this.searchAllPages.bind(this),\n nextResult: this.nextResult.bind(this),\n previousResult: this.previousResult.bind(this),\n goToResult: this.goToResult.bind(this),\n setShowAllResults: (showAll) => this.dispatch(setShowAllResults(showAll)),\n getShowAllResults: () => this.state.showAllResults,\n onSearchResult: this.searchResult$.on,\n onSearchStart: this.searchStart$.on,\n onSearchStop: this.searchStop$.on,\n onActiveResultChange: this.searchActiveResultChange$.on,\n onSearchResultStateChange: this.searchResultState$.on,\n onStateChange: this.searchState$.on,\n getFlags: () => this.state.flags,\n setFlags: (flags) => this.setFlags(flags),\n getState: () => this.state,\n };\n }\n\n private setFlags(flags: MatchFlag[]): void {\n this.dispatch(setSearchFlags(flags));\n if (this.state.active) {\n this.searchAllPages(this.state.query, true);\n }\n }\n\n private notifySearchStart(): void {\n this.searchStart$.emit();\n }\n\n private notifySearchStop(): void {\n this.searchStop$.emit();\n }\n\n private notifyActiveResultChange(index: number): void {\n this.searchActiveResultChange$.emit(index);\n }\n\n private startSearchSession(): void {\n if (!this.currentDocument) {\n return;\n }\n this.dispatch(startSearchSession());\n this.notifySearchStart();\n }\n\n private stopSearchSession(): void {\n if (!this.currentDocument || !this.getState().active) {\n return;\n }\n this.dispatch(stopSearchSession());\n this.notifySearchStop();\n }\n\n private async searchAllPages(\n keyword: string,\n force: boolean = false,\n ): Promise<SearchAllPagesResult> {\n const trimmedKeyword = keyword.trim();\n\n if (this.state.query === trimmedKeyword && !force) {\n return { results: this.state.results, total: this.state.total };\n }\n\n this.dispatch(startSearch(trimmedKeyword));\n\n if (!trimmedKeyword) {\n this.dispatch(setSearchResults([], 0, -1));\n return { results: [], total: 0 };\n }\n if (!this.currentDocument) {\n this.dispatch(setSearchResults([], 0, -1));\n return { results: [], total: 0 };\n }\n\n if (!this.state.active) {\n this.startSearchSession();\n }\n\n return new Promise<SearchAllPagesResult>((resolve) => {\n this.engine.searchAllPages(this.currentDocument!, trimmedKeyword, this.state.flags).wait(\n (results) => {\n const activeResultIndex = results.total > 0 ? 0 : -1;\n this.dispatch(setSearchResults(results.results, results.total, activeResultIndex));\n this.searchResult$.emit(results);\n if (results.total > 0) {\n this.notifyActiveResultChange(0);\n }\n resolve(results);\n },\n (error: TaskError<any>) => {\n console.error('Error during search:', error);\n this.dispatch(setSearchResults([], 0, -1));\n resolve({ results: [], total: 0 });\n },\n );\n });\n }\n\n private nextResult(): number {\n if (this.state.results.length === 0) {\n return -1;\n }\n const nextIndex =\n this.state.activeResultIndex >= this.state.results.length - 1\n ? 0\n : this.state.activeResultIndex + 1;\n return this.goToResult(nextIndex);\n }\n\n private previousResult(): number {\n if (this.state.results.length === 0) {\n return -1;\n }\n const prevIndex =\n this.state.activeResultIndex <= 0\n ? this.state.results.length - 1\n : this.state.activeResultIndex - 1;\n return this.goToResult(prevIndex);\n }\n\n private goToResult(index: number): number {\n if (this.state.results.length === 0 || index < 0 || index >= this.state.results.length) {\n return -1;\n }\n this.dispatch(setActiveResultIndex(index));\n this.notifyActiveResultChange(index);\n return index;\n }\n\n async destroy(): Promise<void> {\n if (this.state.active && this.currentDocument) {\n this.stopSearchSession();\n }\n this.searchResult$.clear();\n this.searchStart$.clear();\n this.searchStop$.clear();\n this.searchActiveResultChange$.clear();\n this.searchResultState$.clear();\n this.searchState$.clear();\n }\n}\n","import { PluginManifest } from '@embedpdf/core';\nimport { SearchPluginConfig } from './types';\n\nexport const SEARCH_PLUGIN_ID = 'search';\n\nexport const manifest: PluginManifest<SearchPluginConfig> = {\n id: SEARCH_PLUGIN_ID,\n name: 'Search Plugin',\n version: '1.0.0',\n provides: ['search'],\n requires: ['loader'],\n optional: [],\n defaultConfig: {\n enabled: true,\n flags: [],\n },\n};\n","import { Reducer } from '@embedpdf/core';\nimport { SearchState } from './types';\nimport {\n START_SEARCH_SESSION,\n STOP_SEARCH_SESSION,\n SET_SEARCH_FLAGS,\n SET_SHOW_ALL_RESULTS,\n START_SEARCH,\n SET_SEARCH_RESULTS,\n SET_ACTIVE_RESULT_INDEX,\n SearchAction,\n} from './actions';\n\nexport const initialState: SearchState = {\n flags: [],\n results: [],\n total: 0,\n activeResultIndex: -1,\n showAllResults: true,\n query: '',\n loading: false,\n active: false,\n};\n\nexport const searchReducer: Reducer<SearchState, SearchAction> = (state = initialState, action) => {\n switch (action.type) {\n case START_SEARCH_SESSION:\n return { ...state, active: true };\n\n case STOP_SEARCH_SESSION:\n return {\n ...state,\n results: [],\n total: 0,\n activeResultIndex: -1,\n query: '',\n loading: false,\n active: false,\n };\n\n case SET_SEARCH_FLAGS:\n return { ...state, flags: action.payload };\n\n case SET_SHOW_ALL_RESULTS:\n return { ...state, showAllResults: action.payload };\n\n case START_SEARCH:\n return { ...state, loading: true, query: action.payload };\n\n case SET_SEARCH_RESULTS:\n return {\n ...state,\n results: action.payload.results,\n total: action.payload.total,\n activeResultIndex: action.payload.activeResultIndex,\n loading: false,\n };\n\n case SET_ACTIVE_RESULT_INDEX:\n return { ...state, activeResultIndex: action.payload };\n\n default:\n return state;\n }\n};\n","import { PluginPackage } from '@embedpdf/core';\nimport { SearchPlugin } from './search-plugin';\nimport { manifest, SEARCH_PLUGIN_ID } from './manifest';\nimport { SearchPluginConfig, SearchState } from './types';\nimport { searchReducer, initialState } from './reducer';\nimport { SearchAction } from './actions';\n\nexport const SearchPluginPackage: PluginPackage<\n SearchPlugin,\n SearchPluginConfig,\n SearchState,\n SearchAction\n> = {\n manifest,\n create: (registry, engine) => new SearchPlugin(SEARCH_PLUGIN_ID, registry, engine),\n reducer: searchReducer,\n initialState,\n};\n\nexport * from './search-plugin';\nexport * from './types';\nexport * from './manifest';\nexport { initialState };\n"],"names":["START_SEARCH_SESSION","STOP_SEARCH_SESSION","SET_SEARCH_FLAGS","SET_SHOW_ALL_RESULTS","START_SEARCH","SET_SEARCH_RESULTS","SET_ACTIVE_RESULT_INDEX","setSearchFlags","flags","type","payload","setShowAllResults","showAll","setSearchResults","results","total","activeResultIndex","_SearchPlugin","BasePlugin","constructor","id","registry","engine","super","this","searchStop$","createBehaviorEmitter","searchStart$","searchResult$","searchActiveResultChange$","searchResultState$","searchState$","loader","getPlugin","provides","onDocumentLoaded","handleDocumentLoaded","bind","onLoaderEvent","handleLoaderEvent","doc","currentDocument","state","active","startSearchSession","event","stopSearchSession","initialize","config","dispatch","showAllResults","onStoreUpdated","_prevState","newState","emit","buildCapability","startSearch","stopSearch","searchAllPages","nextResult","previousResult","goToResult","getShowAllResults","onSearchResult","on","onSearchStart","onSearchStop","onActiveResultChange","onSearchResultStateChange","onStateChange","getFlags","setFlags","getState","query","notifySearchStart","notifySearchStop","notifyActiveResultChange","index","keyword","force","trimmedKeyword","trim","Promise","resolve","wait","error","console","length","nextIndex","prevIndex","setActiveResultIndex","destroy","clear","SearchPlugin","SEARCH_PLUGIN_ID","manifest","name","version","requires","optional","defaultConfig","enabled","initialState","loading","SearchPluginPackage","create","reducer","action"],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -1,231 +1 @@
1
- import { BasePluginConfig, EventHook, Action, BasePlugin, PluginRegistry, PluginManifest, PluginPackage } from '@embedpdf/core';
2
- import { MatchFlag, SearchAllPagesResult, SearchResult, PdfEngine } from '@embedpdf/models';
3
-
4
- interface SearchPluginConfig extends BasePluginConfig {
5
- flags?: MatchFlag[];
6
- /**
7
- * Whether to show all search results or only the active one
8
- * @default true
9
- */
10
- showAllResults?: boolean;
11
- }
12
- interface SearchResultState {
13
- /**
14
- * Current search results from last search operation
15
- */
16
- results: SearchResult[];
17
- /**
18
- * Current active result index (0-based)
19
- */
20
- activeResultIndex: number;
21
- /**
22
- * Whether to show all search results or only the active one
23
- */
24
- showAllResults: boolean;
25
- /**
26
- * Whether search is currently active
27
- */
28
- active: boolean;
29
- }
30
- interface SearchState {
31
- flags: MatchFlag[];
32
- /**
33
- * Current search results from last search operation
34
- */
35
- results: SearchResult[];
36
- /**
37
- * Total number of search results
38
- */
39
- total: number;
40
- /**
41
- * Current active result index (0-based)
42
- */
43
- activeResultIndex: number;
44
- /**
45
- * Whether to show all search results or only the active one
46
- */
47
- showAllResults: boolean;
48
- /**
49
- * Current search query
50
- */
51
- query: string;
52
- /**
53
- * Whether a search operation is in progress
54
- */
55
- loading: boolean;
56
- /**
57
- * Whether search is currently active
58
- */
59
- active: boolean;
60
- }
61
- interface SearchCapability {
62
- /**
63
- * Start a search session
64
- */
65
- startSearch: () => void;
66
- /**
67
- * Stop the active search session
68
- */
69
- stopSearch: () => void;
70
- /**
71
- * Search for all occurrences of the keyword throughout the document
72
- * @param keyword - Text to search for
73
- * @returns Promise that resolves to all search results or empty result if none found
74
- */
75
- searchAllPages: (keyword: string) => Promise<SearchAllPagesResult>;
76
- /**
77
- * Navigate to the next search result
78
- * @returns The new active result index
79
- */
80
- nextResult: () => number;
81
- /**
82
- * Navigate to the previous search result
83
- * @returns The new active result index
84
- */
85
- previousResult: () => number;
86
- /**
87
- * Go to a specific search result by index
88
- * @param index - The index of the result to go to
89
- * @returns The new active result index
90
- */
91
- goToResult: (index: number) => number;
92
- /**
93
- * Toggle visibility of all search results
94
- * @param showAll - Whether to show all results or only the active one
95
- */
96
- setShowAllResults: (showAll: boolean) => void;
97
- /**
98
- * Get current state of search results visibility
99
- * @returns Whether all results are visible
100
- */
101
- getShowAllResults: () => boolean;
102
- /**
103
- * Subscribe to search results
104
- * @param handler - Handler function to receive search results
105
- * @returns Function to unsubscribe the handler
106
- */
107
- onSearchResult: EventHook<SearchAllPagesResult>;
108
- /**
109
- * Subscribe to search session start events
110
- * @param handler - Handler function called when search session starts
111
- * @returns Function to unsubscribe the handler
112
- */
113
- onSearchStart: EventHook;
114
- /**
115
- * Subscribe to search session stop events
116
- * @param handler - Handler function called when search session stops
117
- * @returns Function to unsubscribe the handler
118
- */
119
- onSearchStop: EventHook;
120
- /**
121
- * Subscribe to active result change events
122
- * @param handler - Handler function called when active result changes
123
- * @returns Function to unsubscribe the handler
124
- */
125
- onActiveResultChange: EventHook<number>;
126
- /**
127
- * Subscribe to search result state change events
128
- * @param handler - Handler function called when search state changes
129
- * @returns Function to unsubscribe the handler
130
- */
131
- onSearchResultStateChange: EventHook<SearchResultState>;
132
- /**
133
- * Get the current search flags
134
- * @returns Array of active search flags
135
- */
136
- getFlags: () => MatchFlag[];
137
- /**
138
- * Set the search flags
139
- * @param flags - Array of search flags to use
140
- */
141
- setFlags: (flags: MatchFlag[]) => void;
142
- /**
143
- * Subscribe to state change events
144
- * @param handler - Handler function called when state changes
145
- * @returns Function to unsubscribe the handler
146
- */
147
- onStateChange: EventHook<SearchState>;
148
- /**
149
- * Get the current search state
150
- * @returns The current search state
151
- */
152
- getState: () => SearchState;
153
- }
154
-
155
- declare const START_SEARCH_SESSION = "START_SEARCH_SESSION";
156
- declare const STOP_SEARCH_SESSION = "STOP_SEARCH_SESSION";
157
- declare const SET_SEARCH_FLAGS = "SET_SEARCH_FLAGS";
158
- declare const SET_SHOW_ALL_RESULTS = "SET_SHOW_ALL_RESULTS";
159
- declare const START_SEARCH = "START_SEARCH";
160
- declare const SET_SEARCH_RESULTS = "SET_SEARCH_RESULTS";
161
- declare const SET_ACTIVE_RESULT_INDEX = "SET_ACTIVE_RESULT_INDEX";
162
- interface StartSearchSessionAction extends Action {
163
- type: typeof START_SEARCH_SESSION;
164
- }
165
- interface StopSearchSessionAction extends Action {
166
- type: typeof STOP_SEARCH_SESSION;
167
- }
168
- interface SetSearchFlagsAction extends Action {
169
- type: typeof SET_SEARCH_FLAGS;
170
- payload: MatchFlag[];
171
- }
172
- interface SetShowAllResultsAction extends Action {
173
- type: typeof SET_SHOW_ALL_RESULTS;
174
- payload: boolean;
175
- }
176
- interface StartSearchAction extends Action {
177
- type: typeof START_SEARCH;
178
- payload: string;
179
- }
180
- interface SetSearchResultsAction extends Action {
181
- type: typeof SET_SEARCH_RESULTS;
182
- payload: {
183
- results: SearchResult[];
184
- total: number;
185
- activeResultIndex: number;
186
- };
187
- }
188
- interface SetActiveResultIndexAction extends Action {
189
- type: typeof SET_ACTIVE_RESULT_INDEX;
190
- payload: number;
191
- }
192
- type SearchAction = StartSearchSessionAction | StopSearchSessionAction | SetSearchFlagsAction | SetShowAllResultsAction | StartSearchAction | SetSearchResultsAction | SetActiveResultIndexAction;
193
-
194
- declare class SearchPlugin extends BasePlugin<SearchPluginConfig, SearchCapability, SearchState, SearchAction> {
195
- static readonly id: "search";
196
- private loader;
197
- private currentDocument?;
198
- private engine;
199
- private readonly searchStop$;
200
- private readonly searchStart$;
201
- private readonly searchResult$;
202
- private readonly searchActiveResultChange$;
203
- private readonly searchResultState$;
204
- private readonly searchState$;
205
- constructor(id: string, registry: PluginRegistry, engine: PdfEngine);
206
- private handleDocumentLoaded;
207
- private handleLoaderEvent;
208
- initialize(config: SearchPluginConfig): Promise<void>;
209
- onStoreUpdated(_prevState: SearchState, newState: SearchState): void;
210
- protected buildCapability(): SearchCapability;
211
- private setFlags;
212
- private notifySearchStart;
213
- private notifySearchStop;
214
- private notifyActiveResultChange;
215
- private startSearchSession;
216
- private stopSearchSession;
217
- private searchAllPages;
218
- private nextResult;
219
- private previousResult;
220
- private goToResult;
221
- destroy(): Promise<void>;
222
- }
223
-
224
- declare const initialState: SearchState;
225
-
226
- declare const SEARCH_PLUGIN_ID = "search";
227
- declare const manifest: PluginManifest<SearchPluginConfig>;
228
-
229
- declare const SearchPluginPackage: PluginPackage<SearchPlugin, SearchPluginConfig, SearchState, SearchAction>;
230
-
231
- export { SEARCH_PLUGIN_ID, type SearchCapability, SearchPlugin, type SearchPluginConfig, SearchPluginPackage, type SearchResultState, type SearchState, initialState, manifest };
1
+ export * from './lib';