Skip to content

Commit 676da1d

Browse files
committed
feat: support showing cpl.name on result
1 parent 56c1d18 commit 676da1d

File tree

5 files changed

+36
-32
lines changed

5 files changed

+36
-32
lines changed

src/autocomplete/plugin.info

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
"author": "linonetwo",
55
"description": "Auto complete full-text search across wiki. Dependency of TW-CommandPalette. Install that if you want out-of-box features.",
66
"plugin-type": "plugin",
7-
"version": "0.3.0",
7+
"version": "0.4.0",
88
"stability": "STABILITY_1_EXPERIMENTAL",
99
"list": "readme example config tree"
1010
}

src/autocomplete/widgets/build-in-sub-plugins/search-user-text.ts

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,21 @@ import { checkIsSearchUser, checkIsUnderFilter } from '../utils/checkPrefix';
44
import { titleTextExclusionFilter } from '../utils/configs';
55
import { debounced } from '../utils/debounce';
66
import { filterTiddlersAsync } from '../utils/filterTiddlersAsync';
7-
import { getFieldsAsText } from '../utils/getFieldsAsTitle';
7+
import { getFieldsAsText, getFieldsAsTitle } from '../utils/getFieldsAsTitle';
88
import { lingo } from '../utils/lingo';
99

1010
export const plugin = {
1111
async getSources(parameters) {
1212
if (parameters.query.length === 0) return [];
1313
if (!checkIsSearchUser(parameters) || checkIsUnderFilter(parameters)) return [];
14+
const { textFields, fieldsAsText } = getFieldsAsText();
15+
const { titleFields } = getFieldsAsTitle();
1416
return await debounced([
1517
{
1618
sourceId: 'text',
1719
async getItems({ query }) {
1820
if (query === '') return [];
19-
const filter = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} :filter[has[text]get[text]!compare:string:eq[]]+[search:${getFieldsAsText()}[${query}]]`;
21+
const filter = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[search:${fieldsAsText}[${query}]]`;
2022
return await filterTiddlersAsync(filter, { system: false, exclude: [] });
2123
},
2224
getItemUrl({ item }) {
@@ -27,21 +29,23 @@ export const plugin = {
2729
return lingo('UserText');
2830
},
2931
item({ item, createElement, state }) {
30-
const title = typeof item.caption === 'string' && item.caption !== '' ? `${item.caption} (${item.title})` : item.title;
32+
const titles = titleFields.map(field => item[field]).filter((item): item is string => typeof item === 'string' && item !== '').map((item, index) =>
33+
index === 0 ? item : `(${item})`
34+
).join(' ');
3135
const textCountAroundHit = 30;
3236
let contextNearText = '';
3337
const keywords = state.query.split(' ').filter(Boolean);
34-
38+
const itemText = textFields.map(field => item[field]).filter(Boolean).join(' ');
3539
keywords.forEach(keyword => {
36-
const index = item.text.indexOf(keyword);
40+
const index = itemText.indexOf(keyword);
3741
if (index !== -1) {
3842
const start = Math.max(0, index - textCountAroundHit);
39-
const end = Math.min(item.text.length, index + keyword.length + textCountAroundHit);
43+
const end = Math.min(itemText.length, index + keyword.length + textCountAroundHit);
4044
const prefix = start > 0 ? '...' : '';
41-
const suffix = end < item.text.length ? '...' : '';
42-
const beforeMatch = item.text.slice(start, index);
43-
const matchedText = item.text.slice(index, index + keyword.length);
44-
const afterMatch = item.text.slice(index + keyword.length, end);
45+
const suffix = end < itemText.length ? '...' : '';
46+
const beforeMatch = itemText.slice(start, index);
47+
const matchedText = itemText.slice(index, index + keyword.length);
48+
const afterMatch = itemText.slice(index + keyword.length, end);
4549

4650
contextNearText += `${prefix}${beforeMatch}<mark>${matchedText}</mark>${afterMatch}${suffix}`;
4751
}
@@ -55,7 +59,7 @@ export const plugin = {
5559
onclick,
5660
onTap: onclick,
5761
}, [
58-
createElement('div', { style: 'margin-bottom:0.25em;' }, title),
62+
createElement('div', { style: 'margin-bottom:0.25em;' }, titles),
5963
createElement('div', {}, [
6064
createElement('small', { innerHTML: contextNearText }),
6165
]),

src/autocomplete/widgets/build-in-sub-plugins/search-user-title-pinyin.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,13 @@ export const plugin = {
1919
return [];
2020
}
2121
if (parameters.query.length === 0) return [];
22+
const { fieldsAsTitle, titleFields } = getFieldsAsTitle();
2223
return await debounced([
2324
{
2425
sourceId: 'title-pinyin',
2526
async getItems({ query }) {
2627
if (query === '') return [];
27-
const filterToOpen = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[pinyinfuse:${getFieldsAsTitle()}[${query}]]`;
28+
const filterToOpen = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[pinyinfuse:${fieldsAsTitle}[${query}]]`;
2829
parameters.setContext({ filterToOpen });
2930
return await filterTiddlersAsync(filterToOpen, {});
3031
},
@@ -39,15 +40,13 @@ export const plugin = {
3940
const onclick = () => {
4041
parameters.navigator.navigate({ item, itemUrl: item.title, state });
4142
};
42-
if (typeof item.caption === 'string' && item.caption !== '') {
43-
return createElement('div', {
44-
onclick,
45-
}, `${item.caption} (${item.title})`);
46-
}
43+
const titles = titleFields.map(field => item[field]).filter((item): item is string => typeof item === 'string' && item !== '').map((item, index) =>
44+
index === 0 ? item : `(${item})`
45+
).join(' ');
4746
return createElement('div', {
4847
onclick,
4948
onTap: onclick,
50-
}, item.title);
49+
}, titles);
5150
},
5251
},
5352
},

src/autocomplete/widgets/build-in-sub-plugins/search-user-title.ts

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@ export const plugin = {
1111
async getSources(parameters) {
1212
if (parameters.query.length === 0) return [];
1313
if (!checkIsSearchUser(parameters) || checkIsUnderFilter(parameters)) return [];
14+
const { fieldsAsTitle, titleFields } = getFieldsAsTitle();
1415
return await debounced([
1516
{
1617
sourceId: 'title',
1718
async getItems({ query }) {
1819
if (query === '') return [];
19-
const filterToOpen = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[search:${getFieldsAsTitle()}[${query}]]`;
20+
const filterToOpen = `[all[tiddlers]!is[system]] ${titleTextExclusionFilter()} +[search:${fieldsAsTitle}[${query}]]`;
2021
parameters.setContext({ filterToOpen });
2122
return await filterTiddlersAsync(filterToOpen, {});
2223
},
@@ -31,15 +32,13 @@ export const plugin = {
3132
const onclick = () => {
3233
parameters.navigator.navigate({ item, itemUrl: item.title, state });
3334
};
34-
if (typeof item.caption === 'string' && item.caption !== '') {
35-
return createElement('div', {
36-
onclick,
37-
}, `${item.caption} (${item.title})`);
38-
}
35+
const titles = titleFields.map(field => item[field]).filter((item): item is string => typeof item === 'string' && item !== '').map((item, index) =>
36+
index === 0 ? item : `(${item})`
37+
).join(' ');
3938
return createElement('div', {
4039
onclick,
4140
onTap: onclick,
42-
}, item.title);
41+
}, titles);
4342
},
4443
},
4544
},
Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
11
/**
22
* @returns `title,caption` that can be use with `search:title,caption[]` operator.
33
*/
4-
export function getFieldsAsTitle(): string {
4+
export function getFieldsAsTitle() {
55
const TitleAliasConfig = $tw.wiki.getTiddlerText('$:/plugins/linonetwo/autocomplete/configs/TitleAlias', 'title caption');
6-
const fieldsAsTitle = TitleAliasConfig.split(' ').filter(Boolean).join(',');
7-
return fieldsAsTitle;
6+
const titleFields = TitleAliasConfig.split(' ').filter(Boolean);
7+
const fieldsAsTitle = titleFields.join(',');
8+
return { fieldsAsTitle, titleFields };
89
}
910

10-
export function getFieldsAsText(): string {
11+
export function getFieldsAsText() {
1112
const TextAliasConfig = $tw.wiki.getTiddlerText('$:/plugins/linonetwo/autocomplete/configs/TextAlias', 'text');
12-
const fieldsAsText = TextAliasConfig.split(' ').filter(Boolean).join(',');
13-
return fieldsAsText;
13+
const textFields = TextAliasConfig.split(' ').filter(Boolean);
14+
const fieldsAsText = textFields.join(',');
15+
return { fieldsAsText, textFields };
1416
}

0 commit comments

Comments
 (0)