diff --git a/app/src/constants.ts b/app/src/constants.ts index 20fdcfb8c..7a145f90b 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -517,6 +517,34 @@ export abstract class Constants { } }; + public static readonly SIYUAN_DEFAULT_REPLACETYPES: { + [key: string]: boolean; + } = { + "text": true, + "img-text": true, + "img-title": true, + "img-src": true, + "a-text": true, + "a-title": true, + "a-href": true, + "code": true, + "em": true, + "strong": true, + "inline-math": true, + "inline-memo": true, + "kbd": true, + "mark": true, + "s": true, + "sub": true, + "sup": true, + "tag": true, + "u": true, + "doc-title": true, + "code-block": true, + "math-block": true, + "html-block": true + } + // image public static readonly SIYUAN_IMAGE_VIP: string = ` diff --git a/app/src/menus/navigation.ts b/app/src/menus/navigation.ts index 97068f838..7b470571e 100644 --- a/app/src/menus/navigation.ts +++ b/app/src/menus/navigation.ts @@ -232,7 +232,8 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => { k: localData.k, r: localData.r, page: 1, - types: Object.assign({}, localData.types) + types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes) }); /// #else openSearch({ @@ -262,7 +263,8 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => { k: localData.k, r: localData.r, page: 1, - types: Object.assign({}, localData.types) + types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes) }); /// #else openSearch({ @@ -556,7 +558,8 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l k: localData.k, r: localData.r, page: 1, - types: Object.assign({}, localData.types) + types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes) }); /// #else openSearch({ @@ -591,7 +594,8 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l k: localData.k, r: localData.r, page: 1, - types: Object.assign({}, localData.types) + types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes) }); /// #else openSearch({ diff --git a/app/src/mobile/dock/MobileTags.ts b/app/src/mobile/dock/MobileTags.ts index 4d40917dc..0dce757f4 100644 --- a/app/src/mobile/dock/MobileTags.ts +++ b/app/src/mobile/dock/MobileTags.ts @@ -53,7 +53,8 @@ export class MobileTags { k: `#${labelName}#`, r: "", page: 1, - types: Object.assign({}, searchOption.types) + types: Object.assign({}, searchOption.types), + replaceTypes: Object.assign({}, searchOption.replaceTypes) }); }, blockExtHTML: window.siyuan.config.readonly ? undefined : '', diff --git a/app/src/mobile/menu/search.ts b/app/src/mobile/menu/search.ts index 24dda8fc4..9c306f0ec 100644 --- a/app/src/mobile/menu/search.ts +++ b/app/src/mobile/menu/search.ts @@ -497,7 +497,8 @@ const initSearchEvent = (app: App, element: Element, config: ISearchOption) => { paragraph: window.siyuan.config.search.paragraph, embedBlock: window.siyuan.config.search.embedBlock, databaseBlock: window.siyuan.config.search.databaseBlock, - } + }, + replaceTypes: Constants.SIYUAN_DEFAULT_REPLACETYPES, }, config); }); window.siyuan.menus.menu.fullscreen(); diff --git a/app/src/protyle/header/Background.ts b/app/src/protyle/header/Background.ts index 2196bafd0..7618ad136 100644 --- a/app/src/protyle/header/Background.ts +++ b/app/src/protyle/header/Background.ts @@ -372,7 +372,8 @@ export class Background { k: `#${target.textContent}#`, r: "", page: 1, - types: Object.assign({}, searchOption.types) + types: Object.assign({}, searchOption.types), + replaceTypes: Object.assign({}, searchOption.replaceTypes) }); /// #endif event.preventDefault(); diff --git a/app/src/protyle/header/openTitleMenu.ts b/app/src/protyle/header/openTitleMenu.ts index a544fdd38..d3d989a5b 100644 --- a/app/src/protyle/header/openTitleMenu.ts +++ b/app/src/protyle/header/openTitleMenu.ts @@ -184,7 +184,8 @@ export const openTitleMenu = (protyle: IProtyle, position: IPosition) => { k: localData.k, r: localData.r, page: 1, - types: Object.assign({}, localData.types) + types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes) }); /// #else openSearch({ diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts index f674bafaa..f0cdfbad8 100644 --- a/app/src/protyle/util/compatibility.ts +++ b/app/src/protyle/util/compatibility.ts @@ -238,7 +238,8 @@ export const getLocalStorage = (cb: () => void) => { paragraph: window.siyuan.config.search.paragraph, embedBlock: window.siyuan.config.search.embedBlock, databaseBlock: window.siyuan.config.search.databaseBlock, - } + }, + replaceTypes: Constants.SIYUAN_DEFAULT_REPLACETYPES, }; defaultStorage[Constants.LOCAL_ZOOM] = 1; @@ -262,6 +263,9 @@ export const getLocalStorage = (cb: () => void) => { } else if (typeof response.data[key] === "undefined") { window.siyuan.storage[key] = defaultStorage[key]; } + if (!window.siyuan.storage[Constants.LOCAL_SEARCHDATA].replaceTypes) { + window.siyuan.storage[Constants.LOCAL_SEARCHDATA].replaceTypes = Constants.SIYUAN_DEFAULT_REPLACETYPES; + } }); cb(); }); diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index 5e0b44128..180659dca 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -1922,7 +1922,8 @@ export class WYSIWYG { k: `#${tagElement.textContent}#`, r: "", page: 1, - types: Object.assign({}, searchOption.types) + types: Object.assign({}, searchOption.types), + replaceTypes: Object.assign({}, searchOption.replaceTypes) }); /// #endif return; diff --git a/app/src/search/menu.ts b/app/src/search/menu.ts index 179d97d49..1743ea37d 100644 --- a/app/src/search/menu.ts +++ b/app/src/search/menu.ts @@ -151,6 +151,40 @@ export const filterMenu = (config: ISearchOption, cb: () => void) => { }); }; +export const replaceFilterMenu = (config: ISearchOption) => { + let html = ""; + Object.keys(Constants.SIYUAN_DEFAULT_REPLACETYPES).forEach((key) => { + html += ``; + }) + const filterDialog = new Dialog({ + title: window.siyuan.languages.type, + content: `
${html}
+
+
+ +
`, + width: isMobile() ? "92vw" : "520px", + height: "70vh", + }); + const btnsElement = filterDialog.element.querySelectorAll(".b3-button"); + btnsElement[0].addEventListener("click", () => { + filterDialog.destroy(); + }); + btnsElement[1].addEventListener("click", () => { + filterDialog.element.querySelectorAll(".b3-switch").forEach((item: HTMLInputElement) => { + config.replaceTypes[item.getAttribute("data-type") as TSearchFilter] = item.checked; + }); + filterDialog.destroy(); + }); +}; + export const queryMenu = (config: ISearchOption, cb: () => void) => { if (!window.siyuan.menus.menu.element.classList.contains("fn__none") && window.siyuan.menus.menu.element.getAttribute("data-name") === "searchMethod") { diff --git a/app/src/search/spread.ts b/app/src/search/spread.ts index 1fe4bc823..89bc3c3f4 100644 --- a/app/src/search/spread.ts +++ b/app/src/search/spread.ts @@ -109,6 +109,7 @@ export const openSearch = async (options: { group: localData.group, sort: localData.sort, types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes), page: options.key ? 1 : localData.page }; const edit = genSearch(options.app, config, dialog.element.querySelector(".b3-dialog__body"), () => { diff --git a/app/src/search/util.ts b/app/src/search/util.ts index 58190d1c5..1c6c3c933 100644 --- a/app/src/search/util.ts +++ b/app/src/search/util.ts @@ -25,7 +25,15 @@ import {unicode2Emoji} from "../emoji"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {isNotCtrl, setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility"; import {newFileByName} from "../util/newFile"; -import {filterMenu, getKeyByLiElement, initCriteriaMenu, moreMenu, queryMenu, saveCriterion} from "./menu"; +import { + filterMenu, + getKeyByLiElement, + initCriteriaMenu, + moreMenu, + queryMenu, + replaceFilterMenu, + saveCriterion +} from "./menu"; import {App} from "../index"; import { assetFilterMenu, @@ -215,6 +223,7 @@ export const openGlobalSearch = (app: App, text: string, replace: boolean) => { group: localData.group, sort: localData.sort, types: Object.assign({}, localData.types), + replaceTypes: Object.assign({}, localData.replaceTypes), removed: localData.removed, page: 1 }, @@ -323,10 +332,15 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo
- -
+ + + + +
+ +
@@ -462,7 +476,8 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo paragraph: window.siyuan.config.search.paragraph, embedBlock: window.siyuan.config.search.embedBlock, databaseBlock: window.siyuan.config.search.databaseBlock, - } + }, + replaceTypes: Constants.SIYUAN_DEFAULT_REPLACETYPES, }, config, edit); element.querySelector(".b3-chip--current")?.classList.remove("b3-chip--current"); event.stopPropagation(); @@ -677,7 +692,8 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo paragraph: window.siyuan.config.search.paragraph, embedBlock: window.siyuan.config.search.embedBlock, databaseBlock: window.siyuan.config.search.databaseBlock, - } + }, + replaceTypes: Constants.SIYUAN_DEFAULT_REPLACETYPES, }, config, edit); element.querySelector("#criteria .b3-chip--current")?.classList.remove("b3-chip--current"); }, () => { @@ -746,6 +762,12 @@ export const genSearch = (app: App, config: ISearchOption, element: Element, clo event.stopPropagation(); event.preventDefault(); break; + } else if (target.id === "replaceFilter") { + window.siyuan.menus.menu.remove(); + replaceFilterMenu(config); + event.stopPropagation(); + event.preventDefault(); + break; } else if (type === "assetPrevious") { if (!target.getAttribute("disabled")) { let currentPage = parseInt(assetsElement.querySelector("#searchAssetResult .fn__flex-center").textContent.split("/")[0]); @@ -1137,7 +1159,8 @@ export const replace = (element: Element, config: ISearchOption, edit: Protyle, groupBy: config.group, orderBy: config.sort, page: config.page, - ids: isAll ? [] : [currentList.getAttribute("data-node-id")] + ids: isAll ? [] : [currentList.getAttribute("data-node-id")], + replaceTypes: config.replaceTypes }, (response) => { loadElement.classList.add("fn__none"); if (response.code === 1) { diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index c67472e2b..55f55c0a1 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -264,7 +264,10 @@ interface ISearchOption { htmlBlock: boolean embedBlock: boolean databaseBlock: boolean - } + }, + replaceTypes: { + [key: string]: boolean; + }, } interface ITextOption {