@pallasoft/ps-file-components 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ps-file-search-bar.d.ts +10 -0
- package/dist/components/ps-file-search-bar.js +25 -0
- package/dist/components/ps-file-viewer-content.js +9 -0
- package/dist/components/ps-file-viewer-pane.d.ts +1 -1
- package/dist/components/ps-file-viewer-pane.js +26 -2
- package/dist/components/ps-file-viewer.js +11 -23
- package/dist/components/ps-html-document.d.ts +8 -0
- package/dist/components/ps-html-document.js +23 -0
- package/dist/components/ps-html-viewer.d.ts +2 -0
- package/dist/components/ps-html-viewer.js +17 -0
- package/dist/components/ps-image-text-highlights.d.ts +9 -0
- package/dist/components/ps-image-text-highlights.js +31 -0
- package/dist/components/ps-image-viewer.d.ts +1 -1
- package/dist/components/ps-image-viewer.js +11 -2
- package/dist/components/ps-pdf-page.js +1 -1
- package/dist/components/ps-pdf-viewer.js +6 -2
- package/dist/components/ps-sheet-viewer.d.ts +2 -0
- package/dist/components/ps-sheet-viewer.js +26 -0
- package/dist/components/ps-table-view.d.ts +7 -0
- package/dist/components/ps-table-view.js +17 -0
- package/dist/components/ps-text-viewer.js +7 -14
- package/dist/components/ps-word-viewer.d.ts +2 -0
- package/dist/components/ps-word-viewer.js +17 -0
- package/dist/constants/ps-file-kind-icons.js +3 -0
- package/dist/constants/ps-file-kind.d.ts +3 -0
- package/dist/constants/ps-file-kind.js +3 -0
- package/dist/constants/ps-file-type-config.d.ts +6 -1
- package/dist/constants/ps-file-type-config.js +16 -2
- package/dist/constants/ps-file-viewer-config.d.ts +1 -0
- package/dist/constants/ps-file-viewer-config.js +1 -0
- package/dist/constants/ps-file-viewer-kinds.d.ts +2 -2
- package/dist/constants/ps-file-viewer-kinds.js +17 -2
- package/dist/constants/ps-file-viewer-labels.d.ts +3 -0
- package/dist/constants/ps-file-viewer-labels.js +3 -0
- package/dist/constants/ps-html-sanitize-config.d.ts +8 -0
- package/dist/constants/ps-html-sanitize-config.js +26 -0
- package/dist/esm/components/ps-file-search-bar.js +21 -0
- package/dist/esm/components/ps-file-viewer-content.js +9 -0
- package/dist/esm/components/ps-file-viewer-pane.js +27 -3
- package/dist/esm/components/ps-file-viewer.js +13 -25
- package/dist/esm/components/ps-html-document.js +19 -0
- package/dist/esm/components/ps-html-viewer.js +13 -0
- package/dist/esm/components/ps-image-text-highlights.js +27 -0
- package/dist/esm/components/ps-image-viewer.js +13 -4
- package/dist/esm/components/ps-pdf-page.js +1 -1
- package/dist/esm/components/ps-pdf-viewer.js +6 -2
- package/dist/esm/components/ps-sheet-viewer.js +22 -0
- package/dist/esm/components/ps-table-view.js +13 -0
- package/dist/esm/components/ps-text-viewer.js +7 -14
- package/dist/esm/components/ps-word-viewer.js +13 -0
- package/dist/esm/constants/ps-file-kind-icons.js +3 -0
- package/dist/esm/constants/ps-file-kind.js +3 -0
- package/dist/esm/constants/ps-file-type-config.js +16 -2
- package/dist/esm/constants/ps-file-viewer-config.js +1 -0
- package/dist/esm/constants/ps-file-viewer-kinds.js +17 -2
- package/dist/esm/constants/ps-file-viewer-labels.js +3 -0
- package/dist/esm/constants/ps-html-sanitize-config.js +23 -0
- package/dist/esm/hooks/use-ps-file-search.js +37 -0
- package/dist/esm/hooks/use-ps-file-text.js +4 -19
- package/dist/esm/hooks/use-ps-find-shortcut.js +23 -0
- package/dist/esm/hooks/use-ps-loaded-file.js +19 -0
- package/dist/esm/index.js +33 -0
- package/dist/esm/models/ps-file-search-state.js +1 -0
- package/dist/esm/models/ps-html-highlight-result.js +1 -0
- package/dist/esm/models/ps-html-text-node.js +1 -0
- package/dist/esm/models/ps-image-match.js +1 -0
- package/dist/esm/models/ps-image-text-box.js +1 -0
- package/dist/esm/models/ps-image-text-layer.js +1 -0
- package/dist/esm/models/ps-image-text-word.js +1 -0
- package/dist/esm/models/ps-item-match-part.js +1 -0
- package/dist/esm/models/ps-item-match.js +1 -0
- package/dist/esm/models/ps-loaded-file-state.js +1 -0
- package/dist/esm/models/ps-normalized-text.js +1 -0
- package/dist/esm/models/ps-pdf-text-item.js +1 -0
- package/dist/esm/models/ps-pdf-viewport-like.js +1 -0
- package/dist/esm/models/ps-search-item.js +1 -0
- package/dist/esm/models/ps-sheet-data.js +1 -0
- package/dist/esm/services/ps-file-fetch-service.js +14 -0
- package/dist/esm/services/ps-file-search-service.js +15 -0
- package/dist/esm/services/ps-file-type-service.js +12 -1
- package/dist/esm/services/ps-html-file-service.js +7 -0
- package/dist/esm/services/ps-html-service.js +83 -0
- package/dist/esm/services/ps-image-text-service.js +28 -0
- package/dist/esm/services/ps-label-service.js +5 -0
- package/dist/esm/services/ps-pdf-service.js +39 -16
- package/dist/esm/services/ps-sheet-service.js +23 -0
- package/dist/esm/services/ps-text-search-service.js +70 -5
- package/dist/esm/services/ps-word-service.js +15 -0
- package/dist/hooks/use-ps-file-search.d.ts +2 -0
- package/dist/hooks/use-ps-file-search.js +41 -0
- package/dist/hooks/use-ps-file-text.js +4 -19
- package/dist/hooks/use-ps-find-shortcut.d.ts +2 -0
- package/dist/hooks/use-ps-find-shortcut.js +27 -0
- package/dist/hooks/use-ps-loaded-file.d.ts +2 -0
- package/dist/hooks/use-ps-loaded-file.js +23 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +33 -0
- package/dist/models/ps-file-search-state.d.ts +13 -0
- package/dist/models/ps-file-search-state.js +2 -0
- package/dist/models/ps-file-viewer-pane-props.d.ts +3 -1
- package/dist/models/ps-html-highlight-result.d.ts +4 -0
- package/dist/models/ps-html-highlight-result.js +2 -0
- package/dist/models/ps-html-text-node.d.ts +4 -0
- package/dist/models/ps-html-text-node.js +2 -0
- package/dist/models/ps-image-match.d.ts +7 -0
- package/dist/models/ps-image-match.js +2 -0
- package/dist/models/ps-image-text-box.d.ts +6 -0
- package/dist/models/ps-image-text-box.js +2 -0
- package/dist/models/ps-image-text-layer.d.ts +6 -0
- package/dist/models/ps-image-text-layer.js +2 -0
- package/dist/models/ps-image-text-word.d.ts +5 -0
- package/dist/models/ps-image-text-word.js +2 -0
- package/dist/models/ps-item-match-part.d.ts +5 -0
- package/dist/models/ps-item-match-part.js +2 -0
- package/dist/models/ps-item-match.d.ts +4 -0
- package/dist/models/ps-item-match.js +2 -0
- package/dist/models/ps-loaded-file-state.d.ts +4 -0
- package/dist/models/ps-loaded-file-state.js +2 -0
- package/dist/models/ps-normalized-text.d.ts +5 -0
- package/dist/models/ps-normalized-text.js +2 -0
- package/dist/models/ps-pdf-match.d.ts +1 -0
- package/dist/models/ps-pdf-text-item.d.ts +7 -0
- package/dist/models/ps-pdf-text-item.js +2 -0
- package/dist/models/ps-pdf-viewport-like.d.ts +5 -0
- package/dist/models/ps-pdf-viewport-like.js +2 -0
- package/dist/models/ps-search-item.d.ts +4 -0
- package/dist/models/ps-search-item.js +2 -0
- package/dist/models/ps-sheet-data.d.ts +4 -0
- package/dist/models/ps-sheet-data.js +2 -0
- package/dist/models/ps-viewer-file.d.ts +2 -0
- package/dist/services/ps-file-fetch-service.d.ts +5 -0
- package/dist/services/ps-file-fetch-service.js +18 -0
- package/dist/services/ps-file-search-service.d.ts +5 -0
- package/dist/services/ps-file-search-service.js +19 -0
- package/dist/services/ps-file-type-service.js +12 -1
- package/dist/services/ps-html-file-service.d.ts +3 -0
- package/dist/services/ps-html-file-service.js +11 -0
- package/dist/services/ps-html-service.d.ts +7 -0
- package/dist/services/ps-html-service.js +120 -0
- package/dist/services/ps-image-text-service.d.ts +5 -0
- package/dist/services/ps-image-text-service.js +32 -0
- package/dist/services/ps-label-service.d.ts +3 -0
- package/dist/services/ps-label-service.js +9 -0
- package/dist/services/ps-pdf-service.d.ts +3 -0
- package/dist/services/ps-pdf-service.js +39 -16
- package/dist/services/ps-sheet-service.d.ts +5 -0
- package/dist/services/ps-sheet-service.js +60 -0
- package/dist/services/ps-text-search-service.d.ts +7 -0
- package/dist/services/ps-text-search-service.js +70 -5
- package/dist/services/ps-word-service.d.ts +3 -0
- package/dist/services/ps-word-service.js +52 -0
- package/package.json +5 -2
|
@@ -30,31 +30,54 @@ export class PsPdfService {
|
|
|
30
30
|
task.promise.catch(() => undefined);
|
|
31
31
|
return task;
|
|
32
32
|
}
|
|
33
|
+
static pageMatches(items, viewport, query, pageNumber, firstIndex) {
|
|
34
|
+
const found = PsTextSearchService.findInItems(items.map((item) => ({ isBreakAfter: item.hasEOL, text: item.str })), query);
|
|
35
|
+
const rects = [];
|
|
36
|
+
found.forEach((match, offset) => {
|
|
37
|
+
match.parts.forEach((part) => {
|
|
38
|
+
const item = items[part.itemIndex];
|
|
39
|
+
const [x, y] = [item.transform[4], item.transform[5]];
|
|
40
|
+
const height = item.height > 0 ? item.height : Math.hypot(item.transform[2], item.transform[3]);
|
|
41
|
+
const start = x + (item.width * part.start) / item.str.length;
|
|
42
|
+
const end = x + (item.width * part.end) / item.str.length;
|
|
43
|
+
const [x1, y1] = viewport.convertToViewportPoint(start, y);
|
|
44
|
+
const [x2, y2] = viewport.convertToViewportPoint(end, y + height);
|
|
45
|
+
rects.push({
|
|
46
|
+
height: Math.abs(y2 - y1) / viewport.height,
|
|
47
|
+
left: Math.min(x1, x2) / viewport.width,
|
|
48
|
+
matchIndex: firstIndex + offset,
|
|
49
|
+
pageNumber,
|
|
50
|
+
top: Math.min(y1, y2) / viewport.height,
|
|
51
|
+
width: Math.abs(x2 - x1) / viewport.width,
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
return rects;
|
|
56
|
+
}
|
|
33
57
|
static async search(document, query, rotation) {
|
|
34
58
|
const matches = [];
|
|
59
|
+
let count = 0;
|
|
60
|
+
if (query.trim().length === 0)
|
|
61
|
+
return matches;
|
|
35
62
|
for (let pageNumber = 1; pageNumber <= document.numPages; pageNumber += 1) {
|
|
36
63
|
const page = await document.getPage(pageNumber);
|
|
37
64
|
const viewport = page.getViewport({ rotation: page.rotate + rotation, scale: 1 });
|
|
38
65
|
const content = await page.getTextContent();
|
|
66
|
+
const items = [];
|
|
39
67
|
content.items.forEach((item) => {
|
|
40
|
-
if (
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const [x1, y1] = viewport.convertToViewportPoint(start, y);
|
|
48
|
-
const [x2, y2] = viewport.convertToViewportPoint(end, y + height);
|
|
49
|
-
matches.push({
|
|
50
|
-
height: Math.abs(y2 - y1) / viewport.height,
|
|
51
|
-
left: Math.min(x1, x2) / viewport.width,
|
|
52
|
-
pageNumber,
|
|
53
|
-
top: Math.min(y1, y2) / viewport.height,
|
|
54
|
-
width: Math.abs(x2 - x1) / viewport.width,
|
|
68
|
+
if ('str' in item)
|
|
69
|
+
items.push({
|
|
70
|
+
hasEOL: item.hasEOL,
|
|
71
|
+
height: item.height,
|
|
72
|
+
str: item.str,
|
|
73
|
+
transform: item.transform,
|
|
74
|
+
width: item.width,
|
|
55
75
|
});
|
|
56
|
-
});
|
|
57
76
|
});
|
|
77
|
+
const found = PsPdfService.pageMatches(items, viewport, query, pageNumber, count);
|
|
78
|
+
if (found.length > 0)
|
|
79
|
+
count = found[found.length - 1].matchIndex + 1;
|
|
80
|
+
matches.push(...found);
|
|
58
81
|
}
|
|
59
82
|
return matches;
|
|
60
83
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { PsFileFetchService } from './ps-file-fetch-service';
|
|
2
|
+
export class PsSheetService {
|
|
3
|
+
static async load(url, signal) {
|
|
4
|
+
const [buffer, library] = await Promise.all([
|
|
5
|
+
PsFileFetchService.buffer(url, signal),
|
|
6
|
+
import('read-excel-file/browser'),
|
|
7
|
+
]);
|
|
8
|
+
const sheets = await library.default(buffer);
|
|
9
|
+
return sheets.map((sheet) => ({
|
|
10
|
+
name: sheet.sheet,
|
|
11
|
+
rows: sheet.data.map((row) => row.map((cell) => PsSheetService.cellText(cell))),
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
static cellText(value) {
|
|
15
|
+
if (typeof value === 'string')
|
|
16
|
+
return value;
|
|
17
|
+
if (typeof value === 'number' || typeof value === 'boolean')
|
|
18
|
+
return String(value);
|
|
19
|
+
if (value instanceof Date)
|
|
20
|
+
return Number.isNaN(value.getTime()) ? '' : value.toISOString().slice(0, 10);
|
|
21
|
+
return '';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -1,17 +1,70 @@
|
|
|
1
|
+
const whitespace = /\s/u;
|
|
2
|
+
const marks = /\p{M}/gu;
|
|
1
3
|
export class PsTextSearchService {
|
|
4
|
+
static normalize(text) {
|
|
5
|
+
const starts = [];
|
|
6
|
+
const ends = [];
|
|
7
|
+
let folded = '';
|
|
8
|
+
let isAfterSpace = false;
|
|
9
|
+
let index = 0;
|
|
10
|
+
while (index < text.length) {
|
|
11
|
+
const char = String.fromCodePoint(text.codePointAt(index));
|
|
12
|
+
const next = index + char.length;
|
|
13
|
+
if (whitespace.test(char)) {
|
|
14
|
+
if (!isAfterSpace) {
|
|
15
|
+
folded += ' ';
|
|
16
|
+
starts.push(index);
|
|
17
|
+
ends.push(next);
|
|
18
|
+
}
|
|
19
|
+
isAfterSpace = true;
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
const plain = char.toLowerCase().normalize('NFD').replace(marks, '');
|
|
23
|
+
for (let at = 0; at < plain.length; at += 1) {
|
|
24
|
+
folded += plain[at];
|
|
25
|
+
starts.push(index);
|
|
26
|
+
ends.push(next);
|
|
27
|
+
}
|
|
28
|
+
isAfterSpace = false;
|
|
29
|
+
}
|
|
30
|
+
index = next;
|
|
31
|
+
}
|
|
32
|
+
return { ends, starts, text: folded };
|
|
33
|
+
}
|
|
2
34
|
static find(text, query) {
|
|
3
|
-
const needle = query.trim().
|
|
35
|
+
const needle = PsTextSearchService.normalize(query.trim()).text;
|
|
4
36
|
if (needle.length === 0)
|
|
5
37
|
return [];
|
|
6
|
-
const haystack =
|
|
38
|
+
const haystack = PsTextSearchService.normalize(text);
|
|
7
39
|
const matches = [];
|
|
8
|
-
let from = haystack.indexOf(needle);
|
|
40
|
+
let from = haystack.text.indexOf(needle);
|
|
9
41
|
while (from !== -1) {
|
|
10
|
-
matches.push({
|
|
11
|
-
|
|
42
|
+
matches.push({
|
|
43
|
+
end: haystack.ends[from + needle.length - 1],
|
|
44
|
+
start: haystack.starts[from],
|
|
45
|
+
});
|
|
46
|
+
from = haystack.text.indexOf(needle, from + needle.length);
|
|
12
47
|
}
|
|
13
48
|
return matches;
|
|
14
49
|
}
|
|
50
|
+
static findInItems(items, query) {
|
|
51
|
+
const offsets = [];
|
|
52
|
+
let joined = '';
|
|
53
|
+
items.forEach((item) => {
|
|
54
|
+
offsets.push(joined.length);
|
|
55
|
+
joined += item.isBreakAfter ? `${item.text} ` : item.text;
|
|
56
|
+
});
|
|
57
|
+
return PsTextSearchService.find(joined, query).map((match) => {
|
|
58
|
+
const parts = [];
|
|
59
|
+
items.forEach((item, itemIndex) => {
|
|
60
|
+
const start = Math.max(match.start, offsets[itemIndex]) - offsets[itemIndex];
|
|
61
|
+
const end = Math.min(match.end, offsets[itemIndex] + item.text.length) - offsets[itemIndex];
|
|
62
|
+
if (end > start)
|
|
63
|
+
parts.push({ end, itemIndex, start });
|
|
64
|
+
});
|
|
65
|
+
return { parts };
|
|
66
|
+
});
|
|
67
|
+
}
|
|
15
68
|
static segments(text, matches, firstIndex = 0) {
|
|
16
69
|
const segments = [];
|
|
17
70
|
let cursor = 0;
|
|
@@ -29,4 +82,16 @@ export class PsTextSearchService {
|
|
|
29
82
|
segments.push({ isMatch: false, matchIndex: null, text: text.slice(cursor) });
|
|
30
83
|
return segments;
|
|
31
84
|
}
|
|
85
|
+
static tableSegments(rows, query) {
|
|
86
|
+
let offset = 0;
|
|
87
|
+
return rows.map((row) => row.map((cell) => {
|
|
88
|
+
const matches = PsTextSearchService.find(cell, query);
|
|
89
|
+
const segments = PsTextSearchService.segments(cell, matches, offset);
|
|
90
|
+
offset += matches.length;
|
|
91
|
+
return segments;
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
static countSegments(table) {
|
|
95
|
+
return table.reduce((total, row) => total + row.reduce((sum, cell) => sum + cell.filter((part) => part.isMatch).length, 0), 0);
|
|
96
|
+
}
|
|
32
97
|
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { PsFileFetchService } from './ps-file-fetch-service';
|
|
2
|
+
import { PsHtmlService } from './ps-html-service';
|
|
3
|
+
export class PsWordService {
|
|
4
|
+
static async load(url, signal) {
|
|
5
|
+
const [buffer, library] = await Promise.all([
|
|
6
|
+
PsFileFetchService.buffer(url, signal),
|
|
7
|
+
import('mammoth/mammoth.browser'),
|
|
8
|
+
]);
|
|
9
|
+
const convert = typeof library.convertToHtml === 'function'
|
|
10
|
+
? library.convertToHtml
|
|
11
|
+
: library.default.convertToHtml;
|
|
12
|
+
const result = await convert({ arrayBuffer: buffer });
|
|
13
|
+
return PsHtmlService.sanitize(result.value, true);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usePsFileSearch = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ps_core_components_1 = require("@pallasoft/ps-core-components");
|
|
6
|
+
const ps_file_viewer_config_1 = require("../constants/ps-file-viewer-config");
|
|
7
|
+
const usePsFileSearch = (resetKey) => {
|
|
8
|
+
const [search, setSearch] = (0, react_1.useState)('');
|
|
9
|
+
const [activeMatch, setActiveMatch] = (0, react_1.useState)(0);
|
|
10
|
+
const [matchCount, setMatchCount] = (0, react_1.useState)(0);
|
|
11
|
+
const inputRef = (0, react_1.useRef)(null);
|
|
12
|
+
const query = (0, ps_core_components_1.usePsDebouncedValue)(search, ps_file_viewer_config_1.PsFileViewerConfig.searchDebounceMs);
|
|
13
|
+
const reset = (0, react_1.useCallback)(() => {
|
|
14
|
+
setSearch('');
|
|
15
|
+
setActiveMatch(0);
|
|
16
|
+
setMatchCount(0);
|
|
17
|
+
}, []);
|
|
18
|
+
(0, react_1.useEffect)(reset, [resetKey]);
|
|
19
|
+
(0, react_1.useEffect)(() => setActiveMatch(0), [query]);
|
|
20
|
+
const focus = (0, react_1.useCallback)(() => {
|
|
21
|
+
inputRef.current?.focus();
|
|
22
|
+
inputRef.current?.select();
|
|
23
|
+
}, []);
|
|
24
|
+
const step = (0, react_1.useCallback)((delta) => {
|
|
25
|
+
if (matchCount > 0)
|
|
26
|
+
setActiveMatch((current) => (current + delta + matchCount) % matchCount);
|
|
27
|
+
}, [matchCount]);
|
|
28
|
+
return {
|
|
29
|
+
activeMatch,
|
|
30
|
+
focus,
|
|
31
|
+
inputRef,
|
|
32
|
+
matchCount,
|
|
33
|
+
query,
|
|
34
|
+
reset,
|
|
35
|
+
search,
|
|
36
|
+
setMatchCount,
|
|
37
|
+
setSearch,
|
|
38
|
+
step,
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
exports.usePsFileSearch = usePsFileSearch;
|
|
@@ -1,25 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.usePsFileText = void 0;
|
|
4
|
-
const
|
|
4
|
+
const ps_file_fetch_service_1 = require("../services/ps-file-fetch-service");
|
|
5
|
+
const use_ps_loaded_file_1 = require("./use-ps-loaded-file");
|
|
5
6
|
const usePsFileText = (url) => {
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
const controller = new AbortController();
|
|
9
|
-
setState({ hasFailed: false, text: null });
|
|
10
|
-
fetch(url, { credentials: 'include', signal: controller.signal })
|
|
11
|
-
.then((response) => {
|
|
12
|
-
if (!response.ok)
|
|
13
|
-
throw new Error(response.statusText);
|
|
14
|
-
return response.text();
|
|
15
|
-
})
|
|
16
|
-
.then((text) => setState({ hasFailed: false, text }))
|
|
17
|
-
.catch(() => {
|
|
18
|
-
if (!controller.signal.aborted)
|
|
19
|
-
setState({ hasFailed: true, text: null });
|
|
20
|
-
});
|
|
21
|
-
return () => controller.abort();
|
|
22
|
-
}, [url]);
|
|
23
|
-
return state;
|
|
7
|
+
const { hasFailed, value } = (0, use_ps_loaded_file_1.usePsLoadedFile)(url, ps_file_fetch_service_1.PsFileFetchService.text);
|
|
8
|
+
return { hasFailed, text: value };
|
|
24
9
|
};
|
|
25
10
|
exports.usePsFileText = usePsFileText;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usePsFindShortcut = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const ps_file_search_service_1 = require("../services/ps-file-search-service");
|
|
6
|
+
const usePsFindShortcut = (scope, isEnabled, onFind) => {
|
|
7
|
+
(0, react_1.useEffect)(() => {
|
|
8
|
+
if (!isEnabled)
|
|
9
|
+
return;
|
|
10
|
+
const onKey = (event) => {
|
|
11
|
+
if (!ps_file_search_service_1.PsFileSearchService.isFindShortcut(event))
|
|
12
|
+
return;
|
|
13
|
+
if (scope !== null) {
|
|
14
|
+
const node = scope.current;
|
|
15
|
+
if (node === null)
|
|
16
|
+
return;
|
|
17
|
+
if (!node.contains(document.activeElement) && !node.matches(':hover'))
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
event.preventDefault();
|
|
21
|
+
onFind();
|
|
22
|
+
};
|
|
23
|
+
window.addEventListener('keydown', onKey);
|
|
24
|
+
return () => window.removeEventListener('keydown', onKey);
|
|
25
|
+
}, [scope, isEnabled, onFind]);
|
|
26
|
+
};
|
|
27
|
+
exports.usePsFindShortcut = usePsFindShortcut;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.usePsLoadedFile = void 0;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const usePsLoadedFile = (url, load) => {
|
|
6
|
+
const [state, setState] = (0, react_1.useState)({ hasFailed: false, value: null });
|
|
7
|
+
(0, react_1.useEffect)(() => {
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
setState({ hasFailed: false, value: null });
|
|
10
|
+
load(url, controller.signal)
|
|
11
|
+
.then((value) => {
|
|
12
|
+
if (!controller.signal.aborted)
|
|
13
|
+
setState({ hasFailed: false, value });
|
|
14
|
+
})
|
|
15
|
+
.catch(() => {
|
|
16
|
+
if (!controller.signal.aborted)
|
|
17
|
+
setState({ hasFailed: true, value: null });
|
|
18
|
+
});
|
|
19
|
+
return () => controller.abort();
|
|
20
|
+
}, [url, load]);
|
|
21
|
+
return state;
|
|
22
|
+
};
|
|
23
|
+
exports.usePsLoadedFile = usePsLoadedFile;
|
package/dist/index.d.ts
CHANGED
|
@@ -18,6 +18,13 @@ export * from './components/ps-text-viewer';
|
|
|
18
18
|
export * from './components/ps-unsupported-viewer';
|
|
19
19
|
export * from './components/ps-upload-modal';
|
|
20
20
|
export * from './components/ps-upload-row';
|
|
21
|
+
export * from './components/ps-file-search-bar';
|
|
22
|
+
export * from './components/ps-html-document';
|
|
23
|
+
export * from './components/ps-html-viewer';
|
|
24
|
+
export * from './components/ps-image-text-highlights';
|
|
25
|
+
export * from './components/ps-sheet-viewer';
|
|
26
|
+
export * from './components/ps-table-view';
|
|
27
|
+
export * from './components/ps-word-viewer';
|
|
21
28
|
export * from './constants/ps-file-icon-button-classes';
|
|
22
29
|
export * from './constants/ps-file-kind-icons';
|
|
23
30
|
export * from './constants/ps-file-kind';
|
|
@@ -33,6 +40,7 @@ export * from './constants/ps-upload-messages';
|
|
|
33
40
|
export * from './constants/ps-upload-queue-config';
|
|
34
41
|
export * from './constants/ps-upload-status-tones';
|
|
35
42
|
export * from './constants/ps-upload-status';
|
|
43
|
+
export * from './constants/ps-html-sanitize-config';
|
|
36
44
|
export * from './models/ps-drag-pan-handlers';
|
|
37
45
|
export * from './models/ps-drag-pan-options';
|
|
38
46
|
export * from './models/ps-file-icon-button-tone';
|
|
@@ -59,6 +67,20 @@ export * from './models/ps-viewer-file';
|
|
|
59
67
|
export * from './models/ps-xhr-response-type';
|
|
60
68
|
export * from './models/ps-xhr-upload-request';
|
|
61
69
|
export * from './models/ps-xhr-upload-response';
|
|
70
|
+
export * from './models/ps-file-search-state';
|
|
71
|
+
export * from './models/ps-html-highlight-result';
|
|
72
|
+
export * from './models/ps-image-match';
|
|
73
|
+
export * from './models/ps-image-text-box';
|
|
74
|
+
export * from './models/ps-image-text-layer';
|
|
75
|
+
export * from './models/ps-image-text-word';
|
|
76
|
+
export * from './models/ps-item-match';
|
|
77
|
+
export * from './models/ps-item-match-part';
|
|
78
|
+
export * from './models/ps-loaded-file-state';
|
|
79
|
+
export * from './models/ps-normalized-text';
|
|
80
|
+
export * from './models/ps-pdf-text-item';
|
|
81
|
+
export * from './models/ps-pdf-viewport-like';
|
|
82
|
+
export * from './models/ps-search-item';
|
|
83
|
+
export * from './models/ps-sheet-data';
|
|
62
84
|
export * from './services/ps-csv-service';
|
|
63
85
|
export * from './services/ps-file-selection-service';
|
|
64
86
|
export * from './services/ps-file-size-service';
|
|
@@ -67,11 +89,22 @@ export * from './services/ps-pdf-service';
|
|
|
67
89
|
export * from './services/ps-text-search-service';
|
|
68
90
|
export * from './services/ps-upload-queue-service';
|
|
69
91
|
export * from './services/ps-xhr-upload-service';
|
|
92
|
+
export * from './services/ps-file-fetch-service';
|
|
93
|
+
export * from './services/ps-file-search-service';
|
|
94
|
+
export * from './services/ps-html-file-service';
|
|
95
|
+
export * from './services/ps-html-service';
|
|
96
|
+
export * from './services/ps-image-text-service';
|
|
97
|
+
export * from './services/ps-label-service';
|
|
98
|
+
export * from './services/ps-sheet-service';
|
|
99
|
+
export * from './services/ps-word-service';
|
|
70
100
|
export * from './hooks/use-ps-active-match-scroll';
|
|
71
101
|
export * from './hooks/use-ps-drag-pan';
|
|
72
102
|
export * from './hooks/use-ps-file-text';
|
|
73
103
|
export * from './hooks/use-ps-in-view';
|
|
74
104
|
export * from './hooks/use-ps-upload-queue';
|
|
105
|
+
export * from './hooks/use-ps-file-search';
|
|
106
|
+
export * from './hooks/use-ps-find-shortcut';
|
|
107
|
+
export * from './hooks/use-ps-loaded-file';
|
|
75
108
|
export * from './components/ps-document-scanner';
|
|
76
109
|
export * from './constants/ps-document-scanner-labels';
|
|
77
110
|
export * from './constants/ps-scan-format';
|
package/dist/index.js
CHANGED
|
@@ -34,6 +34,13 @@ __exportStar(require("./components/ps-text-viewer"), exports);
|
|
|
34
34
|
__exportStar(require("./components/ps-unsupported-viewer"), exports);
|
|
35
35
|
__exportStar(require("./components/ps-upload-modal"), exports);
|
|
36
36
|
__exportStar(require("./components/ps-upload-row"), exports);
|
|
37
|
+
__exportStar(require("./components/ps-file-search-bar"), exports);
|
|
38
|
+
__exportStar(require("./components/ps-html-document"), exports);
|
|
39
|
+
__exportStar(require("./components/ps-html-viewer"), exports);
|
|
40
|
+
__exportStar(require("./components/ps-image-text-highlights"), exports);
|
|
41
|
+
__exportStar(require("./components/ps-sheet-viewer"), exports);
|
|
42
|
+
__exportStar(require("./components/ps-table-view"), exports);
|
|
43
|
+
__exportStar(require("./components/ps-word-viewer"), exports);
|
|
37
44
|
__exportStar(require("./constants/ps-file-icon-button-classes"), exports);
|
|
38
45
|
__exportStar(require("./constants/ps-file-kind-icons"), exports);
|
|
39
46
|
__exportStar(require("./constants/ps-file-kind"), exports);
|
|
@@ -49,6 +56,7 @@ __exportStar(require("./constants/ps-upload-messages"), exports);
|
|
|
49
56
|
__exportStar(require("./constants/ps-upload-queue-config"), exports);
|
|
50
57
|
__exportStar(require("./constants/ps-upload-status-tones"), exports);
|
|
51
58
|
__exportStar(require("./constants/ps-upload-status"), exports);
|
|
59
|
+
__exportStar(require("./constants/ps-html-sanitize-config"), exports);
|
|
52
60
|
__exportStar(require("./models/ps-drag-pan-handlers"), exports);
|
|
53
61
|
__exportStar(require("./models/ps-drag-pan-options"), exports);
|
|
54
62
|
__exportStar(require("./models/ps-file-icon-button-tone"), exports);
|
|
@@ -75,6 +83,20 @@ __exportStar(require("./models/ps-viewer-file"), exports);
|
|
|
75
83
|
__exportStar(require("./models/ps-xhr-response-type"), exports);
|
|
76
84
|
__exportStar(require("./models/ps-xhr-upload-request"), exports);
|
|
77
85
|
__exportStar(require("./models/ps-xhr-upload-response"), exports);
|
|
86
|
+
__exportStar(require("./models/ps-file-search-state"), exports);
|
|
87
|
+
__exportStar(require("./models/ps-html-highlight-result"), exports);
|
|
88
|
+
__exportStar(require("./models/ps-image-match"), exports);
|
|
89
|
+
__exportStar(require("./models/ps-image-text-box"), exports);
|
|
90
|
+
__exportStar(require("./models/ps-image-text-layer"), exports);
|
|
91
|
+
__exportStar(require("./models/ps-image-text-word"), exports);
|
|
92
|
+
__exportStar(require("./models/ps-item-match"), exports);
|
|
93
|
+
__exportStar(require("./models/ps-item-match-part"), exports);
|
|
94
|
+
__exportStar(require("./models/ps-loaded-file-state"), exports);
|
|
95
|
+
__exportStar(require("./models/ps-normalized-text"), exports);
|
|
96
|
+
__exportStar(require("./models/ps-pdf-text-item"), exports);
|
|
97
|
+
__exportStar(require("./models/ps-pdf-viewport-like"), exports);
|
|
98
|
+
__exportStar(require("./models/ps-search-item"), exports);
|
|
99
|
+
__exportStar(require("./models/ps-sheet-data"), exports);
|
|
78
100
|
__exportStar(require("./services/ps-csv-service"), exports);
|
|
79
101
|
__exportStar(require("./services/ps-file-selection-service"), exports);
|
|
80
102
|
__exportStar(require("./services/ps-file-size-service"), exports);
|
|
@@ -83,11 +105,22 @@ __exportStar(require("./services/ps-pdf-service"), exports);
|
|
|
83
105
|
__exportStar(require("./services/ps-text-search-service"), exports);
|
|
84
106
|
__exportStar(require("./services/ps-upload-queue-service"), exports);
|
|
85
107
|
__exportStar(require("./services/ps-xhr-upload-service"), exports);
|
|
108
|
+
__exportStar(require("./services/ps-file-fetch-service"), exports);
|
|
109
|
+
__exportStar(require("./services/ps-file-search-service"), exports);
|
|
110
|
+
__exportStar(require("./services/ps-html-file-service"), exports);
|
|
111
|
+
__exportStar(require("./services/ps-html-service"), exports);
|
|
112
|
+
__exportStar(require("./services/ps-image-text-service"), exports);
|
|
113
|
+
__exportStar(require("./services/ps-label-service"), exports);
|
|
114
|
+
__exportStar(require("./services/ps-sheet-service"), exports);
|
|
115
|
+
__exportStar(require("./services/ps-word-service"), exports);
|
|
86
116
|
__exportStar(require("./hooks/use-ps-active-match-scroll"), exports);
|
|
87
117
|
__exportStar(require("./hooks/use-ps-drag-pan"), exports);
|
|
88
118
|
__exportStar(require("./hooks/use-ps-file-text"), exports);
|
|
89
119
|
__exportStar(require("./hooks/use-ps-in-view"), exports);
|
|
90
120
|
__exportStar(require("./hooks/use-ps-upload-queue"), exports);
|
|
121
|
+
__exportStar(require("./hooks/use-ps-file-search"), exports);
|
|
122
|
+
__exportStar(require("./hooks/use-ps-find-shortcut"), exports);
|
|
123
|
+
__exportStar(require("./hooks/use-ps-loaded-file"), exports);
|
|
91
124
|
__exportStar(require("./components/ps-document-scanner"), exports);
|
|
92
125
|
__exportStar(require("./constants/ps-document-scanner-labels"), exports);
|
|
93
126
|
__exportStar(require("./constants/ps-scan-format"), exports);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { RefObject } from 'react';
|
|
2
|
+
export interface PsFileSearchState {
|
|
3
|
+
activeMatch: number;
|
|
4
|
+
focus: () => void;
|
|
5
|
+
inputRef: RefObject<HTMLInputElement>;
|
|
6
|
+
matchCount: number;
|
|
7
|
+
query: string;
|
|
8
|
+
reset: () => void;
|
|
9
|
+
search: string;
|
|
10
|
+
setMatchCount: (count: number) => void;
|
|
11
|
+
setSearch: (value: string) => void;
|
|
12
|
+
step: (delta: number) => void;
|
|
13
|
+
}
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import type { ReactNode } from 'react';
|
|
2
2
|
import type { PsFileViewerLabels } from '../constants/ps-file-viewer-labels';
|
|
3
|
+
import type { PsImageTextLayer } from './ps-image-text-layer';
|
|
3
4
|
import type { PsLabelSet } from './ps-label-set';
|
|
4
5
|
export interface PsFileViewerPaneProps {
|
|
5
6
|
contentType: string;
|
|
6
7
|
headerActions?: ReactNode;
|
|
7
8
|
id?: string;
|
|
8
|
-
labels?: PsLabelSet<typeof PsFileViewerLabels
|
|
9
|
+
labels?: Partial<PsLabelSet<typeof PsFileViewerLabels>>;
|
|
9
10
|
name: string;
|
|
10
11
|
pdfWorkerSrc?: string;
|
|
12
|
+
textLayer?: PsImageTextLayer;
|
|
11
13
|
url: string;
|
|
12
14
|
}
|