diff --git a/.vscode/Sillot.code-workspace b/.vscode/Sillot.code-workspace index e20683e9ab..b61caeed41 100644 --- a/.vscode/Sillot.code-workspace +++ b/.vscode/Sillot.code-workspace @@ -183,17 +183,19 @@ "donjayamanne.githistory", "DavidAnson.vscode-markdownlint", // 不适用本工作区 ::结束 - "vscjava.vscode-java-pack", // 避免自动推荐,有需要的自己会安装 - "vscjava.vscode-gradle", // 避免自动推荐,有需要的自己会安装 - "googlecloudtools.cloudcode", // 避免自动推荐,有需要的自己会安装 - "github.copilot", // 避免自动推荐,有需要的自己会安装 - "ms-kubernetes-tools.vscode-kubernetes-tools", // 避免自动推荐,有需要的自己会安装 - "firefox-devtools.vscode-firefox-debug", // 避免自动推荐,有需要的自己会安装 - "github.vscode-pull-request-github", // 避免自动推荐,有需要的自己会安装 - "ms-vscode-remote.remote-wsl", // 避免自动推荐,有需要的自己会安装 - "ms-vscode.PowerShell", // 避免自动推荐,有需要的自己会安装 - "DotJoshJohnson.xml", // 避免自动推荐,有需要的自己会安装 - "ms-azuretools.vscode-docker", // 避免自动推荐,有需要的自己会安装 + // 避免自动推荐,有需要的自己会安装 ::开始 + "vscjava.vscode-java-pack", + "vscjava.vscode-gradle", + "googlecloudtools.cloudcode", + "github.copilot", + "ms-kubernetes-tools.vscode-kubernetes-tools", + "firefox-devtools.vscode-firefox-debug", + "github.vscode-pull-request-github", + "ms-vscode-remote.remote-wsl", + "ms-vscode.PowerShell", + "DotJoshJohnson.xml", + "ms-azuretools.vscode-docker", + // 避免自动推荐,有需要的自己会安装 ::结束 "ms-python.vscode-pylance", // 推荐的插件包已集成此插件,无需单独推荐 "maixiaojie.git-emoji-zh", // 该扩展已集成在汐洛扩展 ] diff --git a/.vscode/extensions/Sillot/package.json b/.vscode/extensions/Sillot/package.json index 7d3cc91794..45e9e3b451 100644 --- a/.vscode/extensions/Sillot/package.json +++ b/.vscode/extensions/Sillot/package.json @@ -2,7 +2,7 @@ "name": "sillot", "displayName": "汐洛 Sillot", "description": "汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix)为智慧新彖务服务。此插件为汐洛官方插件,提供多功能一体化集成。", - "version": "0.33.1630", + "version": "0.33.1700", "preview": true, "repository": "https://github.com/Hi-Windom/Sillot", "publisher": "Hi-Windom", diff --git a/.vscode/extensions/Sillot/src/extension.ts b/.vscode/extensions/Sillot/src/extension.ts index be1c4aec1a..96d5b85ae9 100644 --- a/.vscode/extensions/Sillot/src/extension.ts +++ b/.vscode/extensions/Sillot/src/extension.ts @@ -39,7 +39,9 @@ import { YamlCompletionItemProvider } from "./provider/yaml"; import { FontMapList, apply花字Transformation } from "./context/花字"; import { C } from "./extension.const"; import { add_module_git_emoji_zh } from "./modules/git_emoji_zh"; -import { unwantedRecommendations_check_by_id } from "./task/unwantedRecommendations"; +import { add_task_unwantedRecommendations_check_by_id } from "./task/unwantedRecommendations"; +import { loadCompletionItemsFromFile, saveCompletionItemsToFile } from "./utils/json"; +import { add_task_同步更新版本 } from "./task/同步更新版本"; let lastChangedDocument: vscode.TextDocument | null = null; let myWebviewPanel: vscode.WebviewPanel | undefined; @@ -60,103 +62,21 @@ class fileCompletionItemProvider implements vscode.CompletionItemProvider { return this.completionItems; } } -// 序列化并保存到文件 -async function saveCompletionItemsToFile(filePath: string, items: Array | { [key: string]: any }) { - // 使用 json5.stringify 格式化 JSON,使其更易读 - const serializedItems = json5.stringify(items, { - space: 2, - quote: '"', - }); - - // 使用 fs-extra 写入文件 - await fs.writeFile(filePath, serializedItems, "utf-8"); -} - -// 从文件反序列化 -async function loadCompletionItemsFromFile(filePath: string): Promise { - // 使用 fs-extra 读取文件 - const serializedItems = await fs.readFile(filePath, "utf-8"); - - // 使用 json5.parse 反序列化 JSON - const items = json5.parse(serializedItems); - - // 返回反序列化后的数组 - return items; -} export async function activate(context: vscode.ExtensionContext) { if (vscode.workspace.workspaceFile) { - unwantedRecommendations_check_by_id(vscode.workspace.workspaceFile.fsPath) + add_task_unwantedRecommendations_check_by_id(vscode.workspace.workspaceFile.fsPath); } // 监听扩展状态变化事件 context.subscriptions.push( vscode.extensions.onDidChange(() => { if (vscode.workspace.workspaceFile) { - unwantedRecommendations_check_by_id(vscode.workspace.workspaceFile.fsPath) + add_task_unwantedRecommendations_check_by_id(vscode.workspace.workspaceFile.fsPath); } }) ); - add_module_git_emoji_zh(context) - const disposable555 = vscode.commands.registerCommand("汐洛.同步更新版本", () => { - vscode.window.showInputBox({ prompt: "Enter new version" }).then(async version => { - if (version) { - const wname = vscode.workspace.name; - if (wname && vscode.workspace.workspaceFile) { - const pkgMapFile = `${path.dirname(vscode.workspace.workspaceFile.fsPath)}/${C.PackageJsonMapping}`; - Log.d(wname, pkgMapFile); - if (!(await fs.exists(pkgMapFile))) { - vscode.window.showWarningMessage("package.json 映射不存在,请先添加"); - return; - } - - const pkgMap: { [key: string]: any } = await loadCompletionItemsFromFile(pkgMapFile); - const paths: string[] = pkgMap[wname]; - // 创建快速选择框 - const quickPick = vscode.window.createQuickPick(); - quickPick.title = "选择要更新版本的文件"; - // quickPick.items = [{ label: "Option 1" }, { label: "Option 2" }, { label: "Option 3" }]; - quickPick.items = paths.map(path => ({ label: path })); - quickPick.canSelectMany = true; // 允许多选 - - // 显示快速选择框并等待用户选择 - const selectedOptions: string[] = await new Promise(resolve => { - quickPick.onDidAccept(() => { - resolve(quickPick.selectedItems.map(item => item.label)); - quickPick.dispose(); - }); - quickPick.onDidHide(() => { - resolve([]); - quickPick.dispose(); - }); - quickPick.show(); - }); - - if (selectedOptions.length > 0) { - Log.d(`Version: ${version}, Selected options:${selectedOptions.join(", ")}`); - } else { - resolve(); - } - // 遍历映射并更新版本号 - selectedOptions.forEach(async (value: string, index: number) => { - Log.d("汐洛.同步更新版本", value); - if (await fs.exists(value)) { - const pkgContent = fs.readJSONSync(value); - pkgContent.version = version; - fs.writeFileSync(value, JSON.stringify(pkgContent, null, 2)); - Log.d(`${version} -> ${value}`); - } else { - vscode.window.showWarningMessage(`已跳过无效映射 ${value}`); - } - }); - vscode.window.showInformationMessage("Version updated in all package.json files."); - } else { - vscode.window.showWarningMessage("当前不在工作区环境"); - } - } - }); - }); - - context.subscriptions.push(disposable555); + add_module_git_emoji_zh(context); + add_task_同步更新版本(context); const addMappingDisposable = vscode.commands.registerCommand("汐洛.addPackageJsonMapping", async (uri: vscode.Uri) => { if (uri?.fsPath.endsWith("package.json")) { diff --git a/.vscode/extensions/Sillot/src/task/unwantedRecommendations.ts b/.vscode/extensions/Sillot/src/task/unwantedRecommendations.ts index d069cd977c..2e50d5f116 100644 --- a/.vscode/extensions/Sillot/src/task/unwantedRecommendations.ts +++ b/.vscode/extensions/Sillot/src/task/unwantedRecommendations.ts @@ -2,7 +2,7 @@ import * as vscode from "vscode"; import fs from "fs-extra"; import json5 from "json5"; -export async function unwantedRecommendations_check_by_id(profilePath: string) { +export async function add_task_unwantedRecommendations_check_by_id(profilePath: string) { const serializedItems = await fs.readFile(profilePath, "utf-8"); const wp_json = json5.parse(serializedItems); if (wp_json.extensions?.unwantedRecommendations) { diff --git "a/.vscode/extensions/Sillot/src/task/\345\220\214\346\255\245\346\233\264\346\226\260\347\211\210\346\234\254.ts" "b/.vscode/extensions/Sillot/src/task/\345\220\214\346\255\245\346\233\264\346\226\260\347\211\210\346\234\254.ts" new file mode 100644 index 0000000000..5f2854d8a6 --- /dev/null +++ "b/.vscode/extensions/Sillot/src/task/\345\220\214\346\255\245\346\233\264\346\226\260\347\211\210\346\234\254.ts" @@ -0,0 +1,81 @@ +import * as vscode from "vscode"; +import fs from "fs-extra"; +import path, { resolve } from "path"; +import { Log } from "../utils/log"; +import { C } from "../extension.const"; +import { loadCompletionItemsFromFile } from "../utils/json"; + +export function add_task_同步更新版本(context: vscode.ExtensionContext) { + const disposable = vscode.commands.registerCommand("汐洛.同步更新版本", async () => { + const wname = vscode.workspace.name; + if (wname && vscode.workspace.workspaceFile) { + const pkgMapFile = `${path.dirname(vscode.workspace.workspaceFile.fsPath)}/${C.PackageJsonMapping}`; + Log.d(wname, pkgMapFile); + if (!(await fs.exists(pkgMapFile))) { + vscode.window.showWarningMessage("package.json 映射不存在,请先添加"); + return; + } + const pkgMap: { [key: string]: any } = await loadCompletionItemsFromFile(pkgMapFile); + const paths: string[] = pkgMap[wname]; + + // 创建快速选择框 + const quickPick = vscode.window.createQuickPick(); + quickPick.title = "选择要更新版本的文件"; + quickPick.items = paths.map(path => ({ label: path })); + quickPick.canSelectMany = true; // 允许多选 + + // 显示快速选择框并等待用户选择 + const selectedOptions: string[] = await new Promise(resolve => { + quickPick.onDidAccept(() => { + resolve(quickPick.selectedItems.map(item => item.label)); + quickPick.dispose(); + }); + quickPick.onDidHide(() => { + resolve([]); + quickPick.dispose(); + }); + quickPick.show(); + }); + + if (selectedOptions.length === 0) { + // 如果用户没有选择任何选项,则直接返回 + return; + } + + // 获取用户选择的路径的版本号 + const versionPromises = selectedOptions.map(async (value: string) => { + if (await fs.exists(value)) { + const pkgContent = fs.readJSONSync(value); + return pkgContent.version; + } + return null; // 如果文件不存在,返回null + }); + + Promise.all(versionPromises).then(versions => { + // 过滤掉null值 + const validVersions = versions.filter(version => version !== null); + vscode.window.showInputBox({ prompt: `输入新版本: (当前版本: ${validVersions.join(", ")})` }).then(async version => { + if (version) { + // 遍历映射并更新版本号 + selectedOptions.forEach(async (value: string, index: number) => { + Log.d("汐洛.同步更新版本", value); + if (await fs.exists(value)) { + const pkgContent = fs.readJSONSync(value); + pkgContent.version = version; + fs.writeFileSync(value, JSON.stringify(pkgContent, null, 2)); + Log.d(`${version} ->${value}`); + } else { + vscode.window.showWarningMessage(`已跳过无效映射 ${value}`); + } + }); + vscode.window.showInformationMessage("所有 package.json 文件的版本已更新。"); + } + }); + }); + } else { + vscode.window.showWarningMessage("当前不在工作区环境"); + } + }); + + context.subscriptions.push(disposable); +} diff --git a/.vscode/extensions/Sillot/src/utils/json.ts b/.vscode/extensions/Sillot/src/utils/json.ts new file mode 100644 index 0000000000..048431e92b --- /dev/null +++ b/.vscode/extensions/Sillot/src/utils/json.ts @@ -0,0 +1,29 @@ +import type * as vscode from "vscode"; +import fs from "fs-extra"; +import json5 from "json5"; +import path, { resolve } from "path"; +import { Log } from "../utils/log"; + +// 序列化并保存到文件 +export async function saveCompletionItemsToFile(filePath: string, items: Array | { [key: string]: any }) { + // 使用 json5.stringify 格式化 JSON,使其更易读 + const serializedItems = json5.stringify(items, { + space: 2, + quote: '"', + }); + + // 使用 fs-extra 写入文件 + await fs.writeFile(filePath, serializedItems, "utf-8"); +} + +// 从文件反序列化 +export async function loadCompletionItemsFromFile(filePath: string): Promise { + // 使用 fs-extra 读取文件 + const serializedItems = await fs.readFile(filePath, "utf-8"); + + // 使用 json5.parse 反序列化 JSON + const items = json5.parse(serializedItems); + + // 返回反序列化后的数组 + return items; +} diff --git a/app/package.json b/app/package.json index 5d14f2bb93..403a39f1e5 100644 --- a/app/package.json +++ b/app/package.json @@ -1,6 +1,6 @@ { "name": "sillot", - "version": "0.33.1630", + "version": "0.33.1700", "syv": "3.0.14", "sypv": "[]", "description": "Build Your Eternal Digital Garden", diff --git a/app/src/assets/scss/component/_typography.scss b/app/src/assets/scss/component/_typography.scss index 05a3573c0f..e7e234c78f 100644 --- a/app/src/assets/scss/component/_typography.scss +++ b/app/src/assets/scss/component/_typography.scss @@ -414,6 +414,8 @@ margin: 0 auto; max-width: 100%; user-select: none; + word-break: keep-all; + white-space: nowrap; & > span:nth-child(1), & > span:nth-child(3) { diff --git a/app/src/assets/scss/protyle/_protyle.scss b/app/src/assets/scss/protyle/_protyle.scss index c4ab34ed3a..318b39d314 100644 --- a/app/src/assets/scss/protyle/_protyle.scss +++ b/app/src/assets/scss/protyle/_protyle.scss @@ -55,6 +55,12 @@ .b3-slider { width: var(--b3-dynamicscroll-width); display: block; + + &::-webkit-slider-runnable-track, + &::-webkit-slider-thumb { + background-color: var(--b3-border-color); + box-shadow: none; + } } } } diff --git a/app/src/layout/dock/Files.ts b/app/src/layout/dock/Files.ts index 88dcbd26ed..d63e15c0fa 100644 --- a/app/src/layout/dock/Files.ts +++ b/app/src/layout/dock/Files.ts @@ -921,7 +921,7 @@ export class Files extends Model { // 文件展开时,刷新 liElement.nextElementSibling.remove(); } - const arrowElement = liElement.querySelector(".b3-list-item__arrow") + const arrowElement = liElement.querySelector(".b3-list-item__arrow"); arrowElement.classList.add("b3-list-item__arrow--open"); arrowElement.parentElement.classList.remove("fn__hidden"); liElement.insertAdjacentHTML("afterend", `
    ${fileHTML}
