fix: parse tag name with space

This commit is contained in:
linonetwo 2023-07-15 12:14:18 +08:00 committed by lin onetwo
parent 645a9cc150
commit fc40ff3f00
4 changed files with 15 additions and 10 deletions

View file

@ -1,3 +1,4 @@
/* eslint-disable @typescript-eslint/no-unsafe-assignment */
/* eslint-disable unicorn/no-null, @typescript-eslint/strict-boolean-expressions, unicorn/no-useless-undefined */
import MenuIcon from '@mui/icons-material/Menu';
import MenuOpenIcon from '@mui/icons-material/MenuOpen';

View file

@ -65,12 +65,12 @@ export function useWorkflowFromWiki(workspacesList: IWorkspaceWithMetadata[] | u
async () => {
const tasks = workspacesList?.map(async (workspace) => {
try {
const workflowTiddlersJSONString = await window.service.wiki.wikiOperation(
const workflowTiddlers = await window.service.wiki.wikiOperation(
WikiChannel.getTiddlersAsJson,
workspace.id,
`[all[tiddlers+shadows]tag[${workflowTiddlerTagName}]]`,
);
return JSON.parse(workflowTiddlersJSONString ?? '[]') as IWorkflowTiddler[];
return (workflowTiddlers ?? []) as IWorkflowTiddler[];
} catch {
// if workspace is hibernated or is subwiki, it will throw error, just return empty workflows array
return [];
@ -80,13 +80,11 @@ export function useWorkflowFromWiki(workspacesList: IWorkspaceWithMetadata[] | u
return workspacesList?.map?.((workspace, workspaceIndex) => {
const workflowTiddlersInWorkspace = workflowsByWorkspace[workspaceIndex];
return workflowTiddlersInWorkspace.map((tiddler) => {
// DEBUG: console tiddler
console.log(`tiddler`, tiddler);
const workflowItem: IWorkflowListItem = {
id: `${workspace.id}:${tiddler.title}`,
title: tiddler.title,
description: tiddler.description,
tags: typeof tiddler.tags === 'string' ? (tiddler.tags as string).split(' ') : tiddler.tags,
tags: tiddler.tags.filter(item => item !== workflowTiddlerTagName),
workspaceID: workspace.id,
image: tiddler['page-cover'],
metadata: {

View file

@ -9,6 +9,7 @@
*/
import { WikiChannel } from '@/constants/channels';
import { ipcRenderer, webFrame } from 'electron';
import type { ITiddlerFields } from 'tiddlywiki';
export const wikiOperations = {
[WikiChannel.setState]: async (stateKey: string, content: string) => {
@ -103,11 +104,15 @@ ipcRenderer.on(WikiChannel.runFilter, async (event, nonceReceived: number, filte
});
ipcRenderer.on(WikiChannel.getTiddlersAsJson, async (event, nonceReceived: number, filter: string) => {
/**
* Result is a stringified JSON array, which is a string. We just return the string, which is cheaper than ipc passing a large object array.
* Modified from `$tw.wiki.getTiddlersAsJson` (it will turn tags into string, so we are not using it.)
* This modified version will return Object
*/
const filterResult: string = await (webFrame.executeJavaScript(`
$tw.wiki.getTiddlersAsJson(\`${filter}\`)
`) as Promise<string>);
const filterResult: ITiddlerFields = await (webFrame.executeJavaScript(`
$tw.wiki.filterTiddlers(\`${filter}\`).map(title => {
const tiddler = $tw.wiki.getTiddler(title);
return tiddler?.fields;
}).filter(item => item !== undefined)
`) as Promise<ITiddlerFields>);
ipcRenderer.send(WikiChannel.getTiddlersAsJson, nonceReceived, filterResult);
});
// set tiddler text, we use workspaceID as callback id

View file

@ -10,6 +10,7 @@ import { sendToMainWindowAndAwait, sendToMainWindowNoWait } from '@services/libs
import serviceIdentifier from '@services/serviceIdentifier';
import { IWindowService } from '@services/windows/interface';
import { WindowNames } from '@services/windows/WindowProperties';
import type { ITiddlerFields } from 'tiddlywiki';
/**
* Handle sending message to trigger operations defined in `src/preload/wikiOperation.ts`
@ -35,7 +36,7 @@ export const wikiOperations = {
[WikiChannel.setState]: (workspaceID: string, stateKey: WikiStateKey, content: string): void => {
sendToMainWindowNoWait(WikiChannel.setState, workspaceID, [stateKey, content]);
},
[WikiChannel.getTiddlersAsJson]: async <T extends string>(workspaceID: string, filterString: string): Promise<T | undefined> => {
[WikiChannel.getTiddlersAsJson]: async <T extends ITiddlerFields>(workspaceID: string, filterString: string): Promise<T | undefined> => {
return await sendToMainWindowAndAwait<T>(WikiChannel.getTiddlersAsJson, workspaceID, [filterString]);
},
[WikiChannel.runFilter]: async <T extends string[]>(workspaceID: string, filterString: string): Promise<T | undefined> => {