@teipublisher/pb-components 2.26.1-next.2 → 3.0.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/.github/workflows/main.yml +3 -3
- package/.github/workflows/node.js.yml +3 -3
- package/.github/workflows/release.js.yml +4 -4
- package/.releaserc.json +2 -2
- package/CHANGELOG.md +267 -9
- package/Dockerfile +78 -70
- package/css/components.css +5 -5
- package/css/leaflet/images/layers.png +0 -0
- package/dist/demo/components.css +46 -1
- package/dist/demo/pb-browse-docs2.html +1 -1
- package/dist/demo/pb-dialog.html +3 -5
- package/dist/demo/pb-drawer2.html +1 -1
- package/dist/demo/pb-facsimile.html +2 -2
- package/dist/demo/pb-grid.html +19 -6
- package/dist/demo/pb-leaflet-map.html +1 -1
- package/dist/demo/pb-login.html +0 -2
- package/dist/demo/pb-message.html +1 -2
- package/dist/demo/pb-progress.html +2 -2
- package/dist/demo/pb-repeat.html +1 -3
- package/dist/demo/pb-search.html +7 -4
- package/dist/demo/pb-search3.html +1 -1
- package/dist/demo/pb-search4.html +2 -2
- package/dist/demo/pb-view3.html +1 -1
- package/dist/{iron-form-3b8dcaa7.js → iron-form-dfb3e3b1.js} +95 -95
- package/dist/paper-checkbox-645e1077.js +200 -0
- package/dist/{paper-icon-button-b1d31571.js → paper-icon-button-984162bd.js} +1 -1
- package/dist/{paper-checkbox-515a5284.js → paper-inky-focus-behavior-fa16796b.js} +58 -247
- package/dist/{paper-listbox-a3b7175c.js → paper-listbox-5f5d1cec.js} +152 -162
- package/dist/pb-code-editor.js +25 -20
- package/dist/pb-component-docs.js +68 -64
- package/dist/pb-components-bundle.js +1983 -2293
- package/dist/pb-edit-app.js +167 -107
- package/dist/pb-elements.json +176 -120
- package/dist/{pb-i18n-0611135a.js → pb-i18n-4cc00bfe.js} +1 -1
- package/dist/pb-leaflet-map.js +23 -23
- package/dist/pb-mei.js +56 -41
- package/dist/{pb-mixin-b1caa22e.js → pb-mixin-886ece32.js} +1 -1
- package/dist/pb-odd-editor.js +1023 -782
- package/dist/pb-tify.js +2 -2
- package/dist/vaadin-element-mixin-beb74ffd.js +545 -0
- package/gh-pages.js +5 -3
- package/i18n/common/en.json +6 -0
- package/i18n/common/pl.json +2 -2
- package/lib/openseadragon.min.js +6 -6
- package/package.json +3 -3
- package/pb-elements.json +176 -120
- package/src/assets/components.css +5 -5
- package/src/authority/airtable.js +20 -21
- package/src/authority/anton.js +129 -129
- package/src/authority/custom.js +23 -21
- package/src/authority/geonames.js +38 -32
- package/src/authority/gnd.js +50 -42
- package/src/authority/kbga.js +137 -134
- package/src/authority/metagrid.js +44 -46
- package/src/authority/reconciliation.js +66 -67
- package/src/authority/registry.js +4 -4
- package/src/docs/pb-component-docs.js +2 -2
- package/src/docs/pb-component-view.js +5 -5
- package/src/docs/pb-components-list.js +2 -2
- package/src/docs/pb-demo-snippet.js +2 -2
- package/src/dts-client.js +299 -297
- package/src/dts-select-endpoint.js +90 -82
- package/src/parse-date-service.js +184 -135
- package/src/pb-ajax.js +158 -171
- package/src/pb-authority-lookup.js +191 -156
- package/src/pb-autocomplete.js +292 -280
- package/src/pb-blacklab-highlight.js +264 -259
- package/src/pb-blacklab-results.js +236 -221
- package/src/pb-browse-docs.js +540 -475
- package/src/pb-browse.js +68 -65
- package/src/pb-clipboard.js +79 -76
- package/src/pb-code-editor.js +110 -102
- package/src/pb-code-highlight.js +209 -204
- package/src/pb-codepen.js +79 -72
- package/src/pb-collapse.js +211 -151
- package/src/pb-combo-box.js +190 -190
- package/src/pb-components-bundle.js +1 -1
- package/src/pb-components.js +1 -0
- package/src/pb-custom-form.js +173 -153
- package/src/pb-dialog.js +98 -62
- package/src/pb-document.js +89 -90
- package/src/pb-download.js +212 -196
- package/src/pb-drawer.js +145 -148
- package/src/pb-edit-app.js +301 -229
- package/src/pb-edit-xml.js +100 -97
- package/src/pb-events.js +114 -107
- package/src/pb-facs-link.js +104 -102
- package/src/pb-facsimile.js +474 -410
- package/src/pb-formula.js +151 -153
- package/src/pb-geolocation.js +129 -131
- package/src/pb-grid-action.js +53 -56
- package/src/pb-grid.js +231 -228
- package/src/pb-highlight.js +140 -140
- package/src/pb-hotkeys.js +40 -42
- package/src/pb-i18n.js +101 -104
- package/src/pb-image-strip.js +84 -78
- package/src/pb-lang.js +142 -57
- package/src/pb-leaflet-map.js +488 -485
- package/src/pb-link.js +126 -124
- package/src/pb-load.js +431 -429
- package/src/pb-login.js +299 -244
- package/src/pb-manage-odds.js +352 -336
- package/src/pb-map-icon.js +89 -89
- package/src/pb-map-layer.js +85 -85
- package/src/pb-markdown.js +90 -99
- package/src/pb-media-query.js +74 -72
- package/src/pb-mei.js +306 -295
- package/src/pb-message.js +139 -97
- package/src/pb-mixin.js +269 -264
- package/src/pb-navigation.js +80 -95
- package/src/pb-observable.js +38 -38
- package/src/pb-odd-editor.js +1054 -958
- package/src/pb-odd-elementspec-editor.js +349 -298
- package/src/pb-odd-model-editor.js +1075 -909
- package/src/pb-odd-parameter-editor.js +200 -178
- package/src/pb-odd-rendition-editor.js +136 -124
- package/src/pb-page.js +431 -422
- package/src/pb-paginate.js +228 -179
- package/src/pb-panel.js +198 -182
- package/src/pb-popover-themes.js +15 -8
- package/src/pb-popover.js +296 -287
- package/src/pb-print-preview.js +127 -127
- package/src/pb-progress.js +51 -51
- package/src/pb-repeat.js +105 -104
- package/src/pb-restricted.js +84 -77
- package/src/pb-search.js +256 -228
- package/src/pb-select-feature.js +127 -120
- package/src/pb-select-odd.js +132 -124
- package/src/pb-select-template.js +89 -78
- package/src/pb-select.js +251 -227
- package/src/pb-split-list.js +179 -174
- package/src/pb-svg.js +80 -79
- package/src/pb-table-column.js +54 -54
- package/src/pb-table-grid.js +221 -203
- package/src/pb-tabs.js +61 -63
- package/src/pb-tify.js +154 -154
- package/src/pb-timeline.js +382 -249
- package/src/pb-toggle-feature.js +195 -187
- package/src/pb-upload.js +184 -174
- package/src/pb-version.js +30 -30
- package/src/pb-view-annotate.js +135 -98
- package/src/pb-view.js +1282 -1270
- package/src/pb-zoom.js +127 -45
- package/src/polymer-hack.js +1 -1
- package/src/search-result-service.js +256 -223
- package/src/seed-element.js +13 -20
- package/src/settings.js +4 -4
- package/src/theming.js +98 -91
- package/src/urls.js +289 -289
- package/src/utils.js +53 -51
- package/css/pb-styles.css +0 -51
- package/dist/vaadin-element-mixin-6e4cee3a.js +0 -527
- package/src/assets/pb-styles.css +0 -51
- package/src/pb-light-dom.js +0 -40
|
@@ -5,8 +5,8 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
|
5
5
|
* This component queries the blacklab API of TEI-Publisher for a list of text matches
|
|
6
6
|
* in a given document. The query is given as a CQL querystring (see pattern property).
|
|
7
7
|
*
|
|
8
|
-
* **Note**: There's no demo for this component yet as it would need a blacklab instance.
|
|
9
|
-
*
|
|
8
|
+
* **Note**: There's no demo for this component yet as it would need a blacklab instance.
|
|
9
|
+
*
|
|
10
10
|
* The component displays 2 navigation buttons to jump to previous / next match and
|
|
11
11
|
* a display of the current index and total number of matches.
|
|
12
12
|
*
|
|
@@ -30,298 +30,303 @@ import { pbMixin, waitOnce } from './pb-mixin.js';
|
|
|
30
30
|
*
|
|
31
31
|
*/
|
|
32
32
|
export class PbBlacklabHighlight extends pbMixin(LitElement) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
connectedCallback() {
|
|
101
|
-
super.connectedCallback();
|
|
102
|
-
this.current = 1;
|
|
103
|
-
this.perDocument = 100;
|
|
104
|
-
this.hits = [];
|
|
105
|
-
this.kwicData = {};
|
|
106
|
-
|
|
107
|
-
/*
|
|
108
|
-
* waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
|
|
109
|
-
* component is attached to via the 'view' attribute.
|
|
110
|
-
*/
|
|
111
|
-
waitOnce('pb-page-ready', () => {
|
|
112
|
-
this.viewElement = document.getElementById(this.view);
|
|
113
|
-
if (!this.viewElement) {
|
|
114
|
-
console.error(`${this}: view element with id ${this.view} does not exist`);
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
this.shadow = this.viewElement.shadowRoot;
|
|
118
|
-
});
|
|
33
|
+
static get properties() {
|
|
34
|
+
return {
|
|
35
|
+
...super.properties,
|
|
36
|
+
/**
|
|
37
|
+
* one-based index of the current highlight
|
|
38
|
+
*/
|
|
39
|
+
current: {
|
|
40
|
+
type: Number,
|
|
41
|
+
},
|
|
42
|
+
/**
|
|
43
|
+
* the id of the view for which highlights shall be displayed
|
|
44
|
+
*/
|
|
45
|
+
view: {
|
|
46
|
+
type: String,
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* CQL search pattern send to the Blacklab API
|
|
50
|
+
*/
|
|
51
|
+
pattern: {
|
|
52
|
+
type: String,
|
|
53
|
+
},
|
|
54
|
+
/**
|
|
55
|
+
* optional match parameter on the URL. If present page will display appropriate hit
|
|
56
|
+
*/
|
|
57
|
+
match: {
|
|
58
|
+
type: String,
|
|
59
|
+
},
|
|
60
|
+
/**
|
|
61
|
+
* the document id
|
|
62
|
+
*/
|
|
63
|
+
docid: {
|
|
64
|
+
type: String,
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* holds the results of querying the 'api/blacklab/doc' endpoint
|
|
68
|
+
*/
|
|
69
|
+
hits: {
|
|
70
|
+
type: Array,
|
|
71
|
+
},
|
|
72
|
+
/**
|
|
73
|
+
* contains full response after successful loading
|
|
74
|
+
*/
|
|
75
|
+
kwicData: {
|
|
76
|
+
type: Object,
|
|
77
|
+
},
|
|
78
|
+
/**
|
|
79
|
+
* optional: may hold id of match element to be highlighted
|
|
80
|
+
*/
|
|
81
|
+
matchParam: {
|
|
82
|
+
type: String,
|
|
83
|
+
},
|
|
84
|
+
/**
|
|
85
|
+
* the pageId to display
|
|
86
|
+
*/
|
|
87
|
+
pageId: {
|
|
88
|
+
type: String,
|
|
89
|
+
},
|
|
90
|
+
/**
|
|
91
|
+
* how many hits shall be loaded. Defaults to 100. This value is passed to the blacklab API
|
|
92
|
+
*/
|
|
93
|
+
perDocument: {
|
|
94
|
+
type: Number,
|
|
95
|
+
attribute: 'per-document',
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
119
99
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
render() {
|
|
129
|
-
return html`
|
|
130
|
-
${this.hits.length !== 0
|
|
131
|
-
? html`
|
|
132
|
-
<section class="kwic-display">
|
|
133
|
-
<paper-icon-button icon="icons:arrow-back" @click="${this._handlePrev}" ?disabled="${this.current === 1}"></paper-icon-button>
|
|
134
|
-
<span class="current">${this.current}</span> / <span class="counter">${this.count}</span>
|
|
135
|
-
<paper-icon-button icon="icons:arrow-forward" @click="${this._handleNext}" ?disabled="${this.current === this.hits.length}"></paper-icon-button>
|
|
136
|
-
</section>` : ''
|
|
137
|
-
}
|
|
138
|
-
`;
|
|
139
|
-
}
|
|
100
|
+
connectedCallback() {
|
|
101
|
+
super.connectedCallback();
|
|
102
|
+
this.current = 1;
|
|
103
|
+
this.perDocument = 100;
|
|
104
|
+
this.hits = [];
|
|
105
|
+
this.kwicData = {};
|
|
140
106
|
|
|
141
|
-
|
|
142
|
-
*
|
|
143
|
-
*
|
|
144
|
-
* The URL query params are used to set params for blacklab API
|
|
145
|
-
*
|
|
146
|
-
* @returns {Promise<void>}
|
|
147
|
-
* @private
|
|
107
|
+
/*
|
|
108
|
+
* waiting for the page to be ready before storing a reference to the shadowDOM of the view element this
|
|
109
|
+
* component is attached to via the 'view' attribute.
|
|
148
110
|
*/
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
111
|
+
waitOnce('pb-page-ready', () => {
|
|
112
|
+
this.viewElement = document.getElementById(this.view);
|
|
113
|
+
if (!this.viewElement) {
|
|
114
|
+
console.error(`${this}: view element with id ${this.view} does not exist`);
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.shadow = this.viewElement.shadowRoot;
|
|
118
|
+
});
|
|
152
119
|
|
|
153
|
-
|
|
154
|
-
|
|
120
|
+
this.subscribeTo('pb-update', () => {
|
|
121
|
+
this._loadDocResults();
|
|
122
|
+
});
|
|
123
|
+
this.subscribeTo('pb-refresh', ev => {
|
|
124
|
+
this.dynMatch = ev.detail.match;
|
|
125
|
+
});
|
|
126
|
+
}
|
|
155
127
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
128
|
+
render() {
|
|
129
|
+
return html`
|
|
130
|
+
${this.hits.length !== 0
|
|
131
|
+
? html` <section class="kwic-display">
|
|
132
|
+
<paper-icon-button
|
|
133
|
+
icon="icons:arrow-back"
|
|
134
|
+
@click="${this._handlePrev}"
|
|
135
|
+
?disabled="${this.current === 1}"
|
|
136
|
+
></paper-icon-button>
|
|
137
|
+
<span class="current">${this.current}</span> /
|
|
138
|
+
<span class="counter">${this.count}</span>
|
|
139
|
+
<paper-icon-button
|
|
140
|
+
icon="icons:arrow-forward"
|
|
141
|
+
@click="${this._handleNext}"
|
|
142
|
+
?disabled="${this.current === this.hits.length}"
|
|
143
|
+
></paper-icon-button>
|
|
144
|
+
</section>`
|
|
145
|
+
: ''}
|
|
146
|
+
`;
|
|
147
|
+
}
|
|
167
148
|
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
this._markAllMatches();
|
|
180
|
-
this._showMatch(this.matchParam);
|
|
181
|
-
})
|
|
182
|
-
.catch((error) => {
|
|
183
|
-
console.error('Error retrieving remote content: ', error);
|
|
184
|
-
});
|
|
185
|
-
}
|
|
149
|
+
/**
|
|
150
|
+
* loads matches from blacklab API, marks matches with CSS classes and displays the current match.
|
|
151
|
+
*
|
|
152
|
+
* The URL query params are used to set params for blacklab API
|
|
153
|
+
*
|
|
154
|
+
* @returns {Promise<void>}
|
|
155
|
+
* @private
|
|
156
|
+
*/
|
|
157
|
+
async _loadDocResults() {
|
|
158
|
+
// console.log('endpoint for loading kwic matches', this.getEndpoint());
|
|
159
|
+
if (!this.getEndpoint()) return;
|
|
186
160
|
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
// ### it's just a single hit and we get object instead of array
|
|
199
|
-
const startId = this.hits.match.words[0];
|
|
200
|
-
const endId = this.hits.match.words[1];
|
|
201
|
-
this._addMarkerClasses(startId, endId);
|
|
202
|
-
// this._scrollTo(startId, endId);
|
|
203
|
-
}
|
|
204
|
-
this.requestUpdate();
|
|
161
|
+
const params = new URLSearchParams(window.location.search);
|
|
162
|
+
this.pattern = params.get('pattern');
|
|
163
|
+
|
|
164
|
+
/*
|
|
165
|
+
* a dynMatch exists when the reloading was triggered by an nav action (prev/next)
|
|
166
|
+
* the match param will be passed by the respective nav handler
|
|
167
|
+
*/
|
|
168
|
+
if (this.dynMatch) {
|
|
169
|
+
this.matchParam = this.dynMatch;
|
|
170
|
+
} else {
|
|
171
|
+
this.matchParam = params.get('match');
|
|
205
172
|
}
|
|
173
|
+
this.pageId = params.get('id');
|
|
174
|
+
this.docId = params.get('doc');
|
|
206
175
|
|
|
176
|
+
const url = `${this.getEndpoint()}/api/blacklab/doc?pattern=${this.pattern}&doc=${
|
|
177
|
+
this.docId
|
|
178
|
+
}&per-document=${this.perDocument}&format=json`;
|
|
179
|
+
await fetch(url, {
|
|
180
|
+
method: 'GET',
|
|
181
|
+
mode: 'cors',
|
|
182
|
+
credentials: 'same-origin',
|
|
183
|
+
})
|
|
184
|
+
.then(response => response.json())
|
|
185
|
+
.then(data => {
|
|
186
|
+
this.kwicData = data;
|
|
187
|
+
})
|
|
188
|
+
.then(() => {
|
|
189
|
+
this._markAllMatches();
|
|
190
|
+
this._showMatch(this.matchParam);
|
|
191
|
+
})
|
|
192
|
+
.catch(error => {
|
|
193
|
+
console.error('Error retrieving remote content: ', error);
|
|
194
|
+
});
|
|
195
|
+
}
|
|
207
196
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
197
|
+
_markAllMatches() {
|
|
198
|
+
const docs = this.kwicData.documents;
|
|
199
|
+
this.count = this.kwicData.hits;
|
|
200
|
+
this.hits = docs[Object.keys(docs)[0]].hits; // 'jump over' docPid
|
|
201
|
+
if (Array.isArray(this.hits)) {
|
|
202
|
+
this.hits.forEach(hit => {
|
|
203
|
+
const startId = hit.match.words[0];
|
|
204
|
+
const endId = hit.match.words[1];
|
|
205
|
+
this._addMarkerClasses(startId, endId);
|
|
206
|
+
});
|
|
207
|
+
} else {
|
|
208
|
+
// ### it's just a single hit and we get object instead of array
|
|
209
|
+
const startId = this.hits.match.words[0];
|
|
210
|
+
const endId = this.hits.match.words[1];
|
|
211
|
+
this._addMarkerClasses(startId, endId);
|
|
212
|
+
// this._scrollTo(startId, endId);
|
|
211
213
|
}
|
|
214
|
+
this.requestUpdate();
|
|
215
|
+
}
|
|
212
216
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
*
|
|
218
|
-
* @param match
|
|
219
|
-
* @returns {[]|*}
|
|
220
|
-
* @private
|
|
221
|
-
*/
|
|
222
|
-
_getMatchObject(match){
|
|
223
|
-
// ### if there's no match param passed in from url return the appropriate object representing current match
|
|
224
|
-
if(!match){
|
|
225
|
-
if(Array.isArray(this.hits)){
|
|
226
|
-
// return this.hits[0];
|
|
227
|
-
return this.hits[this.current - 1];
|
|
228
|
-
}
|
|
229
|
-
return this.hits;
|
|
230
|
-
}
|
|
217
|
+
_showMatch(matchId) {
|
|
218
|
+
const matchObj = this._getMatchObject(matchId);
|
|
219
|
+
this._navigateToMatch(matchObj);
|
|
220
|
+
}
|
|
231
221
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
222
|
+
/**
|
|
223
|
+
* If a match id is given it will be looked up in the loaded data and returned.
|
|
224
|
+
*
|
|
225
|
+
* If no match is given the first match in the response will be used.
|
|
226
|
+
*
|
|
227
|
+
* @param match
|
|
228
|
+
* @returns {[]|*}
|
|
229
|
+
* @private
|
|
230
|
+
*/
|
|
231
|
+
_getMatchObject(match) {
|
|
232
|
+
// ### if there's no match param passed in from url return the appropriate object representing current match
|
|
233
|
+
if (!match) {
|
|
234
|
+
if (Array.isArray(this.hits)) {
|
|
235
|
+
// return this.hits[0];
|
|
236
|
+
return this.hits[this.current - 1];
|
|
237
|
+
}
|
|
238
|
+
return this.hits;
|
|
239
239
|
}
|
|
240
240
|
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
if(this.pageId !== matchPage){
|
|
246
|
-
this.emitTo('pb-refresh', {id: matchPage, match:matchId});
|
|
247
|
-
}else{
|
|
248
|
-
this._highlight(matchObj);
|
|
249
|
-
window.history.replaceState({},'',newUrl);
|
|
250
|
-
}
|
|
241
|
+
if (Array.isArray(this.hits)) {
|
|
242
|
+
const targetHit = this.hits.find(hit => hit.match.words[0] === match);
|
|
243
|
+
this.current = this.hits.findIndex(hit => hit === targetHit) + 1;
|
|
244
|
+
return targetHit;
|
|
251
245
|
}
|
|
246
|
+
this.current = 1;
|
|
247
|
+
return this.hits;
|
|
248
|
+
}
|
|
252
249
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
const endElem = this.shadow.querySelector(`#${endid}`);
|
|
263
|
-
if (endElem) {
|
|
264
|
-
endElem.parentNode.classList.add('kwic-current');
|
|
265
|
-
}
|
|
266
|
-
startElem.scrollIntoView({block: "center", inline: "nearest"});
|
|
267
|
-
|
|
250
|
+
_navigateToMatch(matchObj) {
|
|
251
|
+
const matchPage = matchObj.page[0];
|
|
252
|
+
const matchId = matchObj.match.words[0];
|
|
253
|
+
const newUrl = `${this._endpoint}/${this.docId}.xml?doc=${this.docId}&pattern=${this.pattern}&match=${matchObj.match.words[0]}&id=${matchPage}`;
|
|
254
|
+
if (this.pageId !== matchPage) {
|
|
255
|
+
this.emitTo('pb-refresh', { id: matchPage, match: matchId });
|
|
256
|
+
} else {
|
|
257
|
+
this._highlight(matchObj);
|
|
258
|
+
window.history.replaceState({}, '', newUrl);
|
|
268
259
|
}
|
|
260
|
+
}
|
|
269
261
|
|
|
262
|
+
_highlight(matchObj) {
|
|
263
|
+
this._resetCurrentMarker();
|
|
270
264
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
265
|
+
const startid = matchObj.match.words[0];
|
|
266
|
+
const endid = matchObj.match.words[1];
|
|
267
|
+
const startElem = this.shadow.querySelector(`#${startid}`);
|
|
268
|
+
if (startElem) {
|
|
269
|
+
startElem.parentNode.classList.add('kwic-current');
|
|
276
270
|
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
if (!start) {
|
|
281
|
-
return;
|
|
282
|
-
}
|
|
283
|
-
start.parentNode.classList.add('kwic-start');
|
|
284
|
-
|
|
285
|
-
const end = this.shadow.getElementById(endId);
|
|
286
|
-
if (end) {
|
|
287
|
-
end.parentNode.classList.add('kwic-end');
|
|
288
|
-
}else{
|
|
289
|
-
start.classList.add('kwic-end');
|
|
290
|
-
}
|
|
271
|
+
const endElem = this.shadow.querySelector(`#${endid}`);
|
|
272
|
+
if (endElem) {
|
|
273
|
+
endElem.parentNode.classList.add('kwic-current');
|
|
291
274
|
}
|
|
275
|
+
startElem.scrollIntoView({ block: 'center', inline: 'nearest' });
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
_resetCurrentMarker() {
|
|
279
|
+
const old = this.shadow.querySelectorAll('.kwic-current');
|
|
280
|
+
Array.from(old).forEach(elem => {
|
|
281
|
+
elem.classList.remove('kwic-current');
|
|
282
|
+
});
|
|
283
|
+
}
|
|
292
284
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
285
|
+
_addMarkerClasses(startId, endId) {
|
|
286
|
+
const start = this.shadow.querySelector(`#${startId}`);
|
|
287
|
+
if (!start) {
|
|
288
|
+
return;
|
|
297
289
|
}
|
|
290
|
+
start.parentNode.classList.add('kwic-start');
|
|
298
291
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
292
|
+
const end = this.shadow.getElementById(endId);
|
|
293
|
+
if (end) {
|
|
294
|
+
end.parentNode.classList.add('kwic-end');
|
|
295
|
+
} else {
|
|
296
|
+
start.classList.add('kwic-end');
|
|
303
297
|
}
|
|
298
|
+
}
|
|
304
299
|
|
|
300
|
+
_handlePrev() {
|
|
301
|
+
this.current -= 1;
|
|
302
|
+
const prevMatchObj = this.hits[this.current - 1];
|
|
303
|
+
this._navigateToMatch(prevMatchObj);
|
|
304
|
+
}
|
|
305
305
|
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
.counter, .current{
|
|
312
|
-
padding:0 0.5rem;
|
|
313
|
-
}
|
|
306
|
+
_handleNext() {
|
|
307
|
+
const nextMatchObj = this.hits[this.current];
|
|
308
|
+
this._navigateToMatch(nextMatchObj);
|
|
309
|
+
this.current += 1;
|
|
310
|
+
}
|
|
314
311
|
|
|
315
|
-
|
|
316
|
-
|
|
312
|
+
static get styles() {
|
|
313
|
+
return css`
|
|
314
|
+
:host {
|
|
315
|
+
display: block;
|
|
316
|
+
}
|
|
317
|
+
.counter,
|
|
318
|
+
.current {
|
|
319
|
+
padding: 0 0.5rem;
|
|
320
|
+
}
|
|
321
|
+
`;
|
|
322
|
+
}
|
|
317
323
|
|
|
318
|
-
|
|
324
|
+
/*
|
|
319
325
|
_handleClear(ev) {
|
|
320
326
|
ev.preventDefault();
|
|
321
327
|
localStorage.removeItem('pb-kwic-doc-matches');
|
|
322
328
|
}
|
|
323
329
|
*/
|
|
324
|
-
|
|
325
330
|
}
|
|
326
331
|
|
|
327
332
|
customElements.define('pb-blacklab-highlight', PbBlacklabHighlight);
|