`); diff --git a/app/src/mobile/dock/MobileOutline.ts b/app/src/mobile/dock/MobileOutline.ts index ec882843f5..bf39403474 100644 --- a/app/src/mobile/dock/MobileOutline.ts +++ b/app/src/mobile/dock/MobileOutline.ts @@ -6,6 +6,7 @@ import {getEventName} from "../../protyle/util/compatibility"; import type {App} from "../../index"; import {closePanel} from "../util/closePanel"; import {checkFold} from "../../util/noRelyPCFunction"; +import {hasClosestBlock} from "../../protyle/util/hasClosest"; export class MobileOutline { private tree: Tree; @@ -83,6 +84,16 @@ export class MobileOutline { this.openNodes[blockId] = this.tree.getExpandIds(); } + if (window.siyuan.mobile.editor?.protyle?.toolbar.range) { + const blockElement = hasClosestBlock(window.siyuan.mobile.editor.protyle.toolbar.range.startContainer); + if (blockElement) { + const currentElement = this.element.querySelector(`[data-node-id="${blockElement.dataset.nodeId}"]`); + if (currentElement) { + currentElement.classList.add("b3-list-item--focus"); + return; + } + } + } if (currentId) { currentElement = this.element.querySelector(`[data-node-id="${currentId}"]`); if (currentElement) { diff --git a/app/src/protyle/export/index.ts b/app/src/protyle/export/index.ts index 43e1f531c5..6c3bd71c56 100644 --- a/app/src/protyle/export/index.ts +++ b/app/src/protyle/export/index.ts @@ -426,6 +426,7 @@ const renderPDF = async (id: string) => { config: { appearance: { mode: 0, codeBlockThemeDark: "${window.siyuan.config.appearance.codeBlockThemeDark}", codeBlockThemeLight: "${window.siyuan.config.appearance.codeBlockThemeLight}" }, editor: { + allowHTMLBLockScript: ${window.siyuan.config.editor.allowHTMLBLockScript}, fontSize: ${window.siyuan.config.editor.fontSize}, codeLineWrap: true, codeLigatures: ${window.siyuan.config.editor.codeLigatures}, diff --git a/app/src/protyle/hint/extend.ts b/app/src/protyle/hint/extend.ts index c94ca21e92..0bd6599841 100644 --- a/app/src/protyle/hint/extend.ts +++ b/app/src/protyle/hint/extend.ts @@ -52,9 +52,13 @@ export const hintSlash = (key: string, protyle: IProtyle) => { value: '
', html: `
${window.siyuan.languages.database}
`, }, { - filter: ["文档", "子文档", "wendang", "wd", "ziwendang", "zwd", "xjwd"], + filter: ["文档", "wendang", "wd", "xjwd", "new doc"], value: Constants.ZWSP + 4, html: `
${window.siyuan.languages.newFile}${updateHotkeyTip(window.siyuan.config.keymap.general.newFile.custom)}
`, + }, { + filter: ["子文档", "ziwendang", "zwd", "xjzwd", "create sub doc"], + value: Constants.ZWSP + 6, + html: `
${window.siyuan.languages.newSubDoc}
`, }, { value: "", html: "separator", diff --git a/app/src/protyle/hint/index.ts b/app/src/protyle/hint/index.ts index f466d3ff89..589ac50e9e 100644 --- a/app/src/protyle/hint/index.ts +++ b/app/src/protyle/hint/index.ts @@ -9,7 +9,7 @@ import { getSelectionPosition } from "../util/selection"; import {genHintItemHTML, hintEmbed, hintRef, hintSlash} from "./extend"; -import {getSavePath} from "../../util/newFile"; +import {getSavePath, newFile} from "../../util/newFile"; import {upDownHint} from "../../util/upDownHint"; import {setPosition} from "../../util/setPosition"; import {getContenteditableElement, hasNextSibling, hasPreviousSibling} from "../wysiwyg/getBlock"; @@ -615,6 +615,16 @@ ${genHintItemHTML(item)} range.deleteContents(); return; } else if (value === Constants.ZWSP + 4) { + // 新建文档 + newFile({ + app: protyle.app, + notebookId: protyle.notebookId, + useSavePath: true, + currentPath: protyle.path, + }); + return; + } else if (value === Constants.ZWSP + 6) { + // 新建子文档 const newSubDocId = Lute.NewNodeID(); fetchPost("/api/filetree/createDoc", { notebook: protyle.notebookId, diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts index 4f2683988d..37db47ed09 100644 --- a/app/src/protyle/render/av/action.ts +++ b/app/src/protyle/render/av/action.ts @@ -169,6 +169,8 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle protyle.toolbar.range = document.createRange(); protyle.toolbar.range.selectNodeContents(target); focusByRange(protyle.toolbar.range); + target.parentElement.classList.add("av__cell--select"); + addDragFill(target.parentElement); hintRef(target.previousElementSibling.textContent.trim(), protyle, "av"); event.preventDefault(); event.stopPropagation(); diff --git a/app/src/protyle/render/av/col.ts b/app/src/protyle/render/av/col.ts index dd3ac1ecba..bb065d38bb 100644 --- a/app/src/protyle/render/av/col.ts +++ b/app/src/protyle/render/av/col.ts @@ -188,7 +188,7 @@ export const getEditHTML = (options: { ${isSelf ? window.siyuan.languages.thisDatabase : ""} -