Vanessa 2025-11-29 11:17:58 +08:00
parent 9f0eaa6a0b
commit cad7d48320
6 changed files with 87 additions and 66 deletions

View file

@ -3,21 +3,20 @@ import * as path from "path";
/// #endif
import {matchHotKey} from "../../protyle/util/hotKey";
import {fetchPost} from "../../util/fetch";
import {openFileById} from "../../editor/util";
import {Constants} from "../../constants";
import {newFileByName} from "../../util/newFile";
import {App} from "../../index";
import {Dialog} from "../../dialog";
import {getAllModels} from "../../layout/getAll";
import {hasClosestByClassName} from "../../protyle/util/hasClosest";
import {getArticle, inputEvent, replace} from "../../search/util";
import {getArticle, inputEvent, openSearchEditor, replace} from "../../search/util";
import {useShell} from "../../util/pathName";
import {assetInputEvent, renderPreview} from "../../search/assets";
import {initSearchMenu} from "../../menus/search";
import {writeText} from "../../protyle/util/compatibility";
import {checkFold} from "../../util/noRelyPCFunction";
import {getUnRefList} from "../../search/unRef";
import {toggleAssetHistory, toggleReplaceHistory, toggleSearchHistory} from "../../search/toggleHistory";
import {Protyle} from "../../protyle";
export const searchKeydown = (app: App, event: KeyboardEvent) => {
if (getSelection().rangeCount === 0) {
@ -29,7 +28,7 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => {
}
let element: HTMLElement;
let dialog: Dialog;
let edit;
let edit: Protyle;
let unRefEdit;
let config: Config.IUILayoutTabSearchConfig;
window.siyuan.dialogs.find((item) => {
@ -98,20 +97,15 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => {
}
if (searchType !== "asset") {
if (matchHotKey(window.siyuan.config.keymap.editor.general.insertRight.custom, event)) {
const id = currentList.getAttribute("data-node-id");
checkFold(id, (zoomIn) => {
openFileById({
app,
id,
position: "right",
action: zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HL] :
[Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_HL],
zoomIn,
scrollPosition: "center"
});
if (dialog) {
dialog.destroy({focus: "false"});
}
openSearchEditor({
protyle: edit.protyle,
id: currentList.getAttribute("data-node-id"),
cb: () => {
if (dialog) {
dialog.destroy({focus: "false"});
}
},
openPosition: "right",
});
return true;
}
@ -222,19 +216,14 @@ export const searchKeydown = (app: App, event: KeyboardEvent) => {
if (targetId === "replaceInput") {
replace(element, config, edit, false);
} else {
const id = currentList.getAttribute("data-node-id");
checkFold(id, (zoomIn) => {
openFileById({
app,
id,
action: zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HL] :
[Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_HL],
zoomIn,
scrollPosition: "center"
});
if (dialog) {
dialog.destroy({focus: "false"});
}
openSearchEditor({
protyle: edit.protyle,
id: currentList.getAttribute("data-node-id"),
cb: () => {
if (dialog) {
dialog.destroy({focus: "false"});
}
},
});
}
} else {

View file

@ -130,6 +130,7 @@ export abstract class Constants {
public static readonly CB_GET_BACKLINK = "cb-get-backlink"; // 悬浮窗为传递型需展示上下文
public static readonly CB_GET_UNUNDO = "cb-get-unundo"; // 不需要记录历史
public static readonly CB_GET_SCROLL = "cb-get-scroll"; // 滚动到指定位置,用于直接打开文档,必有 rootID
public static readonly CB_GET_SEARCH = "cb-get-search"; // 通过搜索打开
public static readonly CB_GET_CONTEXT = "cb-get-context"; // 包含上下文
public static readonly CB_GET_ROOTSCROLL = "cb-get-rootscroll"; // 如果为 rootID 就滚动到指定位置,必有 rootID
public static readonly CB_GET_HTML = "cb-get-html"; // 直接渲染,不需要再 /api/block/getDocInfo否则搜索表格无法定位

View file

@ -10,7 +10,7 @@ import {Constants} from "../constants";
import {setEditMode} from "../protyle/util/setEditMode";
import {Files} from "../layout/dock/Files";
import {fetchPost, fetchSyncPost} from "../util/fetch";
import {focusBlock, focusByRange} from "../protyle/util/selection";
import {focusBlock, focusByOffset, focusByRange} from "../protyle/util/selection";
import {onGet} from "../protyle/util/onGet";
/// #if !BROWSER
import {ipcRenderer} from "electron";
@ -398,9 +398,14 @@ const switchEditor = (editor: Editor, options: IOpenFileOptions, allModels: IMod
}
if (options.action?.includes(Constants.CB_GET_FOCUS)) {
if (nodeElement) {
const newRange = focusBlock(nodeElement, undefined, !options.action?.includes(Constants.CB_GET_OUTLINE));
if (newRange) {
editor.editor.protyle.toolbar.range = newRange;
if (options.action.includes(Constants.CB_GET_SEARCH)) {
const scrollAttr = window.siyuan.storage[Constants.LOCAL_FILEPOSITION][editor.editor.protyle.block.rootID];
focusByOffset(nodeElement, scrollAttr.focusStart, scrollAttr.focusEnd);
} else {
const newRange = focusBlock(nodeElement, undefined, !options.action?.includes(Constants.CB_GET_OUTLINE));
if (newRange) {
editor.editor.protyle.toolbar.range = newRange;
}
}
scrollCenter(editor.editor.protyle, (editor.editor.protyle.disabled || options.scrollPosition) ? nodeElement : null, options.scrollPosition);
editor.editor.protyle.observerLoad = new ResizeObserver(() => {

View file

@ -85,6 +85,7 @@ export const getDocByScroll = (options: {
highlight: !isSupportCSSHL(),
}, response => {
onGet({
scrollPosition: options.mergedOptions.scrollPosition,
data: response,
protyle: options.protyle,
action: actions,
@ -98,6 +99,7 @@ export const getDocByScroll = (options: {
} else {
actions.push(Constants.CB_GET_ALL);
onGet({
scrollPosition: options.mergedOptions.scrollPosition,
data: response,
protyle: options.protyle,
action: actions,
@ -121,6 +123,7 @@ export const getDocByScroll = (options: {
highlight: !isSupportCSSHL(),
}, response => {
onGet({
scrollPosition: options.mergedOptions.scrollPosition,
data: response,
protyle: options.protyle,
action: actions,

View file

@ -15,7 +15,7 @@ import {onGet} from "../protyle/util/onGet";
import {addLoading} from "../protyle/ui/initUI";
import {getIconByType} from "../editor/getIcon";
import {unicode2Emoji} from "../emoji";
import {hasClosestByClassName, hasClosestByTag} from "../protyle/util/hasClosest";
import {hasClosestBlock, hasClosestByClassName, hasClosestByTag} from "../protyle/util/hasClosest";
import {isIPad, isNotCtrl, setStorageVal, updateHotkeyTip} from "../protyle/util/compatibility";
import {newFileByName} from "../util/newFile";
import {
@ -45,6 +45,7 @@ import {getDefaultType} from "./getDefault";
import {isSupportCSSHL, searchMarkRender} from "../protyle/render/searchMarkRender";
import {saveKeyList, toggleAssetHistory, toggleReplaceHistory, toggleSearchHistory} from "./toggleHistory";
import {highlightById} from "../util/highlightById";
import {getSelectionOffset} from "../protyle/util/selection";
export const openGlobalSearch = (app: App, text: string, replace: boolean, searchData?: Config.IUILayoutTabSearchConfig) => {
text = text.trim();
@ -814,20 +815,11 @@ export const genSearch = (app: App, config: Config.IUILayoutTabSearchConfig, ele
}
} else {
if (event.altKey) {
const id = target.getAttribute("data-node-id");
checkFold(id, (zoomIn) => {
openFileById({
app,
id,
action: zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HL] :
[Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_HL],
zoomIn,
position: "right",
scrollPosition: "center"
});
if (closeCB) {
closeCB();
}
openSearchEditor({
protyle: edit.protyle,
id: target.getAttribute("data-node-id"),
cb: closeCB,
openPosition: "right",
});
} else if (!target.classList.contains("b3-list-item--focus")) {
(searchType === "doc" ? searchPanelElement : unRefPanelElement).querySelector(".b3-list-item--focus").classList.remove("b3-list-item--focus");
@ -856,19 +848,10 @@ export const genSearch = (app: App, config: Config.IUILayoutTabSearchConfig, ele
useShell("showItemInFolder", path.join(window.siyuan.config.system.dataDir, target.lastElementChild.getAttribute("aria-label")));
/// #endif
} else {
const id = target.getAttribute("data-node-id");
checkFold(id, (zoomIn) => {
openFileById({
app,
id,
action: zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HL] :
[Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_HL],
zoomIn,
scrollPosition: "center"
});
if (closeCB) {
closeCB();
}
openSearchEditor({
protyle: edit.protyle,
id: target.getAttribute("data-node-id"),
cb: closeCB
});
}
}
@ -925,6 +908,45 @@ export const genSearch = (app: App, config: Config.IUILayoutTabSearchConfig, ele
return {edit, unRefEdit};
};
export const openSearchEditor = (options: {
protyle: IProtyle,
openPosition?: string,
id?: string,
cb?: () => void
}) => {
const currentRange = options.protyle.highlight.ranges[options.protyle.highlight.rangeIndex];
if (currentRange) {
const rangeBlockElement = hasClosestBlock(currentRange.startContainer);
if (rangeBlockElement) {
options.id = rangeBlockElement.getAttribute("data-node-id");
const offset = getSelectionOffset(rangeBlockElement, null, options.protyle.highlight.ranges[options.protyle.highlight.rangeIndex]);
const scrollAttr: IScrollAttr = {
rootId: options.protyle.block.rootID,
focusId: options.id,
focusStart: offset.start,
focusEnd: offset.end,
zoomInId: options.protyle.block.showAll ? options.protyle.block.id : undefined
};
window.siyuan.storage[Constants.LOCAL_FILEPOSITION][options.protyle.block.rootID] = scrollAttr;
}
}
checkFold(options.id, (zoomIn) => {
openFileById({
app: options.protyle.app,
id:options.id,
action: currentRange ?
(zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_SCROLL, Constants.CB_GET_SEARCH] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_SCROLL, Constants.CB_GET_SEARCH]) :
(zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HL] : [Constants.CB_GET_FOCUS, Constants.CB_GET_CONTEXT, Constants.CB_GET_HL]),
zoomIn,
position: options.openPosition,
scrollPosition: "center"
});
if (options.cb) {
options.cb();
}
});
};
export const genQueryHTML = (method: number, id: string) => {
let methodTip = "";
let methodIcon = "";

View file

@ -34,6 +34,7 @@ type TProtyleAction = "cb-get-append" | // 向下滚动加载
"cb-get-backlink" | // 悬浮窗为传递型需展示上下文
"cb-get-unundo" | // 不需要记录历史
"cb-get-scroll" | // 滚动到指定位置,用于直接打开文档,必有 rootID
"cb-get-search" | // 使用搜索打开搜索
"cb-get-context" | // 包含上下文
"cb-get-rootscroll" | // 如果为 rootID 就滚动到指定位置,必有 rootID
"cb-get-html" | // 直接渲染,不需要再 /api/block/getDocInfo否则搜索表格无法定位
@ -343,9 +344,9 @@ interface IUpload {
interface IScrollAttr {
rootId: string,
startId: string,
endId: string
scrollTop: number,
startId?: string,
endId?: string
scrollTop?: number,
focusId?: string,
focusStart?: number
focusEnd?: number