mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-16 14:40:12 +01:00
Merge branch 'dev' into feat/doctree
This commit is contained in:
commit
5d2793f6b4
237 changed files with 30219 additions and 12881 deletions
8
.github/CONTRIBUTING.md
vendored
8
.github/CONTRIBUTING.md
vendored
|
|
@ -7,17 +7,17 @@
|
|||
|
||||
## NPM dependencies
|
||||
|
||||
Install pnpm: `npm install -g pnpm@10.15.1`
|
||||
Install pnpm: `npm install -g pnpm@10.18.3`
|
||||
|
||||
<details>
|
||||
<summary>For China mainland</summary>
|
||||
|
||||
Set the Electron mirror environment variable and install Electron:
|
||||
|
||||
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.4.0 -D`
|
||||
* macOS/Linux: `ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.7.0 -D`
|
||||
* Windows:
|
||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||
* `pnpm install electron@37.4.0 -D`
|
||||
* `pnpm install electron@37.7.0 -D`
|
||||
|
||||
NPM mirror:
|
||||
|
||||
|
|
@ -27,7 +27,7 @@ NPM mirror:
|
|||
|
||||
Enter the app folder and execute:
|
||||
|
||||
* `pnpm install electron@37.4.0 -D`
|
||||
* `pnpm install electron@37.7.0 -D`
|
||||
* `pnpm run dev`
|
||||
* `pnpm run start`
|
||||
|
||||
|
|
|
|||
8
.github/CONTRIBUTING_zh_CN.md
vendored
8
.github/CONTRIBUTING_zh_CN.md
vendored
|
|
@ -7,17 +7,17 @@
|
|||
|
||||
## NPM 依赖
|
||||
|
||||
安装 pnpm:`npm install -g pnpm@10.15.1`
|
||||
安装 pnpm:`npm install -g pnpm@10.18.3`
|
||||
|
||||
<details>
|
||||
<summary>适用于中国大陆</summary>
|
||||
|
||||
设置 Electron 镜像环境变量并安装 Electron:
|
||||
|
||||
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.4.0 -D`
|
||||
* macOS/Linux:`ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ pnpm install electron@37.7.0 -D`
|
||||
* Windows:
|
||||
* `SET ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/`
|
||||
* `pnpm install electron@37.4.0 -D`
|
||||
* `pnpm install electron@37.7.0 -D`
|
||||
|
||||
NPM 镜像:
|
||||
|
||||
|
|
@ -27,7 +27,7 @@ NPM 镜像:
|
|||
|
||||
进入 app 文件夹执行:
|
||||
|
||||
* `pnpm install electron@37.4.0 -D`
|
||||
* `pnpm install electron@37.7.0 -D`
|
||||
* `pnpm run dev`
|
||||
* `pnpm run start`
|
||||
|
||||
|
|
|
|||
82
Dockerfile
82
Dockerfile
|
|
@ -1,52 +1,60 @@
|
|||
FROM node:21 AS NODE_BUILD
|
||||
FROM --platform=$BUILDPLATFORM node:21 AS node-build
|
||||
|
||||
WORKDIR /go/src/github.com/siyuan-note/siyuan/
|
||||
ADD . /go/src/github.com/siyuan-note/siyuan/
|
||||
RUN apt-get update && \
|
||||
apt-get install -y jq
|
||||
RUN cd app && \
|
||||
packageManager=$(jq -r '.packageManager' package.json) && \
|
||||
if [ -n "$packageManager" ]; then \
|
||||
npm install -g $packageManager; \
|
||||
else \
|
||||
echo "No packageManager field found in package.json"; \
|
||||
npm install -g pnpm; \
|
||||
fi && \
|
||||
pnpm install --registry=http://registry.npmjs.org/ --silent && \
|
||||
ARG NPM_REGISTRY=
|
||||
|
||||
WORKDIR /app
|
||||
ADD app/package.json app/pnpm* app/.npmrc .
|
||||
|
||||
RUN <<EORUN
|
||||
#!/bin/bash -e
|
||||
corepack enable
|
||||
corepack install --global $(node -e 'console.log(require("./package.json").packageManager)')
|
||||
npm config set registry ${NPM_REGISTRY}
|
||||
pnpm install --silent
|
||||
EORUN
|
||||
|
||||
ADD app/ .
|
||||
RUN <<EORUN
|
||||
#!/bin/bash -e
|
||||
pnpm run build
|
||||
RUN apt-get purge -y jq
|
||||
RUN apt-get autoremove -y
|
||||
RUN rm -rf /var/lib/apt/lists/*
|
||||
mkdir /artifacts
|
||||
mv appearance stage guide changelogs /artifacts/
|
||||
EORUN
|
||||
|
||||
FROM golang:1.24-alpine AS GO_BUILD
|
||||
WORKDIR /go/src/github.com/siyuan-note/siyuan/
|
||||
COPY --from=NODE_BUILD /go/src/github.com/siyuan-note/siyuan/ /go/src/github.com/siyuan-note/siyuan/
|
||||
ENV GO111MODULE=on
|
||||
ENV CGO_ENABLED=1
|
||||
RUN apk add --no-cache gcc musl-dev && \
|
||||
cd kernel && go build --tags fts5 -v -ldflags "-s -w" && \
|
||||
mkdir /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/app/appearance/ /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/app/stage/ /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/app/guide/ /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/app/changelogs/ /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/kernel/kernel /opt/siyuan/ && \
|
||||
mv /go/src/github.com/siyuan-note/siyuan/kernel/entrypoint.sh /opt/siyuan/entrypoint.sh && \
|
||||
find /opt/siyuan/ -name .git | xargs rm -rf
|
||||
FROM golang:1.24-alpine AS go-build
|
||||
|
||||
ARG GOPROXY=
|
||||
|
||||
RUN <<EORUN
|
||||
#!/bin/sh -e
|
||||
apk add --no-cache gcc musl-dev
|
||||
go env -w GO111MODULE=on
|
||||
go env -w GOPROXY=${GOPROXY}
|
||||
go env -w CGO_ENABLED=1
|
||||
EORUN
|
||||
|
||||
WORKDIR /kernel
|
||||
ADD kernel/go.* .
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg \
|
||||
go mod download
|
||||
|
||||
ADD kernel/ .
|
||||
RUN --mount=type=cache,target=/root/.cache/go-build --mount=type=cache,target=/go/pkg \
|
||||
go build --tags fts5 -v -ldflags "-s -w"
|
||||
|
||||
FROM alpine:latest
|
||||
LABEL maintainer="Liang Ding<845765@qq.com>"
|
||||
|
||||
WORKDIR /opt/siyuan/
|
||||
COPY --from=GO_BUILD /opt/siyuan/ /opt/siyuan/
|
||||
|
||||
RUN apk add --no-cache ca-certificates tzdata su-exec && \
|
||||
chmod +x /opt/siyuan/entrypoint.sh
|
||||
RUN apk add --no-cache ca-certificates tzdata su-exec
|
||||
|
||||
ENV TZ=Asia/Shanghai
|
||||
ENV HOME=/home/siyuan
|
||||
ENV RUN_IN_CONTAINER=true
|
||||
EXPOSE 6806
|
||||
|
||||
WORKDIR /opt/siyuan/
|
||||
COPY --from=go-build --chmod=755 /kernel/kernel /kernel/entrypoint.sh .
|
||||
COPY --from=node-build /artifacts .
|
||||
|
||||
ENTRYPOINT ["/opt/siyuan/entrypoint.sh"]
|
||||
CMD ["/opt/siyuan/kernel"]
|
||||
|
|
|
|||
|
|
@ -44,6 +44,7 @@
|
|||
* [Unraid 部署](#unraid-部署)
|
||||
* [宝塔面板 部署](#宝塔面板部署)
|
||||
* [小皮面板 部署](#小皮面板部署)
|
||||
* [1Panel面板 部署](#1Panel面板部署)
|
||||
* [内部预览版](#内部预览版)
|
||||
* [🏘️ 社区](#️-社区)
|
||||
* [🛠️ 开发指南](#️-开发指南)
|
||||
|
|
@ -361,6 +362,42 @@ Publish parameters: --accessAuthCode=******(访问授权码)
|
|||
|
||||
</details>
|
||||
|
||||
### 1Panel面板部署
|
||||
|
||||
<details>
|
||||
<summary>1Panel面板 部署文档</summary>
|
||||
|
||||
#### 前提
|
||||
|
||||
- 仅适用于1Panel面板v1.10.32-lts及以上版本
|
||||
- 安装1Panel面板,前往[1Panel](https://1panel.cn/)官网,选择正式版安装脚本下载安装
|
||||
|
||||
#### 部署
|
||||
|
||||
1. 登录1Panel面板,在左侧菜单栏中点击 `应用商店`
|
||||
2. 在 `应用商店-实用工具` 中找到 `思源笔记`,点击`安装`,也可以在搜索框直接搜索
|
||||
3. 配置访问授权码等基本信息,点击 `确定`
|
||||
|
||||
- 名称:应用名称,默认 `siyuan`
|
||||
- 版本:默认最新发行版
|
||||
- 端口:默认 `6806`
|
||||
- 访问授权码:访问笔记时需要使用的`访问密码`
|
||||
- 端口外部访问:如你需通过 `IP+Port` 直接访问,请勾选,同时会开放服务器防火墙端口
|
||||
- CPU限制:默认为0,不限制,可根据实际需要设置
|
||||
- 内存限制:默认为0,不限制,可根据实际需要设置
|
||||
4. 提交后面板会自动进行应用安装启动,应用状态会变为`安装中`,大概需要`1-3`分钟,耐心等待安装完成
|
||||
5. 当应用状态变为`已启动`后,点击左侧的网站,首次使用需要安装`OpenResty`,点击`安装`
|
||||
6. 安装完成后,点击`网站`菜单栏左上角`创建`,在弹出的页面中选择`反向代理`
|
||||
7. 在`主域名`填入你的域名,网站代号会自动生成,代理选择`http`,代理地址填写`127.0.0.1:6806`,点击`确定`
|
||||
8. (可选) 配置你创建的网站,可根据需要配置`https`访问增强访问安全性
|
||||
|
||||
#### 访问思源笔记
|
||||
|
||||
- 如果你通过`OpenResty`反向代理反代了网站,并且填写了域名,请在浏览器输入`域名`访问
|
||||
- 如你选择了 `端口外部访问`,请在浏览器地输入 `http://<1Panel面板IP>:6806` 访问
|
||||
|
||||
</details>
|
||||
|
||||
### 内部预览版
|
||||
|
||||
我们会在有重大更新前发布内部预览版,请访问 [https://github.com/siyuan-note/insider](https://github.com/siyuan-note/insider)。
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
document.body.insertAdjacentHTML('afterbegin', `<svg id="iconsAnt" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<symbol id="iconInclude" viewBox="0 0 32 32">
|
||||
<path d="M22.091 2.435v7.747h7.582v13.65h-2.637v-11.013h-4.945v9.156h-9.436v5.11h11.036v2.637h-13.674v-7.747h-7.582v-13.65h2.637v11.013h4.945v-9.156h9.436l0-5.11h-11.036v-2.637h13.674zM19.454 12.82h-6.799v6.518l6.799 0v-6.518z"></path>
|
||||
<path d="M1 1h5.604v5.604h-5.604zM25.396 1h5.604v5.604h-5.604zM25.396 25.396h5.604v5.604h-5.604zM1 25.396h5.604v5.604h-5.604z"></path>
|
||||
</symbol>
|
||||
<symbol id="iconGroups" viewBox="0 0 32 32">
|
||||
<path d="M3.074 1c-0.646 0-1.17 0.524-1.17 1.17s0.524 1.17 1.17 1.17h25.851c0.646 0 1.17-0.524 1.17-1.17s-0.524-1.17-1.17-1.17v0zM3.074 17.526c-0.646 0-1.17 0.524-1.17 1.17s0.524 1.17 1.17 1.17h25.851c0.646 0 1.17-0.524 1.17-1.17s-0.524-1.17-1.17-1.17v0zM1.904 8.517c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM4.245 8.73v3.404h3.404v-3.404zM14.085 6.389c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM14.298 12.134v-3.404h3.404v3.404zM22.011 8.517c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM24.351 8.73v3.404h3.404v-3.404zM4.032 22.915c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM4.245 28.66v-3.404h3.404v3.404zM11.957 25.043c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM14.298 25.255v3.404h3.404v-3.404zM24.138 22.915c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM24.351 28.66v-3.404h3.404v3.404z"></path>
|
||||
</symbol>
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
"name": "ant",
|
||||
"author": "Vanessa",
|
||||
"url": "https://github.com/Vanessa219",
|
||||
"version": "1.34.0"
|
||||
"version": "1.35.0"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,12 @@
|
|||
<body>
|
||||
<h2>SiYuan</h2>
|
||||
<div class="fn__clear">
|
||||
<div>
|
||||
<svg>
|
||||
<use xlink:href="#iconInclude"></use>
|
||||
</svg>
|
||||
iconGroups
|
||||
</div>
|
||||
<div>
|
||||
<svg>
|
||||
<use xlink:href="#iconGroups"></use>
|
||||
|
|
|
|||
|
|
@ -1,5 +1,9 @@
|
|||
document.body.insertAdjacentHTML('afterbegin', `<svg id="iconsMaterial" style="position: absolute; width: 0; height: 0; overflow: hidden;" xmlns="http://www.w3.org/2000/svg">
|
||||
<defs>
|
||||
<symbol id="iconInclude" viewBox="0 0 32 32">
|
||||
<path d="M22.091 2.435v7.747h7.582v13.65h-2.637v-11.013h-4.945v9.156h-9.436v5.11h11.036v2.637h-13.674v-7.747h-7.582v-13.65h2.637v11.013h4.945v-9.156h9.436l0-5.11h-11.036v-2.637h13.674zM19.454 12.82h-6.799v6.518l6.799 0v-6.518z"></path>
|
||||
<path d="M1 1h5.604v5.604h-5.604zM25.396 1h5.604v5.604h-5.604zM25.396 25.396h5.604v5.604h-5.604zM1 25.396h5.604v5.604h-5.604z"></path>
|
||||
</symbol>
|
||||
<symbol id="iconGroups" viewBox="0 0 32 32">
|
||||
<path d="M3.074 1c-0.646 0-1.17 0.524-1.17 1.17s0.524 1.17 1.17 1.17h25.851c0.646 0 1.17-0.524 1.17-1.17s-0.524-1.17-1.17-1.17v0zM3.074 17.526c-0.646 0-1.17 0.524-1.17 1.17s0.524 1.17 1.17 1.17h25.851c0.646 0 1.17-0.524 1.17-1.17s-0.524-1.17-1.17-1.17v0zM1.904 8.517c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM4.245 8.73v3.404h3.404v-3.404zM14.085 6.389c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM14.298 12.134v-3.404h3.404v3.404zM22.011 8.517c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM24.351 8.73v3.404h3.404v-3.404zM4.032 22.915c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM4.245 28.66v-3.404h3.404v3.404zM11.957 25.043c0-1.175 0.953-2.128 2.128-2.128v0h3.83c1.175 0 2.128 0.953 2.128 2.128v0 3.83c0 1.175-0.953 2.128-2.128 2.128v0h-3.83c-1.175 0-2.128-0.953-2.128-2.128v0zM14.298 25.255v3.404h3.404v-3.404zM24.138 22.915c-1.175 0-2.128 0.953-2.128 2.128v0 3.83c0 1.175 0.953 2.128 2.128 2.128v0h3.83c1.175 0 2.128-0.953 2.128-2.128v0-3.83c0-1.175-0.953-2.128-2.128-2.128v0zM24.351 28.66v-3.404h3.404v3.404z"></path>
|
||||
</symbol>
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
"name": "material",
|
||||
"author": "Vanessa",
|
||||
"url": "https://github.com/Vanessa219",
|
||||
"version": "1.34.0"
|
||||
"version": "1.35.0"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "طباعة",
|
||||
"clickArrow": "انقر على السهم",
|
||||
"foldAll": "طي الكل",
|
||||
"expandSameLevelHeading": "توسيع العناوين من نفس المستوى",
|
||||
"foldSameLevelHeading": "طي العناوين من نفس المستوى",
|
||||
"expandChildHeading": "توسيع العناوين الفرعية",
|
||||
"foldChildHeading": "طي العناوين الفرعية",
|
||||
"addChildHeading": "إضافة عنوان فرعي",
|
||||
"insertSameLevelHeadingBefore": "إدراج عنوان من نفس المستوى قبل",
|
||||
"insertSameLevelHeadingAfter": "إدراج عنوان من نفس المستوى بعد",
|
||||
"upgrade": "ترقية",
|
||||
"downgrade": "خفض المستوى",
|
||||
"clipboardPermissionDenied": "تم رفض إذن الحافظة. يرجى السماح بالوصول إلى الحافظة من شريط عنوان المتصفح ثم المحاولة مرة أخرى.",
|
||||
"jumpTo": "انتقل إلى",
|
||||
"vacuumDataIndex": "تحسين الفهرس",
|
||||
"vacuumDataIndexTip": "تحقق من فهرس البيانات، وحرر مساحة التخزين وحسّن أداء الفهرس",
|
||||
"rebuildDataIndex": "إعادة بناء الفهرس",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "عرض أيقونات المدخلات",
|
||||
"wrapAllFields": "التفاف الحقول تلقائيًا",
|
||||
"gallery": "بطاقة",
|
||||
"kanban": "Kanban",
|
||||
"newTag": "علامة جديدة",
|
||||
"pleaseWait": "يرجى الانتظار...",
|
||||
"reconnectPrompt": "بعد تبديل التطبيقات، سيستغرق الأمر بعض الوقت لاستعادة تشغيل نواة SiYuan. يرجى الانتظار بضع ثوانٍ أو النقر فوق الزر \"إعادة المحاولة\"",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "فك ربط الكتلة",
|
||||
"showTitle": "عرض عنوان قاعدة البيانات",
|
||||
"fillCreated": "ملء وقت الإنشاء افتراضياً",
|
||||
"fillSpecificTime": "ملء الوقت المحدد افتراضيًا",
|
||||
"removeCard": "إزالة بطاقة تعليمية",
|
||||
"updateLayout": "تحديث التصميم",
|
||||
"dndFolderTip": "يرجى ملاحظة أن ${x} يقوم فقط بإدراج رابط file:// ولا يقوم بنسخ الملف",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "سيؤدي تطهير التخزين السحابي إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة. <ul class='fn__list'><li>الرجاء التأكد من أن الأجهزة الأخرى توقفت عن المزامنة قبل التنفيذ</li><li>عملية التطهير تستغرق وقتاً طويلاً جداً، الرجاء التأكد من أن الشبكة مستقرة</li></ul>هل أنت متأكد من تنفيذها الآن؟",
|
||||
"dragFill": "اسحب عمودياً لملء القيمة",
|
||||
"switchReadonly": "تبديل وضع القراءة فقط",
|
||||
"original": "القيمة الأصلية",
|
||||
"original": "عرض القيمة الأصلية",
|
||||
"uniqueValues": "عرض القيم الفريدة",
|
||||
"selectRelation": "الرجاء تحديد الحقل ذي الصلة أولاً",
|
||||
"backRelation": "ثنائي الاتجاه",
|
||||
"thisDatabase": "قاعدة البيانات هذه",
|
||||
"relatedTo": "الربط بـ",
|
||||
"relation": "ربط",
|
||||
"relatedItems": "العناصر المرتبطة",
|
||||
"rollup": "القيمة المحتسبة",
|
||||
"rollupProperty": "الخاصية",
|
||||
"rollupCalc": "الحساب بـ",
|
||||
|
|
@ -187,7 +205,7 @@
|
|||
"imgSrc": "رابط الصورة",
|
||||
"aText": "نص مرساة الرابط",
|
||||
"aTitle": "عنوان الرابط",
|
||||
"aHref": "نص الرابط",
|
||||
"aHref": "عنوان URL",
|
||||
"code": "شفرة داخل السطر",
|
||||
"em": "خط مائل",
|
||||
"strong": "خط غامق",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "كتلة الصيغة",
|
||||
"htmlBlock": "كتلة HTML"
|
||||
},
|
||||
"copyAHref": "نسخ عنوان URL للرابط",
|
||||
"selected": "محدد",
|
||||
"loadMore": "عرض المزيد",
|
||||
"tempUnlock": "فتح القفل مؤقتاً",
|
||||
"cancelTempUnlock": "إلغاء القفل المؤقت",
|
||||
"addFilter": "إضافة عامل تصفية",
|
||||
"removeFilters": "مسح عامل تصفية",
|
||||
"addSort": "إضافة ترتيب",
|
||||
"removeSorts": "مسح الترتيب",
|
||||
"checked": "مكتمل",
|
||||
"unchecked": "غير مكتمل",
|
||||
"percentChecked": "نسبة المكتمل",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "اكتمل الاستيراد",
|
||||
"mirrorTip": "مرآة قاعدة بيانات، حيث جميع تحديثات البيانات سيتم مزامنتها مع جميع المرايا الأخرى",
|
||||
"includeTime": "إدراج الوقت",
|
||||
"accountSupport1": "منذ إصدار SiYuan العام الأول في 31 أغسطس 2020، تم إصداره 776 مرة، وتم حل متطلبات وتعليقات المستخدمين 13840 مرة، وتم تنفيذ 17637 عملية إيداع للكود. لا يمكننا تحقيق كل هذا بدون دعمكم وتعليقاتكم.",
|
||||
"accountSupport1": "منذ إصدار SiYuan العام الأول في 31 أغسطس 2020، تم إصداره أكثر من 830 مرة، وتم حل متطلبات وتعليقات المستخدمين أكثر من 15000 مرة، وتم تنفيذ أكثر من 19800 عملية إيداع للكود. لا يمكننا تحقيق كل هذا بدون دعمكم وتعليقاتكم.",
|
||||
"accountSupport2": "سيسمح دعمكم وتعليقاتكم لـ SiYuan بالتطور والتحسن بشكل أفضل. سنبقى دائماً أصدقاء مع المستخدمين، ونعمل بجد لتحسين منتجاتنا، ونقدم لكم تجربة أفضل في إدارة المعرفة. شكراً جزيلاً لدعمكم!",
|
||||
"goToTab1": "الذهاب إلى علامة التبويب #1",
|
||||
"goToTab2": "الذهاب إلى علامة التبويب #2",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "بعد التمكين، تم عرض شريط التنقل في الكتل المضمنة؛ تم مجاهلة هذا الخيار عند شريط التنقل للكتل المضمنة في الكتل الخارقة ولا يظهر أبداً",
|
||||
"appearanceMode": "وضع المظهر",
|
||||
"editReadonly": "وضع القراءة فقط",
|
||||
"editReadonlyTip": "عند التمكين، سيكون المستند للقراءة فقط افتراضيًا",
|
||||
"editReadonlyTip": "عند التمكين، سيكون محرر المستندات للقراءة فقط افتراضيًا. لا يزال بإمكانك البحث واستبدال النص، وتعديل المحتوى عبر API",
|
||||
"generateConflictDoc": "توليد مستندات التعارض عند ظهور تضاربات المزامنة",
|
||||
"generateConflictDocTip": "بعد التمكين، سيتم إنشاء مستندات التعارض عند حدوث تضاربات المزامنة، بحيث يمكن فتحها وعرضها مباشرة. سيتم تسجيل مستندات التعارض في [تاريخ البيانات] سواء تمكين هذا الخيار أو عدم تمكينه",
|
||||
"deleteOpConfirm": "⚠️ تأكيد عملية حذف",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "\u202Bالرجاء استخدام تنسيق كائن JSON (<code class='fn__code'>{}</code>) لإختلاف تعاريف ماكرو، على سبيل المثال \u202A<code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>\u202C\u202C",
|
||||
"systemLogTip": "يتم حفظ سجلات تشغيل البرنامج في سجل النظام. من خلال تصدير سجل النظام وإرساله إلى المطورين، يمكن أن تساعد المطورين بشكل أفضل على تشخيص مشاكل البرنامج",
|
||||
"systemLog": "سجل النظام",
|
||||
"syncConfGuide1": "تهيئة مفتاح المزامنة",
|
||||
"syncConfGuide1": "تهيئة مفتاح مستودع البيانات",
|
||||
"syncConfGuide2": "يتم استخدام هذا المفتاح لتشفير مزامنة البيانات من النهاية إلى النهاية<br>يتم إنشاء المفتاح استناداً إلى كلمة المرور التي أدخلتها، يرجى تذكرها",
|
||||
"syncConfGuide3": "يتم استخدام دليل المزامنة السحابية لتخزين البيانات المشفرة المقابلة لمساحة العمل الحالية. الاسم الافتراضي هو <code>main</code>. إذا كان لديك مساحة عمل واحدة فقط للمزامنة، استخدم <code>main</code> مباشرة",
|
||||
"syncConfGuide4": "مزامنة الآن؟",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "نص المرساة الديناميكي",
|
||||
"sizeLimit": "الحد الأقصى",
|
||||
"trafficStat": "إحصاءات حركة المرور",
|
||||
"hideHeadingBelowBlocks": "إخفاء الكتل تحت العنوان",
|
||||
"headingEmbedMode": "إعدادات تضمين كتلة العنوان",
|
||||
"headingEmbedModeTip": "تعيين نمط عرض كتلة العنوان في الكتلة المضمنة",
|
||||
"showHeadingWithBlocks": "إظهار العنوان مع الكتل أدناه",
|
||||
"showHeadingOnlyTitle": "إظهار العنوان فقط",
|
||||
"showHeadingOnlyBlocks": "إظهار الكتل تحت العنوان فقط",
|
||||
"matchDiacritics": "مطابقة علامات التشكيل",
|
||||
"copyHPath": "نسخ المسار المقروء",
|
||||
"justify": "محاذاة من الجانبين",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "عنوان 4",
|
||||
"heading5": "عنوان 5",
|
||||
"heading6": "عنوان 6",
|
||||
"outlineExpandLevel": "مستوى التوسيع",
|
||||
"expandAll": "توسيع الكل",
|
||||
"outlineKeepCurrentExpand": "الحفاظ على التوسيع الحالي",
|
||||
"general": "عام",
|
||||
"insertBefore": "إدراج كتلة فارغة قبل الكتلة حيث يكون المؤشر",
|
||||
"insertAfter": "إدراج كتلة فارغة بعد الكتلة حيث يوجد المؤشر",
|
||||
"list1": "قائمة",
|
||||
"element": "عناصر",
|
||||
"closeTab": "إغلاق علامة التبويب الحالية",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "المسافة البادئة",
|
||||
"info": "المعلومات",
|
||||
"inline-code": "كود داخل السطر",
|
||||
"insert-after": "إدراج كتلة بعد هذه الكتلة",
|
||||
"insert-before": "إدراج كتلة قبل هذه الكتلة",
|
||||
"insertAfter": "إدراج كتلة بالأسفل",
|
||||
"insertBefore": "إدراج كتلة بالأعلى",
|
||||
"insertColumnLeft": "إدراج عمود واحد على اليسار",
|
||||
"insertColumnRight": "إدراج عمود واحد على اليمين",
|
||||
"insertRowAbove": "إدراج صف واحد بالأعلى",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "جدول",
|
||||
"gallery": "بطاقة",
|
||||
"kanban": "Kanban",
|
||||
"key": "المفتاح الرئيسي",
|
||||
"select": "تحديد"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "تمت إضافة هذا المقطع بالفعل إلى قاعدة البيانات [%s]",
|
||||
"270": "يتم تحسين فهرس البيانات، يرجى الانتظار...",
|
||||
"271": "اكتملت عملية تحسين فهرس البيانات، تم تحرير [%s] من مساحة القرص",
|
||||
"272": "حقل غير مسمى"
|
||||
"272": "حقل غير مسمى",
|
||||
"273": "لا تقم بإنشاء مساحة العمل في مسار جذر القسم، يرجى إنشاء مجلد جديد كمساحة عمل",
|
||||
"274": "يحتوي هذا المجلد على ملفات أخرى، يرجى إنشاء مجلد جديد كمساحة عمل"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "Print",
|
||||
"clickArrow": "Click arrow",
|
||||
"foldAll": "Fold all",
|
||||
"expandSameLevelHeading": "Expand same level heading",
|
||||
"foldSameLevelHeading": "Fold same level heading",
|
||||
"expandChildHeading": "Expand child heading",
|
||||
"foldChildHeading": "Fold child heading",
|
||||
"addChildHeading": "Add child heading",
|
||||
"insertSameLevelHeadingBefore": "Insert same level heading before",
|
||||
"insertSameLevelHeadingAfter": "Insert same level heading after",
|
||||
"upgrade": "Upgrade",
|
||||
"downgrade": "Downgrade",
|
||||
"clipboardPermissionDenied": "Clipboard permission denied. Please allow clipboard access in the browser address bar and try again.",
|
||||
"jumpTo": "Jump to",
|
||||
"vacuumDataIndex": "Optimize Index",
|
||||
"vacuumDataIndexTip": "Check data index, free up storage, and improve index performance",
|
||||
"rebuildDataIndex": "Rebuild Index",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "Show entry icons",
|
||||
"wrapAllFields": "Auto-wrap fields",
|
||||
"gallery": "Card",
|
||||
"kanban": "Kanban",
|
||||
"newTag": "New tag",
|
||||
"pleaseWait": "Please wait...",
|
||||
"reconnectPrompt": "After switching applications, it will take some time to restore the SiYuan kernel operation. Please wait a few seconds or click the \"Retry\" button",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "Unbind block",
|
||||
"showTitle": "Show database title",
|
||||
"fillCreated": "Default fill created time",
|
||||
"fillSpecificTime": "Default fill specific time",
|
||||
"removeCard": "Remove flashcard",
|
||||
"updateLayout": "Update layout",
|
||||
"dndFolderTip": "Please note that ${x} only inserts the file:// hyperlink and does not copy the file",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "Purging the cloud storage will completely delete all unreferenced snapshots and related data objects. <ul class='fn__list'><li>Please ensure that other devices have paused sync before execution</li><li>The purge operation is very time-consuming, please ensure that the network is stable</li></ul>Are you sure to execute it now?",
|
||||
"dragFill": "Drag vertically to fill value",
|
||||
"switchReadonly": "Switch read-only mode",
|
||||
"original": "Original",
|
||||
"original": "Show original values",
|
||||
"uniqueValues": "Show unique values",
|
||||
"selectRelation": "Please select the related field first",
|
||||
"backRelation": "Bidirectional",
|
||||
"thisDatabase": "This database",
|
||||
"relatedTo": "Relation to",
|
||||
"relation": "Relation",
|
||||
"relatedItems": "Related Items",
|
||||
"rollup": "Rollup",
|
||||
"rollupProperty": "Property",
|
||||
"rollupCalc": "Calculate",
|
||||
|
|
@ -187,7 +205,7 @@
|
|||
"imgSrc": "Image link",
|
||||
"aText": "Link anchor text",
|
||||
"aTitle": "Link title",
|
||||
"aHref": "Link link",
|
||||
"aHref": "Link URL",
|
||||
"code": "inline code",
|
||||
"em": "Italic",
|
||||
"strong": "Bold",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "Formula block",
|
||||
"htmlBlock": "HTML block"
|
||||
},
|
||||
"copyAHref": "Copy link URL",
|
||||
"selected": "Selected",
|
||||
"loadMore": "Load more",
|
||||
"tempUnlock": "Temporarily unlock",
|
||||
"cancelTempUnlock": "Cancel temporary unlock",
|
||||
"addFilter": "Add filter",
|
||||
"removeFilters": "Clear filter",
|
||||
"addSort": "Add sort",
|
||||
"removeSorts": "Clear sort",
|
||||
"checked": "Checked",
|
||||
"unchecked": "Unchecked",
|
||||
"percentChecked": "Percent checked",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "Import completed",
|
||||
"mirrorTip": "Mirror database, all data updates will be synchronized to all other mirrors",
|
||||
"includeTime": "Include time",
|
||||
"accountSupport1": "Since its first public release on August 31, 2020, SiYuan has been released a total of 776 times, solved user requirements and feedback 13840 times, and committed code 17637 times. We couldn't have achieved this without your support and feedback.",
|
||||
"accountSupport1": "Since its first public release on August 31, 2020, SiYuan has been released more than 830 times, solved user requirements and feedback more than 15000 times, and committed code more than 19800 times. We couldn't have achieved this without your support and feedback.",
|
||||
"accountSupport2": "Your support and feedback will make SiYuan better. We will always be friends with users, work hard to make products better, and provide you with a better knowledge management experience. Thank you very much for your support!",
|
||||
"goToTab1": "Go to tab #1",
|
||||
"goToTab2": "Go to tab #2",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "When enabled, embed blocks will display breadcrumbs, embed blocks in super blocks ignore this option and never show breadcrumbs",
|
||||
"appearanceMode": "Appearance Mode",
|
||||
"editReadonly": "Read-only mode",
|
||||
"editReadonlyTip": "When enabled, the document will be read-only by default",
|
||||
"editReadonlyTip": "When enabled, the document editor will be read-only by default. You can still search and replace text, modify content via API",
|
||||
"generateConflictDoc": "Generate conflict documentation when syncing conflicts",
|
||||
"generateConflictDocTip": "When enabled, a conflict document will be generated when a synchronization conflict occurs, so that it can be opened and viewed directly. Whether enabled or not, the [Data History] will record the conflict document",
|
||||
"deleteOpConfirm": "⚠️ Delete operation confirmation",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "Please use JSON object format (<code class='fn__code'>{}</code>) to wrap macro definitions, eg <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>",
|
||||
"systemLogTip": "Program running records are saved in the system log. By exporting the system log and sending it to developers, it can better help developers diagnose program problems",
|
||||
"systemLog": "System log",
|
||||
"syncConfGuide1": "Initialize sync key",
|
||||
"syncConfGuide1": "Initialize data repo key",
|
||||
"syncConfGuide2": "This key is used for data sync end-to-end encryption<br>The key is generated based on the password you enter, please remember the password",
|
||||
"syncConfGuide3": "The cloud sync directory is used to store the encrypted data corresponding to the current workspace. The default name is <code>main</code>. If you only have one workspace to sync, use <code>main</code> directly",
|
||||
"syncConfGuide4": "Sync now?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "Dynamic anchor text",
|
||||
"sizeLimit": "Limit",
|
||||
"trafficStat": "Traffic statistics",
|
||||
"hideHeadingBelowBlocks": "Hide blocks below heading",
|
||||
"headingEmbedMode": "Heading block embed settings",
|
||||
"showHeadingWithBlocks": "Show heading with blocks below",
|
||||
"showHeadingOnlyTitle": "Show heading only",
|
||||
"showHeadingOnlyBlocks": "Show only blocks below heading",
|
||||
"headingEmbedModeTip": "Set the display style of heading blocks in embed blocks",
|
||||
"matchDiacritics": "Match Diacritics",
|
||||
"copyHPath": "Copy readable path",
|
||||
"justify": "Justify",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "Heading 4",
|
||||
"heading5": "Heading 5",
|
||||
"heading6": "Heading 6",
|
||||
"outlineExpandLevel": "Expand level",
|
||||
"expandAll": "Expand all",
|
||||
"outlineKeepCurrentExpand": "Keep current expand",
|
||||
"general": "General",
|
||||
"insertBefore": "Insert an empty block before the block where the cursor is",
|
||||
"insertAfter": "Insert an empty block after the block where the cursor is located",
|
||||
"list1": "List",
|
||||
"element": "Element",
|
||||
"closeTab": "Close current Tab",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "Indent",
|
||||
"info": "Info",
|
||||
"inline-code": "Inline Code",
|
||||
"insert-after": "Insert block after",
|
||||
"insert-before": "Insert block Before",
|
||||
"insertAfter": "Insert block below",
|
||||
"insertBefore": "Insert block above",
|
||||
"insertColumnLeft": "Insert 1 left",
|
||||
"insertColumnRight": "Insert 1 right",
|
||||
"insertRowAbove": "Insert 1 above",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "Table",
|
||||
"gallery": "Card",
|
||||
"kanban": "Kanban",
|
||||
"key": "Primary Key",
|
||||
"select": "Select"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "This block has already been added to the database [%s]",
|
||||
"270": "Optimizing data index, please wait...",
|
||||
"271": "Data index optimization completed, [%s] disk space freed",
|
||||
"272": "Unnamed field"
|
||||
"272": "Unnamed field",
|
||||
"273": "Do not create the workspace in the partition root path, please create a new folder as the workspace",
|
||||
"274": "This folder contains other files, please create a new folder as the workspace"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "Imprimir",
|
||||
"clickArrow": "Haz clic en la flecha",
|
||||
"foldAll": "Colapsar todo",
|
||||
"expandSameLevelHeading": "Expandir títulos del mismo nivel",
|
||||
"foldSameLevelHeading": "Colapsar títulos del mismo nivel",
|
||||
"expandChildHeading": "Expandir subtítulos",
|
||||
"foldChildHeading": "Colapsar subtítulos",
|
||||
"addChildHeading": "Agregar subtítulo",
|
||||
"insertSameLevelHeadingBefore": "Insertar título del mismo nivel antes",
|
||||
"insertSameLevelHeadingAfter": "Insertar título del mismo nivel después",
|
||||
"upgrade": "Actualizar",
|
||||
"downgrade": "Degradar",
|
||||
"clipboardPermissionDenied": "Permiso del portapapeles denegado. Permite el acceso al portapapeles en la barra de direcciones del navegador y vuelve a intentarlo.",
|
||||
"jumpTo": "Ir a",
|
||||
"vacuumDataIndex": "Optimizar índice",
|
||||
"vacuumDataIndexTip": "Verifique el índice de datos, libere espacio y mejore el rendimiento del índice",
|
||||
"rebuildDataIndex": "Reconstruir índice",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "Mostrar íconos de entradas",
|
||||
"wrapAllFields": "Ajuste automático de campos",
|
||||
"gallery": "Tarjeta",
|
||||
"kanban": "Kanban",
|
||||
"newTag": "Nueva etiqueta",
|
||||
"pleaseWait": "Por favor, espere...",
|
||||
"reconnectPrompt": "Después de cambiar de aplicación, tomará algún tiempo restaurar el funcionamiento del núcleo de SiYuan. Espere unos segundos o haga clic en el botón \"Reintentar\"",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "Desvincular bloque",
|
||||
"showTitle": "Mostrar título de la base de datos",
|
||||
"fillCreated": "Hora de creación del relleno predeterminado",
|
||||
"fillSpecificTime": "Rellenar hora específica por defecto",
|
||||
"removeCard": "Eliminar tarjeta flash",
|
||||
"updateLayout": "Actualizar diseño",
|
||||
"dndFolderTip": "Tenga en cuenta que ${x} solo inserta el hipervínculo file:// y no copia el archivo",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "Al purgar el almacenamiento en la nube se eliminarán por completo todas las instantáneas sin referencia y los objetos de datos relacionados.<ul class='fn__list'><li>Asegúrese de que otros dispositivos hayan pausado la sincronización antes de la ejecución</li><li>La operación de purga requiere mucho tiempo; asegúrese de que la red esté estable</li></ul>¿Está seguro de ejecutarla ahora?",
|
||||
"dragFill": "Arrastra verticalmente para llenar valores",
|
||||
"switchReadonly": "Cambiar modo de sólo lectura",
|
||||
"original": "Original",
|
||||
"original": "Mostrar valor original",
|
||||
"uniqueValues": "Mostrar valores únicos",
|
||||
"selectRelation": "Seleccione primero la columna relacionada",
|
||||
"backRelation": "Bidireccional",
|
||||
"thisDatabase": "Esta base de datos",
|
||||
"relatedTo": "Relación con",
|
||||
"relation": "Relación",
|
||||
"relatedItems": "Elementos relacionados",
|
||||
"rollup": "Acumular",
|
||||
"rollupProperty": "Propiedad",
|
||||
"rollupCalc": "Calcular",
|
||||
|
|
@ -187,7 +205,7 @@
|
|||
"imgSrc": "Enlace de imagen",
|
||||
"aText": "Texto ancla del enlace",
|
||||
"aTitle": "Título del enlace",
|
||||
"aHref": "Enlace enlace",
|
||||
"aHref": "URL del enlace",
|
||||
"code": "código en línea",
|
||||
"em": "Cursiva",
|
||||
"strong": "negrita",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "Bloque de fórmulas",
|
||||
"htmlBlock": "bloque HTML"
|
||||
},
|
||||
"copyAHref": "Copiar URL del enlace",
|
||||
"selected": "Seleccionado",
|
||||
"loadMore": "Cargar más",
|
||||
"tempUnlock": "Desbloquear temporalmente",
|
||||
"cancelTempUnlock": "Cancelar desbloqueo temporal",
|
||||
"addFilter": "Agregar filtro",
|
||||
"removeFilters": "Borrar filtro",
|
||||
"addSort": "Agregar ordenación",
|
||||
"removeSorts": "Borrar ordenación",
|
||||
"checked": "marcado",
|
||||
"unchecked": "desmarcado",
|
||||
"percentChecked": "Porcentaje comprobado",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "Importación completada",
|
||||
"mirrorTip": "Base de datos espejo, todas las actualizaciones de datos se sincronizarán con todos los demás espejos",
|
||||
"includeTime": "Incluir tiempo",
|
||||
"accountSupport1": "Desde su primer lanzamiento público el 31 de agosto de 2020, SiYuan se ha publicado un total de 776 veces, ha resuelto los requisitos y comentarios de los usuarios 13840 veces y ha enviado código 17637 veces. No podemos prescindir de su apoyo y comentarios.",
|
||||
"accountSupport1": "Desde su primer lanzamiento público el 31 de agosto de 2020, SiYuan se ha publicado más de 830 veces, ha resuelto los requisitos y comentarios de los usuarios más de 15000 veces y ha enviado código más de 19800 veces. No podemos prescindir de su apoyo y comentarios.",
|
||||
"accountSupport2": "Su apoyo y comentarios permitirán a SiYuan desarrollarse y desarrollarse mejor. Siempre seremos amigos de los usuarios, trabajaremos duro para mejorar los productos y brindarle una mejor experiencia de gestión del conocimiento. ¡Muchas gracias por tu apoyo!",
|
||||
"goToTab1": "Ir a la pestaña #1",
|
||||
"goToTab2": "Ir a la pestaña #2",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "Después de habilitar los bloques incrustados, se mostrarán migas de pan, incrustar bloques en superbloques ignora esta opción y nunca muestra migas de pan",
|
||||
"appearanceMode": "Modo de apariencia",
|
||||
"editReadonly": "Modo de solo lectura",
|
||||
"editReadonlyTip": "Después de habilitarlo, el documento será de solo lectura por defecto",
|
||||
"editReadonlyTip": "Después de habilitarlo, el editor de documentos será de solo lectura por defecto. Aún puedes buscar y reemplazar texto, modificar contenido a través de la API",
|
||||
"generateConflictDoc": "Generar documentación de conflicto al sincronizar conflictos",
|
||||
"generateConflictDocTip": "Después de habilitarlo, se generará un documento de conflicto cuando ocurra un conflicto de sincronización, para que pueda abrirse y verse directamente. Ya sea que esté habilitado o no, el [Historial de datos] registrará el documento de conflicto",
|
||||
"deleteOpConfirm": "⚠️ Confirmación de operación de eliminación",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "Utilice el formato de objeto JSON (<code class='fn__code'>{}</code>) para envolver definiciones de macro, por ejemplo, <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>",
|
||||
"systemLogTip": "Los registros de ejecución del programa se guardan en el registro del sistema. Al exportar el registro del sistema y enviarlo a los desarrolladores, puede ayudarlos a diagnosticar mejor los problemas del programa",
|
||||
"systemLog": "Registro del sistema",
|
||||
"syncConfGuide1": "Inicializar clave de sincronización",
|
||||
"syncConfGuide1": "Inicializar clave del repositorio de datos",
|
||||
"syncConfGuide2": "Esta clave se utiliza para el cifrado de extremo a extremo de sincronización de datos<br>La clave se genera en función de la contraseña que ingresa, recuerde la contraseña",
|
||||
"syncConfGuide3": "El directorio de sincronización en la nube se utiliza para almacenar los datos cifrados correspondientes al espacio de trabajo actual. El nombre predeterminado es <code>main</code>. Si solo tiene un espacio de trabajo para sincronizar, agregue y use <code>main</code> directamente.",
|
||||
"syncConfGuide4": "¿Sincronizar ahora?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "Texto de anclaje dinámico",
|
||||
"sizeLimit": "Límite",
|
||||
"trafficStat": "Estadísticas de tráfico",
|
||||
"hideHeadingBelowBlocks": "Ocultar bloques por debajo del encabezamiento",
|
||||
"headingEmbedMode": "Configuración de incrustación de bloque de encabezado",
|
||||
"headingEmbedModeTip": "Establecer el estilo de visualización de los bloques de encabezado en los bloques incrustados",
|
||||
"showHeadingWithBlocks": "Mostrar encabezado con bloques debajo",
|
||||
"showHeadingOnlyTitle": "Mostrar solo el encabezado",
|
||||
"showHeadingOnlyBlocks": "Mostrar solo bloques debajo del encabezado",
|
||||
"matchDiacritics": " Hacer coincidir los diacríticos",
|
||||
"copyHPath": "Copiar ruta legible",
|
||||
"justify": "Justificar",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "Encabezado 4",
|
||||
"heading5": "Encabezado 5",
|
||||
"heading6": "Encabezado 6",
|
||||
"outlineExpandLevel": "Nivel de expansión",
|
||||
"expandAll": "Expandir todo",
|
||||
"outlineKeepCurrentExpand": "Mantener la expansión actual",
|
||||
"general": "General",
|
||||
"insertBefore": "Inserta un bloque vacío antes del bloque donde está el cursor",
|
||||
"insertAfter": "Inserta un bloque vacío después del bloque donde se encuentra el cursor",
|
||||
"list1": "Lista",
|
||||
"element": "elemento",
|
||||
"closeTab": "Cerrar pestaña actual",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "sangría",
|
||||
"info": "Información",
|
||||
"inline-code": "Código Inline",
|
||||
"insert-after": "Insertar bloque después",
|
||||
"insert-before": "Insertar bloque antes",
|
||||
"insertAfter": "Insertar bloque debajo",
|
||||
"insertBefore": "Insertar bloque arriba",
|
||||
"insertColumnLeft": "Insertar 1 a la izquierda",
|
||||
"insertColumnRight": "Insertar 1 derecha",
|
||||
"insertRowAbove": "Insertar 1 arriba",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "Tabla",
|
||||
"gallery": "Tarjeta",
|
||||
"kanban": "Kanban",
|
||||
"key": "Clave principal",
|
||||
"select": "Selección"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "Este bloque ya ha sido añadido a la base de datos [%s]",
|
||||
"270": "Optimizando el índice de datos, por favor espere...",
|
||||
"271": "Optimización del índice de datos completada, se liberaron [%s] de espacio en disco",
|
||||
"272": "Campo sin nombre"
|
||||
"272": "Campo sin nombre",
|
||||
"273": "No cree el espacio de trabajo en la ruta raíz de la partición, cree una nueva carpeta como espacio de trabajo",
|
||||
"274": "Esta carpeta contiene otros archivos, cree una nueva carpeta como espacio de trabajo"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "Imprimer",
|
||||
"clickArrow": "Cliquez sur la flèche",
|
||||
"foldAll": "Tout replier",
|
||||
"expandSameLevelHeading": "Développer les titres du même niveau",
|
||||
"foldSameLevelHeading": "Replier les titres du même niveau",
|
||||
"expandChildHeading": "Développer les sous-titres",
|
||||
"foldChildHeading": "Replier les sous-titres",
|
||||
"addChildHeading": "Ajouter un sous-titre",
|
||||
"insertSameLevelHeadingBefore": "Insérer un titre du même niveau avant",
|
||||
"insertSameLevelHeadingAfter": "Insérer un titre du même niveau après",
|
||||
"upgrade": "Mettre à niveau",
|
||||
"downgrade": "Rétrograder",
|
||||
"clipboardPermissionDenied": "Permission du presse-papiers refusée. Veuillez autoriser l'accès au presse-papiers dans la barre d'adresse du navigateur, puis réessayez.",
|
||||
"jumpTo": "Aller à",
|
||||
"vacuumDataIndex": "Optimiser l'index",
|
||||
"vacuumDataIndexTip": "Vérifiez l'index des données, libérez de l'espace et améliorez les performances de l'index",
|
||||
"rebuildDataIndex": "Reconstruire l'index",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "Afficher les icônes des entrées",
|
||||
"wrapAllFields": "Retour automatique des champs",
|
||||
"gallery": "Carte",
|
||||
"kanban": "Kanban",
|
||||
"newTag": "Nouvelle étiquette",
|
||||
"pleaseWait": "Veuillez patienter...",
|
||||
"reconnectPrompt": "Après avoir changé d'application, il faudra un certain temps pour rétablir le fonctionnement du noyau SiYuan. Veuillez patienter quelques secondes ou cliquer sur le bouton « Réessayer »",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "Dissocier le bloc",
|
||||
"showTitle": "Afficher le titre de la base de données",
|
||||
"fillCreated": "Heure de création de remplissage par défaut",
|
||||
"fillSpecificTime": "Remplir l'heure spécifique par défaut",
|
||||
"removeCard": "Supprimer la flashcard",
|
||||
"updateLayout": "Mettre à jour la mise en page",
|
||||
"dndFolderTip": "Veuillez noter que ${x} insère uniquement le lien hypertexte file:// et ne copie pas le fichier",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "La purge du stockage cloud supprimera complètement tous les instantanés non référencés et les objets de données associés. <ul class='fn__list'><li>Veuillez vous assurer que la synchronisation des autres appareils a été suspendue avant l'exécution</li><li>L'opération de purge prend beaucoup de temps, veuillez vous assurer que le réseau est stable</li></ul>Êtes-vous sûr de l'exécuter maintenant ?",
|
||||
"dragFill": "Faites glisser verticalement pour remplir les valeurs",
|
||||
"switchReadonly": "Changer de mode lecture seule",
|
||||
"original": "Originale",
|
||||
"original": "Afficher la valeur d'origine",
|
||||
"uniqueValues": "Afficher les valeurs uniques",
|
||||
"selectRelation": "Veuillez d'abord sélectionner la colonne associée",
|
||||
"backRelation": "Bidirectionnel",
|
||||
"thisDatabase": "Cette base de données",
|
||||
"relatedTo": " Relation avec ",
|
||||
"relation": "Relation",
|
||||
"relatedItems": "Éléments liés",
|
||||
"rollup": "Rollup",
|
||||
"rollupProperty": "Propriété",
|
||||
"rollupCalc": "Calculer",
|
||||
|
|
@ -187,7 +205,7 @@
|
|||
"imgSrc": "Lien image",
|
||||
"aText": "Texte d'ancrage du lien",
|
||||
"aTitle": "Titre du lien",
|
||||
"aHref": "Lien lien",
|
||||
"aHref": "URL du lien",
|
||||
"code": "code en ligne",
|
||||
"em": "Italique",
|
||||
"strong": "Audacieux",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "Bloc de formule",
|
||||
"htmlBlock": "Bloc HTML"
|
||||
},
|
||||
"copyAHref": "Copier l'URL du lien",
|
||||
"selected": "Sélectionné",
|
||||
"loadMore": "Charger plus",
|
||||
"tempUnlock": "Déverrouiller temporairement",
|
||||
"cancelTempUnlock": "Annuler le déverrouillage temporaire",
|
||||
"addFilter": "Ajouter un filtre",
|
||||
"removeFilters": "Effacer le filtre",
|
||||
"addSort": "Ajouter un tri",
|
||||
"removeSorts": "Effacer le tri",
|
||||
"checked": "Coché",
|
||||
"unchecked": "Décoché",
|
||||
"percentChecked": "Pourcentage vérifié",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "Importation terminée",
|
||||
"mirrorTip": "Base de données miroir, toutes les mises à jour des données seront synchronisées avec tous les autres miroirs",
|
||||
"includeTime": "Inclure l'heure",
|
||||
"accountSupport1": "Depuis sa première version publique le 31 août 2020, SiYuan a été publié 776 fois au total, a répondu aux exigences et aux commentaires des utilisateurs 13840 fois et a soumis du code 17637 fois. Nous ne pouvons pas nous passer de votre soutien et de vos commentaires.",
|
||||
"accountSupport1": "Depuis sa première version publique le 31 août 2020, SiYuan a été publié plus de 830 fois au total, a répondu aux exigences et aux commentaires des utilisateurs plus de 15000 fois et a soumis du code plus de 19800 fois. Nous ne pouvons pas nous passer de votre soutien et de vos commentaires.",
|
||||
"accountSupport2": "Votre soutien et vos retours permettront à SiYuan de se développer et de mieux se développer. Nous serons toujours amis avec les utilisateurs, travaillerons dur pour améliorer les produits et vous offrirons une meilleure expérience de gestion des connaissances. Merci beaucoup pour votre soutient!",
|
||||
"goToTab1": "Aller à l'onglet #1",
|
||||
"goToTab2": "Aller à l'onglet #2",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "Après avoir activé l'intégration, les blocs afficheront le fil d'Ariane, intégrer des blocs dans des super blocs ignorent cette option et n'affichent jamais le fil d'Ariane",
|
||||
"appearanceMode": "Mode d'apparence",
|
||||
"editReadonly": "Mode lecture seule",
|
||||
"editReadonlyTip": "Lorsqu'il est activé, le document sera en lecture seule par défaut",
|
||||
"editReadonlyTip": "Lorsqu'il est activé, l'éditeur de document sera en lecture seule par défaut. Vous pouvez toujours rechercher et remplacer du texte, modifier le contenu via l'API",
|
||||
"generateConflictDoc": "Générer une documentation sur les conflits lors de la synchronisation des conflits",
|
||||
"generateConflictDocTip": "Lorsqu'il est activé, un document de conflit sera généré lorsqu'un conflit de synchronisation se produit, afin qu'il puisse être ouvert et visualisé directement. Qu'il soit activé ou non, l'historique des données enregistrera le document de conflit",
|
||||
"deleteOpConfirm": "⚠️ Supprimer la confirmation de l'opération",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "Veuillez utiliser le format d'objet JSON (<code class='fn__code'>{}</code>) pour envelopper les définitions de macro, par exemple <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>",
|
||||
"systemLogTip": "Les enregistrements en cours d'exécution du programme sont enregistrés dans le journal système. En exportant le journal système et en l'envoyant aux développeurs, cela peut mieux aider les développeurs à diagnostiquer les problèmes du programme",
|
||||
"systemLog": "Journal du système",
|
||||
"syncConfGuide1": "Initialiser la clé de synchronisation",
|
||||
"syncConfGuide1": "Initialiser la clé de référentiel de données",
|
||||
"syncConfGuide2": "Cette clé est utilisée pour le chiffrement de bout en bout de la synchronisation des données<br> La clé est générée en fonction du mot de passe que vous saisissez, veuillez vous souvenir du mot de passe",
|
||||
"syncConfGuide3": "Le répertoire de synchronisation cloud est utilisé pour stocker les données chiffrées correspondant à l'espace de travail actuel. Le nom par défaut est <code>main</code>. Si vous n'avez qu'un seul espace de travail à synchroniser, ajoutez et utilisez <code>main</code> directement",
|
||||
"syncConfGuide4": "Synchroniser maintenant ?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "Texte d'ancrage dynamique",
|
||||
"sizeLimit": "Limite",
|
||||
"trafficStat": "Statistiques de trafic",
|
||||
"hideHeadingBelowBlocks": "Masquer les blocs sous l'en-tête",
|
||||
"headingEmbedMode": "Paramètres d'intégration de bloc de titre",
|
||||
"showHeadingWithBlocks": "Afficher l'en-tête avec les blocs en dessous",
|
||||
"showHeadingOnlyTitle": "Afficher uniquement l'en-tête",
|
||||
"showHeadingOnlyBlocks": "Afficher uniquement les blocs sous l'en-tête",
|
||||
"headingEmbedModeTip": "Définir le style d'affichage des blocs de titre dans les blocs intégrés",
|
||||
"matchDiacritics": "Respecter les accents et diacritiques",
|
||||
"copyHPath": "Copier le chemin lisible",
|
||||
"justify": "Justifier",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "Titre 4",
|
||||
"heading5": "Titre 5",
|
||||
"heading6": "Titre 6",
|
||||
"outlineExpandLevel": "Niveau d'expansion",
|
||||
"expandAll": "Tout développer",
|
||||
"outlineKeepCurrentExpand": "Maintenir le titre actuel développé",
|
||||
"general": "Général",
|
||||
"insertBefore": "Insérer un bloc vide devant le bloc où se trouve le curseur",
|
||||
"insertAfter": "Insérer un bloc vide après le bloc où se trouve le curseur",
|
||||
"list1": "Liste",
|
||||
"element": "élément",
|
||||
"closeTab": "Fermer l'onglet actuel",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "Retrait de liste",
|
||||
"info": "Info",
|
||||
"inline-code": "Inline Code",
|
||||
"insert-after": "Insérer un bloc après",
|
||||
"insert-before": "Insérer un bloc avant",
|
||||
"insertAfter": "Insérer un bloc en dessous",
|
||||
"insertBefore": "Insérer un bloc au-dessus",
|
||||
"insertColumnLeft": "Insérer 1 gauche",
|
||||
"insertColumnRight": "Insérer 1 droite",
|
||||
"insertRowAbove": "Insérer 1 ci-dessus",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "Tableau",
|
||||
"gallery": "Carte",
|
||||
"kanban": "Kanban",
|
||||
"key": "Clé primaire",
|
||||
"select": "Sélectionner"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "Ce bloc a déjà été ajouté à la base de données [%s]",
|
||||
"270": "Optimisation de l'index des données en cours, veuillez patienter...",
|
||||
"271": "Optimisation de l'index des données terminée, [%s] d'espace disque libéré",
|
||||
"272": "Champ sans nom"
|
||||
"272": "Champ sans nom",
|
||||
"273": "Ne créez pas l’espace de travail à la racine de la partition, créez un nouveau dossier comme espace de travail",
|
||||
"274": "Ce dossier contient d’autres fichiers, créez un nouveau dossier comme espace de travail"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "印刷",
|
||||
"clickArrow": "矢印をクリック",
|
||||
"foldAll": "すべて折りたたむ",
|
||||
"expandSameLevelHeading": "同じレベルの見出しを展開",
|
||||
"foldSameLevelHeading": "同じレベルの見出しを折りたたむ",
|
||||
"expandChildHeading": "子見出しを展開",
|
||||
"foldChildHeading": "子見出しを折りたたむ",
|
||||
"addChildHeading": "子見出しを追加",
|
||||
"insertSameLevelHeadingBefore": "前に同じレベルの見出しを挿入",
|
||||
"insertSameLevelHeadingAfter": "後に同じレベルの見出しを挿入",
|
||||
"upgrade": "アップグレード",
|
||||
"downgrade": "ダウングレード",
|
||||
"clipboardPermissionDenied": "クリップボードの権限が拒否されました。ブラウザのアドレスバーでクリップボードへのアクセスを許可してから再試行してください。",
|
||||
"jumpTo": "ジャンプ先",
|
||||
"vacuumDataIndex": "インデックスの最適化",
|
||||
"vacuumDataIndexTip": "データインデックスを検証し、ストレージを解放してインデックス性能を向上させます",
|
||||
"rebuildDataIndex": "インデックスの再構築",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "エントリアイコンを表示",
|
||||
"wrapAllFields": "フィールドを自動折り返し",
|
||||
"gallery": "カード",
|
||||
"kanban": "カンバン",
|
||||
"newTag": "新しいタグ",
|
||||
"pleaseWait": "しばらくお待ちください...",
|
||||
"reconnectPrompt": "アプリを切り替えた後、思源カーネルの実行を再開するには少し時間がかかります。数秒待つか、「再試行」ボタンをクリックしてください",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "ブロックのバインドを解除",
|
||||
"showTitle": "データベースのタイトルを表示",
|
||||
"fillCreated": "デフォルトで作成時間を入力",
|
||||
"fillSpecificTime": "デフォルトで具体的な時間を入力",
|
||||
"removeCard": "フラッシュカードを削除",
|
||||
"updateLayout": "レイアウトを更新",
|
||||
"dndFolderTip": "${x} は file:// 形式のハイパーリンクを挿入するだけでファイルはコピーされないので注意してください",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "クラウドストレージを消去すると、参照されていないスナップショットと関連データオブジェクトが完全に削除されます。<ul class='fn__list'><li>実行前に他のデバイスが同期を一時停止していることを確認してください</li><li>消去操作は非常に時間がかかるため、ネットワークが安定していることを確認してください</li></ul>今すぐ実行してもよろしいですか?",
|
||||
"dragFill": "値を埋めるために垂直にドラッグ",
|
||||
"switchReadonly": "読み取り専用モードの切り替え",
|
||||
"original": "元の値",
|
||||
"original": "元の値を表示",
|
||||
"uniqueValues": "一意の値を表示",
|
||||
"selectRelation": "最初に関連する列を選択してください",
|
||||
"backRelation": "双方向の関連付け",
|
||||
"thisDatabase": "現在のデータベース",
|
||||
"relatedTo": "関連付け",
|
||||
"relation": "関連",
|
||||
"relatedItems": "関連項目",
|
||||
"rollup": "集計",
|
||||
"rollupProperty": "属性",
|
||||
"rollupCalc": "計算方法",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "数式ブロック",
|
||||
"htmlBlock": "HTMLブロック"
|
||||
},
|
||||
"copyAHref": "リンクの URL をコピー",
|
||||
"selected": "選択済み",
|
||||
"loadMore": "さらに読み込む",
|
||||
"tempUnlock": "一時的にロック解除",
|
||||
"cancelTempUnlock": "一時的なロック解除をキャンセル",
|
||||
"addFilter": "フィルタを追加",
|
||||
"removeFilters": "フィルタを削除",
|
||||
"addSort": "ソートを追加",
|
||||
"removeSorts": "ソートを削除",
|
||||
"checked": "チェック済み",
|
||||
"unchecked": "未チェック",
|
||||
"percentChecked": "チェック済みの割合",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "インポートが完了しました",
|
||||
"mirrorTip": "ミラーデータベース: すべてのデータ更新は他のすべてのミラーに同期されます",
|
||||
"includeTime": "時間を含める",
|
||||
"accountSupport1": "SiYuan は 2020 年 8 月 31 日の最初の公開以来、合計 776 回のリリースを行い、ユーザーからの要求とフィードバックを 13840 回解決し、コードを 17637 回コミットしました。",
|
||||
"accountSupport1": "SiYuan は 2020 年 8 月 31 日の最初の公開以来、合計 830 回を超えるリリースを行い、ユーザーからの要求とフィードバックを 15000 回以上解決し、コードを 19800 回以上コミットしました。",
|
||||
"accountSupport2": "皆様のサポートとフィードバックによって、SiYuan はさらに発展します。私たちは常にユーザーのよき理解者であり、製品の向上に努め、より良い知識管理体験を提供して参ります。ご支援いただき誠にありがとうございます。",
|
||||
"goToTab1": "最初のタブへ移動",
|
||||
"goToTab2": "2 番目のタブへ移動",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "埋め込みブロックにパンくずリストを表示します<br>この設定にかかわらずスーパーブロック内の埋め込みブロックは常にパンくずリストが表示されません",
|
||||
"appearanceMode": "表示モード",
|
||||
"editReadonly": "読み取り専用モード",
|
||||
"editReadonlyTip": "有効にすると、ドキュメントはデフォルトで読み取り専用になります",
|
||||
"editReadonlyTip": "有効にすると、ドキュメントエディターはデフォルトで読み取り専用になります。テキストの検索・置換や API による内容の変更は可能です",
|
||||
"generateConflictDoc": "同期の競合時に競合ドキュメントを生成する",
|
||||
"generateConflictDocTip": "同期の競合が発生した場合は競合ドキュメントが生成され、直接開いて表示できます。この設定に関わらず [データ履歴] には競合ドキュメントが記録されます",
|
||||
"deleteOpConfirm": "⚠️ 削除操作の確認",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "JSON オブジェクト形式 (<code class='fn__code'>{}</code>) を使用してマクロ定義を囲んでください (例: <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>)",
|
||||
"systemLogTip": "プログラムの実行記録はシステムログに保存されます。システムログをエクスポートして開発者に送信することで開発者がプログラムの問題を診断するのに役立ちます",
|
||||
"systemLog": "システムログ",
|
||||
"syncConfGuide1": "同期キーの初期化",
|
||||
"syncConfGuide1": "データリポジトリキーの初期化",
|
||||
"syncConfGuide2": "このキーはデータ同期のためのエンドツーエンドの暗号化に使用されます<br>キーは入力されたパスワードに基づいて生成されるためパスワードを忘れないでください",
|
||||
"syncConfGuide3": "クラウド同期ディレクトリは現在のワークスペースに対応する暗号化されたデータを保存するために使用されます。デフォルト名は <code>main</code> です。同期するワークスペースがひとつしかない場合は <code>main</code> を使用してください",
|
||||
"syncConfGuide4": "今すぐ同期しますか?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "動的アンカーテキスト",
|
||||
"sizeLimit": "制限",
|
||||
"trafficStat": "トラフィック統計",
|
||||
"hideHeadingBelowBlocks": "見出し以下のブロックを非表示にする",
|
||||
"headingEmbedMode": "見出しブロック埋め込み設定",
|
||||
"headingEmbedModeTip": "見出しブロックの埋め込みブロック内での表示スタイルを設定",
|
||||
"showHeadingWithBlocks": "見出しと下のブロックを表示",
|
||||
"showHeadingOnlyTitle": "見出しのみ表示",
|
||||
"showHeadingOnlyBlocks": "見出し下のブロックのみ表示",
|
||||
"matchDiacritics": "ダイアクリティカルマークを一致させる",
|
||||
"copyHPath": "パスをコピー",
|
||||
"justify": "両端揃え",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "見出し4",
|
||||
"heading5": "見出し5",
|
||||
"heading6": "見出し6",
|
||||
"outlineExpandLevel": "展開レベル",
|
||||
"expandAll": "すべて展開",
|
||||
"outlineKeepCurrentExpand": "現在の見出しを展開し続ける",
|
||||
"general": "一般",
|
||||
"insertBefore": "前にブロックを挿入",
|
||||
"insertAfter": "後にブロックを挿入",
|
||||
"list1": "リスト",
|
||||
"element": "要素",
|
||||
"closeTab": "現在のタブを閉じる",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "インデント",
|
||||
"info": "情報",
|
||||
"inline-code": "インラインコード",
|
||||
"insert-after": "後にブロックを挿入",
|
||||
"insert-before": "前にブロックを挿入",
|
||||
"insertAfter": "下にブロックを挿入",
|
||||
"insertBefore": "上にブロックを挿入",
|
||||
"insertColumnLeft": "左に1列挿入",
|
||||
"insertColumnRight": "右に1列挿入",
|
||||
"insertRowAbove": "上に1行挿入",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "テーブル",
|
||||
"gallery": "カード",
|
||||
"kanban": "カンバン",
|
||||
"key": "プライマリキー",
|
||||
"select": "選択"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "このブロックはすでにデータベース [%s] に追加されています",
|
||||
"270": "データインデックスを最適化しています。しばらくお待ちください...",
|
||||
"271": "データインデックスの最適化が完了しました。合計 [%s] のディスク容量が解放されました",
|
||||
"272": "未命名フィールド"
|
||||
"272": "未命名フィールド",
|
||||
"273": "パーティションのルートパスにワークスペースを作成しないでください。新しいフォルダーをワークスペースとして作成してください",
|
||||
"274": "このフォルダーには他のファイルが含まれています。新しいフォルダーをワークスペースとして作成してください"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "列印",
|
||||
"clickArrow": "點擊箭頭",
|
||||
"foldAll": "全部摺疊",
|
||||
"expandSameLevelHeading": "展開同級標題",
|
||||
"foldSameLevelHeading": "摺疊同級標題",
|
||||
"expandChildHeading": "展開子標題",
|
||||
"foldChildHeading": "摺疊子標題",
|
||||
"addChildHeading": "新增子標題",
|
||||
"insertSameLevelHeadingBefore": "在前方插入同級標題",
|
||||
"insertSameLevelHeadingAfter": "在後方插入同級標題",
|
||||
"upgrade": "升級",
|
||||
"downgrade": "降級",
|
||||
"clipboardPermissionDenied": "剪貼簿權限被拒絕,請在瀏覽器地址欄允許訪問剪貼簿後再試",
|
||||
"jumpTo": "跳轉到",
|
||||
"vacuumDataIndex": "優化索引",
|
||||
"vacuumDataIndexTip": "校驗資料索引,釋放儲存空間並提升索引效能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "顯示條目圖標",
|
||||
"wrapAllFields": "欄位自動換行",
|
||||
"gallery": "卡片",
|
||||
"kanban": "看板",
|
||||
"newTag": "新建標籤",
|
||||
"pleaseWait": "請稍等片刻...",
|
||||
"reconnectPrompt": "切換應用後再次進入需要一些時間恢復思源內核運行,請稍等幾秒或者點擊“重試”按鈕",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "取消綁定塊",
|
||||
"showTitle": "顯示資料庫標題",
|
||||
"fillCreated": "預設填滿創建時間",
|
||||
"fillSpecificTime": "預設填入具體時間",
|
||||
"removeCard": "移除閃卡",
|
||||
"updateLayout": "更新版面配置",
|
||||
"dndFolderTip": "請注意 ${x} 僅插入 file:// 超鏈接,不複製檔案",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "清理雲端儲存會徹底刪除所有未引用的快照和相關資料物件。<ul class='fn__list'><li>執行前請確保其他設備已經暫停同步</li><li>清理作業非常耗時,請確保網路穩定</li></ul>確定現在就執行嗎?",
|
||||
"dragFill": "垂直拖動以填充值",
|
||||
"switchReadonly": "唯讀模式切換",
|
||||
"original": "原值",
|
||||
"original": "顯示原始值",
|
||||
"uniqueValues": "顯示唯一值",
|
||||
"selectRelation": "請先選擇關聯欄位",
|
||||
"backRelation": "雙向關聯",
|
||||
"thisDatabase": "目前資料庫",
|
||||
"relatedTo": "關聯至",
|
||||
"relation": "關聯",
|
||||
"relatedItems": "已關聯條目",
|
||||
"rollup": "匯總",
|
||||
"rollupProperty": "總計欄位",
|
||||
"rollupCalc": "彙總方式",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "公式塊",
|
||||
"htmlBlock": "HTML 塊"
|
||||
},
|
||||
"copyAHref": "複製連結位址",
|
||||
"selected": "已選擇",
|
||||
"loadMore": "載入更多",
|
||||
"tempUnlock": "暫時解鎖",
|
||||
"cancelTempUnlock": "取消暫時解鎖",
|
||||
"addFilter": "新增篩選條件",
|
||||
"removeFilters": "清空篩選規則",
|
||||
"addSort": "新增排序條件",
|
||||
"removeSorts": "清空排序規則",
|
||||
"checked": "已完成",
|
||||
"unchecked": "未完成",
|
||||
"percentChecked": "已完成佔比",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "導入完成",
|
||||
"mirrorTip": "鏡像資料庫,所有資料更新會同步到其他所有鏡像中",
|
||||
"includeTime": "具體時間",
|
||||
"accountSupport1": "自 2020 年 8 月 31 日第一次公開版本以來,思源筆記已累計發版 776 次,解決用戶需求與反饋 13840 次,提交代碼 17637 次,背後無數次的辛勤付出與長期堅持不懈的更新都 離不開您的支持與回饋。",
|
||||
"accountSupport1": "自 2020 年 8 月 31 日第一次公開版本以來,思源筆記已累計發版超過 830 次,解決用戶需求與反饋超過 15000 次,提交代碼超過 19800 次,背後無數次的辛勤付出與長期堅持不懈的更新都離不開您的支持與回饋。",
|
||||
"accountSupport2": "您的支持與回饋能讓思源筆記更好地開發與發展下去,我們會一直與使用者做朋友,用心做好產品,為您提供更好的知識管理體驗。 非常感謝您的支持! ",
|
||||
"goToTab1": "跳到第一個頁籤",
|
||||
"goToTab2": "跳到第二個頁籤",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "啟用後嵌入塊將顯示導覽路徑,在超級塊中的嵌入塊忽略該選項,始終不顯示導覽路徑",
|
||||
"appearanceMode": "外觀模式",
|
||||
"editReadonly": "只讀模式",
|
||||
"editReadonlyTip": "啟用後文檔將預設鎖定編輯",
|
||||
"editReadonlyTip": "啟用後文檔編輯器將預設鎖定編輯。仍然能夠搜尋替換文字、透過 API 修改內容",
|
||||
"generateConflictDoc": "同步衝突時生成衝突文檔",
|
||||
"generateConflictDocTip": "啟用後當同步發生衝突時會生成衝突文檔,以便直接打開查看。無論是否啟用,[資料歷史] 都會記錄衝突文檔",
|
||||
"deleteOpConfirm": "⚠️ Delete operation confirmation",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "請使用 JSON 對象格式(<code class='fn__code'>{}</code>)來包裹宏定義,例如 <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>",
|
||||
"systemLogTip": "系統日誌中保存了程式運行記錄,通過導出系統日誌發送給開發者可以更好地幫助開發者診斷程式問題",
|
||||
"systemLog": "系統日誌",
|
||||
"syncConfGuide1": "初始化同步密鑰",
|
||||
"syncConfGuide1": "初始化資料倉庫密鑰",
|
||||
"syncConfGuide2": "該密鑰用於資料同步端到端加密<br>密鑰基於你輸入的密碼生成,請務必牢記密碼",
|
||||
"syncConfGuide3": "雲端同步目錄用於存放當前工作空間對應的加密資料,預設名稱為 <code>main</code>。如果你只有一個工作空間需要同步,直接使用 <code>main</code> 即可",
|
||||
"syncConfGuide4": "立即同步?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "動態錨文字",
|
||||
"sizeLimit": "上限",
|
||||
"trafficStat": "流量統計",
|
||||
"hideHeadingBelowBlocks": "隱藏標題下方的塊",
|
||||
"headingEmbedMode": "標題塊嵌入設定",
|
||||
"headingEmbedModeTip": "設定標題塊在嵌入塊中的顯示樣式",
|
||||
"showHeadingWithBlocks": "顯示標題與下方的塊",
|
||||
"showHeadingOnlyTitle": "僅顯示標題",
|
||||
"showHeadingOnlyBlocks": "僅顯示標題下方的塊",
|
||||
"matchDiacritics": "符合變音符號",
|
||||
"copyHPath": "複製可讀路徑",
|
||||
"justify": "兩側對齊",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "四級標題",
|
||||
"heading5": "五級標題",
|
||||
"heading6": "六級標題",
|
||||
"outlineExpandLevel": "展開層級",
|
||||
"expandAll": "全部展開",
|
||||
"outlineKeepCurrentExpand": "保持當前標題展開",
|
||||
"general": "通用",
|
||||
"insertBefore": "游標所在塊前插入空塊",
|
||||
"insertAfter": "游標所在塊後插入空塊",
|
||||
"list1": "列表",
|
||||
"element": "元素",
|
||||
"closeTab": "關閉當前分頁",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "列表縮進",
|
||||
"info": "關於",
|
||||
"inline-code": "行內代碼",
|
||||
"insert-after": "末尾插入塊",
|
||||
"insert-before": "起始插入塊",
|
||||
"insertAfter": "下方插入塊",
|
||||
"insertBefore": "上方插入塊",
|
||||
"insertColumnLeft": "在左邊插入一行",
|
||||
"insertColumnRight": "在右邊插入一行",
|
||||
"insertRowAbove": "在上方插入一列",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "表格",
|
||||
"gallery": "卡片",
|
||||
"kanban": "看板",
|
||||
"key": "主鍵",
|
||||
"select": "單選"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "該塊已經添加到資料庫 [%s] 中",
|
||||
"270": "正在優化資料索引,請稍等...",
|
||||
"271": "資料索引優化完畢,共釋放 [%s] 磁碟空間",
|
||||
"272": "未命名欄位"
|
||||
"272": "未命名欄位",
|
||||
"273": "請勿在分區根路徑上建立工作空間,請新建一個資料夾作為工作空間",
|
||||
"274": "該資料夾包含其他檔案,請新建一個資料夾作為工作空間"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,18 @@
|
|||
{
|
||||
"print": "打印",
|
||||
"clickArrow": "点击箭头",
|
||||
"foldAll": "全部折叠",
|
||||
"expandSameLevelHeading": "展开同级标题",
|
||||
"foldSameLevelHeading": "折叠同级标题",
|
||||
"expandChildHeading": "展开子标题",
|
||||
"foldChildHeading": "折叠子标题",
|
||||
"addChildHeading": "添加子标题",
|
||||
"insertSameLevelHeadingBefore": "在前方插入同级标题",
|
||||
"insertSameLevelHeadingAfter": "在后方插入同级标题",
|
||||
"upgrade": "升级",
|
||||
"downgrade": "降级",
|
||||
"clipboardPermissionDenied": "剪贴板权限被拒绝,请在浏览器地址栏允许访问剪贴板后再试",
|
||||
"jumpTo": "跳转到",
|
||||
"vacuumDataIndex": "优化索引",
|
||||
"vacuumDataIndexTip": "校验数据索引,释放存储空间并提升索引性能",
|
||||
"rebuildDataIndex": "重建索引",
|
||||
|
|
@ -36,6 +50,7 @@
|
|||
"showAllEntriesIcons": "显示条目图标",
|
||||
"wrapAllFields": "字段自动换行",
|
||||
"gallery": "卡片",
|
||||
"kanban": "看板",
|
||||
"newTag": "新建标签",
|
||||
"pleaseWait": "请稍等片刻...",
|
||||
"reconnectPrompt": "切换应用后再次进入需要一些时间恢复思源内核运行,请稍等几秒或者点击“重试”按钮",
|
||||
|
|
@ -127,6 +142,7 @@
|
|||
"unbindBlock": "取消绑定块",
|
||||
"showTitle": "显示数据库标题",
|
||||
"fillCreated": "默认填充创建时间",
|
||||
"fillSpecificTime": "默认填充具体时间",
|
||||
"removeCard": "移除闪卡",
|
||||
"updateLayout": "更新布局",
|
||||
"dndFolderTip": "请注意 ${x} 仅插入 file:// 超链接,不复制文件",
|
||||
|
|
@ -169,12 +185,14 @@
|
|||
"cloudStoragePurgeConfirm": "清理云端存储会彻底删除所有未引用的快照和相关数据对象。<ul class='fn__list'><li>执行前请确保其他设备已经暂停同步</li><li>清理操作非常耗时,请确保网络稳定</li></ul> 确定现在就执行吗?",
|
||||
"dragFill": "垂直拖动以填充值",
|
||||
"switchReadonly": "只读模式切换",
|
||||
"original": "原值",
|
||||
"original": "显示原始值",
|
||||
"uniqueValues": "显示唯一值",
|
||||
"selectRelation": "请先选择关联字段",
|
||||
"backRelation": "双向关联",
|
||||
"thisDatabase": "当前数据库",
|
||||
"relatedTo": "关联至",
|
||||
"relation": "关联",
|
||||
"relatedItems": "已关联条目",
|
||||
"rollup": "汇总",
|
||||
"rollupProperty": "汇总字段",
|
||||
"rollupCalc": "汇总方式",
|
||||
|
|
@ -207,12 +225,15 @@
|
|||
"mathBlock": "公式块",
|
||||
"htmlBlock": "HTML 块"
|
||||
},
|
||||
"copyAHref": "复制链接地址",
|
||||
"selected": "已选中",
|
||||
"loadMore": "加载更多",
|
||||
"tempUnlock": "临时解锁",
|
||||
"cancelTempUnlock": "取消临时解锁",
|
||||
"addFilter": "添加筛选条件",
|
||||
"removeFilters": "清空筛选规则",
|
||||
"addSort": "添加排序条件",
|
||||
"removeSorts": "清空排序规则",
|
||||
"checked": "已完成",
|
||||
"unchecked": "未完成",
|
||||
"percentChecked": "已完成占比",
|
||||
|
|
@ -228,7 +249,7 @@
|
|||
"imported": "导入完成",
|
||||
"mirrorTip": "镜像数据库,所有数据更新会同步到其他所有镜像中",
|
||||
"includeTime": "具体时间",
|
||||
"accountSupport1": "自 2020 年 8 月 31 日第一次公开发版以来,思源笔记已累计发版 776 次,解决用户需求与反馈 13840 次,提交代码 17637 次,背后无数次的辛勤付出与长期坚持不懈的更新都离不开您的支持与反馈。",
|
||||
"accountSupport1": "自 2020 年 8 月 31 日第一次公开发版以来,思源笔记已累计发版超过 830 次,解决用户需求与反馈超过 15000 次,提交代码超过 19800 次,背后无数次的辛勤付出与长期坚持不懈的更新都离不开您的支持与反馈。",
|
||||
"accountSupport2": "您的支持与反馈能够让思源笔记更好地开发与发展下去,我们会一直与用户做朋友,用心做好产品,为您提供更好的知识管理体验。非常感谢您的支持!",
|
||||
"goToTab1": "跳转到第一个页签",
|
||||
"goToTab2": "跳转到第二个页签",
|
||||
|
|
@ -565,7 +586,7 @@
|
|||
"embedBlockBreadcrumbTip": "启用后嵌入块将显示面包屑,在超级块中的嵌入块忽略该选项,始终不显示面包屑",
|
||||
"appearanceMode": "外观模式",
|
||||
"editReadonly": "只读模式",
|
||||
"editReadonlyTip": "启用后文档将默认锁定编辑",
|
||||
"editReadonlyTip": "启用后文档编辑器将默认锁定编辑。仍然能够搜索替换文本、通过 API 修改内容",
|
||||
"generateConflictDoc": "同步冲突时生成冲突文档",
|
||||
"generateConflictDocTip": "启用后当同步发生冲突时会生成冲突文档,以便直接打开查看。无论是否启用,[数据历史] 都会记录冲突文档",
|
||||
"deleteOpConfirm": "⚠️ 删除操作确认",
|
||||
|
|
@ -595,7 +616,7 @@
|
|||
"katexMacrosTip": "请使用 JSON 对象格式(<code class='fn__code'>{}</code>)来包裹宏定义,例如 <code class='fn__code'>{ \"\\\\foo\": \"{x^2}\" }</code>",
|
||||
"systemLogTip": "系统日志中保存了程序运行记录,通过导出系统日志发送给开发者可以更好地帮助开发者诊断程序问题",
|
||||
"systemLog": "系统日志",
|
||||
"syncConfGuide1": "初始化同步密钥",
|
||||
"syncConfGuide1": "初始化数据仓库密钥",
|
||||
"syncConfGuide2": "该密钥用于数据同步端到端加密<br>密钥基于你输入的密码生成,请务必牢记密码",
|
||||
"syncConfGuide3": "云端同步目录用于存放当前工作空间对应的加密数据,默认名称为 <code>main</code>。如果你只有一个工作空间需要同步,直接使用 <code>main</code> 即可",
|
||||
"syncConfGuide4": "立即同步?",
|
||||
|
|
@ -670,7 +691,11 @@
|
|||
"turnToDynamic": "动态锚文本",
|
||||
"sizeLimit": "上限",
|
||||
"trafficStat": "流量统计",
|
||||
"hideHeadingBelowBlocks": "隐藏标题下方的块",
|
||||
"headingEmbedMode": "标题块嵌入设置",
|
||||
"showHeadingWithBlocks": "显示标题与下方的块",
|
||||
"showHeadingOnlyTitle": "仅显示标题",
|
||||
"showHeadingOnlyBlocks": "仅显示标题下方的块",
|
||||
"headingEmbedModeTip": "设置标题块在嵌入块中的显示样式",
|
||||
"matchDiacritics": "匹配变音符号",
|
||||
"copyHPath": "复制可读路径",
|
||||
"justify": "两侧对齐",
|
||||
|
|
@ -967,9 +992,10 @@
|
|||
"heading4": "四级标题",
|
||||
"heading5": "五级标题",
|
||||
"heading6": "六级标题",
|
||||
"outlineExpandLevel": "展开层级",
|
||||
"expandAll": "全部展开",
|
||||
"outlineKeepCurrentExpand": "保持当前标题展开",
|
||||
"general": "通用",
|
||||
"insertBefore": "光标所在块前插入空块",
|
||||
"insertAfter": "光标所在块后插入空块",
|
||||
"list1": "列表",
|
||||
"element": "元素",
|
||||
"closeTab": "关闭当前页签",
|
||||
|
|
@ -1284,8 +1310,8 @@
|
|||
"indent": "列表缩进",
|
||||
"info": "关于",
|
||||
"inline-code": "行级代码",
|
||||
"insert-after": "末尾插入块",
|
||||
"insert-before": "起始插入块",
|
||||
"insertAfter": "下方插入块",
|
||||
"insertBefore": "上方插入块",
|
||||
"insertColumnLeft": "在左边插入一列",
|
||||
"insertColumnRight": "在右边插入一列",
|
||||
"insertRowAbove": "在上方插入一行",
|
||||
|
|
@ -1387,6 +1413,7 @@
|
|||
"_attrView": {
|
||||
"table": "表格",
|
||||
"gallery": "卡片",
|
||||
"kanban": "看板",
|
||||
"key": "主键",
|
||||
"select": "单选"
|
||||
},
|
||||
|
|
@ -1663,6 +1690,8 @@
|
|||
"269": "该块已经添加到数据库 [%s] 中",
|
||||
"270": "正在优化数据索引,请稍等...",
|
||||
"271": "数据索引优化完毕,共释放 [%s] 磁盘空间",
|
||||
"272": "未命名字段"
|
||||
"272": "未命名字段",
|
||||
"273": "请勿在分区根路径上创建工作空间,请新建一个文件夹作为工作空间",
|
||||
"274": "该文件夹包含了其他文件,请新建一个文件夹作为工作空间"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
47
app/appx/AppxManifest-arm64.xml
Normal file
47
app/appx/AppxManifest-arm64.xml
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!--suppress XmlUnusedNamespaceDeclaration -->
|
||||
<Package
|
||||
xmlns="http://schemas.microsoft.com/appx/manifest/foundation/windows10"
|
||||
xmlns:uap="http://schemas.microsoft.com/appx/manifest/uap/windows10"
|
||||
xmlns:desktop="http://schemas.microsoft.com/appx/manifest/desktop/windows10"
|
||||
xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities">
|
||||
<!-- use single quotes to avoid double quotes escaping in the publisher value -->
|
||||
<Identity Name="89C2A984.SiYuan"
|
||||
ProcessorArchitecture="arm64"
|
||||
Publisher="CN=087C656E-C1D9-42D8-8807-CED45A74FC0F"
|
||||
Version="3.3.5.0"/>
|
||||
<Properties>
|
||||
<DisplayName>SiYuan</DisplayName>
|
||||
<PublisherDisplayName>云南链滴科技有限公司</PublisherDisplayName>
|
||||
<Description>Refactor your thinking</Description>
|
||||
<Logo>assets\StoreLogo.png</Logo>
|
||||
</Properties>
|
||||
<Resources>
|
||||
<Resource Language="en-US"/>
|
||||
<Resource Language="zh-CN"/>
|
||||
</Resources>
|
||||
<Dependencies>
|
||||
<TargetDeviceFamily Name="Windows.Desktop" MinVersion="10.0.14316.0" MaxVersionTested="10.0.14316.0"/>
|
||||
</Dependencies>
|
||||
<Capabilities>
|
||||
<rescap:Capability Name="runFullTrust"/>
|
||||
</Capabilities>
|
||||
<Applications>
|
||||
<Application Id="SiYuan" Executable="app\SiYuan.exe" EntryPoint="Windows.FullTrustApplication">
|
||||
<uap:VisualElements
|
||||
BackgroundColor="transparent"
|
||||
DisplayName="SiYuan"
|
||||
Square150x150Logo="assets\Square150x150Logo.png"
|
||||
Square44x44Logo="assets\Square44x44Logo.png"
|
||||
Description="Refactor your thinking">
|
||||
<uap:DefaultTile Wide310x150Logo="assets\Wide310x150Logo.png"/>
|
||||
</uap:VisualElements>
|
||||
|
||||
<Extensions>
|
||||
<uap:Extension Category="windows.protocol">
|
||||
<uap:Protocol Name="siyuan"/>
|
||||
</uap:Extension>
|
||||
</Extensions>
|
||||
</Application>
|
||||
</Applications>
|
||||
</Package>
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
<Identity Name="89C2A984.SiYuan"
|
||||
ProcessorArchitecture="x64"
|
||||
Publisher="CN=087C656E-C1D9-42D8-8807-CED45A74FC0F"
|
||||
Version="3.3.2.0"/>
|
||||
Version="3.3.5.0"/>
|
||||
<Properties>
|
||||
<DisplayName>SiYuan</DisplayName>
|
||||
<PublisherDisplayName>云南链滴科技有限公司</PublisherDisplayName>
|
||||
|
|
@ -34,9 +34,7 @@
|
|||
Square150x150Logo="assets\Square150x150Logo.png"
|
||||
Square44x44Logo="assets\Square44x44Logo.png"
|
||||
Description="Refactor your thinking">
|
||||
|
||||
<uap:DefaultTile Wide310x150Logo="assets\Wide310x150Logo.png"/>
|
||||
|
||||
</uap:VisualElements>
|
||||
|
||||
<Extensions>
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
* [為外掛程式 API 添加一些 `Protyle` 方法](https://github.com/siyuan-note/siyuan/issues/9762)
|
||||
* [當編輯器左側邊距最小時改進資料庫表格視圖行圖示](https://github.com/siyuan-note/siyuan/pull/9772)
|
||||
* [新增插件事件 `mobile-keyboard-show` 和 `mobile-keyboard-hide`](https://github.com/siyuan-note/siyuan/issues/9773)
|
||||
* [新增插件時間 `sync-start`、`sync-end` 和 `sync-fail`](https://github.com/siyuan-note/siyuan/issues/9798)
|
||||
* [新增插件事件 `sync-start`、`sync-end` 和 `sync-fail`](https://github.com/siyuan-note/siyuan/issues/9798)
|
||||
* [插件 `requrie` 函數支援載入 node 模組](https://github.com/siyuan-note/siyuan/pull/9803)
|
||||
* [建立日記文件時新增 `custom-dailynote-yyyyMMdd` 屬性](https://github.com/siyuan-note/siyuan/issues/9807)
|
||||
* [新增一些日期相關的範本函數](https://github.com/siyuan-note/siyuan/pull/9812)
|
||||
|
|
|
|||
|
|
@ -49,7 +49,7 @@
|
|||
* [为插件 API 添加一些 `Protyle` 方法](https://github.com/siyuan-note/siyuan/issues/9762)
|
||||
* [当编辑器左侧边距最小时改进数据库表格视图行图标](https://github.com/siyuan-note/siyuan/pull/9772)
|
||||
* [添加插件事件 `mobile-keyboard-show` 和 `mobile-keyboard-hide`](https://github.com/siyuan-note/siyuan/issues/9773)
|
||||
* [添加插件时间 `sync-start`、`sync-end` 和 `sync-fail`](https://github.com/siyuan-note/siyuan/issues/9798)
|
||||
* [添加插件事件 `sync-start`、`sync-end` 和 `sync-fail`](https://github.com/siyuan-note/siyuan/issues/9798)
|
||||
* [插件 `requrie` 函数支持加载 node 模块](https://github.com/siyuan-note/siyuan/pull/9803)
|
||||
* [创建日记文档时添加 `custom-dailynote-yyyyMMdd` 属性](https://github.com/siyuan-note/siyuan/issues/9807)
|
||||
* [添加一些日期相关的模板函数](https://github.com/siyuan-note/siyuan/pull/9812)
|
||||
|
|
|
|||
61
app/changelogs/v3.3.3/v3.3.3.md
Normal file
61
app/changelogs/v3.3.3/v3.3.3.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
## Overview
|
||||
|
||||
This version improves some details.
|
||||
|
||||
## Changelogs
|
||||
|
||||
Below are the detailed changes in this version.
|
||||
|
||||
### Enhancement
|
||||
|
||||
* [Database asset fields support filtering](https://github.com/siyuan-note/siyuan/issues/11967)
|
||||
* [Block ref elements retain their original styles when exported](https://github.com/siyuan-note/siyuan/issues/15698)
|
||||
* [The new block created after folding the heading must be a heading of the same level](https://github.com/siyuan-note/siyuan/issues/15725)
|
||||
* [Add scenes for expanding and collapsing headings](https://github.com/siyuan-note/siyuan/issues/15726)
|
||||
* [Refresh the data in the interface after moving the document](https://github.com/siyuan-note/siyuan/issues/15762)
|
||||
* [Improve copy/cut/delete `Headings and Bottom Blocks` menu](https://github.com/siyuan-note/siyuan/issues/15797)
|
||||
* [Improve database group view performance](https://github.com/siyuan-note/siyuan/issues/15811)
|
||||
* [Upgrade mermaid.js from 11.6.0 to 11.11.0](https://github.com/siyuan-note/siyuan/issues/15819)
|
||||
* [The browser clipping extension supports "Show directories first in path search"](https://github.com/siyuan-note/siyuan/issues/15822)
|
||||
* [Improve reopening interaction of closed notebooks](https://github.com/siyuan-note/siyuan/issues/15825)
|
||||
* [Add new icon: iconInclude](https://github.com/siyuan-note/siyuan/issues/15831)
|
||||
* [Support arm64 version in Microsoft Store](https://github.com/siyuan-note/siyuan/issues/15836)
|
||||
* [Improve database menu rendering](https://github.com/siyuan-note/siyuan/issues/15839)
|
||||
* [Improve the drag-and-drop in the chart and math editing dialogs](https://github.com/siyuan-note/siyuan/issues/15850)
|
||||
* [The database rollup field supports using the relation field](https://github.com/siyuan-note/siyuan/issues/15851)
|
||||
* [Add "Show unique values" to the calculation of the database rollup field](https://github.com/siyuan-note/siyuan/issues/15852)
|
||||
* [Extend the time the interface waits for kernel startup on the desktop](https://github.com/siyuan-note/siyuan/issues/15853)
|
||||
* [When exporting inline code to Markdown, try to remove the trailing zero-width space](https://github.com/siyuan-note/siyuan/issues/15854)
|
||||
* [Improve HTML code block clipping](https://github.com/siyuan-note/siyuan/issues/15855)
|
||||
* [Improve HTML clipping base64 images](https://github.com/siyuan-note/siyuan/issues/15856)
|
||||
* [Improve database rollup checkbox fields](https://github.com/siyuan-note/siyuan/issues/15858)
|
||||
* [Disallow editing of non-bound block icons in database relation field](https://github.com/siyuan-note/siyuan/issues/15859)
|
||||
* [Improve database interaction details](https://github.com/siyuan-note/siyuan/issues/15861)
|
||||
* [Improve the interaction when using the backspace key at the beginning of a code block](https://github.com/siyuan-note/siyuan/issues/15864)
|
||||
* [The database relation fields support copying existing relations](https://github.com/siyuan-note/siyuan/pull/15876)
|
||||
* [Improve font loading](https://github.com/siyuan-note/siyuan/issues/15879)
|
||||
* [Improve document opening compatibility](https://github.com/siyuan-note/siyuan/issues/15885)
|
||||
* [Improve dynamic loading to prevent continuous automatic loading in certain situations](https://github.com/siyuan-note/siyuan/issues/15889)
|
||||
* [Improve the judgment of editable blocks and the escape processing of HTML blocks](https://github.com/siyuan-note/siyuan/issues/15904)
|
||||
|
||||
### Bugfix
|
||||
|
||||
* [The editor switch cursor does not follow](https://github.com/siyuan-note/siyuan/issues/15821)
|
||||
* [After updating a select field in the database attribute panel, clicking on other select fields does not respond](https://github.com/siyuan-note/siyuan/issues/15827)
|
||||
* [When "Default fill created time" is enabled for database date fields, the automatically filled time value is incorrect](https://github.com/siyuan-note/siyuan/issues/15828)
|
||||
* [The menus for database relation and rollup fields on the mobile do not display the related database name and field name](https://github.com/siyuan-note/siyuan/issues/15835)
|
||||
* [When exporting images, the code block line number will display 0](https://github.com/siyuan-note/siyuan/issues/15837)
|
||||
* [File history cannot load the correct view of database blocks](https://github.com/siyuan-note/siyuan/issues/15841)
|
||||
* [`Optimize typography` exception when code block contains ```](https://github.com/siyuan-note/siyuan/issues/15843)
|
||||
* [`Add to Database` shows databases that are not in the document](https://github.com/siyuan-note/siyuan/issues/15847)
|
||||
* [An error occurs when inserting a tag using a mouse click](https://github.com/siyuan-note/siyuan/issues/15867)
|
||||
* [Outline drag function is abnormal](https://github.com/siyuan-note/siyuan/issues/15909)
|
||||
|
||||
### Development
|
||||
|
||||
* [Add an attribute for the breadcrumb unlock/lock button tag](https://github.com/siyuan-note/siyuan/pull/15820)
|
||||
|
||||
## Download
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/en/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
61
app/changelogs/v3.3.3/v3.3.3_zh_CHT.md
Normal file
61
app/changelogs/v3.3.3/v3.3.3_zh_CHT.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
## 概述
|
||||
|
||||
該版本改進了一些細節。
|
||||
|
||||
## 變更記錄
|
||||
|
||||
以下是此版本中的詳細變更。
|
||||
|
||||
### 改進功能
|
||||
|
||||
* [資料庫資源欄位支援篩選](https://github.com/siyuan-note/siyuan/issues/11967)
|
||||
* [塊引用元素導出時保留原有樣式](https://github.com/siyuan-note/siyuan/issues/15698)
|
||||
* [折疊標題後新建的區塊為同級標題](https://github.com/siyuan-note/siyuan/issues/15725)
|
||||
* [增加標題展開與折疊的場景](https://github.com/siyuan-note/siyuan/issues/15726)
|
||||
* [行動文件後刷新介面資料](https://github.com/siyuan-note/siyuan/issues/15762)
|
||||
* [改進複製/剪下/刪除 `標題與下方區塊` 選單](https://github.com/siyuan-note/siyuan/issues/15797)
|
||||
* [提升資料庫分組檢視效能](https://github.com/siyuan-note/siyuan/issues/15811)
|
||||
* [將 mermaid.js 從 11.6.0 升級到 11.11.0](https://github.com/siyuan-note/siyuan/issues/15819)
|
||||
* [瀏覽器剪藏擴充功能支援「路徑搜尋時目錄優先顯示」](https://github.com/siyuan-note/siyuan/issues/15822)
|
||||
* [改進關閉筆記本後重新開啟的互動](https://github.com/siyuan-note/siyuan/issues/15825)
|
||||
* [新增圖示:iconInclude](https://github.com/siyuan-note/siyuan/issues/15831)
|
||||
* [Microsoft Store 支援 arm64 版本](https://github.com/siyuan-note/siyuan/issues/15836)
|
||||
* [改進資料庫選單渲染](https://github.com/siyuan-note/siyuan/issues/15839)
|
||||
* [改進圖表和數學編輯對話框的拖曳](https://github.com/siyuan-note/siyuan/issues/15850)
|
||||
* [資料庫匯總欄位支援使用關聯欄位](https://github.com/siyuan-note/siyuan/issues/15851)
|
||||
* [資料庫匯總欄位計算中增加「顯示唯一值」](https://github.com/siyuan-note/siyuan/issues/15852)
|
||||
* [桌上端介面等待內核啟動時間延長](https://github.com/siyuan-note/siyuan/issues/15853)
|
||||
* [匯出 Markdown 行內程式碼時盡量移除結尾零寬空格](https://github.com/siyuan-note/siyuan/issues/15854)
|
||||
* [改進 HTML 程式碼區塊剪藏](https://github.com/siyuan-note/siyuan/issues/15855)
|
||||
* [改進 HTML 剪藏 base64 圖片](https://github.com/siyuan-note/siyuan/issues/15856)
|
||||
* [改進資料庫總複選方塊欄位](https://github.com/siyuan-note/siyuan/issues/15858)
|
||||
* [資料庫關聯欄位不允許編輯未綁定區塊的圖示](https://github.com/siyuan-note/siyuan/issues/15859)
|
||||
* [改進資料庫互動細節](https://github.com/siyuan-note/siyuan/issues/15861)
|
||||
* [在程式碼區塊開頭使用退格鍵時改進互動](https://github.com/siyuan-note/siyuan/issues/15864)
|
||||
* [資料庫關聯欄位支援複製已有關聯](https://github.com/siyuan-note/siyuan/pull/15876)
|
||||
* [改進字體載入](https://github.com/siyuan-note/siyuan/issues/15879)
|
||||
* [改進開啟文件相容性](https://github.com/siyuan-note/siyuan/issues/15885)
|
||||
* [改進文件動態加載,防止在特定情況下持續自動加載](https://github.com/siyuan-note/siyuan/issues/15889)
|
||||
* [改進可編輯區塊的判斷和 HTML 區塊的轉義處理](https://github.com/siyuan-note/siyuan/issues/15904)
|
||||
|
||||
### 修復缺陷
|
||||
|
||||
* [編輯器切換時光標未跟隨](https://github.com/siyuan-note/siyuan/issues/15821)
|
||||
* [資料庫屬性面板更新選擇欄位後,點選其他選擇欄位無回應](https://github.com/siyuan-note/siyuan/issues/15827)
|
||||
* [資料庫日期欄位啟用「預設填入建立時間」後自動填入的時間值不正確](https://github.com/siyuan-note/siyuan/issues/15828)
|
||||
* [行動端資料庫關聯和匯總欄位選單未顯示關聯資料庫名稱和欄位名稱](https://github.com/siyuan-note/siyuan/issues/15835)
|
||||
* [匯出圖片時程式碼區塊行號顯示為 0](https://github.com/siyuan-note/siyuan/issues/15837)
|
||||
* [檔案歷史無法載入資料庫區塊的正確檢視](https://github.com/siyuan-note/siyuan/issues/15841)
|
||||
* [程式碼區塊包含 ``` 時「最佳化排版」異常](https://github.com/siyuan-note/siyuan/issues/15843)
|
||||
* [「新增至資料庫」會顯示不在文件中的資料庫](https://github.com/siyuan-note/siyuan/issues/15847)
|
||||
* [滑鼠點選插入標籤時報錯誤](https://github.com/siyuan-note/siyuan/issues/15867)
|
||||
* [大綱拖曳功能異常](https://github.com/siyuan-note/siyuan/issues/15909)
|
||||
|
||||
### 開發者
|
||||
|
||||
* [為麵包屑解鎖/鎖定按鈕標籤增加屬性](https://github.com/siyuan-note/siyuan/pull/15820)
|
||||
|
||||
## 下載
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
61
app/changelogs/v3.3.3/v3.3.3_zh_CN.md
Normal file
61
app/changelogs/v3.3.3/v3.3.3_zh_CN.md
Normal file
|
|
@ -0,0 +1,61 @@
|
|||
## 概述
|
||||
|
||||
该版本改进了一些细节。
|
||||
|
||||
## 变更记录
|
||||
|
||||
以下是此版本中的详细变更。
|
||||
|
||||
### 改进功能
|
||||
|
||||
* [数据库资源字段支持筛选](https://github.com/siyuan-note/siyuan/issues/11967)
|
||||
* [块引用元素导出时保留原有样式](https://github.com/siyuan-note/siyuan/issues/15698)
|
||||
* [折叠标题后新建的块为同级标题](https://github.com/siyuan-note/siyuan/issues/15725)
|
||||
* [增加标题展开与折叠的场景](https://github.com/siyuan-note/siyuan/issues/15726)
|
||||
* [移动文档后刷新界面数据](https://github.com/siyuan-note/siyuan/issues/15762)
|
||||
* [改进复制/剪切/删除 `标题与下方块` 菜单](https://github.com/siyuan-note/siyuan/issues/15797)
|
||||
* [提升数据库分组视图性能](https://github.com/siyuan-note/siyuan/issues/15811)
|
||||
* [将 mermaid.js 从 11.6.0 升级到 11.11.0](https://github.com/siyuan-note/siyuan/issues/15819)
|
||||
* [浏览器剪藏扩展支持“路径搜索时目录优先显示”](https://github.com/siyuan-note/siyuan/issues/15822)
|
||||
* [改进关闭笔记本后重新打开的交互](https://github.com/siyuan-note/siyuan/issues/15825)
|
||||
* [新增图标:iconInclude](https://github.com/siyuan-note/siyuan/issues/15831)
|
||||
* [Microsoft Store 支持 arm64 版本](https://github.com/siyuan-note/siyuan/issues/15836)
|
||||
* [改进数据库菜单渲染](https://github.com/siyuan-note/siyuan/issues/15839)
|
||||
* [改进图表和数学编辑对话框的拖拽](https://github.com/siyuan-note/siyuan/issues/15850)
|
||||
* [数据库汇总字段支持使用关联字段](https://github.com/siyuan-note/siyuan/issues/15851)
|
||||
* [数据库汇总字段计算中增加“显示唯一值”](https://github.com/siyuan-note/siyuan/issues/15852)
|
||||
* [桌面端界面等待内核启动时间延长](https://github.com/siyuan-note/siyuan/issues/15853)
|
||||
* [导出 Markdown 行内代码时尽量去除末尾零宽空格](https://github.com/siyuan-note/siyuan/issues/15854)
|
||||
* [改进 HTML 代码块剪藏](https://github.com/siyuan-note/siyuan/issues/15855)
|
||||
* [改进 HTML 剪藏 base64 图片](https://github.com/siyuan-note/siyuan/issues/15856)
|
||||
* [改进数据库汇总复选框字段](https://github.com/siyuan-note/siyuan/issues/15858)
|
||||
* [数据库关联字段不允许编辑未绑定块的图标](https://github.com/siyuan-note/siyuan/issues/15859)
|
||||
* [改进数据库交互细节](https://github.com/siyuan-note/siyuan/issues/15861)
|
||||
* [在代码块开头使用退格键时改进交互](https://github.com/siyuan-note/siyuan/issues/15864)
|
||||
* [数据库关联字段支持复制已有关联](https://github.com/siyuan-note/siyuan/pull/15876)
|
||||
* [改进字体加载](https://github.com/siyuan-note/siyuan/issues/15879)
|
||||
* [改进打开文档兼容性](https://github.com/siyuan-note/siyuan/issues/15885)
|
||||
* [改进文档动态加载,防止特定情况下持续自动加载](https://github.com/siyuan-note/siyuan/issues/15889)
|
||||
* [改进可编辑块的判断和 HTML 块的转义处理](https://github.com/siyuan-note/siyuan/issues/15904)
|
||||
|
||||
### 修复缺陷
|
||||
|
||||
* [编辑器切换时光标未跟随](https://github.com/siyuan-note/siyuan/issues/15821)
|
||||
* [数据库属性面板更新选择字段后,点击其他选择字段无响应](https://github.com/siyuan-note/siyuan/issues/15827)
|
||||
* [数据库日期字段启用“默认填充创建时间”后自动填充的时间值不正确](https://github.com/siyuan-note/siyuan/issues/15828)
|
||||
* [移动端数据库关联和汇总字段菜单未显示关联数据库名和字段名](https://github.com/siyuan-note/siyuan/issues/15835)
|
||||
* [导出图片时代码块行号显示为 0](https://github.com/siyuan-note/siyuan/issues/15837)
|
||||
* [文件历史无法加载数据库块的正确视图](https://github.com/siyuan-note/siyuan/issues/15841)
|
||||
* [代码块包含 ``` 时“优化排版”异常](https://github.com/siyuan-note/siyuan/issues/15843)
|
||||
* [“添加到数据库”会显示不在文档中的数据库](https://github.com/siyuan-note/siyuan/issues/15847)
|
||||
* [鼠标点击插入标签时报错](https://github.com/siyuan-note/siyuan/issues/15867)
|
||||
* [大纲拖动功能异常](https://github.com/siyuan-note/siyuan/issues/15909)
|
||||
|
||||
### 开发者
|
||||
|
||||
* [为面包屑解锁/锁定按钮标签增加属性](https://github.com/siyuan-note/siyuan/pull/15820)
|
||||
|
||||
## 下载
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
50
app/changelogs/v3.3.4/v3.3.4.md
Normal file
50
app/changelogs/v3.3.4/v3.3.4.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
## Overview
|
||||
|
||||
This version improves some details.
|
||||
|
||||
## Changelogs
|
||||
|
||||
Below are the detailed changes in this version.
|
||||
|
||||
### Enhancement
|
||||
|
||||
* [Improve the first empty list item editing](https://github.com/siyuan-note/siyuan/issues/12060)
|
||||
* [Add `Default fill specific time` switch to database date field](https://github.com/siyuan-note/siyuan/issues/12089)
|
||||
* [Improve line break handling within tables](https://github.com/siyuan-note/siyuan/issues/15844)
|
||||
* [Improve fold heading editing](https://github.com/siyuan-note/siyuan/issues/15848)
|
||||
* [The embed block of a heading supports hiding the heading itself](https://github.com/siyuan-note/siyuan/pull/15877)
|
||||
* [Improve database editing cell style](https://github.com/siyuan-note/siyuan/issues/15908)
|
||||
* [Improve HTML dl/dt/dd clipping](https://github.com/siyuan-note/siyuan/issues/15912)
|
||||
* [If the block ref is pointing to a doc block, the doc title will be displayed in the block ref floating window](https://github.com/siyuan-note/siyuan/pull/15929)
|
||||
* [Improve `Jump to` block icon menu](https://github.com/siyuan-note/siyuan/issues/15937)
|
||||
* [Improve the behavior of `Jump to the next/previous block of the parent block` in lists](https://github.com/siyuan-note/siyuan/issues/15939)
|
||||
* [Improve `Jump to the next/previous block of the parent block` for container blocks](https://github.com/siyuan-note/siyuan/issues/15940)
|
||||
* [Improve style for document tags and tables resize in read-only mode](https://github.com/siyuan-note/siyuan/issues/15944)
|
||||
* [Add icons and zenmuml support to mermaid.js](https://github.com/siyuan-note/siyuan/issues/15948)
|
||||
* [Upgrade mermaid from 11.11.0 to 11.12.0](https://github.com/siyuan-note/siyuan/issues/15957)
|
||||
* [Add a refresh button in the upper right corner of the chart block](https://github.com/siyuan-note/siyuan/issues/15964)
|
||||
* [Doc tree supports `Shift+Click` to select multiple documents](https://github.com/siyuan-note/siyuan/pull/15965)
|
||||
* [Ensure compatibility with inline elements containing <br> tags](https://github.com/siyuan-note/siyuan/issues/15968)
|
||||
* [Prompt when the user attempts to create a workspace in the root directory of the disk](https://github.com/siyuan-note/siyuan/issues/15976)
|
||||
* [`History Retention Days` supports a maximum setting of 3650](https://github.com/siyuan-note/siyuan/issues/15979)
|
||||
* [Improve font loading](https://github.com/siyuan-note/siyuan/issues/15981)
|
||||
* [Improve return to desktop gesture on Android](https://github.com/siyuan-note/siyuan/issues/15991)
|
||||
|
||||
### Bugfix
|
||||
|
||||
* [Chart block height setting is not fully effective](https://github.com/siyuan-note/siyuan/issues/15765)
|
||||
* [Filter over rollups doesn't work](https://github.com/siyuan-note/siyuan/issues/15915)
|
||||
* [Chart not rendering after copying and pasting](https://github.com/siyuan-note/siyuan/issues/15918)
|
||||
* [Nested lists cause hang after collapsing headings](https://github.com/siyuan-note/siyuan/issues/15943)
|
||||
* [IFrame block address escape error](https://github.com/siyuan-note/siyuan/issues/15946)
|
||||
* [XSS to RCE in dynamic icon feature](https://github.com/siyuan-note/siyuan/issues/15970)
|
||||
* [Doc tree drag function is abnormal](https://github.com/siyuan-note/siyuan/issues/15972)
|
||||
|
||||
### Refactor
|
||||
|
||||
* [Upgrade to Electron v37.6.0](https://github.com/siyuan-note/siyuan/issues/15990)
|
||||
|
||||
## Download
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/en/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
50
app/changelogs/v3.3.4/v3.3.4_zh_CHT.md
Normal file
50
app/changelogs/v3.3.4/v3.3.4_zh_CHT.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
## 概述
|
||||
|
||||
該版本改進了一些細節。
|
||||
|
||||
## 變更記錄
|
||||
|
||||
以下是此版本中的詳細變更。
|
||||
|
||||
### 改進功能
|
||||
|
||||
* [改進首個空列表項目的編輯](https://github.com/siyuan-note/siyuan/issues/12060)
|
||||
* [資料庫日期欄位新增「預設填入特定時間」開關](https://github.com/siyuan-note/siyuan/issues/12089)
|
||||
* [改進表格內換行處理](https://github.com/siyuan-note/siyuan/issues/15844)
|
||||
* [改進折疊標題的編輯](https://github.com/siyuan-note/siyuan/issues/15848)
|
||||
* [標題嵌入區塊支援隱藏標題本身](https://github.com/siyuan-note/siyuan/pull/15877)
|
||||
* [改進資料庫編輯單元格樣式](https://github.com/siyuan-note/siyuan/issues/15908)
|
||||
* [改進 HTML dl/dt/dd 剪藏](https://github.com/siyuan-note/siyuan/issues/15912)
|
||||
* [當區塊引用指向文件區塊時,浮窗顯示文件標題](https://github.com/siyuan-note/siyuan/pull/15929)
|
||||
* [改進「跳到」區塊圖示選單](https://github.com/siyuan-note/siyuan/issues/15937)
|
||||
* [改進清單中「跳到父區塊的下/上一個區塊」行為](https://github.com/siyuan-note/siyuan/issues/15939)
|
||||
* [改進容器區塊「跳到父區塊的下/上一個區塊」行為](https://github.com/siyuan-note/siyuan/issues/15940)
|
||||
* [改進唯讀模式下文件標籤和表格縮放樣式](https://github.com/siyuan-note/siyuan/issues/15944)
|
||||
* [mermaid.js 新增圖示和 zenmuml 支援](https://github.com/siyuan-note/siyuan/issues/15948)
|
||||
* [mermaid 從 11.11.0 升級到 11.12.0](https://github.com/siyuan-note/siyuan/issues/15957)
|
||||
* [圖表區塊右上角新增刷新按鈕](https://github.com/siyuan-note/siyuan/issues/15964)
|
||||
* [文檔樹支援 `Shift+點擊` 多選文件](https://github.com/siyuan-note/siyuan/pull/15965)
|
||||
* [確保相容於包含 <br> 標籤的行級元素](https://github.com/siyuan-note/siyuan/issues/15968)
|
||||
* [嘗試在磁碟根目錄建立工作空間時提示使用者](https://github.com/siyuan-note/siyuan/issues/15976)
|
||||
* [`歷史保留天數` 最大支援 3650](https://github.com/siyuan-note/siyuan/issues/15979)
|
||||
* [改進字體載入](https://github.com/siyuan-note/siyuan/issues/15981)
|
||||
* [改進 Android 端回傳桌面手勢](https://github.com/siyuan-note/siyuan/issues/15991)
|
||||
|
||||
### 修復缺陷
|
||||
|
||||
* [圖表塊高度設定未完全生效](https://github.com/siyuan-note/siyuan/issues/15765)
|
||||
* [匯總過濾器無法正常運作](https://github.com/siyuan-note/siyuan/issues/15915)
|
||||
* [複製貼上後圖表未渲染](https://github.com/siyuan-note/siyuan/issues/15918)
|
||||
* [折疊標題後嵌套列表導致卡死](https://github.com/siyuan-note/siyuan/issues/15943)
|
||||
* [IFrame 區塊位址轉義錯誤](https://github.com/siyuan-note/siyuan/issues/15946)
|
||||
* [動態圖示功能存在 XSS 到 RCE 漏洞](https://github.com/siyuan-note/siyuan/issues/15970)
|
||||
* [文檔樹拖曳功能異常](https://github.com/siyuan-note/siyuan/issues/15972)
|
||||
|
||||
### 開發重構
|
||||
|
||||
* [升級至 Electron v37.6.0](https://github.com/siyuan-note/siyuan/issues/15990)
|
||||
|
||||
## 下載
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
50
app/changelogs/v3.3.4/v3.3.4_zh_CN.md
Normal file
50
app/changelogs/v3.3.4/v3.3.4_zh_CN.md
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
## 概述
|
||||
|
||||
该版本改进了一些细节。
|
||||
|
||||
## 变更记录
|
||||
|
||||
以下是此版本中的详细变更。
|
||||
|
||||
### 改进功能
|
||||
|
||||
* [改进首个空列表项的编辑](https://github.com/siyuan-note/siyuan/issues/12060)
|
||||
* [数据库日期字段新增“默认填充具体时间”开关](https://github.com/siyuan-note/siyuan/issues/12089)
|
||||
* [改进表格内换行处理](https://github.com/siyuan-note/siyuan/issues/15844)
|
||||
* [改进折叠标题的编辑](https://github.com/siyuan-note/siyuan/issues/15848)
|
||||
* [标题嵌入块支持隐藏标题本身](https://github.com/siyuan-note/siyuan/pull/15877)
|
||||
* [改进数据库编辑单元格样式](https://github.com/siyuan-note/siyuan/issues/15908)
|
||||
* [改进 HTML dl/dt/dd 剪藏](https://github.com/siyuan-note/siyuan/issues/15912)
|
||||
* [块引用指向文档块时,浮窗显示文档标题](https://github.com/siyuan-note/siyuan/pull/15929)
|
||||
* [改进“跳转到”块图标菜单](https://github.com/siyuan-note/siyuan/issues/15937)
|
||||
* [改进列表中“跳转到父块的下/上一个块”行为](https://github.com/siyuan-note/siyuan/issues/15939)
|
||||
* [改进容器块“跳转到父块的下/上一个块”行为](https://github.com/siyuan-note/siyuan/issues/15940)
|
||||
* [改进只读模式下文档标签和表格缩放样式](https://github.com/siyuan-note/siyuan/issues/15944)
|
||||
* [mermaid.js 新增图标和 zenmuml 支持](https://github.com/siyuan-note/siyuan/issues/15948)
|
||||
* [mermaid 从 11.11.0 升级到 11.12.0](https://github.com/siyuan-note/siyuan/issues/15957)
|
||||
* [图表块右上角新增刷新按钮](https://github.com/siyuan-note/siyuan/issues/15964)
|
||||
* [文档树支持 `Shift+点击` 多选文档](https://github.com/siyuan-note/siyuan/pull/15965)
|
||||
* [确保兼容包含 <br> 标签的行级元素](https://github.com/siyuan-note/siyuan/issues/15968)
|
||||
* [尝试在磁盘根目录创建工作空间时提示用户](https://github.com/siyuan-note/siyuan/issues/15976)
|
||||
* [`历史保留天数` 最大支持 3650](https://github.com/siyuan-note/siyuan/issues/15979)
|
||||
* [改进字体加载](https://github.com/siyuan-note/siyuan/issues/15981)
|
||||
* [改进 Android 端返回桌面手势](https://github.com/siyuan-note/siyuan/issues/15991)
|
||||
|
||||
### 修复缺陷
|
||||
|
||||
* [图表块高度设置未完全生效](https://github.com/siyuan-note/siyuan/issues/15765)
|
||||
* [汇总过滤器无法正常工作](https://github.com/siyuan-note/siyuan/issues/15915)
|
||||
* [复制粘贴后图表未渲染](https://github.com/siyuan-note/siyuan/issues/15918)
|
||||
* [折叠标题后嵌套列表导致卡死](https://github.com/siyuan-note/siyuan/issues/15943)
|
||||
* [IFrame 块地址转义错误](https://github.com/siyuan-note/siyuan/issues/15946)
|
||||
* [动态图标功能存在 XSS 到 RCE 漏洞](https://github.com/siyuan-note/siyuan/issues/15970)
|
||||
* [文档树拖拽功能异常](https://github.com/siyuan-note/siyuan/issues/15972)
|
||||
|
||||
### 开发重构
|
||||
|
||||
* [升级至 Electron v37.6.0](https://github.com/siyuan-note/siyuan/issues/15990)
|
||||
|
||||
## 下载
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
56
app/changelogs/v3.3.5/v3.3.5.md
Normal file
56
app/changelogs/v3.3.5/v3.3.5.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
## Overview
|
||||
|
||||
This version improves some details.
|
||||
|
||||
## Changelogs
|
||||
|
||||
Below are the detailed changes in this version.
|
||||
|
||||
### Enhancement
|
||||
|
||||
* [Browser clipping extension supports context menu `Send to SiYuan`](https://github.com/siyuan-note/siyuan/issues/9181)
|
||||
* [Improve database relation field filter settings](https://github.com/siyuan-note/siyuan/issues/12000)
|
||||
* [Improve doc browsing location loading](https://github.com/siyuan-note/siyuan/issues/14505)
|
||||
* [Supports theme light/dark mode following the system setting on HarmonyOS](https://github.com/siyuan-note/siyuan/issues/14676)
|
||||
* [Improve spaced repetition interface](https://github.com/siyuan-note/siyuan/pull/15627)
|
||||
* [Search results show document titles](https://github.com/siyuan-note/siyuan/pull/15969)
|
||||
* [Improve toolbar position calculation](https://github.com/siyuan-note/siyuan/pull/15983)
|
||||
* [Improve fold heading editing](https://github.com/siyuan-note/siyuan/issues/15989)
|
||||
* [Improve browser clipping extension `After clipping a web page, open document*`](https://github.com/siyuan-note/siyuan/issues/15992)
|
||||
* [Increase the height of the editing toolbar on mobile](https://github.com/siyuan-note/siyuan/issues/15994)
|
||||
* [Add `Show in Folder` for the database block](https://github.com/siyuan-note/siyuan/issues/15995)
|
||||
* [Read-only mode supports previewing title images and searching by clicking on document tags](https://github.com/siyuan-note/siyuan/issues/15999)
|
||||
* [Improve search document title highlighting](https://github.com/siyuan-note/siyuan/issues/16011)
|
||||
* [Improve exporting block ref style](https://github.com/siyuan-note/siyuan/issues/16017)
|
||||
* [Remove the "Import" item from the doc block menu within the doc](https://github.com/siyuan-note/siyuan/issues/16019)
|
||||
* [Prompt when the web page does not have permission to read the clipboard](https://github.com/siyuan-note/siyuan/issues/16024)
|
||||
* [Improve block memo display](https://github.com/siyuan-note/siyuan/pull/16025)
|
||||
* [Cancel the animation effect when exiting focus and scrolling to the corresponding block](https://github.com/siyuan-note/siyuan/issues/16028)
|
||||
* [Turn off autocomplete and spellcheck in the search input box](https://github.com/siyuan-note/siyuan/issues/16031)
|
||||
* [Improve export of empty documents with subdocuments](https://github.com/siyuan-note/siyuan/issues/16040)
|
||||
* [Improve exporting markdown block ref relative path](https://github.com/siyuan-note/siyuan/issues/16042)
|
||||
* [Change `Search asset content` and `Add watermark to exported PDF or image` from paid to free](https://github.com/siyuan-note/siyuan/issues/16044)
|
||||
* [Improve copy and cut](https://github.com/siyuan-note/siyuan/issues/16048)
|
||||
* [Improve data sync S3 provider compatibility](https://github.com/siyuan-note/siyuan/issues/16058)
|
||||
* [Improve HTML img clipping](https://github.com/siyuan-note/siyuan/issues/16076)
|
||||
|
||||
### Bugfix
|
||||
|
||||
* [Drag errors with blocks in the list](https://github.com/siyuan-note/siyuan/issues/13822)
|
||||
* [Inserting an image into an empty list item will insert it into the next paragraph block on mobile](https://github.com/siyuan-note/siyuan/issues/15998)
|
||||
* [The database attribute panel of the doc opened from the doc tree does not display the content](https://github.com/siyuan-note/siyuan/issues/16001)
|
||||
* [Chart not refreshing after updating code](https://github.com/siyuan-note/siyuan/issues/16003)
|
||||
* [Database is constantly loading](https://github.com/siyuan-note/siyuan/issues/16023)
|
||||
* [Unable to export PDF after setting KaTeX macro definition](https://github.com/siyuan-note/siyuan/issues/16037)
|
||||
* [Unable to save search and replace type settings](https://github.com/siyuan-note/siyuan/issues/16059)
|
||||
|
||||
### Development
|
||||
|
||||
* [API `getTag` add an optional parameter `ignoreMaxListHint`](https://github.com/siyuan-note/siyuan/issues/16000)
|
||||
* [Add internal kernel API `/api/ui/reloadIcon`](https://github.com/siyuan-note/siyuan/issues/16008)
|
||||
* [Improve the `click-blockicon` event triggering after multiple blocks are selected in read-only mode](https://github.com/siyuan-note/siyuan/issues/16010)
|
||||
|
||||
## Download
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/en/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
56
app/changelogs/v3.3.5/v3.3.5_zh_CHT.md
Normal file
56
app/changelogs/v3.3.5/v3.3.5_zh_CHT.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
## 概述
|
||||
|
||||
該版本改進了一些細節。
|
||||
|
||||
## 變更記錄
|
||||
|
||||
以下是此版本中的詳細變更。
|
||||
|
||||
### 改進功能
|
||||
|
||||
* [瀏覽器剪藏擴充功能支援右鍵選單「傳送到思源」](https://github.com/siyuan-note/siyuan/issues/9181)
|
||||
* [改進資料庫關聯欄位篩選設定](https://github.com/siyuan-note/siyuan/issues/12000)
|
||||
* [改進文件瀏覽位置載入](https://github.com/siyuan-note/siyuan/issues/14505)
|
||||
* [鴻蒙系統支援主題跟隨系統設定的明暗模式](https://github.com/siyuan-note/siyuan/issues/14676)
|
||||
* [改進間隔重複介面](https://github.com/siyuan-note/siyuan/pull/15627)
|
||||
* [搜尋結果顯示文件標題](https://github.com/siyuan-note/siyuan/pull/15969)
|
||||
* [改進工具列位置計算](https://github.com/siyuan-note/siyuan/pull/15983)
|
||||
* [改進折疊標題編輯](https://github.com/siyuan-note/siyuan/issues/15989)
|
||||
* [改進瀏覽器剪藏擴充功能「剪藏網頁後開啟文件」](https://github.com/siyuan-note/siyuan/issues/15992)
|
||||
* [增加行動裝置編輯工具列高度](https://github.com/siyuan-note/siyuan/issues/15994)
|
||||
* [資料庫區塊新增「在資料夾中顯示」](https://github.com/siyuan-note/siyuan/issues/15995)
|
||||
* [唯讀模式支援預覽標題圖片和點擊文件標籤搜尋](https://github.com/siyuan-note/siyuan/issues/15999)
|
||||
* [改進搜尋文件標題高亮顯示](https://github.com/siyuan-note/siyuan/issues/16011)
|
||||
* [改進導出區塊引用樣式](https://github.com/siyuan-note/siyuan/issues/16017)
|
||||
* [移除文件區塊選單中的「導入」項目](https://github.com/siyuan-note/siyuan/issues/16019)
|
||||
* [網頁無剪貼簿讀取權限時提示](https://github.com/siyuan-note/siyuan/issues/16024)
|
||||
* [改進區塊備註顯示](https://github.com/siyuan-note/siyuan/pull/16025)
|
||||
* [退出對焦並捲動至對應區塊時取消動畫效果](https://github.com/siyuan-note/siyuan/issues/16028)
|
||||
* [搜尋輸入方塊關閉自動補全與拼字檢查](https://github.com/siyuan-note/siyuan/issues/16031)
|
||||
* [改進匯出含子文件的空白文檔](https://github.com/siyuan-note/siyuan/issues/16040)
|
||||
* [改進匯出 Markdown 區塊引用相對路徑](https://github.com/siyuan-note/siyuan/issues/16042)
|
||||
* [「搜尋資源文件內容」和「匯出 PDF 或圖片加浮水印」由付費改為免費](https://github.com/siyuan-note/siyuan/issues/16044)
|
||||
* [改進複製和剪切](https://github.com/siyuan-note/siyuan/issues/16048)
|
||||
* [改進資料同步 S3 供應商相容性](https://github.com/siyuan-note/siyuan/issues/16058)
|
||||
* [改良 HTML img 剪藏](https://github.com/siyuan-note/siyuan/issues/16076)
|
||||
|
||||
### 修復缺陷
|
||||
|
||||
* [清單中區塊拖曳異常](https://github.com/siyuan-note/siyuan/issues/13822)
|
||||
* [行動端空列表項目插入圖片會插入到下一個段落區塊](https://github.com/siyuan-note/siyuan/issues/15998)
|
||||
* [從文件樹開啟的文件資料庫屬性面板不顯示內容](https://github.com/siyuan-note/siyuan/issues/16001)
|
||||
* [更新程式碼後圖表未刷新](https://github.com/siyuan-note/siyuan/issues/16003)
|
||||
* [資料庫一直載入](https://github.com/siyuan-note/siyuan/issues/16023)
|
||||
* [設定 KaTeX 巨集定義後無法匯出 PDF](https://github.com/siyuan-note/siyuan/issues/16037)
|
||||
* [無法儲存搜尋和替換類型設定](https://github.com/siyuan-note/siyuan/issues/16059)
|
||||
|
||||
### 開發者
|
||||
|
||||
* [API `getTag` 新增選用參數 `ignoreMaxListHint`](https://github.com/siyuan-note/siyuan/issues/16000)
|
||||
* [新增核心 API `/api/ui/reloadIcon`](https://github.com/siyuan-note/siyuan/issues/16008)
|
||||
* [改進唯讀模式下多選區塊後 `click-blockicon` 事件觸發](https://github.com/siyuan-note/siyuan/issues/16010)
|
||||
|
||||
## 下載
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
56
app/changelogs/v3.3.5/v3.3.5_zh_CN.md
Normal file
56
app/changelogs/v3.3.5/v3.3.5_zh_CN.md
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
## 概述
|
||||
|
||||
该版本改进了一些细节。
|
||||
|
||||
## 变更记录
|
||||
|
||||
以下是此版本中的详细变更。
|
||||
|
||||
### 改进功能
|
||||
|
||||
* [浏览器剪藏扩展支持右键菜单“发送到思源”](https://github.com/siyuan-note/siyuan/issues/9181)
|
||||
* [改进数据库关联字段筛选设置](https://github.com/siyuan-note/siyuan/issues/12000)
|
||||
* [改进文档浏览位置加载](https://github.com/siyuan-note/siyuan/issues/14505)
|
||||
* [鸿蒙系统支持主题跟随系统设置的明暗模式](https://github.com/siyuan-note/siyuan/issues/14676)
|
||||
* [改进间隔重复界面](https://github.com/siyuan-note/siyuan/pull/15627)
|
||||
* [搜索结果显示文档标题](https://github.com/siyuan-note/siyuan/pull/15969)
|
||||
* [改进工具栏位置计算](https://github.com/siyuan-note/siyuan/pull/15983)
|
||||
* [改进折叠标题编辑](https://github.com/siyuan-note/siyuan/issues/15989)
|
||||
* [改进浏览器剪藏扩展“剪藏网页后打开文档”](https://github.com/siyuan-note/siyuan/issues/15992)
|
||||
* [增加移动端编辑工具栏高度](https://github.com/siyuan-note/siyuan/issues/15994)
|
||||
* [数据库块新增“在文件夹中显示”](https://github.com/siyuan-note/siyuan/issues/15995)
|
||||
* [只读模式支持预览标题图片和点击文档标签搜索](https://github.com/siyuan-note/siyuan/issues/15999)
|
||||
* [改进搜索文档标题高亮显示](https://github.com/siyuan-note/siyuan/issues/16011)
|
||||
* [改进导出块引用样式](https://github.com/siyuan-note/siyuan/issues/16017)
|
||||
* [移除文档块菜单中的“导入”项](https://github.com/siyuan-note/siyuan/issues/16019)
|
||||
* [网页无剪贴板读取权限时提示](https://github.com/siyuan-note/siyuan/issues/16024)
|
||||
* [改进块备注显示](https://github.com/siyuan-note/siyuan/pull/16025)
|
||||
* [退出聚焦并滚动到对应块时取消动画效果](https://github.com/siyuan-note/siyuan/issues/16028)
|
||||
* [搜索输入框关闭自动补全和拼写检查](https://github.com/siyuan-note/siyuan/issues/16031)
|
||||
* [改进导出含子文档的空文档](https://github.com/siyuan-note/siyuan/issues/16040)
|
||||
* [改进导出 Markdown 块引用相对路径](https://github.com/siyuan-note/siyuan/issues/16042)
|
||||
* [“搜索资源文件内容”和“导出 PDF 或图片添加水印”由付费改为免费](https://github.com/siyuan-note/siyuan/issues/16044)
|
||||
* [改进复制和剪切](https://github.com/siyuan-note/siyuan/issues/16048)
|
||||
* [改进数据同步 S3 提供商兼容性](https://github.com/siyuan-note/siyuan/issues/16058)
|
||||
* [改进 HTML img 剪藏](https://github.com/siyuan-note/siyuan/issues/16076)
|
||||
|
||||
### 修复缺陷
|
||||
|
||||
* [列表中块拖拽异常](https://github.com/siyuan-note/siyuan/issues/13822)
|
||||
* [移动端空列表项插入图片会插入到下一个段落块](https://github.com/siyuan-note/siyuan/issues/15998)
|
||||
* [从文档树打开的文档数据库属性面板不显示内容](https://github.com/siyuan-note/siyuan/issues/16001)
|
||||
* [更新代码后图表未刷新](https://github.com/siyuan-note/siyuan/issues/16003)
|
||||
* [数据库一直加载](https://github.com/siyuan-note/siyuan/issues/16023)
|
||||
* [设置 KaTeX 宏定义后无法导出 PDF](https://github.com/siyuan-note/siyuan/issues/16037)
|
||||
* [无法保存搜索和替换类型设置](https://github.com/siyuan-note/siyuan/issues/16059)
|
||||
|
||||
### 开发者
|
||||
|
||||
* [API `getTag` 新增可选参数 `ignoreMaxListHint`](https://github.com/siyuan-note/siyuan/issues/16000)
|
||||
* [新增内核 API `/api/ui/reloadIcon`](https://github.com/siyuan-note/siyuan/issues/16008)
|
||||
* [改进只读模式下多选块后 `click-blockicon` 事件触发](https://github.com/siyuan-note/siyuan/issues/16010)
|
||||
|
||||
## 下载
|
||||
|
||||
* [B3log](https://b3log.org/siyuan/download.html)
|
||||
* [GitHub](https://github.com/siyuan-note/siyuan/releases)
|
||||
|
|
@ -383,6 +383,24 @@
|
|||
}
|
||||
const initPath = result.filePaths[0]
|
||||
|
||||
if (isPartitionRootPath(initPath)) {
|
||||
let msg = '⚠️ Do not create the workspace in the partition root path, please create a new folder as the workspace'
|
||||
if (isChinese(currentLang)) {
|
||||
msg = '⚠️ 请勿在分区根路径上创建工作空间,请新建一个文件夹作为工作空间'
|
||||
}
|
||||
alert(msg)
|
||||
return
|
||||
}
|
||||
|
||||
if (!isWorkspaceDir(initPath) && !isEmptyDir(initPath)) {
|
||||
let msg = '⚠️ This folder contains other files, please create a new folder as the workspace'
|
||||
if (isChinese(currentLang)) {
|
||||
msg = '⚠️ 该文件夹包含了其他文件,请新建一个文件夹作为工作空间'
|
||||
}
|
||||
alert(msg)
|
||||
return
|
||||
}
|
||||
|
||||
if (isICloudPath(initPath)) {
|
||||
let msg = '⚠️ This folder is under the iCloud sync path, please change another path'
|
||||
if (isChinese(currentLang)) {
|
||||
|
|
@ -417,6 +435,36 @@
|
|||
})
|
||||
})
|
||||
|
||||
const isPartitionRootPath = (absPath) => {
|
||||
const path = require('path')
|
||||
const parsedPath = path.parse(absPath)
|
||||
return parsedPath.root === absPath
|
||||
}
|
||||
|
||||
const isEmptyDir = (absPath) => {
|
||||
const fs = require('fs')
|
||||
let files;
|
||||
try {
|
||||
files = fs.readdirSync(absPath)
|
||||
} catch (err) {
|
||||
return false
|
||||
}
|
||||
return 0 === files.length
|
||||
}
|
||||
|
||||
const isWorkspaceDir = (absPath) => {
|
||||
const path = require('path');
|
||||
const fs = require('fs');
|
||||
const conf = path.join(absPath, 'conf', 'conf.json');
|
||||
let data;
|
||||
try {
|
||||
data = fs.readFileSync(conf, 'utf8');
|
||||
} catch (err) {
|
||||
return false;
|
||||
}
|
||||
return data.includes('kernelVersion');
|
||||
}
|
||||
|
||||
const isCloudDrivePath = (absPath) => {
|
||||
const absPathLower = absPath.toLowerCase()
|
||||
return -1 < absPathLower.indexOf("onedrive") || -1 < absPathLower.indexOf("dropbox") ||
|
||||
|
|
|
|||
|
|
@ -352,7 +352,7 @@ const initMainWindow = () => {
|
|||
}).then((response) => {
|
||||
setProxy(`${response.data.proxy.scheme}://${response.data.proxy.host}:${response.data.proxy.port}`, currentWindow.webContents).then(() => {
|
||||
// 加载主界面
|
||||
currentWindow.loadURL(getServer() + "/stage/build/app/index.html?v=" + new Date().getTime());
|
||||
currentWindow.loadURL(getServer() + "/stage/build/app/?v=" + new Date().getTime());
|
||||
});
|
||||
});
|
||||
|
||||
|
|
@ -607,7 +607,7 @@ const initKernel = (workspace, port, lang) => {
|
|||
resolve(false);
|
||||
return;
|
||||
}
|
||||
await sleep(200);
|
||||
await sleep(500);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -866,6 +866,13 @@ app.whenReady().then(() => {
|
|||
event.sender.send("siyuan-event", "leave-full-screen");
|
||||
});
|
||||
});
|
||||
ipcMain.on("siyuan-focus-fix", (event) => {
|
||||
const currentWindow = getWindowByContentId(event.sender.id);
|
||||
if (currentWindow && process.platform === "win32") {
|
||||
currentWindow.blur();
|
||||
currentWindow.focus();
|
||||
}
|
||||
});
|
||||
ipcMain.on("siyuan-cmd", (event, data) => {
|
||||
let cmd = data;
|
||||
let webContentsId = event.sender.id;
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20200924100950-9op5xi1",
|
||||
"title": "Shortcuts",
|
||||
"type": "doc",
|
||||
"updated": "20250529111226"
|
||||
"updated": "20250929214205"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9049,7 +9049,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20210106154319-d0mxz1p",
|
||||
"updated": "20250115160840"
|
||||
"updated": "20250924165043"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9073,7 +9073,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20210106154319-v6ksqnu",
|
||||
"updated": "20250115160840"
|
||||
"updated": "20250924165043"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9233,7 +9233,43 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Must select content"
|
||||
"Data": "Requires selecting content; by default uses static anchor text. Press "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Enter"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " or "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Click"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " in the candidate list to use dynamic anchor text"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -14981,7 +15017,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20220619002135-5dfw1yo",
|
||||
"updated": "20250407200538"
|
||||
"updated": "20250929214205"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15001,7 +15037,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20220619002135-s399g7e",
|
||||
"updated": "20250115161052"
|
||||
"updated": "20250929214205"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15103,7 +15139,7 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Multiple choice"
|
||||
"Data": "Multiple selection"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -15150,6 +15186,87 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Batch multiple selection"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Shift"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Click"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " / "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧Click"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "You need to use "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "click"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " to select the first document"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
|
|
@ -15233,6 +15350,15 @@
|
|||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
|
|
@ -15254,7 +15380,7 @@
|
|||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧Click"
|
||||
"TextMarkTextContent": "⌥⇧Click"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
"id": "20201227201128-m1wrouw",
|
||||
"title": "Docker hosting",
|
||||
"type": "doc",
|
||||
"updated": "20231108220523"
|
||||
"updated": "20250926110627"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -790,7 +790,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20230406105311-sq5f3qj",
|
||||
"updated": "20230406105334"
|
||||
"updated": "20250926110627"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -805,7 +805,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20230406105311-jvtmuhi",
|
||||
"updated": "20230406105617"
|
||||
"updated": "20250926110627"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -845,7 +845,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20230406105311-rz3umi0",
|
||||
"updated": "20230406105311"
|
||||
"updated": "20250926110627"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -853,40 +853,12 @@
|
|||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406105311-bhdrf8a",
|
||||
"updated": "20230406105311"
|
||||
"updated": "20250926110627"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Export to PDF, HTML and Word formats is not supported"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20230406105311-3rrhrq2",
|
||||
"Type": "NodeListItem",
|
||||
"ListData": {
|
||||
"BulletChar": 42,
|
||||
"Marker": "Kg=="
|
||||
},
|
||||
"Properties": {
|
||||
"id": "20230406105311-3rrhrq2",
|
||||
"updated": "20230406105617"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"ID": "20230406105311-w0rmhgz",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406105311-w0rmhgz",
|
||||
"updated": "20230406105617"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Import Markdown file is not supported"
|
||||
"Data": "Does not support exporting to formats such as PDF, HTML, and Word"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20200813004551-gm0pbn1",
|
||||
"title": "快捷键",
|
||||
"type": "doc",
|
||||
"updated": "20250529111202"
|
||||
"updated": "20250929213838"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9061,7 +9061,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20210102174148-tq925jm",
|
||||
"updated": "20250115154629"
|
||||
"updated": "20250924163015"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9081,7 +9081,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20210102174148-snb76bj",
|
||||
"updated": "20250115154629"
|
||||
"updated": "20250924163015"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9190,7 +9190,7 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "引用块"
|
||||
"Data": "块引用"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -9237,7 +9237,43 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "需选中内容"
|
||||
"Data": "需选中内容;默认使用静态锚文本,在候选列表中按 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "回车"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 或 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "点击"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 会使用动态锚文本"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -14934,7 +14970,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20220619001156-26volkp",
|
||||
"updated": "20250407195943"
|
||||
"updated": "20250929213838"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -14954,7 +14990,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20220619001217-e9cwukj",
|
||||
"updated": "20250115154936"
|
||||
"updated": "20250929213838"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15095,6 +15131,87 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "批量多选"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Shift"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "点击"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " / "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧点击"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "需要先使用 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "点击"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 选中首个文档"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
|
|
@ -15178,6 +15295,15 @@
|
|||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
|
|
@ -15199,7 +15325,7 @@
|
|||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧点击"
|
||||
"TextMarkTextContent": "⌥⇧点击"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@
|
|||
"id": "20201227173504-847cs1q",
|
||||
"title": "Docker 伺服",
|
||||
"type": "doc",
|
||||
"updated": "20231108220452"
|
||||
"updated": "20250926110513"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -798,7 +798,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20230406104141-6o5jpu6",
|
||||
"updated": "20230406104144"
|
||||
"updated": "20250926110513"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -813,7 +813,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20230406104201-nbfn2p9",
|
||||
"updated": "20230406104451"
|
||||
"updated": "20250926110513"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -852,7 +852,8 @@
|
|||
"Marker": "Kg=="
|
||||
},
|
||||
"Properties": {
|
||||
"id": "20230406104247-qyrt1tz"
|
||||
"id": "20230406104247-qyrt1tz",
|
||||
"updated": "20250926110513"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -860,40 +861,12 @@
|
|||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406104247-vrslzoi",
|
||||
"updated": "20230406104438"
|
||||
"updated": "20250926110513"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "不支持导出 PDF、HTML 和 Word 格式"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20230406104438-kqz2pl7",
|
||||
"Type": "NodeListItem",
|
||||
"ListData": {
|
||||
"BulletChar": 42,
|
||||
"Marker": "Kg=="
|
||||
},
|
||||
"Properties": {
|
||||
"id": "20230406104438-kqz2pl7",
|
||||
"updated": "20230406104451"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"ID": "20230406104438-b4m8fen",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406104438-b4m8fen",
|
||||
"updated": "20230406104451"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "不支持导入 Markdown 文件"
|
||||
"Data": "不支持导出 PDF、HTML 和 Word 等格式"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@
|
|||
"Properties": {
|
||||
"id": "20211226122459-08mi5cq",
|
||||
"title": "Docker 伺服",
|
||||
"updated": "20231108220609"
|
||||
"type": "doc",
|
||||
"updated": "20250926110600"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -760,7 +761,7 @@
|
|||
"HeadingLevel": 2,
|
||||
"Properties": {
|
||||
"id": "20230406105213-yoyn08w",
|
||||
"updated": "20230406105213"
|
||||
"updated": "20250926110600"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -775,7 +776,7 @@
|
|||
"ListData": {},
|
||||
"Properties": {
|
||||
"id": "20230406105213-899tzed",
|
||||
"updated": "20230406105213"
|
||||
"updated": "20250926110600"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -815,7 +816,7 @@
|
|||
},
|
||||
"Properties": {
|
||||
"id": "20230406105213-a8dt0r2",
|
||||
"updated": "20230406105213"
|
||||
"updated": "20250926110600"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -823,53 +824,18 @@
|
|||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406105213-2dqmoo6",
|
||||
"updated": "20230406105213"
|
||||
"updated": "20250926110600"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "不支持導出 PDF、HTML 和 Word 格式"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20230406105213-7du7gyh",
|
||||
"Type": "NodeListItem",
|
||||
"ListData": {
|
||||
"BulletChar": 42,
|
||||
"Marker": "Kg=="
|
||||
},
|
||||
"Properties": {
|
||||
"id": "20230406105213-7du7gyh",
|
||||
"updated": "20230406105213"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"ID": "20230406105213-c9nvb8g",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406105213-c9nvb8g",
|
||||
"updated": "20230406105213"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "不支持導入 Markdown 文件"
|
||||
"Data": "不支援導出 PDF、HTML 和 Word 等格式"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20230406105209-10odb7t",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"id": "20230406105209-10odb7t"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20211226122549-jktxego",
|
||||
"title": "快捷鍵",
|
||||
"type": "doc",
|
||||
"updated": "20250529111304"
|
||||
"updated": "20250929213959"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9104,7 +9104,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20211226122652-8191vgw",
|
||||
"updated": "20250115155758"
|
||||
"updated": "20250924164911"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9124,7 +9124,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20211226122652-v6as45b",
|
||||
"updated": "20250115155758"
|
||||
"updated": "20250924164911"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9233,7 +9233,7 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "引用塊"
|
||||
"Data": "塊引用"
|
||||
}
|
||||
]
|
||||
},
|
||||
|
|
@ -9280,7 +9280,43 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "需選中內容"
|
||||
"Data": "需選中內容;預設使用靜態錨文本,在候選列表中按 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Enter"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 或 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "點擊"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 會使用動態錨文本"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -15027,7 +15063,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20220619002223-zliquo3",
|
||||
"updated": "20250407200322"
|
||||
"updated": "20250929213959"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15047,7 +15083,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20220619002223-xwob5s8",
|
||||
"updated": "20250115160004"
|
||||
"updated": "20250929213959"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15196,6 +15232,87 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "批次多選"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Shift"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "點擊"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " / "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧點擊"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "需要先使用 "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "點擊"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " 選取首個文件"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
|
|
@ -15283,6 +15400,15 @@
|
|||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
|
|
@ -15304,7 +15430,7 @@
|
|||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧點擊"
|
||||
"TextMarkTextContent": "⌥⇧點擊"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@
|
|||
"id": "20240530101000-f16hpct",
|
||||
"title": "Docker サーバー",
|
||||
"type": "doc",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250926110655"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -906,7 +906,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-8bjgcwz",
|
||||
"id": "20240530101000-av0hc90",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250926110655"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -922,7 +922,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-c39mqvp",
|
||||
"id": "20240530101000-95f1jst",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250926110655"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -965,65 +965,26 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-r9haojg",
|
||||
"id": "20240530101000-ibq4c4y",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250926110655"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"ID": "20240530101000-k2rz2gr",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"ID": "20240530101000-txuv357",
|
||||
"id": "20240530101000-k2rz2gr",
|
||||
"updated": "20240530101000"
|
||||
"updated": "20250926110655"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "PDF、HTML、Word 形式のエクスポートは対応していません"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20240530101000-hei819m",
|
||||
"Type": "NodeListItem",
|
||||
"ListData": {
|
||||
"BulletChar": 42,
|
||||
"Marker": "Kg=="
|
||||
},
|
||||
"Properties": {
|
||||
"ID": "20240530101000-r7ab84s",
|
||||
"id": "20240530101000-hei819m",
|
||||
"updated": "20240530101000"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"ID": "20240530101000-0y6efyk",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"ID": "20240530101000-6fuv1qy",
|
||||
"id": "20240530101000-0y6efyk",
|
||||
"updated": "20240530101000"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "Markdown ファイルのインポートは対応していません"
|
||||
"Data": "PDF、HTML、Word などの形式でのエクスポートはサポートしていません"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"ID": "20240530101000-vboxjwn",
|
||||
"Type": "NodeParagraph",
|
||||
"Properties": {
|
||||
"ID": "20240530101000-iy4sbqy",
|
||||
"id": "20240530101000-vboxjwn"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -9,7 +9,7 @@
|
|||
"id": "20240530101000-xsbxokr",
|
||||
"title": "ショートカット",
|
||||
"type": "doc",
|
||||
"updated": "20250529111249"
|
||||
"updated": "20250929214234"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9010,7 +9010,7 @@
|
|||
"Properties": {
|
||||
"ID": "20240530101000-qf3oj4u",
|
||||
"id": "20240530101000-zy0pmo3",
|
||||
"updated": "20250115161741"
|
||||
"updated": "20250924165340"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9040,7 +9040,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20240530101000-5be9vw0",
|
||||
"updated": "20250115161741"
|
||||
"updated": "20250924165340"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -9200,7 +9200,43 @@
|
|||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "コンテンツが選択されている必要があります"
|
||||
"Data": "コンテンツを選択する必要があります。デフォルトでは静的アンカーテキストを使用し、候補リストで "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Enter"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " または "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "クリック"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " を押すと動的アンカーテキストを使用します"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
@ -15077,7 +15113,7 @@
|
|||
"HeadingLevel": 3,
|
||||
"Properties": {
|
||||
"id": "20240530101000-mifghto",
|
||||
"updated": "20250407200635"
|
||||
"updated": "20250929214234"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15097,7 +15133,7 @@
|
|||
"Properties": {
|
||||
"colgroup": "||",
|
||||
"id": "20240530101000-4iuhg30",
|
||||
"updated": "20250115161937"
|
||||
"updated": "20250929214234"
|
||||
},
|
||||
"Children": [
|
||||
{
|
||||
|
|
@ -15238,6 +15274,87 @@
|
|||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "一括複数選択"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Shift"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "クリック"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " / "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧クリック"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableCell",
|
||||
"Data": "td",
|
||||
"Children": [
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "まずは "
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "クリック"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": " で最初の文書を選択する必要があります"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"Type": "NodeTableRow",
|
||||
"Data": "tr",
|
||||
|
|
@ -15321,6 +15438,15 @@
|
|||
"Type": "NodeText",
|
||||
"Data": ""
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "Ctrl"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
"Data": "+"
|
||||
},
|
||||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
|
|
@ -15342,7 +15468,7 @@
|
|||
{
|
||||
"Type": "NodeTextMark",
|
||||
"TextMarkType": "kbd",
|
||||
"TextMarkTextContent": "⇧クリック"
|
||||
"TextMarkTextContent": "⌥⇧クリック"
|
||||
},
|
||||
{
|
||||
"Type": "NodeText",
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
{
|
||||
"name": "SiYuan",
|
||||
"version": "3.3.2",
|
||||
"version": "3.3.5",
|
||||
"description": "Refactor your thinking",
|
||||
"homepage": "https://b3log.org/siyuan",
|
||||
"main": "./electron/main.js",
|
||||
"packageManager": "pnpm@10.15.1",
|
||||
"packageManager": "pnpm@10.18.3",
|
||||
"scripts": {
|
||||
"lint": "eslint . --fix --cache",
|
||||
"dev": "webpack --mode development",
|
||||
|
|
@ -18,7 +18,6 @@
|
|||
"build:export": "webpack --mode production --config webpack.export.js",
|
||||
"gen:types": "tsc -d",
|
||||
"start": "NODE_ENV=development electron ./electron/main.js",
|
||||
"dist-appx": "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ electron-builder --config electron-appx-builder.yml",
|
||||
"dist": "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ electron-builder --config electron-builder.yml --publish=never",
|
||||
"dist-arm64": "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ electron-builder --arm64 --config electron-builder-arm64.yml --publish=never",
|
||||
"dist-darwin": "ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ electron-builder --mac --config electron-builder-darwin.yml --publish=never",
|
||||
|
|
@ -58,7 +57,7 @@
|
|||
"clean-webpack-plugin": "^4.0.0",
|
||||
"css-loader": "^7.1.2",
|
||||
"dayjs": "^1.11.5",
|
||||
"electron": "37.4.0",
|
||||
"electron": "37.7.0",
|
||||
"electron-builder": "26.0.12",
|
||||
"encoding": "^0.1.13",
|
||||
"esbuild-loader": "^3.0.1",
|
||||
|
|
|
|||
65
app/pnpm-lock.yaml
generated
65
app/pnpm-lock.yaml
generated
|
|
@ -10,7 +10,7 @@ importers:
|
|||
dependencies:
|
||||
'@electron/remote':
|
||||
specifier: ^2.1.3
|
||||
version: 2.1.3(electron@37.4.0)
|
||||
version: 2.1.3(electron@37.7.0)
|
||||
devDependencies:
|
||||
'@eslint/eslintrc':
|
||||
specifier: ^3.3.1
|
||||
|
|
@ -23,10 +23,10 @@ importers:
|
|||
version: 18.19.124
|
||||
'@typescript-eslint/eslint-plugin':
|
||||
specifier: ^8.15.0
|
||||
version: 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@4.9.5))(eslint@9.35.0)(typescript@4.9.5)
|
||||
version: 8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
'@typescript-eslint/parser':
|
||||
specifier: ^8.15.0
|
||||
version: 8.42.0(eslint@9.35.0)(typescript@4.9.5)
|
||||
version: 8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
blueimp-md5:
|
||||
specifier: ^2.19.0
|
||||
version: 2.19.0
|
||||
|
|
@ -40,8 +40,8 @@ importers:
|
|||
specifier: ^1.11.5
|
||||
version: 1.11.18
|
||||
electron:
|
||||
specifier: 37.4.0
|
||||
version: 37.4.0
|
||||
specifier: 37.7.0
|
||||
version: 37.7.0
|
||||
electron-builder:
|
||||
specifier: 26.0.12
|
||||
version: 26.0.12(electron-builder-squirrel-windows@26.0.12)
|
||||
|
|
@ -53,7 +53,7 @@ importers:
|
|||
version: 3.2.0(webpack@5.101.3)
|
||||
eslint:
|
||||
specifier: ^9.15.0
|
||||
version: 9.35.0
|
||||
version: 9.35.0(jiti@1.21.7)
|
||||
file-loader:
|
||||
specifier: ^6.2.0
|
||||
version: 6.2.0(webpack@5.101.3)
|
||||
|
|
@ -1198,8 +1198,8 @@ packages:
|
|||
resolution: {integrity: sha512-bO3y10YikuUwUuDUQRM4KfwNkKhnpVO7IPdbsrejwN9/AABJzzTQ4GeHwyzNSrVO+tEH3/Np255a3sVZpZDjvg==}
|
||||
engines: {node: '>=8.0.0'}
|
||||
|
||||
electron@37.4.0:
|
||||
resolution: {integrity: sha512-HhsSdWowE5ODOeWNc/323Ug2C52mq/TqNBG+4uMeOA3G2dMXNc/nfyi0RYu1rJEgiaJLEjtHveeZZaYRYFsFCQ==}
|
||||
electron@37.7.0:
|
||||
resolution: {integrity: sha512-LBzvfrS0aalynOsnC11AD7zeoU8eOois090mzLpQM3K8yZ2N04i2ZW9qmHOTFLrXlKvrwRc7EbyQf1u8XHMl6Q==}
|
||||
engines: {node: '>= 12.20.55'}
|
||||
hasBin: true
|
||||
|
||||
|
|
@ -1757,6 +1757,10 @@ packages:
|
|||
resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==}
|
||||
engines: {node: '>= 10.13.0'}
|
||||
|
||||
jiti@1.21.7:
|
||||
resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==}
|
||||
hasBin: true
|
||||
|
||||
js-yaml@4.1.0:
|
||||
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
|
||||
hasBin: true
|
||||
|
|
@ -2864,9 +2868,9 @@ snapshots:
|
|||
- bluebird
|
||||
- supports-color
|
||||
|
||||
'@electron/remote@2.1.3(electron@37.4.0)':
|
||||
'@electron/remote@2.1.3(electron@37.7.0)':
|
||||
dependencies:
|
||||
electron: 37.4.0
|
||||
electron: 37.7.0
|
||||
|
||||
'@electron/universal@2.0.1':
|
||||
dependencies:
|
||||
|
|
@ -2960,9 +2964,9 @@ snapshots:
|
|||
'@esbuild/win32-x64@0.19.12':
|
||||
optional: true
|
||||
|
||||
'@eslint-community/eslint-utils@4.8.0(eslint@9.35.0)':
|
||||
'@eslint-community/eslint-utils@4.8.0(eslint@9.35.0(jiti@1.21.7))':
|
||||
dependencies:
|
||||
eslint: 9.35.0
|
||||
eslint: 9.35.0(jiti@1.21.7)
|
||||
eslint-visitor-keys: 3.4.3
|
||||
|
||||
'@eslint-community/regexpp@4.12.1': {}
|
||||
|
|
@ -3234,15 +3238,15 @@ snapshots:
|
|||
'@types/node': 18.19.124
|
||||
optional: true
|
||||
|
||||
'@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@4.9.5))(eslint@9.35.0)(typescript@4.9.5)':
|
||||
'@typescript-eslint/eslint-plugin@8.42.0(@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5))(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@eslint-community/regexpp': 4.12.1
|
||||
'@typescript-eslint/parser': 8.42.0(eslint@9.35.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/parser': 8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
'@typescript-eslint/scope-manager': 8.42.0
|
||||
'@typescript-eslint/type-utils': 8.42.0(eslint@9.35.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/type-utils': 8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
'@typescript-eslint/utils': 8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
'@typescript-eslint/visitor-keys': 8.42.0
|
||||
eslint: 9.35.0
|
||||
eslint: 9.35.0(jiti@1.21.7)
|
||||
graphemer: 1.4.0
|
||||
ignore: 7.0.5
|
||||
natural-compare: 1.4.0
|
||||
|
|
@ -3251,14 +3255,14 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@typescript-eslint/parser@8.42.0(eslint@9.35.0)(typescript@4.9.5)':
|
||||
'@typescript-eslint/parser@8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@typescript-eslint/scope-manager': 8.42.0
|
||||
'@typescript-eslint/types': 8.42.0
|
||||
'@typescript-eslint/typescript-estree': 8.42.0(typescript@4.9.5)
|
||||
'@typescript-eslint/visitor-keys': 8.42.0
|
||||
debug: 4.4.1
|
||||
eslint: 9.35.0
|
||||
eslint: 9.35.0(jiti@1.21.7)
|
||||
typescript: 4.9.5
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
|
@ -3281,13 +3285,13 @@ snapshots:
|
|||
dependencies:
|
||||
typescript: 4.9.5
|
||||
|
||||
'@typescript-eslint/type-utils@8.42.0(eslint@9.35.0)(typescript@4.9.5)':
|
||||
'@typescript-eslint/type-utils@8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@typescript-eslint/types': 8.42.0
|
||||
'@typescript-eslint/typescript-estree': 8.42.0(typescript@4.9.5)
|
||||
'@typescript-eslint/utils': 8.42.0(eslint@9.35.0)(typescript@4.9.5)
|
||||
'@typescript-eslint/utils': 8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)
|
||||
debug: 4.4.1
|
||||
eslint: 9.35.0
|
||||
eslint: 9.35.0(jiti@1.21.7)
|
||||
ts-api-utils: 2.1.0(typescript@4.9.5)
|
||||
typescript: 4.9.5
|
||||
transitivePeerDependencies:
|
||||
|
|
@ -3311,13 +3315,13 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
'@typescript-eslint/utils@8.42.0(eslint@9.35.0)(typescript@4.9.5)':
|
||||
'@typescript-eslint/utils@8.42.0(eslint@9.35.0(jiti@1.21.7))(typescript@4.9.5)':
|
||||
dependencies:
|
||||
'@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0)
|
||||
'@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@1.21.7))
|
||||
'@typescript-eslint/scope-manager': 8.42.0
|
||||
'@typescript-eslint/types': 8.42.0
|
||||
'@typescript-eslint/typescript-estree': 8.42.0(typescript@4.9.5)
|
||||
eslint: 9.35.0
|
||||
eslint: 9.35.0(jiti@1.21.7)
|
||||
typescript: 4.9.5
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
|
@ -4009,7 +4013,7 @@ snapshots:
|
|||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
electron@37.4.0:
|
||||
electron@37.7.0:
|
||||
dependencies:
|
||||
'@electron/get': 2.0.3
|
||||
'@types/node': 22.18.1
|
||||
|
|
@ -4116,9 +4120,9 @@ snapshots:
|
|||
|
||||
eslint-visitor-keys@4.2.1: {}
|
||||
|
||||
eslint@9.35.0:
|
||||
eslint@9.35.0(jiti@1.21.7):
|
||||
dependencies:
|
||||
'@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0)
|
||||
'@eslint-community/eslint-utils': 4.8.0(eslint@9.35.0(jiti@1.21.7))
|
||||
'@eslint-community/regexpp': 4.12.1
|
||||
'@eslint/config-array': 0.21.0
|
||||
'@eslint/config-helpers': 0.3.1
|
||||
|
|
@ -4153,6 +4157,8 @@ snapshots:
|
|||
minimatch: 3.1.2
|
||||
natural-compare: 1.4.0
|
||||
optionator: 0.9.4
|
||||
optionalDependencies:
|
||||
jiti: 1.21.7
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
|
|
@ -4649,6 +4655,9 @@ snapshots:
|
|||
merge-stream: 2.0.0
|
||||
supports-color: 8.1.1
|
||||
|
||||
jiti@1.21.7:
|
||||
optional: true
|
||||
|
||||
js-yaml@4.1.0:
|
||||
dependencies:
|
||||
argparse: 2.0.1
|
||||
|
|
|
|||
|
|
@ -161,7 +161,7 @@ export const AIActions = (elements: Element[], protyle: IProtyle) => {
|
|||
elements.forEach(item => {
|
||||
ids.push(item.getAttribute("data-node-id"));
|
||||
});
|
||||
const menu = new Menu("ai", () => {
|
||||
const menu = new Menu(Constants.MENU_AI, () => {
|
||||
focusByRange(protyle.toolbar.range);
|
||||
});
|
||||
let customHTML = "";
|
||||
|
|
|
|||
|
|
@ -180,43 +180,43 @@ export class Asset extends Model {
|
|||
<button id="previous" class="secondaryToolbarButton b3-menu__item pageUp">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconUp"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.previousLabel}</span>
|
||||
<span class="b3-menu__accelerator">${updateHotkeyTip("P")}/${updateHotkeyTip("K")}</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("P")}/${updateHotkeyTip("K")}</span>
|
||||
</button>
|
||||
<button id="next" class="secondaryToolbarButton b3-menu__item pageDown">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconDown"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.nextLabel}</span>
|
||||
<span class="b3-menu__accelerator">${updateHotkeyTip("J")}/${updateHotkeyTip("N")}</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("J")}/${updateHotkeyTip("N")}</span>
|
||||
</button>
|
||||
<button id="firstPage" class="secondaryToolbarButton b3-menu__item firstPage">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconBack"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.firstPage}</span>
|
||||
<span class="b3-menu__accelerator">Home</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">Home</span>
|
||||
</button>
|
||||
<button id="lastPage" class="secondaryToolbarButton b3-menu__item lastPage">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconForward"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.lastPage}</span>
|
||||
<span class="b3-menu__accelerator">End</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">End</span>
|
||||
</button>
|
||||
<div class="horizontalToolbarSeparator b3-menu__separator"></div>
|
||||
<button id="zoomOutButton" class="secondaryToolbarButton b3-menu__item zoomOut">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconLine"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.zoomOut}</span>
|
||||
<span class="b3-menu__accelerator">${updateHotkeyTip("⌘-")}</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("⌘-")}</span>
|
||||
</button>
|
||||
<button id="zoomInButton" class="secondaryToolbarButton b3-menu__item zoomIn">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconAdd"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.zoomIn}</span>
|
||||
<span class="b3-menu__accelerator">${updateHotkeyTip("⌘=")}</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("⌘=")}</span>
|
||||
</button>
|
||||
<button id="pageRotateCw" class="secondaryToolbarButton b3-menu__item rotateCw">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconRedo"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.rotateCw}</span>
|
||||
<span class="b3-menu__accelerator">R</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">R</span>
|
||||
</button>
|
||||
<button id="pageRotateCcw" class="secondaryToolbarButton b3-menu__item rotateCcw">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconUndo"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.rotateCcw}</span>
|
||||
<span class="b3-menu__accelerator">⇧R</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("⇧R")}</span>
|
||||
</button>
|
||||
|
||||
<div class="horizontalToolbarSeparator b3-menu__separator"></div>
|
||||
|
|
@ -224,12 +224,12 @@ export class Asset extends Model {
|
|||
<button id="cursorSelectTool" class="secondaryToolbarButton b3-menu__item selectTool toggled">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconSelectText"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.cursorText}</span>
|
||||
<span class="b3-menu__accelerator">S</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">S</span>
|
||||
</button>
|
||||
<button id="cursorHandTool" class="secondaryToolbarButton b3-menu__item handTool">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconHand"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.cursorHand}</span>
|
||||
<span class="b3-menu__accelerator">H</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">H</span>
|
||||
</button>
|
||||
<div class="horizontalToolbarSeparator b3-menu__separator"></div>
|
||||
<button id="scrollVertical" class="secondaryToolbarButton b3-menu__item scrollModeButtons scrollVertical toggled">
|
||||
|
|
@ -262,7 +262,7 @@ export class Asset extends Model {
|
|||
<button id="presentationMode" class="secondaryToolbarButton b3-menu__item presentationMode">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconPlay"></use></svg>
|
||||
<span class="b3-menu__label">${window.siyuan.languages.presentationMode}</span>
|
||||
<span class="b3-menu__accelerator">${updateHotkeyTip("⌥⌘P")}</span>
|
||||
<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip("⌥⌘P")}</span>
|
||||
</button>
|
||||
<div class="horizontalToolbarSeparator b3-menu__separator spreadModeButtons"></div>
|
||||
<button id="documentProperties" class="secondaryToolbarButton b3-menu__item documentProperties">
|
||||
|
|
|
|||
|
|
@ -74,4 +74,8 @@
|
|||
left: -8px;
|
||||
bottom: 8px;
|
||||
}
|
||||
|
||||
&__move {
|
||||
cursor: move;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -375,6 +375,7 @@
|
|||
position: fixed;
|
||||
box-shadow: var(--b3-dialog-shadow);
|
||||
z-index: 1;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
&__accelerator {
|
||||
|
|
|
|||
|
|
@ -60,6 +60,7 @@
|
|||
}
|
||||
|
||||
em,
|
||||
a[data-type~="em"],
|
||||
span[data-type~="em"] {
|
||||
font-style: italic;
|
||||
color: var(--b3-protyle-inline-em-color);
|
||||
|
|
@ -72,6 +73,7 @@
|
|||
}
|
||||
|
||||
strong,
|
||||
a[data-type~="strong"],
|
||||
span[data-type~="strong"] {
|
||||
font-weight: bold;
|
||||
color: var(--b3-protyle-inline-strong-color);
|
||||
|
|
@ -345,10 +347,11 @@
|
|||
[data-subtype="echarts"],
|
||||
[data-subtype="mindmap"] {
|
||||
z-index: 1;
|
||||
height: 420px;
|
||||
box-sizing: border-box;
|
||||
|
||||
& > div:not(.protyle-icons):not(.protyle-attr) {
|
||||
overflow: hidden;
|
||||
height: 420px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -607,11 +610,15 @@
|
|||
& > span {
|
||||
pointer-events: none;
|
||||
display: block;
|
||||
color: var(--b3-theme-on-surface);
|
||||
|
||||
&:not(:empty)::before {
|
||||
content: "";
|
||||
}
|
||||
|
||||
&::before {
|
||||
counter-increment: linenumber;
|
||||
content: counter(linenumber);
|
||||
color: var(--b3-theme-on-surface);
|
||||
display: block;
|
||||
text-align: right;
|
||||
white-space: nowrap;
|
||||
|
|
|
|||
|
|
@ -278,7 +278,7 @@
|
|||
bottom: 0;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
height: 42px;
|
||||
height: 48px;
|
||||
background: var(--b3-theme-background);
|
||||
display: flex;
|
||||
border-top: 1px solid var(--b3-theme-surface-lighter);
|
||||
|
|
@ -336,8 +336,8 @@
|
|||
height: 16px;
|
||||
width: 16px;
|
||||
float: left;
|
||||
padding: 6px;
|
||||
margin: 6px;
|
||||
padding: 13px 9px;
|
||||
margin: 3px;
|
||||
border-radius: var(--b3-border-radius);
|
||||
|
||||
&.keyboard__svg--big {
|
||||
|
|
@ -432,7 +432,7 @@
|
|||
}
|
||||
|
||||
.b3-menu {
|
||||
&__accelerator {
|
||||
&__accelerator--hotkey {
|
||||
display: none;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -53,6 +53,7 @@
|
|||
height: 16px;
|
||||
background-color: var(--b3-theme-surface);
|
||||
z-index: 1; // 防止被 protyle-scroll 遮挡
|
||||
white-space: nowrap;
|
||||
|
||||
&:hover {
|
||||
color: var(--b3-theme-on-background);
|
||||
|
|
|
|||
|
|
@ -274,8 +274,16 @@
|
|||
.protyle-background {
|
||||
position: relative;
|
||||
|
||||
&:not(.protyle-background--enable) .protyle-background__img .protyle-icons {
|
||||
display: none;
|
||||
&:not(.protyle-background--enable) {
|
||||
.protyle-background__img .protyle-icons,
|
||||
.b3-chips__doctag .b3-chip__close,
|
||||
.protyle-background__action {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.protyle-background__icon {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
|
||||
&--enable {
|
||||
|
|
@ -414,7 +422,7 @@
|
|||
}
|
||||
|
||||
table[contenteditable="false"] + .protyle-action__table > .table__resize {
|
||||
display: none;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
table + .protyle-action__table {
|
||||
|
|
|
|||
|
|
@ -6,7 +6,6 @@
|
|||
box-shadow: var(--b3-point-shadow);
|
||||
border-radius: var(--b3-border-radius);
|
||||
display: flex;
|
||||
transition: top .15s cubic-bezier(0, 0, .2, 1) 0ms;
|
||||
|
||||
&__item {
|
||||
color: var(--b3-theme-on-surface);
|
||||
|
|
|
|||
|
|
@ -604,10 +604,16 @@
|
|||
&--attr .protyle-attr {
|
||||
opacity: 1;
|
||||
|
||||
& > div:not(.protyle-attr--memo):not(.protyle-attr--refcount) {
|
||||
cursor: pointer;
|
||||
@include mixin.text-clamp(1);
|
||||
max-width: 25vw;
|
||||
& > div {
|
||||
&.protyle-attr--memo {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
&:not(.protyle-attr--memo):not(.protyle-attr--refcount) {
|
||||
cursor: pointer;
|
||||
@include mixin.text-clamp(1);
|
||||
max-width: 25vw;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,12 @@
|
|||
@use "mixin";
|
||||
|
||||
.fn {
|
||||
&__hidescrollbar::-webkit-scrollbar {
|
||||
display: none;
|
||||
&__hidescrollbar {
|
||||
&::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
&__ellipsis {
|
||||
|
|
@ -20,6 +24,12 @@
|
|||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
&--5 {
|
||||
width: 5px;
|
||||
display: inline-block;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
}
|
||||
|
||||
&__hr {
|
||||
|
|
|
|||
|
|
@ -182,6 +182,7 @@ export class BlockPanel {
|
|||
scroll: true,
|
||||
gutter: true,
|
||||
breadcrumbDocName: true,
|
||||
title: response.data.rootID === this.refDefs[index].refID, // 如果块是文档,显示文档标题
|
||||
},
|
||||
typewriterMode: false,
|
||||
after: (editor) => {
|
||||
|
|
@ -227,7 +228,7 @@ export class BlockPanel {
|
|||
this.targetElement = undefined;
|
||||
// 移除弹出上使用右键菜单
|
||||
const menuLevel = parseInt(window.siyuan.menus.menu.element.dataset.from);
|
||||
if (window.siyuan.menus.menu.element.dataset.from !== "app" && menuLevel && menuLevel >= level) {
|
||||
if (menuLevel && menuLevel >= level && window.siyuan.menus.menu.element.dataset.from?.includes("popover")) {
|
||||
// https://github.com/siyuan-note/siyuan/issues/9854 右键菜单不是从浮窗中弹出的则不进行移除
|
||||
window.siyuan.menus.menu.remove();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -220,7 +220,7 @@ const hidePopover = (event: MouseEvent & { path: HTMLElement[] }) => {
|
|||
} else {
|
||||
// 浮窗上点击菜单,浮窗不能消失 https://ld246.com/article/1632668091023
|
||||
const menuElement = hasClosestByClassName(target, "b3-menu");
|
||||
if (menuElement && menuElement.getAttribute("data-name") !== "docTreeMore") {
|
||||
if (menuElement && menuElement.getAttribute("data-name") !== Constants.MENU_DOC_TREE_MORE) {
|
||||
const blockPanel = window.siyuan.blockPanels.find((item) => {
|
||||
if (item.element.style.zIndex < menuElement.style.zIndex) {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -150,7 +150,16 @@ export const insertEmptyBlock = (protyle: IProtyle, position: InsertPosition, id
|
|||
if (blockElement.getAttribute("data-type") === "NodeListItem") {
|
||||
newElement = genListItemElement(blockElement, 0, true) as HTMLDivElement;
|
||||
orderIndex = parseInt(blockElement.parentElement.firstElementChild.getAttribute("data-marker"));
|
||||
} else if (position === "beforebegin" && blockElement.previousElementSibling &&
|
||||
blockElement.previousElementSibling.getAttribute("data-type") === "NodeHeading" &&
|
||||
blockElement.previousElementSibling.getAttribute("fold") === "1") {
|
||||
newElement = genHeadingElement(blockElement.previousElementSibling, false, true) as HTMLDivElement;
|
||||
} else if (position === "afterend" && blockElement &&
|
||||
blockElement.getAttribute("data-type") === "NodeHeading" &&
|
||||
blockElement.getAttribute("fold") === "1") {
|
||||
newElement = genHeadingElement(blockElement, false, true) as HTMLDivElement;
|
||||
}
|
||||
|
||||
const parentOldHTML = blockElement.parentElement.outerHTML;
|
||||
const newId = newElement.getAttribute("data-node-id");
|
||||
blockElement.insertAdjacentElement(position, newElement);
|
||||
|
|
@ -216,6 +225,17 @@ export const genEmptyElement = (zwsp = true, wbr = true, id?: string) => {
|
|||
return element;
|
||||
};
|
||||
|
||||
export const genHeadingElement = (headElement: Element, getHTML = false, addWbr = false) => {
|
||||
const html = `<div data-subtype="${headElement.getAttribute("data-subtype")}" data-node-id="${Lute.NewNodeID()}" data-type="NodeHeading" class="${headElement.className}"><div contenteditable="true" spellcheck="false">${addWbr ? "<wbr>" : ""}</div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
|
||||
if (getHTML) {
|
||||
return html;
|
||||
} else {
|
||||
const tempElement = document.createElement("template");
|
||||
tempElement.innerHTML = html;
|
||||
return tempElement.content.firstElementChild;
|
||||
}
|
||||
};
|
||||
|
||||
export const getLangByType = (type: string) => {
|
||||
let lang = type;
|
||||
switch (type) {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@ import {popSearch} from "../../../mobile/menu/search";
|
|||
import {getRecentDocs} from "../../../mobile/menu/getRecentDocs";
|
||||
/// #else
|
||||
import {openNewWindow} from "../../../window/openNewWindow";
|
||||
import {toggleDockBar} from "../../../layout/dock/util";
|
||||
import {selectOpenTab, toggleDockBar} from "../../../layout/dock/util";
|
||||
import {openGlobalSearch} from "../../../search/util";
|
||||
import {workspaceMenu} from "../../../menus/workspace";
|
||||
import {isWindow} from "../../../util/functions";
|
||||
|
|
@ -27,7 +27,6 @@ import {
|
|||
} from "../../../layout/tabUtil";
|
||||
import {openSetting} from "../../../config";
|
||||
import {Tab} from "../../../layout/Tab";
|
||||
import {Files} from "../../../layout/dock/Files";
|
||||
/// #endif
|
||||
/// #if !BROWSER
|
||||
import {ipcRenderer} from "electron";
|
||||
|
|
@ -42,32 +41,6 @@ import {syncGuide} from "../../../sync/syncGuide";
|
|||
import {Wnd} from "../../../layout/Wnd";
|
||||
import {unsplitWnd} from "../../../menus/tab";
|
||||
|
||||
const selectOpenTab = () => {
|
||||
/// #if MOBILE
|
||||
if (window.siyuan.mobile.editor?.protyle) {
|
||||
openDock("file");
|
||||
window.siyuan.mobile.docks.file.selectItem(window.siyuan.mobile.editor.protyle.notebookId, window.siyuan.mobile.editor.protyle.path);
|
||||
}
|
||||
/// #else
|
||||
const dockFile = getDockByType("file");
|
||||
if (!dockFile) {
|
||||
return false;
|
||||
}
|
||||
const files = dockFile.data.file as Files;
|
||||
const element = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus") ||
|
||||
document.querySelector("ul.layout-tab-bar > .item--focus");
|
||||
if (element) {
|
||||
const tab = getInstanceById(element.getAttribute("data-id")) as Tab;
|
||||
if (tab && tab.model instanceof Editor) {
|
||||
tab.model.editor.protyle.wysiwyg.element.blur();
|
||||
tab.model.editor.protyle.title.editElement.blur();
|
||||
files.selectItem(tab.model.editor.protyle.notebookId, tab.model.editor.protyle.path);
|
||||
}
|
||||
}
|
||||
dockFile.toggleModel("file", true);
|
||||
/// #endif
|
||||
};
|
||||
|
||||
export const globalCommand = (command: string, app: App) => {
|
||||
/// #if MOBILE
|
||||
switch (command) {
|
||||
|
|
|
|||
|
|
@ -442,7 +442,7 @@ export const execByCommand = async (options: {
|
|||
case "move":
|
||||
if (!isFileFocus) {
|
||||
const nodeElement = hasClosestBlock(range.startContainer);
|
||||
if (protyle.title?.editElement.contains(range.startContainer) || !nodeElement || window.siyuan.menus.menu.element.getAttribute("data-name") === "titleMenu") {
|
||||
if (protyle.title?.editElement.contains(range.startContainer) || !nodeElement || window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_TITLE) {
|
||||
movePathTo((toPath, toNotebook) => {
|
||||
moveToPath([protyle.path], toNotebook[0], toPath[0]);
|
||||
}, [protyle.path], range);
|
||||
|
|
|
|||
|
|
@ -1,3 +1,5 @@
|
|||
import {Constants} from "../../constants";
|
||||
|
||||
export const cancelDrag = () => {
|
||||
const ghostElement = document.getElementById("dragGhost");
|
||||
if (ghostElement) {
|
||||
|
|
@ -18,5 +20,49 @@ export const cancelDrag = () => {
|
|||
}
|
||||
ghostElement.remove();
|
||||
document.onmousemove = null;
|
||||
stopScrollAnimation();
|
||||
}
|
||||
};
|
||||
|
||||
const dragoverScroll: {
|
||||
animationId?: number,
|
||||
element?: Element,
|
||||
space?: number // -1 向上;1 向下
|
||||
lastTime?: number
|
||||
} = {};
|
||||
export const stopScrollAnimation = () => {
|
||||
if (dragoverScroll.animationId) {
|
||||
cancelAnimationFrame(dragoverScroll.animationId);
|
||||
dragoverScroll.animationId = null;
|
||||
dragoverScroll.element = null;
|
||||
dragoverScroll.space = null;
|
||||
dragoverScroll.lastTime = null;
|
||||
}
|
||||
};
|
||||
const scrollAnimation = (timestamp: number) => {
|
||||
if (!dragoverScroll.lastTime) {
|
||||
dragoverScroll.lastTime = timestamp - 8;
|
||||
}
|
||||
dragoverScroll.element.scroll({
|
||||
top: dragoverScroll.element.scrollTop + (timestamp - dragoverScroll.lastTime) * dragoverScroll.space / 64
|
||||
});
|
||||
// 使用 requestAnimationFrame 继续动画
|
||||
dragoverScroll.animationId = requestAnimationFrame(scrollAnimation);
|
||||
dragoverScroll.lastTime = timestamp;
|
||||
};
|
||||
|
||||
export const dragOverScroll = (moveEvent: MouseEvent, contentRect: DOMRect, element: Element) => {
|
||||
const dragToUp = moveEvent.clientY < contentRect.top + Constants.SIZE_SCROLL_TB;
|
||||
if (dragToUp ||
|
||||
moveEvent.clientY > contentRect.bottom - Constants.SIZE_SCROLL_TB) {
|
||||
dragoverScroll.space = dragToUp ? moveEvent.clientY - contentRect.top - Constants.SIZE_SCROLL_TB :
|
||||
moveEvent.clientY - contentRect.bottom + Constants.SIZE_SCROLL_TB;
|
||||
if (!dragoverScroll.animationId) {
|
||||
dragoverScroll.element = element;
|
||||
dragoverScroll.animationId = requestAnimationFrame(scrollAnimation);
|
||||
}
|
||||
} else {
|
||||
// 离开滚动区域时停止滚动
|
||||
stopScrollAnimation();
|
||||
}
|
||||
};
|
||||
|
|
|
|||
|
|
@ -601,6 +601,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
|
|||
const liElement = files.element.querySelector(".b3-list-item");
|
||||
if (liElement) {
|
||||
liElement.classList.add("b3-list-item--focus");
|
||||
files.lastSelectedElement = liElement;
|
||||
}
|
||||
event.preventDefault();
|
||||
}
|
||||
|
|
@ -863,6 +864,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
|
|||
item.classList.remove("b3-list-item--focus");
|
||||
});
|
||||
parentElement.classList.add("b3-list-item--focus");
|
||||
files.lastSelectedElement = parentElement;
|
||||
const parentRect = parentElement.getBoundingClientRect();
|
||||
const fileRect = files.element.getBoundingClientRect();
|
||||
if (parentRect.top < fileRect.top || parentRect.bottom > fileRect.bottom) {
|
||||
|
|
@ -895,6 +897,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
|
|||
item.classList.remove("b3-list-item--focus");
|
||||
});
|
||||
nextElement.classList.add("b3-list-item--focus");
|
||||
files.lastSelectedElement = nextElement;
|
||||
const nextRect = nextElement.getBoundingClientRect();
|
||||
const fileRect = files.element.getBoundingClientRect();
|
||||
if (nextRect.top < fileRect.top || nextRect.bottom > fileRect.bottom) {
|
||||
|
|
@ -928,6 +931,7 @@ const fileTreeKeydown = (app: App, event: KeyboardEvent) => {
|
|||
item.classList.remove("b3-list-item--focus");
|
||||
});
|
||||
previousElement.classList.add("b3-list-item--focus");
|
||||
files.lastSelectedElement = previousElement;
|
||||
const previousRect = previousElement.getBoundingClientRect();
|
||||
const fileRect = files.element.getBoundingClientRect();
|
||||
if (previousRect.top < fileRect.top || previousRect.bottom > fileRect.bottom) {
|
||||
|
|
|
|||
|
|
@ -224,8 +224,8 @@ export const windowMouseMove = (event: MouseEvent, mouseIsEnter: boolean) => {
|
|||
const blockElement = hasClosestByClassName(target, "table");
|
||||
if (blockElement && blockElement.style.cursor !== "col-resize" && !hasClosestByClassName(blockElement, "protyle-wysiwyg__embed")) {
|
||||
const cellElement = (hasClosestByTag(target, "TH") || hasClosestByTag(target, "TD")) as HTMLTableCellElement;
|
||||
if (cellElement) {
|
||||
const tableElement = blockElement.querySelector("table");
|
||||
const tableElement = blockElement.querySelector("table");
|
||||
if (cellElement && tableElement && tableElement.getAttribute("contenteditable") === "true") {
|
||||
const tableHeight = blockElement.querySelector("table").clientHeight;
|
||||
const resizeElement = blockElement.querySelector(".table__resize");
|
||||
if (blockElement.style.textAlign === "center" || blockElement.style.textAlign === "right") {
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ import * as fs from "fs";
|
|||
import * as path from "path";
|
||||
import {afterExport} from "../protyle/export/util";
|
||||
import {onWindowsMsg} from "../window/onWindowsMsg";
|
||||
import {initFocusFix} from "../protyle/util/compatibility";
|
||||
/// #endif
|
||||
import {Constants} from "../constants";
|
||||
import {appearance} from "../config/appearance";
|
||||
|
|
@ -68,6 +69,9 @@ export const onGetConfig = (isStart: boolean, app: App) => {
|
|||
initBar(app);
|
||||
initStatus();
|
||||
initWindow(app);
|
||||
/// #if !BROWSER
|
||||
initFocusFix();
|
||||
/// #endif
|
||||
appearance.onSetAppearance(window.siyuan.config.appearance);
|
||||
initAssets();
|
||||
setInlineStyle();
|
||||
|
|
|
|||
|
|
@ -26,13 +26,14 @@ export const newCardModel = (options: {
|
|||
data: options.data,
|
||||
async init() {
|
||||
if (options.data.cardsData) {
|
||||
let cardsData = options.data.cardsData;
|
||||
for (let i = 0; i < options.app.plugins.length; i++) {
|
||||
options.data.cardsData = await options.app.plugins[i].updateCards(options.data.cardsData);
|
||||
cardsData = await options.app.plugins[i].updateCards(options.data.cardsData);
|
||||
}
|
||||
this.element.innerHTML = genCardHTML({
|
||||
id: this.data.id,
|
||||
cardType: this.data.cardType,
|
||||
cardsData: options.data.cardsData,
|
||||
cardsData,
|
||||
isTab: true,
|
||||
});
|
||||
|
||||
|
|
@ -42,7 +43,7 @@ export const newCardModel = (options: {
|
|||
id: this.data.id,
|
||||
title: this.data.title,
|
||||
cardType: this.data.cardType,
|
||||
cardsData: options.data.cardsData,
|
||||
cardsData,
|
||||
index: options.data.index,
|
||||
});
|
||||
customObj.editors.push(editor);
|
||||
|
|
@ -56,9 +57,9 @@ export const newCardModel = (options: {
|
|||
deckID: this.data.id,
|
||||
notebook: this.data.id,
|
||||
}, async (response) => {
|
||||
let cardsData: ICardData = response.data;
|
||||
let cardsData = response.data;
|
||||
for (let i = 0; i < options.app.plugins.length; i++) {
|
||||
cardsData = await options.app.plugins[i].updateCards(response.data);
|
||||
cardsData = await options.app.plugins[i].updateCards(cardsData);
|
||||
}
|
||||
this.element.innerHTML = genCardHTML({
|
||||
id: this.data.id,
|
||||
|
|
@ -75,7 +76,6 @@ export const newCardModel = (options: {
|
|||
cardType: this.data.cardType,
|
||||
cardsData,
|
||||
});
|
||||
|
||||
customObj.editors.push(editor);
|
||||
});
|
||||
}
|
||||
|
|
@ -97,15 +97,28 @@ export const newCardModel = (options: {
|
|||
deckID: this.data.id,
|
||||
notebook: this.data.id,
|
||||
}, async (response) => {
|
||||
let cardsData = response.data;
|
||||
for (let i = 0; i < options.app.plugins.length; i++) {
|
||||
options.data.cardsData = await options.app.plugins[i].updateCards(options.data.cardsData);
|
||||
cardsData = await options.app.plugins[i].updateCards(cardsData);
|
||||
}
|
||||
customObj.editors.forEach(item => {
|
||||
item.destroy();
|
||||
});
|
||||
this.element.innerHTML = genCardHTML({
|
||||
id: this.data.id,
|
||||
cardType: this.data.cardType,
|
||||
cardsData: response.data,
|
||||
cardsData,
|
||||
isTab: true,
|
||||
});
|
||||
editor = await bindCardEvent({
|
||||
app: options.app,
|
||||
element: this.element,
|
||||
id: this.data.id,
|
||||
title: this.data.title,
|
||||
cardType: this.data.cardType,
|
||||
cardsData,
|
||||
});
|
||||
customObj.editors.push(editor);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
|
|
|||
|
|
@ -82,8 +82,8 @@ export const genCardHTML = (options: {
|
|||
<div data-type="fullscreen" class="b3-tooltips b3-tooltips__sw block__icon block__icon--show" aria-label="${window.siyuan.languages.fullscreen}">
|
||||
<svg><use xlink:href="#iconFullscreen"></use></svg>
|
||||
</div>
|
||||
<div class="fn__space"></div>
|
||||
<div data-type="more" class="b3-tooltips b3-tooltips__sw block__icon block__icon--show" aria-label="${window.siyuan.languages.more}">
|
||||
<div class="fn__space${options.cardsData.cards.length === 0 ? " fn__none" : ""}"></div>
|
||||
<div data-type="more" class="${options.cardsData.cards.length === 0 ? "fn__none " : ""}b3-tooltips b3-tooltips__sw block__icon block__icon--show" aria-label="${window.siyuan.languages.more}">
|
||||
<svg><use xlink:href="#iconMore"></use></svg>
|
||||
</div>
|
||||
<div class="fn__space${options.isTab ? " fn__none" : ""}"></div>
|
||||
|
|
@ -161,10 +161,11 @@ const getEditor = (id: string, protyle: IProtyle, element: Element, currentCard:
|
|||
updateReadonly: true,
|
||||
data: response,
|
||||
protyle,
|
||||
action: response.data.rootID === response.data.id ? [Constants.CB_GET_HTML] : [Constants.CB_GET_ALL, Constants.CB_GET_HTML],
|
||||
action: response.data.rootID === response.data.id ? [] : [Constants.CB_GET_ALL],
|
||||
afterCB: () => {
|
||||
protyle.title.element.removeAttribute("data-render");
|
||||
protyle.title.render(protyle, docResponse);
|
||||
if (protyle.element.classList.contains("fn__none")) {
|
||||
return;
|
||||
}
|
||||
let hasHide = false;
|
||||
if (!window.siyuan.config.flashcard.superBlock &&
|
||||
!window.siyuan.config.flashcard.heading &&
|
||||
|
|
@ -235,7 +236,7 @@ export const bindCardEvent = async (options: {
|
|||
cardType: TCardType,
|
||||
id?: string,
|
||||
dialog?: Dialog,
|
||||
index?: number
|
||||
index?: number,
|
||||
}) => {
|
||||
if (window.siyuan.storage[Constants.LOCAL_FLASHCARD].fullscreen) {
|
||||
fullscreen(options.element.querySelector(".card__main"),
|
||||
|
|
@ -303,7 +304,7 @@ export const bindCardEvent = async (options: {
|
|||
};
|
||||
|
||||
countElement.innerHTML = genCardCount(options.cardsData, index);
|
||||
options.element.addEventListener("click", (event: MouseEvent) => {
|
||||
options.element.firstChild.addEventListener("click", (event: MouseEvent) => {
|
||||
const target = event.target as HTMLElement;
|
||||
let type = "";
|
||||
const currentCard = options.cardsData.cards[index];
|
||||
|
|
@ -337,7 +338,7 @@ export const bindCardEvent = async (options: {
|
|||
return;
|
||||
}
|
||||
const moreElement = hasClosestByAttribute(target, "data-type", "more");
|
||||
if (moreElement) {
|
||||
if (moreElement && currentCard) {
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
if (filterElement.getAttribute("data-cardtype") === "all" && filterElement.getAttribute("data-id")) {
|
||||
|
|
@ -491,6 +492,29 @@ export const bindCardEvent = async (options: {
|
|||
const sticktabElement = hasClosestByAttribute(target, "data-type", "sticktab");
|
||||
if (sticktabElement) {
|
||||
const stickMenu = new Menu();
|
||||
stickMenu.addItem({
|
||||
id: "openInNewTab",
|
||||
icon: "iconOpen",
|
||||
label: window.siyuan.languages.openInNewTab,
|
||||
click() {
|
||||
openFile({
|
||||
app: options.app,
|
||||
custom: {
|
||||
icon: "iconRiffCard",
|
||||
title: window.siyuan.languages.spaceRepetition,
|
||||
data: {
|
||||
cardsData: options.cardsData,
|
||||
index,
|
||||
cardType: filterElement.getAttribute("data-cardtype") as TCardType,
|
||||
id: docId,
|
||||
title: options.title
|
||||
},
|
||||
id: "siyuan-card"
|
||||
},
|
||||
});
|
||||
options.dialog.destroy();
|
||||
}
|
||||
});
|
||||
stickMenu.addItem({
|
||||
id: "insertRight",
|
||||
icon: "iconLayoutRight",
|
||||
|
|
@ -529,6 +553,8 @@ export const bindCardEvent = async (options: {
|
|||
"instance": "Custom",
|
||||
"customModelType": "siyuan-card",
|
||||
"customModelData": {
|
||||
"cardsData": options.cardsData,
|
||||
"index": index,
|
||||
"cardType": filterElement.getAttribute("data-cardtype"),
|
||||
"id": docId,
|
||||
"title": options.title
|
||||
|
|
@ -851,6 +877,9 @@ const allDone = (countElement: Element, editor: Protyle, actionElements: NodeLis
|
|||
emptyElement.classList.remove("fn__none");
|
||||
actionElements[0].classList.add("fn__none");
|
||||
actionElements[1].classList.add("fn__none");
|
||||
const moreElement = countElement.parentElement.querySelector('[data-type="more"]');
|
||||
moreElement.classList.add("fn__none");
|
||||
moreElement.previousElementSibling.classList.add("fn__none");
|
||||
};
|
||||
|
||||
const newRound = (countElement: Element, editor: Protyle, actionElements: NodeListOf<Element>, unreviewedCount: number) => {
|
||||
|
|
|
|||
|
|
@ -313,11 +313,7 @@ const getArticle = (edit: Protyle, id: string) => {
|
|||
updateReadonly: true,
|
||||
data: getResponse,
|
||||
protyle: edit.protyle,
|
||||
action: getResponse.data.rootID === getResponse.data.id ? [Constants.CB_GET_HTML] : [Constants.CB_GET_ALL, Constants.CB_GET_HTML],
|
||||
afterCB() {
|
||||
edit.protyle.title.element.removeAttribute("data-render");
|
||||
edit.protyle.title.render(edit.protyle, response);
|
||||
}
|
||||
action: getResponse.data.rootID === getResponse.data.id ? [] : [Constants.CB_GET_ALL],
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
|
|||
|
|
@ -69,6 +69,18 @@ export const editor = {
|
|||
<span class="fn__space"></span>
|
||||
<input class="b3-switch fn__flex-center" id="embedBlockBreadcrumb" type="checkbox"${window.siyuan.config.editor.embedBlockBreadcrumb ? " checked" : ""}/>
|
||||
</label>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.headingEmbedMode}
|
||||
<div class="b3-label__text">${window.siyuan.languages.headingEmbedModeTip}</div>
|
||||
</div>
|
||||
<span class="fn__space"></span>
|
||||
<select class="b3-select fn__flex-center fn__size200" id="headingEmbedMode">
|
||||
<option value="0" ${window.siyuan.config.editor.headingEmbedMode === 0 ? "selected" : ""}>${window.siyuan.languages.showHeadingWithBlocks}</option>
|
||||
<option value="1" ${window.siyuan.config.editor.headingEmbedMode === 1 ? "selected" : ""}>${window.siyuan.languages.showHeadingOnlyTitle}</option>
|
||||
<option value="2" ${window.siyuan.config.editor.headingEmbedMode === 2 ? "selected" : ""}>${window.siyuan.languages.showHeadingOnlyBlocks}</option>
|
||||
</select>
|
||||
</div>
|
||||
<label class="fn__flex b3-label">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.outlineOutdent}
|
||||
|
|
@ -222,7 +234,7 @@ export const editor = {
|
|||
<div class="fn__flex config__item">
|
||||
<div class="fn__flex-center fn__flex-1 ft__on-surface">${window.siyuan.languages.historyRetentionDays}</div>
|
||||
<span class="fn__space"></span>
|
||||
<input class="b3-text-field fn__flex-center fn__size200" id="historyRetentionDays" type="number" min="0" value="${window.siyuan.config.editor.historyRetentionDays}"/>
|
||||
<input class="b3-text-field fn__flex-center fn__size200" id="historyRetentionDays" type="number" min="1" max="3650" value="${window.siyuan.config.editor.historyRetentionDays}"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fn__flex b3-label config__item">
|
||||
|
|
@ -428,6 +440,7 @@ export const editor = {
|
|||
displayNetImgMark: (editor.element.querySelector("#displayNetImgMark") as HTMLInputElement).checked,
|
||||
codeSyntaxHighlightLineNum: (editor.element.querySelector("#codeSyntaxHighlightLineNum") as HTMLInputElement).checked,
|
||||
embedBlockBreadcrumb: (editor.element.querySelector("#embedBlockBreadcrumb") as HTMLInputElement).checked,
|
||||
headingEmbedMode: parseInt((editor.element.querySelector("#headingEmbedMode") as HTMLSelectElement).value),
|
||||
listLogicalOutdent: (editor.element.querySelector("#listLogicalOutdent") as HTMLInputElement).checked,
|
||||
listItemDotNumberClickFocus: (editor.element.querySelector("#listItemDotNumberClickFocus") as HTMLInputElement).checked,
|
||||
spellcheck: (editor.element.querySelector("#spellcheck") as HTMLInputElement).checked,
|
||||
|
|
|
|||
|
|
@ -118,7 +118,7 @@ export const openSnippets = () => {
|
|||
type: target.id === "addCodeSnippetCSS" ? "css" : "js",
|
||||
name: "",
|
||||
content: "",
|
||||
enabled: false,
|
||||
enabled: true,
|
||||
disabledInPublish: false,
|
||||
}));
|
||||
event.stopPropagation();
|
||||
|
|
|
|||
|
|
@ -224,6 +224,69 @@ export abstract class Constants {
|
|||
public static readonly DIALOG_OPENWORKSPACE = "dialog-openworkspace"; // 打开工作空间
|
||||
public static readonly DIALOG_SAVEWORKSPACE = "dialog-saveworkspace"; // 保存工作空间
|
||||
|
||||
// menu
|
||||
public static readonly MENU_BAR_WORKSPACE = "barWorkspace"; // 顶栏主菜单
|
||||
public static readonly MENU_BAR_PLUGIN = "topBarPlugin"; // 顶栏插件菜单
|
||||
public static readonly MENU_BAR_ZOOM = "barZoom"; // 顶栏缩放菜单
|
||||
public static readonly MENU_BAR_MODE = "barmode"; // 顶栏外观菜单
|
||||
public static readonly MENU_BAR_MORE = "barmore"; // 顶栏更多菜单
|
||||
public static readonly MENU_STATUS_HELP = "statusHelp"; // 状态栏帮助菜单
|
||||
public static readonly MENU_STATUS_BACKGROUND_TASK = "statusBackgroundTask"; // 状态栏后台任务菜单
|
||||
public static readonly MENU_DOCK_MOBILE = "dockMobileMenu"; // 移动端侧栏插件选项菜单
|
||||
|
||||
public static readonly MENU_BLOCK_SINGLE = "block-single"; // 单选块菜单
|
||||
public static readonly MENU_BLOCK_MULTI = "block-multi"; // 多选块菜单
|
||||
public static readonly MENU_TITLE = "titleMenu"; // 文档块菜单
|
||||
public static readonly MENU_FROM_TITLE_PROTYLE = "title-protyle"; // 在 Protyle 触发的文档块菜单
|
||||
public static readonly MENU_FROM_TITLE_BREADCRUMB = "title-breadcrumb"; // 在面包屑触发的文档块菜单
|
||||
public static readonly MENU_BREADCRUMB_MORE = "breadcrumbMore"; // 面包屑更多菜单
|
||||
public static readonly MENU_BREADCRUMB_MOBILE_PATH = "breadcrumb-mobile-path"; // 移动端面包屑菜单
|
||||
|
||||
public static readonly MENU_DOC_TREE_MORE = "docTreeMore"; // 侧栏文档树右键菜单
|
||||
public static readonly MENU_FROM_DOC_TREE_MORE_NOTEBOOK = "tree-notebook"; // 侧栏文档树右键菜单,单个笔记本
|
||||
public static readonly MENU_FROM_DOC_TREE_MORE_DOC = "tree-doc"; // 侧栏文档树右键菜单,单个文档
|
||||
public static readonly MENU_FROM_DOC_TREE_MORE_ITEMS = "tree-items"; // 侧栏文档树右键菜单,多个文档或笔记本
|
||||
public static readonly MENU_TAG = "tagMenu"; // 侧栏标签菜单
|
||||
public static readonly MENU_BOOKMARK = "bookmarkMenu"; // 侧栏书签菜单
|
||||
public static readonly MENU_OUTLINE_CONTEXT = "outline-context"; // 大纲标题右键菜单
|
||||
public static readonly MENU_OUTLINE_EXPAND_LEVEL = "outline-expand-level"; // 大纲展开层级菜单
|
||||
|
||||
public static readonly MENU_AV_VIEW = "av-view"; // 数据库视图标题菜单
|
||||
public static readonly MENU_AV_HEADER_CELL = "av-header-cell"; // 数据库字段标题菜单
|
||||
public static readonly MENU_AV_HEADER_ADD = "av-header-add"; // 数据库添加字段菜单
|
||||
public static readonly MENU_AV_ADD_FILTER = "av-add-filter"; // 数据库添加筛选条件菜单
|
||||
public static readonly MENU_AV_ADD_SORT = "av-add-sort"; // 数据库添加排序条件菜单
|
||||
public static readonly MENU_AV_COL_OPTION = "av-col-option"; // 数据库单选多选字段的选项编辑菜单
|
||||
public static readonly MENU_AV_COL_FORMAT_NUMBER = "av-col-format-number"; // 数据库数字字段格式化菜单
|
||||
public static readonly MENU_AV_GROUP_DATE = "avGroupDate"; // 数据库日期字段分组菜单的日期菜单
|
||||
public static readonly MENU_AV_GROUP_SORT = "avGroupSort"; // 数据库日期字段分组菜单的排序菜单
|
||||
public static readonly MENU_AV_ASSET_EDIT = "av-asset-edit"; // 数据库资源字段链接或资源文件菜单
|
||||
public static readonly MENU_AV_CALC = "av-calc"; // 数据库计算菜单
|
||||
public static readonly MENU_AV_PAGE_SIZE = "av-page-size"; // 数据库条目数菜单
|
||||
|
||||
public static readonly MENU_SEARCH_MORE = "searchMore"; // 搜索更多菜单
|
||||
public static readonly MENU_SEARCH_METHOD = "searchMethod"; // 搜索方式菜单
|
||||
public static readonly MENU_SEARCH_ASSET_MORE = "searchAssetMore"; // 资源文件搜索更多菜单
|
||||
public static readonly MENU_SEARCH_ASSET_METHOD = "searchAssetMethod"; // 资源文件搜索方式菜单
|
||||
public static readonly MENU_SEARCH_UNREF_MORE = "searchUnRefMore"; // 列出引用失效的块的更多菜单
|
||||
public static readonly MENU_SEARCH_HISTORY = "search-history"; // 搜索历史菜单
|
||||
public static readonly MENU_SEARCH_REPLACE_HISTORY = "search-replace-history"; // 替换历史菜单
|
||||
public static readonly MENU_SEARCH_ASSET_HISTORY = "search-asset-history"; // 资源文件搜索历史菜单
|
||||
public static readonly MENU_MOVE_PATH_HISTORY = "move-path-history"; // 移动文档窗口搜索历史菜单
|
||||
|
||||
public static readonly MENU_BACKGROUND_ASSET = "background-asset"; // 资源文件选择器菜单
|
||||
public static readonly MENU_AI = "ai"; // 块 AI 菜单
|
||||
public static readonly MENU_TAB = "tab"; // 页签右键菜单
|
||||
public static readonly MENU_TAB_LIST = "tabList"; // 页签切换菜单
|
||||
|
||||
public static readonly MENU_INLINE_CONTEXT = "inline-context"; // 文本右键菜单
|
||||
public static readonly MENU_INLINE_IMG = "inline-img"; // 图片元素菜单
|
||||
public static readonly MENU_INLINE_FILE_ANNOTATION_REF = "inline-file-annotation-ref"; // PDF 标注元素菜单
|
||||
public static readonly MENU_INLINE_REF = "inline-block-ref"; // 块引用元素菜单
|
||||
public static readonly MENU_INLINE_A = "inline-a"; // 超链接元素菜单
|
||||
public static readonly MENU_INLINE_TAG = "inline-tag"; // 行级标签元素菜单
|
||||
public static readonly MENU_INLINE_MATH = "inline-math"; // 行级公式元素菜单
|
||||
|
||||
// timeout
|
||||
public static readonly TIMEOUT_OPENDIALOG = 50;
|
||||
public static readonly TIMEOUT_DBLCLICK = 190;
|
||||
|
|
|
|||
|
|
@ -461,7 +461,7 @@ export const progressBackgroundTask = (tasks: { action: string }[]) => {
|
|||
if (tasks.length === 0) {
|
||||
backgroundTaskElement.classList.add("fn__none");
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "statusBackgroundTask") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_STATUS_BACKGROUND_TASK) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
}
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -362,11 +362,11 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
<span class="fn__space"></span>
|
||||
<span class="fn__flex-center ft__on-surface" style="width: 89px">${window.siyuan.languages.custom}</span>
|
||||
<span class="fn__space--small"></span>
|
||||
<input type="text" class="b3-text-field fn__flex-1" value="${dynamicCurrentObj.content}">
|
||||
<input type="text" class="b3-text-field fn__flex-1" value="">
|
||||
<span class="fn__space"></span>
|
||||
</div>
|
||||
<div>
|
||||
<img data-type="text" class="emoji__dynamic-item${dynamicCurrentObj.type === "8" ? " emoji__dynamic-item--current" : ""}" src="${dynamicURL}type=8&color=${encodeURIComponent(dynamicCurrentObj.color)}&content=${dynamicCurrentObj.content}&id=${id}">
|
||||
<img data-type="text" class="emoji__dynamic-item${dynamicCurrentObj.type === "8" ? " emoji__dynamic-item--current" : ""}" src="${dynamicURL}type=8&color=${encodeURIComponent(dynamicCurrentObj.color)}&content=${encodeURIComponent(dynamicCurrentObj.content)}&id=${id}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
@ -685,6 +685,7 @@ export const openEmojiPanel = (id: string, type: "doc" | "notebook" | "av", posi
|
|||
}
|
||||
});
|
||||
});
|
||||
dynamicTextElements[1].value = dynamicCurrentObj.content;
|
||||
dynamicTextElements[1].addEventListener("input", () => {
|
||||
const url = new URLSearchParams(dynamicTextImgElement.getAttribute("src").replace(dynamicURL, ""));
|
||||
url.set("content", dynamicTextElements[1].value);
|
||||
|
|
|
|||
|
|
@ -654,7 +654,7 @@ export class Wnd {
|
|||
|
||||
private renderTabList(target: HTMLElement) {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "tabList") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_TAB_LIST) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
|
|
@ -703,7 +703,7 @@ export class Wnd {
|
|||
current: item.classList.contains("item--focus")
|
||||
}).element);
|
||||
});
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "tabList");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_TAB_LIST);
|
||||
const rect = target.getBoundingClientRect();
|
||||
window.siyuan.menus.menu.popup({
|
||||
x: rect.left + rect.width,
|
||||
|
|
|
|||
|
|
@ -150,14 +150,6 @@ export class Backlink extends Model {
|
|||
this.searchBacklinks();
|
||||
}
|
||||
});
|
||||
item.addEventListener("input", (event: KeyboardEvent) => {
|
||||
const inputElement = event.target as HTMLInputElement;
|
||||
if (inputElement.value === "") {
|
||||
inputElement.classList.remove("search__input--block");
|
||||
} else {
|
||||
inputElement.classList.add("search__input--block");
|
||||
}
|
||||
});
|
||||
});
|
||||
this.tree = new Tree({
|
||||
element: this.element.querySelector(".backlinkList") as HTMLElement,
|
||||
|
|
|
|||
|
|
@ -1,25 +1,18 @@
|
|||
import {escapeAriaLabel, escapeGreat, escapeHtml} from "../../util/escape";
|
||||
import {Tab} from "../Tab";
|
||||
import {Model} from "../Model";
|
||||
import {getInstanceById, setPanelFocus} from "../util";
|
||||
import {setPanelFocus} from "../util";
|
||||
import {getDockByType} from "../tabUtil";
|
||||
import {Constants} from "../../constants";
|
||||
import {getDisplayName, pathPosix, setNoteBook} from "../../util/pathName";
|
||||
import {newFile} from "../../util/newFile";
|
||||
import {initFileMenu, initNavigationMenu, sortMenu} from "../../menus/navigation";
|
||||
import {MenuItem} from "../../menus/Menu";
|
||||
import {Editor} from "../../editor";
|
||||
import {showMessage} from "../../dialog/message";
|
||||
import {fetchPost, fetchSyncPost} from "../../util/fetch";
|
||||
import {openEmojiPanel, unicode2Emoji} from "../../emoji";
|
||||
import {mountHelp, newNotebook} from "../../util/mount";
|
||||
import {confirmDialog} from "../../dialog/confirmDialog";
|
||||
import {
|
||||
isNotCtrl,
|
||||
isOnlyMeta,
|
||||
setStorageVal,
|
||||
updateHotkeyAfterTip
|
||||
} from "../../protyle/util/compatibility";
|
||||
import {isNotCtrl, isOnlyMeta, setStorageVal, updateHotkeyAfterTip} from "../../protyle/util/compatibility";
|
||||
import {openFileById} from "../../editor/util";
|
||||
import {
|
||||
hasClosestByAttribute,
|
||||
|
|
@ -34,12 +27,14 @@ import {refreshFileTree} from "../../dialog/processSystem";
|
|||
import {ipcRenderer} from "electron";
|
||||
/// #endif
|
||||
import {hideTooltip, showTooltip} from "../../dialog/tooltip";
|
||||
import {selectOpenTab} from "./util";
|
||||
|
||||
export class Files extends Model {
|
||||
public element: HTMLElement;
|
||||
public parent: Tab;
|
||||
private actionsElement: HTMLElement;
|
||||
public closeElement: HTMLElement;
|
||||
public lastSelectedElement: Element = null;
|
||||
private actionsElement: HTMLElement;
|
||||
|
||||
constructor(options: { tab: Tab, app: App }) {
|
||||
super({
|
||||
|
|
@ -178,18 +173,6 @@ export class Files extends Model {
|
|||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (type === "remove") {
|
||||
confirmDialog(window.siyuan.languages.deleteOpConfirm,
|
||||
`${window.siyuan.languages.confirmDelete} <b>${escapeHtml(target.parentElement.querySelector(".b3-list-item__text").textContent)}</b>?`, () => {
|
||||
fetchPost("/api/notebook/removeNotebook", {
|
||||
notebook: target.getAttribute("data-url"),
|
||||
callback: Constants.CB_MOUNT_REMOVE
|
||||
});
|
||||
}, undefined, true);
|
||||
window.siyuan.menus.menu.remove();
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (type === "open") {
|
||||
fetchPost("/api/notebook/openNotebook", {
|
||||
notebook: target.getAttribute("data-url")
|
||||
|
|
@ -226,23 +209,7 @@ export class Files extends Model {
|
|||
window.siyuan.menus.menu.remove();
|
||||
break;
|
||||
} else if (type === "focus") {
|
||||
let element = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus") as HTMLElement;
|
||||
if (!element) {
|
||||
document.querySelectorAll("ul.layout-tab-bar > .item--focus").forEach((item: HTMLElement, index) => {
|
||||
if (index === 0) {
|
||||
element = item;
|
||||
} else if (item.dataset.activetime > element.dataset.activetime) {
|
||||
element = item;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (element) {
|
||||
const tab = getInstanceById(element.getAttribute("data-id")) as Tab;
|
||||
if (tab && tab.model instanceof Editor) {
|
||||
this.selectItem(tab.model.editor.protyle.notebookId, tab.model.editor.protyle.path);
|
||||
}
|
||||
}
|
||||
selectOpenTab();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (type === "more") {
|
||||
|
|
@ -351,9 +318,42 @@ export class Files extends Model {
|
|||
} else if (target.tagName === "LI") {
|
||||
if (isOnlyMeta(event) && !event.altKey && !event.shiftKey) {
|
||||
target.classList.toggle("b3-list-item--focus");
|
||||
this.lastSelectedElement = target;
|
||||
} else if (event.shiftKey && !event.altKey && isNotCtrl(event)) {
|
||||
// Shift+click 多选文档
|
||||
if (!document.contains(this.lastSelectedElement)) {
|
||||
this.lastSelectedElement = null;
|
||||
}
|
||||
if (!this.lastSelectedElement) {
|
||||
this.lastSelectedElement = this.element.querySelector(".b3-list-item--focus");
|
||||
}
|
||||
if (!this.lastSelectedElement) {
|
||||
this.lastSelectedElement = target.parentElement.firstElementChild;
|
||||
}
|
||||
this.element.querySelectorAll(".b3-list-item--focus").forEach(item => {
|
||||
item.classList.remove("b3-list-item--focus");
|
||||
});
|
||||
|
||||
// 获取所有文档项
|
||||
const allFiles = Array.from(this.element.querySelectorAll("li.b3-list-item"));
|
||||
|
||||
// 获取起始和结束索引
|
||||
const startIndex = allFiles.indexOf(this.lastSelectedElement);
|
||||
const endIndex = allFiles.indexOf(target);
|
||||
|
||||
// 确定选择范围
|
||||
const start = Math.min(startIndex, endIndex);
|
||||
const end = Math.max(startIndex, endIndex);
|
||||
|
||||
// 添加新选择
|
||||
for (let i = start; i <= end; i++) {
|
||||
(allFiles[i] as HTMLElement).classList.add("b3-list-item--focus");
|
||||
}
|
||||
} else {
|
||||
this.lastSelectedElement = target;
|
||||
this.setCurrent(target, false);
|
||||
if (target.getAttribute("data-type") === "navigation-file") {
|
||||
// 更新最后点击的文档项
|
||||
needFocus = false;
|
||||
if (target.getAttribute("data-opening")) {
|
||||
return;
|
||||
|
|
@ -369,7 +369,7 @@ export class Files extends Model {
|
|||
target.removeAttribute("data-opening");
|
||||
}
|
||||
});
|
||||
} else if (!event.altKey && isNotCtrl(event) && event.shiftKey) {
|
||||
} else if (!event.altKey && isOnlyMeta(event) && event.shiftKey) {
|
||||
openFileById({
|
||||
app: options.app,
|
||||
id: target.getAttribute("data-node-id"),
|
||||
|
|
@ -751,6 +751,7 @@ export class Files extends Model {
|
|||
fetchPost("/api/filetree/listDocsByPath", {
|
||||
notebook: toURL,
|
||||
path: toDir === "/" ? "/" : toDir + ".sy",
|
||||
app: Constants.SIYUAN_APPID,
|
||||
}, response => {
|
||||
if (response.data.path === "/" && response.data.files.length === 0) {
|
||||
showMessage(window.siyuan.languages.emptyContent);
|
||||
|
|
@ -813,14 +814,14 @@ export class Files extends Model {
|
|||
private genNotebook(item: INotebook) {
|
||||
const emojiHTML = `<span class="b3-list-item__icon b3-tooltips b3-tooltips__e" aria-label="${window.siyuan.languages.changeIcon}">${unicode2Emoji(item.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].note)}</span>`;
|
||||
if (item.closed) {
|
||||
return `<li data-type="open" data-url="${item.id}" class="b3-list-item b3-list-item--hide-action">
|
||||
return `<li data-url="${item.id}" class="b3-list-item b3-list-item--hide-action">
|
||||
<span class="b3-list-item__toggle fn__hidden">
|
||||
<svg class="b3-list-item__arrow"><use xlink:href="#iconRight"></use></svg>
|
||||
</span>
|
||||
${emojiHTML}
|
||||
<span class="b3-list-item__text">${escapeHtml(item.name)}</span>
|
||||
<span data-type="remove" data-url="${item.id}" class="b3-list-item__action b3-tooltips b3-tooltips__w${(window.siyuan.config.readonly) ? " fn__none" : ""}" aria-label="${window.siyuan.languages.delete}">
|
||||
<svg><use xlink:href="#iconTrashcan"></use></svg>
|
||||
<span class="b3-list-item__text" style="cursor: default;">${escapeHtml(item.name)}</span>
|
||||
<span data-type="open" data-url="${item.id}" class="b3-list-item__action b3-tooltips b3-tooltips__w${(window.siyuan.config.readonly) ? " fn__none" : ""}" aria-label="${window.siyuan.languages.openBy}">
|
||||
<svg><use xlink:href="#iconOpen"></use></svg>
|
||||
</span>
|
||||
</li>`;
|
||||
} else {
|
||||
|
|
@ -1005,9 +1006,12 @@ data-type="navigation-root" data-path="/">
|
|||
}
|
||||
if (sourceElement.parentElement.childElementCount === 1) {
|
||||
if (sourceElement.parentElement.previousElementSibling) {
|
||||
sourceElement.parentElement.previousElementSibling.querySelector(".b3-list-item__toggle").classList.add("fn__hidden");
|
||||
sourceElement.parentElement.previousElementSibling.querySelector(".b3-list-item__arrow").classList.remove("b3-list-item__arrow--open");
|
||||
const emojiElement = sourceElement.parentElement.previousElementSibling.querySelector(".b3-list-item__icon");
|
||||
const parentLiElement = sourceElement.parentElement.previousElementSibling;
|
||||
if (parentLiElement.getAttribute("data-type") !== "navigation-root") {
|
||||
parentLiElement.querySelector(".b3-list-item__toggle").classList.add("fn__hidden");
|
||||
}
|
||||
parentLiElement.querySelector(".b3-list-item__arrow").classList.remove("b3-list-item__arrow--open");
|
||||
const emojiElement = parentLiElement.querySelector(".b3-list-item__icon");
|
||||
if (emojiElement.innerHTML === unicode2Emoji(window.siyuan.storage[Constants.LOCAL_IMAGES].folder)) {
|
||||
emojiElement.innerHTML = unicode2Emoji(window.siyuan.storage[Constants.LOCAL_IMAGES].file);
|
||||
}
|
||||
|
|
@ -1016,6 +1020,12 @@ data-type="navigation-root" data-path="/">
|
|||
} else {
|
||||
sourceElement.remove();
|
||||
}
|
||||
} else {
|
||||
const parentElement = this.element.querySelector(`ul[data-url="${response.data.fromNotebook}"] li[data-path="${pathPosix().dirname(response.data.fromPath)}.sy"]`) as HTMLElement;
|
||||
if (parentElement && parentElement.getAttribute("data-count") === "1") {
|
||||
parentElement.querySelector(".b3-list-item__toggle").classList.add("fn__hidden");
|
||||
parentElement.querySelector(".b3-list-item__arrow").classList.remove("b3-list-item__arrow--open");
|
||||
}
|
||||
}
|
||||
const newElement = this.element.querySelector(`[data-url="${response.data.toNotebook}"] li[data-path="${response.data.toPath}"]`) as HTMLElement;
|
||||
// 更新移动到的新文件夹
|
||||
|
|
@ -1094,6 +1104,9 @@ data-type="navigation-root" data-path="/">
|
|||
return;
|
||||
}
|
||||
const liElement = this.element.querySelector(`ul[data-url="${data.box}"] li[data-path="${data.path}"]`);
|
||||
if (!liElement) {
|
||||
return;
|
||||
}
|
||||
if (liElement.nextElementSibling && liElement.nextElementSibling.tagName === "UL") {
|
||||
// 文件展开时,刷新
|
||||
liElement.nextElementSibling.remove();
|
||||
|
|
@ -1114,7 +1127,8 @@ data-type="navigation-root" data-path="/">
|
|||
} else if (filePath.startsWith(item.path.replace(".sy", ""))) {
|
||||
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
|
||||
notebook: data.box,
|
||||
path: item.path
|
||||
path: item.path,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
});
|
||||
newLiElement = await this.selectItem(response.data.box, filePath, response.data, setStorage, isSetCurrent);
|
||||
}
|
||||
|
|
@ -1151,6 +1165,7 @@ data-type="navigation-root" data-path="/">
|
|||
fetchPost("/api/filetree/listDocsByPath", {
|
||||
notebook: notebookId,
|
||||
path: liElement.getAttribute("data-path"),
|
||||
app: Constants.SIYUAN_APPID,
|
||||
}, response => {
|
||||
if (response.data.path === "/" && response.data.files.length === 0) {
|
||||
newFile({
|
||||
|
|
@ -1206,7 +1221,8 @@ data-type="navigation-root" data-path="/">
|
|||
} else {
|
||||
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
|
||||
notebook: notebookId,
|
||||
path: currentPath
|
||||
path: currentPath,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
});
|
||||
liElement = await this.onLsSelect(response.data, filePath, setStorage, isSetCurrent);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -341,7 +341,6 @@ export class Graph extends Model {
|
|||
});
|
||||
this.inputElement.addEventListener("compositionend", () => {
|
||||
this.searchGraph(false);
|
||||
this.inputElement.classList.add("search__input--block");
|
||||
});
|
||||
this.inputElement.addEventListener("blur", (event: InputEvent) => {
|
||||
const inputElement = event.target as HTMLInputElement;
|
||||
|
|
@ -351,11 +350,6 @@ export class Graph extends Model {
|
|||
if (event.isComposing) {
|
||||
return;
|
||||
}
|
||||
if (this.inputElement.value === "") {
|
||||
this.inputElement.classList.remove("search__input--block");
|
||||
} else {
|
||||
this.inputElement.classList.add("search__input--block");
|
||||
}
|
||||
this.searchGraph(false);
|
||||
});
|
||||
this.element.querySelectorAll(".b3-slider").forEach((item: HTMLInputElement) => {
|
||||
|
|
|
|||
|
|
@ -6,17 +6,28 @@ import {getDockByType} from "../tabUtil";
|
|||
import {fetchPost} from "../../util/fetch";
|
||||
import {getAllModels} from "../getAll";
|
||||
import {hasClosestBlock, hasClosestByClassName, hasTopClosestByClassName} from "../../protyle/util/hasClosest";
|
||||
import {setStorageVal, updateHotkeyAfterTip} from "../../protyle/util/compatibility";
|
||||
import {
|
||||
isInAndroid,
|
||||
isInHarmony,
|
||||
setStorageVal,
|
||||
updateHotkeyAfterTip,
|
||||
writeText
|
||||
} from "../../protyle/util/compatibility";
|
||||
import {openFileById} from "../../editor/util";
|
||||
import {Constants} from "../../constants";
|
||||
import {escapeHtml} from "../../util/escape";
|
||||
import {MenuItem} from "../../menus/Menu";
|
||||
import {escapeAttr, escapeHtml} from "../../util/escape";
|
||||
import {unicode2Emoji} from "../../emoji";
|
||||
import {getPreviousBlock} from "../../protyle/wysiwyg/getBlock";
|
||||
import {App} from "../../index";
|
||||
import {checkFold} from "../../util/noRelyPCFunction";
|
||||
import {transaction} from "../../protyle/wysiwyg/transaction";
|
||||
import {transaction, turnsIntoTransaction} from "../../protyle/wysiwyg/transaction";
|
||||
import {goHome} from "../../protyle/wysiwyg/commonHotkey";
|
||||
import {Editor} from "../../editor";
|
||||
import {mathRender} from "../../protyle/render/mathRender";
|
||||
import {genEmptyElement} from "../../block/util";
|
||||
import {focusBlock, focusByWbr} from "../../protyle/util/selection";
|
||||
import {dragOverScroll, stopScrollAnimation} from "../../boot/globalEvent/dragover";
|
||||
|
||||
export class Outline extends Model {
|
||||
public tree: Tree;
|
||||
|
|
@ -25,7 +36,7 @@ export class Outline extends Model {
|
|||
public type: "pin" | "local";
|
||||
public blockId: string;
|
||||
public isPreview: boolean;
|
||||
private openNodes: { [key: string]: string[] } = {};
|
||||
private preFilterExpandIds: string[] | null = null;
|
||||
|
||||
constructor(options: {
|
||||
app: App,
|
||||
|
|
@ -84,27 +95,64 @@ export class Outline extends Model {
|
|||
this.blockId = options.blockId;
|
||||
this.type = options.type;
|
||||
options.tab.panelElement.classList.add("fn__flex-column", "file-tree", "sy__outline");
|
||||
options.tab.panelElement.innerHTML = `<div class="block__icons">
|
||||
options.tab.panelElement.innerHTML = `<div class="block__icons fn__hidescrollbar">
|
||||
<div class="block__logo">
|
||||
<svg class="block__logoicon"><use xlink:href="#iconAlignCenter"></use></svg>${window.siyuan.languages.outline}
|
||||
</div>
|
||||
<span class="fn__flex-1 fn__space"></span>
|
||||
<span data-type="expand" class="block__icon b3-tooltips b3-tooltips__sw${window.siyuan.storage[Constants.LOCAL_OUTLINE].keepExpand ? " block__icon--active" : ""}" aria-label="${window.siyuan.languages.stickOpen}${updateHotkeyAfterTip(window.siyuan.config.keymap.editor.general.expand.custom)}">
|
||||
<input class="b3-text-field search__label fn__none fn__size200" placeholder="${window.siyuan.languages.filterKeywordEnter}" />
|
||||
<span data-type="search" class="block__icon ariaLabel" aria-label="${window.siyuan.languages.filter}">
|
||||
<svg><use xlink:href='#iconFilter'></use></svg>
|
||||
</span>
|
||||
<span class="fn__space"></span>
|
||||
<span data-type="keepCurrentExpand" class="block__icon ariaLabel${window.siyuan.storage[Constants.LOCAL_OUTLINE].keepCurrentExpand ? " block__icon--active" : ""}" aria-label="${window.siyuan.languages.outlineKeepCurrentExpand}">
|
||||
<svg><use xlink:href="#iconFocus"></use></svg>
|
||||
</span>
|
||||
<span class="fn__space"></span>
|
||||
<span data-type="expandLevel" class="block__icon ariaLabel" aria-label="${window.siyuan.languages.expandLevel}">
|
||||
<svg><use xlink:href="#iconList"></use></svg>
|
||||
</span>
|
||||
<span class="fn__space"></span>
|
||||
<span data-type="expand" class="block__icon ariaLabel" aria-label="${window.siyuan.languages.expandAll}${updateHotkeyAfterTip(window.siyuan.config.keymap.editor.general.expand.custom)}">
|
||||
<svg><use xlink:href="#iconExpand"></use></svg>
|
||||
</span>
|
||||
<span class="fn__space"></span>
|
||||
<span data-type="collapse" class="block__icon b3-tooltips b3-tooltips__sw" aria-label="${window.siyuan.languages.collapse}${updateHotkeyAfterTip(window.siyuan.config.keymap.editor.general.collapse.custom)}">
|
||||
<span data-type="collapse" class="block__icon ariaLabel" aria-label="${window.siyuan.languages.foldAll}${updateHotkeyAfterTip(window.siyuan.config.keymap.editor.general.collapse.custom)}">
|
||||
<svg><use xlink:href="#iconContract"></use></svg>
|
||||
</span>
|
||||
<span class="${this.type === "local" ? "fn__none " : ""}fn__space"></span>
|
||||
<span data-type="min" class="${this.type === "local" ? "fn__none " : ""}block__icon b3-tooltips b3-tooltips__sw" aria-label="${window.siyuan.languages.min}${updateHotkeyAfterTip(window.siyuan.config.keymap.general.closeTab.custom)}"><svg><use xlink:href='#iconMin'></use></svg></span>
|
||||
<span data-type="min" class="${this.type === "local" ? "fn__none " : ""}block__icon ariaLabel" aria-label="${window.siyuan.languages.min}${updateHotkeyAfterTip(window.siyuan.config.keymap.general.closeTab.custom)}">
|
||||
<svg><use xlink:href='#iconMin'></use></svg>
|
||||
</span>
|
||||
</div>
|
||||
<div class="b3-list-item fn__none"></div>
|
||||
<div class="fn__flex-1" style="padding: 3px 0 8px"></div>`;
|
||||
this.element = options.tab.panelElement.lastElementChild as HTMLElement;
|
||||
this.headerElement = options.tab.panelElement.firstElementChild as HTMLElement;
|
||||
const inputElement = this.headerElement.querySelector("input.b3-text-field.search__label") as HTMLInputElement;
|
||||
inputElement.addEventListener("blur", () => {
|
||||
inputElement.classList.add("fn__none");
|
||||
const filterIconElement = inputElement.nextElementSibling as HTMLElement; // search 图标
|
||||
const value = inputElement.value;
|
||||
if (value) {
|
||||
filterIconElement.classList.add("block__icon--active");
|
||||
filterIconElement.setAttribute("aria-label", window.siyuan.languages.filter + " " + escapeAttr(value));
|
||||
} else {
|
||||
filterIconElement.classList.remove("block__icon--active");
|
||||
filterIconElement.setAttribute("aria-label", window.siyuan.languages.filter);
|
||||
}
|
||||
if (inputElement.dataset.value !== value) {
|
||||
this.setFilter();
|
||||
}
|
||||
});
|
||||
inputElement.addEventListener("keydown", (event: KeyboardEvent) => {
|
||||
if (!event.isComposing && event.key === "Enter") {
|
||||
inputElement.dataset.value = inputElement.value;
|
||||
this.setFilter();
|
||||
}
|
||||
});
|
||||
this.tree = new Tree({
|
||||
element: options.tab.panelElement.lastElementChild as HTMLElement,
|
||||
element: this.element,
|
||||
data: null,
|
||||
click: (element: HTMLElement) => {
|
||||
const id = element.getAttribute("data-node-id");
|
||||
|
|
@ -134,7 +182,12 @@ export class Outline extends Model {
|
|||
});
|
||||
}
|
||||
},
|
||||
ctrlClick(element: HTMLElement) {
|
||||
ctrlClick: (element: HTMLElement, event) => {
|
||||
const arrowElement = hasClosestByClassName(event.target as Element, "b3-list-item__toggle");
|
||||
if (arrowElement && !arrowElement.classList.contains("fn__hidden")) {
|
||||
this.collapseChildren(element);
|
||||
return;
|
||||
}
|
||||
const id = element.getAttribute("data-node-id");
|
||||
openFileById({
|
||||
app: options.app,
|
||||
|
|
@ -142,13 +195,52 @@ export class Outline extends Model {
|
|||
action: [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HTML],
|
||||
zoomIn: true,
|
||||
});
|
||||
},
|
||||
altClick: (element: HTMLElement, event: MouseEvent) => {
|
||||
// alt 点击箭头,切换同层级的所有标题的展开/折叠状态
|
||||
const arrowElement = hasClosestByClassName(event.target as HTMLElement, "b3-list-item__toggle");
|
||||
if (arrowElement) {
|
||||
this.collapseSameLevel(element);
|
||||
}
|
||||
},
|
||||
rightClick: (element: HTMLElement, event: MouseEvent) => {
|
||||
this.showContextMenu(element, event);
|
||||
},
|
||||
toggleClick: (liElement) => {
|
||||
if (!liElement.nextElementSibling) {
|
||||
return;
|
||||
}
|
||||
const svgElement = liElement.firstElementChild.firstElementChild;
|
||||
if (svgElement.classList.contains("b3-list-item__arrow--open")) {
|
||||
svgElement.classList.remove("b3-list-item__arrow--open");
|
||||
liElement.nextElementSibling.classList.add("fn__none");
|
||||
if (liElement.nextElementSibling.nextElementSibling && liElement.nextElementSibling.nextElementSibling.tagName === "UL") {
|
||||
liElement.nextElementSibling.nextElementSibling.classList.add("fn__none");
|
||||
}
|
||||
} else {
|
||||
svgElement.classList.add("b3-list-item__arrow--open");
|
||||
liElement.nextElementSibling.classList.remove("fn__none");
|
||||
if (liElement.nextElementSibling.nextElementSibling && liElement.nextElementSibling.nextElementSibling.tagName === "UL") {
|
||||
liElement.nextElementSibling.nextElementSibling.classList.remove("fn__none");
|
||||
}
|
||||
}
|
||||
this.saveExpendIds();
|
||||
}
|
||||
});
|
||||
// 为了快捷键的 dispatch
|
||||
options.tab.panelElement.querySelector('[data-type="collapse"]').addEventListener("click", () => {
|
||||
this.tree.collapseAll();
|
||||
this.saveExpendIds();
|
||||
});
|
||||
options.tab.panelElement.querySelector('[data-type="expand"]').addEventListener("click", (event: MouseEvent & {
|
||||
|
||||
// 普通的全部展开按钮
|
||||
options.tab.panelElement.querySelector('[data-type="expand"]').addEventListener("click", () => {
|
||||
this.tree.expandAll();
|
||||
this.saveExpendIds();
|
||||
});
|
||||
|
||||
// 保持当前标题展开功能
|
||||
options.tab.panelElement.querySelector('[data-type="keepCurrentExpand"]').addEventListener("click", (event: MouseEvent & {
|
||||
target: Element
|
||||
}) => {
|
||||
const iconElement = hasClosestByClassName(event.target, "block__icon");
|
||||
|
|
@ -157,17 +249,35 @@ export class Outline extends Model {
|
|||
}
|
||||
if (iconElement.classList.contains("block__icon--active")) {
|
||||
iconElement.classList.remove("block__icon--active");
|
||||
window.siyuan.storage[Constants.LOCAL_OUTLINE].keepExpand = false;
|
||||
window.siyuan.storage[Constants.LOCAL_OUTLINE].keepCurrentExpand = false;
|
||||
} else {
|
||||
iconElement.classList.add("block__icon--active");
|
||||
window.siyuan.storage[Constants.LOCAL_OUTLINE].keepExpand = true;
|
||||
this.tree.expandAll();
|
||||
window.siyuan.storage[Constants.LOCAL_OUTLINE].keepCurrentExpand = true;
|
||||
let focusElement;
|
||||
getAllModels().editor.find(editItem => {
|
||||
if (editItem.editor.protyle.block.rootID === this.blockId) {
|
||||
const selection = getSelection();
|
||||
if (selection.rangeCount > 0) {
|
||||
const blockElement = hasClosestBlock(selection.getRangeAt(0).startContainer);
|
||||
if (blockElement) {
|
||||
focusElement = blockElement;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
if (focusElement) {
|
||||
this.setCurrent(focusElement);
|
||||
}
|
||||
}
|
||||
|
||||
// 保存keepCurrentExpand状态到localStorage
|
||||
setStorageVal(Constants.LOCAL_OUTLINE, window.siyuan.storage[Constants.LOCAL_OUTLINE]);
|
||||
});
|
||||
options.tab.panelElement.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => {
|
||||
let target = event.target as HTMLElement;
|
||||
if (target.tagName === "INPUT") {
|
||||
return;
|
||||
}
|
||||
let isFocus = true;
|
||||
while (target && !target.isEqualNode(options.tab.panelElement)) {
|
||||
if (target.classList.contains("block__icon")) {
|
||||
|
|
@ -176,6 +286,15 @@ export class Outline extends Model {
|
|||
case "min":
|
||||
getDockByType("outline").toggleModel("outline", false, true);
|
||||
break;
|
||||
case "search":
|
||||
inputElement.classList.remove("fn__none");
|
||||
inputElement.select();
|
||||
break;
|
||||
case "expandLevel":
|
||||
this.showExpandLevelMenu(target);
|
||||
event.preventDefault();
|
||||
event.stopPropagation();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
} else if (this.blockId && (target === this.headerElement.nextElementSibling || target.classList.contains("block__icons"))) {
|
||||
|
|
@ -250,18 +369,13 @@ export class Outline extends Model {
|
|||
}
|
||||
ghostElement.style.top = moveEvent.clientY + "px";
|
||||
ghostElement.style.left = moveEvent.clientX + "px";
|
||||
dragOverScroll(moveEvent, contentRect, this.element);
|
||||
if (!this.element.contains(moveEvent.target as Element)) {
|
||||
this.element.querySelectorAll(".dragover__top, .dragover__bottom, .dragover, .dragover__current").forEach(item => {
|
||||
item.classList.remove("dragover__top", "dragover__bottom", "dragover", "dragover__current");
|
||||
});
|
||||
return;
|
||||
}
|
||||
if (moveEvent.clientY < contentRect.top + Constants.SIZE_SCROLL_TB || moveEvent.clientY > contentRect.bottom - Constants.SIZE_SCROLL_TB) {
|
||||
this.element.scroll({
|
||||
top: this.element.scrollTop + (moveEvent.clientY < contentRect.top + Constants.SIZE_SCROLL_TB ? -Constants.SIZE_SCROLL_STEP : Constants.SIZE_SCROLL_STEP),
|
||||
behavior: "smooth"
|
||||
});
|
||||
}
|
||||
selectItem = hasClosestByClassName(moveEvent.target as HTMLElement, "b3-list-item") as HTMLElement;
|
||||
if (!selectItem || selectItem.tagName !== "LI" || selectItem.style.position === "fixed") {
|
||||
return;
|
||||
|
|
@ -292,6 +406,8 @@ export class Outline extends Model {
|
|||
documentSelf.onselect = null;
|
||||
ghostElement?.remove();
|
||||
item.style.opacity = "";
|
||||
// 清理滚动动画
|
||||
stopScrollAnimation();
|
||||
if (!selectItem) {
|
||||
selectItem = this.element.querySelector(".dragover__top, .dragover__bottom, .dragover");
|
||||
}
|
||||
|
|
@ -332,6 +448,7 @@ export class Outline extends Model {
|
|||
}
|
||||
if (hasChange) {
|
||||
this.element.setAttribute("data-loading", "true");
|
||||
|
||||
transaction(editor, [{
|
||||
action: "moveOutlineHeading",
|
||||
id: item.dataset.nodeId,
|
||||
|
|
@ -343,6 +460,7 @@ export class Outline extends Model {
|
|||
previousID: undoPreviousID,
|
||||
parentID: undoParentID,
|
||||
}]);
|
||||
|
||||
// https://github.com/siyuan-note/siyuan/issues/10828#issuecomment-2044099675
|
||||
editor.wysiwyg.element.querySelectorAll('[data-type="NodeHeading"] [contenteditable="true"][spellcheck]').forEach(item => {
|
||||
item.setAttribute("contenteditable", "false");
|
||||
|
|
@ -480,8 +598,18 @@ export class Outline extends Model {
|
|||
item.classList.remove("b3-list-item--focus");
|
||||
});
|
||||
let currentElement = this.element.querySelector(`.b3-list-item[data-node-id="${id}"]`) as HTMLElement;
|
||||
while (currentElement && currentElement.clientHeight === 0) {
|
||||
currentElement = currentElement.parentElement.previousElementSibling as HTMLElement;
|
||||
if (window.siyuan.storage[Constants.LOCAL_OUTLINE].keepCurrentExpand) {
|
||||
let ulElement = currentElement.parentElement;
|
||||
while (ulElement && !ulElement.classList.contains("b3-list") && ulElement.tagName === "UL") {
|
||||
ulElement.classList.remove("fn__none");
|
||||
ulElement.previousElementSibling.querySelector(".b3-list-item__arrow").classList.add("b3-list-item__arrow--open");
|
||||
ulElement = ulElement.parentElement;
|
||||
}
|
||||
this.saveExpendIds();
|
||||
} else {
|
||||
while (currentElement && currentElement.clientHeight === 0) {
|
||||
currentElement = currentElement.parentElement.previousElementSibling as HTMLElement;
|
||||
}
|
||||
}
|
||||
if (currentElement) {
|
||||
currentElement.classList.add("b3-list-item--focus");
|
||||
|
|
@ -496,28 +624,31 @@ export class Outline extends Model {
|
|||
if (currentElement) {
|
||||
currentId = currentElement.getAttribute("data-node-id");
|
||||
}
|
||||
|
||||
if (!this.isPreview && this.openNodes[this.blockId]) {
|
||||
this.openNodes[this.blockId] = this.tree.getExpandIds();
|
||||
}
|
||||
const scrollTop = this.element.scrollTop;
|
||||
if (typeof callbackId !== "undefined") {
|
||||
this.blockId = callbackId;
|
||||
}
|
||||
this.tree.updateData(data.data);
|
||||
if (!this.isPreview && this.openNodes[this.blockId] && !this.headerElement.querySelector('[data-type="expand"]').classList.contains("block__icon--active")) {
|
||||
this.tree.setExpandIds(this.openNodes[this.blockId]);
|
||||
} else {
|
||||
this.tree.expandAll();
|
||||
if (!this.isPreview) {
|
||||
this.openNodes[this.blockId] = this.tree.getExpandIds();
|
||||
}
|
||||
}
|
||||
|
||||
if (this.isPreview) {
|
||||
this.tree.element.querySelectorAll(".popover__block").forEach(item => {
|
||||
item.classList.remove("popover__block");
|
||||
});
|
||||
this.element.scrollTop = scrollTop;
|
||||
} else if (this.blockId) {
|
||||
fetchPost("/api/storage/getOutlineStorage", {
|
||||
docID: this.blockId
|
||||
}, storageResponse => {
|
||||
const storageData = storageResponse.data;
|
||||
if (storageData && storageData.expandIds) {
|
||||
this.tree.setExpandIds(storageData.expandIds);
|
||||
}
|
||||
if ((this.headerElement.querySelector("input.b3-text-field.search__label") as HTMLInputElement).value) {
|
||||
this.setFilter();
|
||||
}
|
||||
this.element.scrollTop = scrollTop;
|
||||
});
|
||||
}
|
||||
|
||||
if (currentId) {
|
||||
currentElement = this.element.querySelector(`[data-node-id="${currentId}"]`);
|
||||
if (currentElement) {
|
||||
|
|
@ -526,4 +657,648 @@ export class Outline extends Model {
|
|||
}
|
||||
this.element.removeAttribute("data-loading");
|
||||
}
|
||||
|
||||
public saveExpendIds() {
|
||||
if (window.siyuan.config.readonly || window.siyuan.isPublish) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.isPreview && this.type === "pin") {
|
||||
fetchPost("/api/storage/setOutlineStorage", {
|
||||
docID: this.blockId,
|
||||
val: {
|
||||
expandIds: this.tree.getExpandIds()
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 应用大纲筛选
|
||||
*/
|
||||
private setFilter() {
|
||||
// 还原 display
|
||||
this.element.querySelectorAll('li.b3-list-item[style$="display: none;"]').forEach((item: HTMLElement) => {
|
||||
item.style.display = "";
|
||||
});
|
||||
this.element.querySelectorAll("ul.fn__none").forEach((item) => {
|
||||
item.previousElementSibling.querySelector(".b3-list-item__toggle").classList.remove("fn__hidden");
|
||||
});
|
||||
const keyword = (this.headerElement.querySelector("input.b3-text-field.search__label") as HTMLInputElement).value.toLowerCase();
|
||||
if (keyword) {
|
||||
// 首次筛选时记录折叠状态
|
||||
if (!this.preFilterExpandIds) {
|
||||
this.preFilterExpandIds = this.tree.getExpandIds();
|
||||
}
|
||||
const processUL = (ul: Element) => {
|
||||
let hasMatch = false;
|
||||
let hasChildMatch = false;
|
||||
const children = ul.querySelectorAll(":scope > li.b3-list-item");
|
||||
|
||||
children.forEach((liItem: HTMLElement) => {
|
||||
const nextUlElement = (liItem.nextElementSibling && liItem.nextElementSibling.tagName === "UL") ? liItem.nextElementSibling as HTMLElement : undefined;
|
||||
|
||||
let childResult = {hasMatch: false, hasChildMatch: false};
|
||||
if (nextUlElement) {
|
||||
childResult = processUL(nextUlElement);
|
||||
}
|
||||
|
||||
const arrowElement = liItem.querySelector(".b3-list-item__arrow");
|
||||
if ((liItem.querySelector(".b3-list-item__text")?.textContent || "").trim().toLowerCase().includes(keyword)) {
|
||||
// 当前标题命中
|
||||
liItem.style.display = "";
|
||||
hasMatch = true;
|
||||
|
||||
if (nextUlElement) {
|
||||
nextUlElement.classList.remove("fn__none");
|
||||
if (childResult.hasMatch || childResult.hasChildMatch) {
|
||||
// 子项也有命中
|
||||
arrowElement.classList.add("b3-list-item__arrow--open");
|
||||
nextUlElement.classList.remove("fn__none");
|
||||
} else {
|
||||
// 子项无命中,折叠所有子项
|
||||
arrowElement.classList.remove("b3-list-item__arrow--open");
|
||||
arrowElement.parentElement.classList.add("fn__hidden");
|
||||
nextUlElement.classList.add("fn__none");
|
||||
}
|
||||
}
|
||||
} else if (childResult.hasMatch || childResult.hasChildMatch) {
|
||||
// 当前标题未命中,但子级有命中
|
||||
liItem.style.display = "";
|
||||
hasChildMatch = true;
|
||||
|
||||
if (nextUlElement) {
|
||||
nextUlElement.classList.remove("fn__none");
|
||||
arrowElement.classList.add("b3-list-item__arrow--open");
|
||||
}
|
||||
} else {
|
||||
// 当前标题和子级都未命中,隐藏
|
||||
liItem.style.display = "none";
|
||||
if (nextUlElement) {
|
||||
nextUlElement.classList.add("fn__none");
|
||||
}
|
||||
}
|
||||
});
|
||||
return {hasMatch, hasChildMatch};
|
||||
};
|
||||
|
||||
processUL(this.element.firstElementChild);
|
||||
return;
|
||||
}
|
||||
// 恢复折叠状态
|
||||
this.tree.setExpandIds(this.preFilterExpandIds);
|
||||
this.preFilterExpandIds = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取标题元素的实际标题级别(H1=1, H2=2, 等等)
|
||||
* @param element li元素
|
||||
* @returns 标题级别(1-6)
|
||||
*/
|
||||
private getHeadingLevel(element: HTMLElement) {
|
||||
return parseInt(element.getAttribute("data-subtype")?.replace("h", "") || "0");
|
||||
}
|
||||
|
||||
/**
|
||||
* 展开到指定标题级别
|
||||
* @param targetLevel 目标标题级别,1-6级(H1-H6),6级表示全部展开
|
||||
*/
|
||||
private expandToLevel(targetLevel: number) {
|
||||
if (targetLevel >= 6) {
|
||||
// 全部展开
|
||||
this.tree.expandAll();
|
||||
} else {
|
||||
// 展开到指定标题级别
|
||||
this.element.querySelectorAll("li.b3-list-item").forEach(item => {
|
||||
const headingLevel = this.getHeadingLevel(item as HTMLElement);
|
||||
const arrowElement = item.querySelector(".b3-list-item__arrow");
|
||||
if (item.nextElementSibling && item.nextElementSibling.tagName === "UL" && arrowElement) {
|
||||
if (headingLevel > 0 && headingLevel < targetLevel) {
|
||||
// 当前标题级别小于目标级别,展开
|
||||
arrowElement.classList.add("b3-list-item__arrow--open");
|
||||
item.nextElementSibling.classList.remove("fn__none");
|
||||
} else if (headingLevel >= targetLevel) {
|
||||
// 当前标题级别大于等于目标级别,折叠
|
||||
arrowElement.classList.remove("b3-list-item__arrow--open");
|
||||
item.nextElementSibling.classList.add("fn__none");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
this.saveExpendIds();
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示展开层级菜单
|
||||
*/
|
||||
private showExpandLevelMenu(target: HTMLElement) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_OUTLINE_EXPAND_LEVEL);
|
||||
for (let i = 1; i <= 6; i++) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: `heading${i}`,
|
||||
icon: `iconH${i}`,
|
||||
label: window.siyuan.languages[`heading${i}`],
|
||||
click: () => this.expandToLevel(i)
|
||||
}).element);
|
||||
}
|
||||
const rect = target.getBoundingClientRect();
|
||||
window.siyuan.menus.menu.popup({
|
||||
x: rect.left,
|
||||
y: rect.bottom,
|
||||
h: rect.height
|
||||
});
|
||||
return window.siyuan.menus.menu;
|
||||
}
|
||||
|
||||
/**
|
||||
* 切换同层级的所有标题的展开/折叠状态(基于标题级别而不是DOM层级)
|
||||
*/
|
||||
private collapseSameLevel(element: HTMLElement, expand?: boolean) {
|
||||
// 获取所有相同标题级别的元素
|
||||
this.element.querySelectorAll(`li.b3-list-item[data-subtype="${element.getAttribute("data-subtype")}"]`).forEach(item => {
|
||||
const arrowElement = item.querySelector(".b3-list-item__arrow");
|
||||
if (typeof expand === "undefined") {
|
||||
expand = !element.querySelector(".b3-list-item__arrow").classList.contains("b3-list-item__arrow--open");
|
||||
}
|
||||
if (expand) {
|
||||
if (item.nextElementSibling && item.nextElementSibling.tagName === "UL") {
|
||||
item.nextElementSibling.classList.remove("fn__none");
|
||||
arrowElement.classList.add("b3-list-item__arrow--open");
|
||||
}
|
||||
let ulElement = item.parentElement;
|
||||
while (ulElement && !ulElement.classList.contains("b3-list") && ulElement.tagName === "UL") {
|
||||
ulElement.classList.remove("fn__none");
|
||||
ulElement.previousElementSibling.querySelector(".b3-list-item__arrow").classList.add("b3-list-item__arrow--open");
|
||||
ulElement = ulElement.parentElement;
|
||||
}
|
||||
} else {
|
||||
if (item.nextElementSibling && item.nextElementSibling.tagName === "UL") {
|
||||
item.nextElementSibling.classList.add("fn__none");
|
||||
arrowElement.classList.remove("b3-list-item__arrow--open");
|
||||
}
|
||||
}
|
||||
});
|
||||
this.saveExpendIds();
|
||||
}
|
||||
|
||||
private collapseChildren(element: HTMLElement, expand?: boolean) {
|
||||
const nextElement = element.nextElementSibling;
|
||||
if (!nextElement || nextElement.tagName !== "UL") {
|
||||
return;
|
||||
}
|
||||
const arrowElement = element.querySelector(".b3-list-item__arrow");
|
||||
if (typeof expand === "undefined") {
|
||||
expand = !arrowElement.classList.contains("b3-list-item__arrow--open");
|
||||
}
|
||||
if (expand) {
|
||||
arrowElement.classList.add("b3-list-item__arrow--open");
|
||||
nextElement.classList.remove("fn__none");
|
||||
nextElement.querySelectorAll("ul").forEach(item => {
|
||||
item.previousElementSibling.querySelector(".b3-list-item__arrow").classList.add("b3-list-item__arrow--open");
|
||||
item.classList.remove("fn__none");
|
||||
});
|
||||
} else {
|
||||
arrowElement.classList.remove("b3-list-item__arrow--open");
|
||||
nextElement.classList.add("fn__none");
|
||||
}
|
||||
this.saveExpendIds();
|
||||
}
|
||||
|
||||
/**
|
||||
* 显示右键菜单
|
||||
*/
|
||||
private showContextMenu(element: HTMLElement, event: MouseEvent) {
|
||||
if (this.isPreview) {
|
||||
return; // 预览模式下不显示右键菜单
|
||||
}
|
||||
const currentLevel = this.getHeadingLevel(element);
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_OUTLINE_CONTEXT);
|
||||
const id = element.getAttribute("data-node-id");
|
||||
if (!window.siyuan.config.readonly) {
|
||||
// 升级
|
||||
if (currentLevel > 1) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "upgrade",
|
||||
icon: "iconUp",
|
||||
label: window.siyuan.languages.upgrade,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
if (data) {
|
||||
turnsIntoTransaction({
|
||||
protyle: data.protyle,
|
||||
selectsElement: [data.blockElement],
|
||||
type: "Blocks2Hs",
|
||||
level: currentLevel - 1
|
||||
});
|
||||
}
|
||||
}
|
||||
}).element);
|
||||
}
|
||||
|
||||
// 降级
|
||||
if (currentLevel < 6) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "downgrade",
|
||||
icon: "iconDown",
|
||||
label: window.siyuan.languages.downgrade,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
if (data) {
|
||||
turnsIntoTransaction({
|
||||
protyle: data.protyle,
|
||||
selectsElement: [data.blockElement],
|
||||
type: "Blocks2Hs",
|
||||
level: currentLevel + 1
|
||||
});
|
||||
}
|
||||
}
|
||||
}).element);
|
||||
}
|
||||
|
||||
// 带子标题转换
|
||||
checkFold(id, (zoomIn) => {
|
||||
openFileById({
|
||||
app: this.app,
|
||||
id,
|
||||
action: zoomIn ? [Constants.CB_GET_FOCUS, Constants.CB_GET_ALL, Constants.CB_GET_HTML, Constants.CB_GET_OUTLINE] : [Constants.CB_GET_FOCUS, Constants.CB_GET_OUTLINE, Constants.CB_GET_SETID, Constants.CB_GET_CONTEXT, Constants.CB_GET_HTML],
|
||||
});
|
||||
});
|
||||
this.setCurrentById(id);
|
||||
const headingSubMenu = [];
|
||||
if (currentLevel !== 1) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 1));
|
||||
}
|
||||
if (currentLevel !== 2) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 2));
|
||||
}
|
||||
if (currentLevel !== 3) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 3));
|
||||
}
|
||||
if (currentLevel !== 4) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 4));
|
||||
}
|
||||
if (currentLevel !== 5) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 5));
|
||||
}
|
||||
if (currentLevel !== 6) {
|
||||
headingSubMenu.push(this.genHeadingTransform(id, 6));
|
||||
}
|
||||
|
||||
if (headingSubMenu.length > 0) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "tWithSubtitle",
|
||||
type: "submenu",
|
||||
icon: "iconRefresh",
|
||||
label: window.siyuan.languages.tWithSubtitle,
|
||||
submenu: headingSubMenu
|
||||
}).element);
|
||||
}
|
||||
|
||||
window.siyuan.menus.menu.append(new MenuItem({id: "separator_1", type: "separator"}).element);
|
||||
|
||||
// 在前面插入同级标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "insertSameLevelHeadingBefore",
|
||||
icon: "iconBefore",
|
||||
label: window.siyuan.languages.insertSameLevelHeadingBefore,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
const newId = Lute.NewNodeID();
|
||||
const html = `<div data-subtype="h${currentLevel}" data-node-id="${newId}" data-type="NodeHeading" class="h${currentLevel}"><div contenteditable="true" spellcheck="false"><wbr></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
|
||||
transaction(data.protyle, [{
|
||||
action: "insert",
|
||||
data: html,
|
||||
id: newId,
|
||||
previousID: data.blockElement.previousElementSibling?.getAttribute("data-node-id"),
|
||||
parentID: data.blockElement.parentElement.getAttribute("data-node-id") || data.protyle.block.parentID,
|
||||
}], [{
|
||||
action: "delete",
|
||||
id: newId
|
||||
}]);
|
||||
data.blockElement.insertAdjacentHTML("beforebegin", html);
|
||||
data.blockElement.previousElementSibling.scrollIntoView();
|
||||
focusByWbr(data.blockElement.previousElementSibling, document.createRange());
|
||||
}
|
||||
}).element);
|
||||
|
||||
// 在后面插入同级标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "insertSameLevelHeadingAfter",
|
||||
icon: "iconAfter",
|
||||
label: window.siyuan.languages.insertSameLevelHeadingAfter,
|
||||
click: () => {
|
||||
fetchPost("/api/block/getHeadingDeleteTransaction", {
|
||||
id,
|
||||
}, (deleteResponse) => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
const previousID = deleteResponse.data.doOperations[deleteResponse.data.doOperations.length - 1].id;
|
||||
|
||||
const newId = Lute.NewNodeID();
|
||||
const html = `<div data-subtype="h${currentLevel}" data-node-id="${newId}" data-type="NodeHeading" class="h${currentLevel}"><div contenteditable="true" spellcheck="false"><wbr></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
|
||||
transaction(data.protyle, [{
|
||||
action: "insert",
|
||||
data: html,
|
||||
id: newId,
|
||||
previousID,
|
||||
}], [{
|
||||
action: "delete",
|
||||
id: newId
|
||||
}]);
|
||||
const previousElement = data.protyle.wysiwyg.element.querySelector(`[data-node-id="${previousID}"]`);
|
||||
if (previousElement) {
|
||||
previousElement.insertAdjacentHTML("afterend", html);
|
||||
previousElement.nextElementSibling.scrollIntoView();
|
||||
focusByWbr(previousElement.nextElementSibling, document.createRange());
|
||||
}
|
||||
});
|
||||
}
|
||||
}).element);
|
||||
|
||||
// 添加子标题
|
||||
if (currentLevel < 6) { // 只有当前级别小于6时才能添加子标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "addChildHeading",
|
||||
icon: "iconAdd",
|
||||
label: window.siyuan.languages.addChildHeading,
|
||||
click: () => {
|
||||
fetchPost("/api/block/getHeadingDeleteTransaction", {
|
||||
id,
|
||||
}, (deleteResponse) => {
|
||||
let previousID = deleteResponse.data.doOperations[deleteResponse.data.doOperations.length - 1].id;
|
||||
deleteResponse.data.undoOperations.find((operationsItem: IOperation, index: number) => {
|
||||
const startIndex = operationsItem.data.indexOf(' data-subtype="h');
|
||||
if (startIndex > -1 && startIndex < 260 && parseInt(operationsItem.data.substring(startIndex + 16, startIndex + 17)) === currentLevel + 1) {
|
||||
previousID = deleteResponse.data.undoOperations[index - 1].id;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
const newId = Lute.NewNodeID();
|
||||
const html = `<div data-subtype="h${currentLevel + 1}" data-node-id="${newId}" data-type="NodeHeading" class="h${currentLevel + 1}"><div contenteditable="true" spellcheck="false"><wbr></div><div class="protyle-attr" contenteditable="false">${Constants.ZWSP}</div></div>`;
|
||||
transaction(data.protyle, [{
|
||||
action: "insert",
|
||||
data: html,
|
||||
id: newId,
|
||||
previousID,
|
||||
}], [{
|
||||
action: "delete",
|
||||
id: newId
|
||||
}]);
|
||||
const previousElement = data.protyle.wysiwyg.element.querySelector(`[data-node-id="${previousID}"]`);
|
||||
if (previousElement) {
|
||||
previousElement.insertAdjacentHTML("afterend", html);
|
||||
previousElement.nextElementSibling.scrollIntoView();
|
||||
focusByWbr(previousElement.nextElementSibling, document.createRange());
|
||||
}
|
||||
});
|
||||
}
|
||||
}).element);
|
||||
}
|
||||
|
||||
window.siyuan.menus.menu.append(new MenuItem({id: "separator_2", type: "separator"}).element);
|
||||
}
|
||||
|
||||
// 复制带子标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "copyHeadings1",
|
||||
icon: "iconCopy",
|
||||
label: `${window.siyuan.languages.copy} ${window.siyuan.languages.headings1}`,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
fetchPost("/api/block/getHeadingChildrenDOM", {
|
||||
id,
|
||||
removeFoldAttr: data.blockElement.getAttribute("fold") !== "1"
|
||||
}, (response) => {
|
||||
if (isInAndroid()) {
|
||||
window.JSAndroid.writeHTMLClipboard(data.protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
|
||||
} else if (isInHarmony()) {
|
||||
window.JSHarmony.writeHTMLClipboard(data.protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
|
||||
} else {
|
||||
writeText(response.data + Constants.ZWSP);
|
||||
}
|
||||
});
|
||||
}
|
||||
}).element);
|
||||
|
||||
if (!window.siyuan.config.readonly) {
|
||||
// 剪切带子标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "cutHeadings1",
|
||||
icon: "iconCut",
|
||||
label: `${window.siyuan.languages.cut} ${window.siyuan.languages.headings1}`,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
fetchPost("/api/block/getHeadingChildrenDOM", {
|
||||
id,
|
||||
removeFoldAttr: data.blockElement.getAttribute("fold") !== "1"
|
||||
}, (response) => {
|
||||
if (isInAndroid()) {
|
||||
window.JSAndroid.writeHTMLClipboard(data.protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
|
||||
} else if (isInHarmony()) {
|
||||
window.JSHarmony.writeHTMLClipboard(data.protyle.lute.BlockDOM2StdMd(response.data).trimEnd(), response.data + Constants.ZWSP);
|
||||
} else {
|
||||
writeText(response.data + Constants.ZWSP);
|
||||
}
|
||||
fetchPost("/api/block/getHeadingDeleteTransaction", {
|
||||
id,
|
||||
}, (deleteResponse) => {
|
||||
deleteResponse.data.doOperations.forEach((operation: IOperation) => {
|
||||
data.protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.id}"]`).forEach((itemElement: HTMLElement) => {
|
||||
itemElement.remove();
|
||||
});
|
||||
});
|
||||
if (data.protyle.wysiwyg.element.childElementCount === 0) {
|
||||
const newID = Lute.NewNodeID();
|
||||
const emptyElement = genEmptyElement(false, false, newID);
|
||||
data.protyle.wysiwyg.element.insertAdjacentElement("afterbegin", emptyElement);
|
||||
deleteResponse.data.doOperations.push({
|
||||
action: "insert",
|
||||
data: emptyElement.outerHTML,
|
||||
id: newID,
|
||||
parentID: data.protyle.block.parentID
|
||||
});
|
||||
deleteResponse.data.undoOperations.push({
|
||||
action: "delete",
|
||||
id: newID,
|
||||
});
|
||||
focusBlock(emptyElement);
|
||||
}
|
||||
transaction(data.protyle, deleteResponse.data.doOperations, deleteResponse.data.undoOperations);
|
||||
});
|
||||
});
|
||||
}
|
||||
}).element);
|
||||
|
||||
// 删除
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "deleteHeadings1",
|
||||
icon: "iconTrashcan",
|
||||
label: `${window.siyuan.languages.delete} ${window.siyuan.languages.headings1}`,
|
||||
click: () => {
|
||||
const data = this.getProtyleAndBlockElement(element);
|
||||
fetchPost("/api/block/getHeadingDeleteTransaction", {
|
||||
id,
|
||||
}, (response) => {
|
||||
response.data.doOperations.forEach((operation: IOperation) => {
|
||||
data.protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.id}"]`).forEach((itemElement: HTMLElement) => {
|
||||
itemElement.remove();
|
||||
});
|
||||
});
|
||||
if (data.protyle.wysiwyg.element.childElementCount === 0) {
|
||||
const newID = Lute.NewNodeID();
|
||||
const emptyElement = genEmptyElement(false, false, newID);
|
||||
data.protyle.wysiwyg.element.insertAdjacentElement("afterbegin", emptyElement);
|
||||
response.data.doOperations.push({
|
||||
action: "insert",
|
||||
data: emptyElement.outerHTML,
|
||||
id: newID,
|
||||
parentID: data.protyle.block.parentID
|
||||
});
|
||||
response.data.undoOperations.push({
|
||||
action: "delete",
|
||||
id: newID,
|
||||
});
|
||||
focusBlock(emptyElement);
|
||||
}
|
||||
transaction(data.protyle, response.data.doOperations, response.data.undoOperations);
|
||||
});
|
||||
}
|
||||
}).element);
|
||||
}
|
||||
window.siyuan.menus.menu.append(new MenuItem({id: "separator_3", type: "separator"}).element);
|
||||
|
||||
// 展开子标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "expandChildHeading",
|
||||
icon: "iconExpand",
|
||||
label: window.siyuan.languages.expandChildHeading,
|
||||
accelerator: "⌘" + window.siyuan.languages.clickArrow,
|
||||
click: () => this.collapseChildren(element, true)
|
||||
}).element);
|
||||
|
||||
// 折叠子标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "foldChildHeading",
|
||||
icon: "iconContract",
|
||||
label: window.siyuan.languages.foldChildHeading,
|
||||
accelerator: "⌘" + window.siyuan.languages.clickArrow,
|
||||
click: () => this.collapseChildren(element, false)
|
||||
}).element);
|
||||
|
||||
// 展开同级标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "expandSameLevelHeading",
|
||||
icon: "iconExpand",
|
||||
label: window.siyuan.languages.expandSameLevelHeading,
|
||||
accelerator: "⌥" + window.siyuan.languages.clickArrow,
|
||||
click: () => this.collapseSameLevel(element, true)
|
||||
}).element);
|
||||
|
||||
// 折叠同级标题
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "foldSameLevelHeading",
|
||||
icon: "iconContract",
|
||||
label: window.siyuan.languages.foldSameLevelHeading,
|
||||
accelerator: "⌥" + window.siyuan.languages.clickArrow,
|
||||
click: () => this.collapseSameLevel(element, false)
|
||||
}).element);
|
||||
|
||||
// 全部展开
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "expandAll",
|
||||
icon: "iconExpand",
|
||||
label: window.siyuan.languages.expandAll,
|
||||
click: () => {
|
||||
this.tree.expandAll();
|
||||
this.saveExpendIds();
|
||||
}
|
||||
}).element);
|
||||
|
||||
// 全部折叠
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "foldAll",
|
||||
icon: "iconContract",
|
||||
label: window.siyuan.languages.foldAll,
|
||||
click: () => {
|
||||
this.tree.collapseAll();
|
||||
this.saveExpendIds();
|
||||
}
|
||||
}).element);
|
||||
|
||||
window.siyuan.menus.menu.popup({
|
||||
x: event.clientX,
|
||||
y: event.clientY
|
||||
});
|
||||
}
|
||||
|
||||
private getProtyleAndBlockElement(element: HTMLElement) {
|
||||
const id = element.getAttribute("data-node-id");
|
||||
let protyle: IProtyle;
|
||||
let blockElement: HTMLElement;
|
||||
getAllModels().editor.find(editItem => {
|
||||
if (editItem.editor.protyle.block.rootID === this.blockId) {
|
||||
protyle = editItem.editor.protyle;
|
||||
blockElement = protyle.wysiwyg.element.querySelector(`[data-node-id="${id}"]`);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!protyle || !blockElement) {
|
||||
return;
|
||||
}
|
||||
return {
|
||||
protyle, blockElement
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成标题级别转换菜单项
|
||||
*/
|
||||
private genHeadingTransform(id: string, level: number) {
|
||||
return {
|
||||
id: "heading" + level,
|
||||
iconHTML: "",
|
||||
icon: "iconHeading" + level,
|
||||
label: window.siyuan.languages["heading" + level],
|
||||
click: () => {
|
||||
let protyle: IProtyle;
|
||||
getAllModels().editor.find(editItem => {
|
||||
if (editItem.editor.protyle.block.rootID === this.blockId) {
|
||||
protyle = editItem.editor.protyle;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!protyle) {
|
||||
return;
|
||||
}
|
||||
|
||||
fetchPost("/api/block/getHeadingLevelTransaction", {
|
||||
id,
|
||||
level
|
||||
}, (response) => {
|
||||
response.data.doOperations.forEach((operation: any, index: number) => {
|
||||
protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.id}"]`).forEach((itemElement: HTMLElement) => {
|
||||
itemElement.outerHTML = operation.data;
|
||||
});
|
||||
// 使用 outer 后元素需要重新查询
|
||||
protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.id}"]`).forEach((itemElement: HTMLElement) => {
|
||||
mathRender(itemElement);
|
||||
});
|
||||
if (index === 0) {
|
||||
const focusElement = protyle.wysiwyg.element.querySelector(`[data-node-id="${operation.id}"]`);
|
||||
if (focusElement) {
|
||||
focusElement.scrollIntoView({behavior: "smooth", block: "center"});
|
||||
}
|
||||
}
|
||||
});
|
||||
transaction(protyle, response.data.doOperations, response.data.undoOperations);
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -10,6 +10,7 @@ import {MenuItem} from "../../menus/Menu";
|
|||
import {App} from "../../index";
|
||||
import {openTagMenu} from "../../menus/tag";
|
||||
import {hasClosestByClassName} from "../../protyle/util/hasClosest";
|
||||
import {Constants} from "../../constants";
|
||||
|
||||
export class Tag extends Model {
|
||||
private openNodes: string[];
|
||||
|
|
@ -174,17 +175,19 @@ export class Tag extends Model {
|
|||
target = target.parentElement;
|
||||
}
|
||||
});
|
||||
this.update();
|
||||
this.update(false);
|
||||
}
|
||||
|
||||
public update() {
|
||||
public update(ignoreMaxListHint = true) {
|
||||
const element = this.element.querySelector('.block__icon[data-type="refresh"] svg');
|
||||
if (element.classList.contains("fn__rotate")) {
|
||||
return;
|
||||
}
|
||||
element.classList.add("fn__rotate");
|
||||
fetchPost("/api/tag/getTag", {
|
||||
sort: window.siyuan.config.tag.sort
|
||||
sort: window.siyuan.config.tag.sort,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
ignoreMaxListHint
|
||||
}, response => {
|
||||
if (this.openNodes) {
|
||||
this.openNodes = this.tree.getExpandIds();
|
||||
|
|
|
|||
|
|
@ -3,11 +3,13 @@ import {Tab} from "../Tab";
|
|||
import {Graph} from "./Graph";
|
||||
import {Outline} from "./Outline";
|
||||
import {fixWndFlex1, getInstanceById, getWndByLayout, saveLayout, switchWnd} from "../util";
|
||||
import {resizeTabs} from "../tabUtil";
|
||||
import {getDockByType, resizeTabs} from "../tabUtil";
|
||||
import {Backlink} from "./Backlink";
|
||||
import {App} from "../../index";
|
||||
import {Wnd} from "../Wnd";
|
||||
import {fetchSyncPost} from "../../util/fetch";
|
||||
import {Files} from "./Files";
|
||||
import {Editor} from "../../editor";
|
||||
|
||||
export const openBacklink = async (options: {
|
||||
app: App,
|
||||
|
|
@ -234,3 +236,23 @@ export const clearOBG = () => {
|
|||
item.render(undefined);
|
||||
});
|
||||
};
|
||||
|
||||
export const selectOpenTab = async () => {
|
||||
const dockFile = getDockByType("file");
|
||||
if (!dockFile) {
|
||||
return false;
|
||||
}
|
||||
const files = dockFile.data.file as Files;
|
||||
const element = document.querySelector(".layout__wnd--active > .fn__flex > .layout-tab-bar > .item--focus") ||
|
||||
document.querySelector("ul.layout-tab-bar > .item--focus");
|
||||
if (element) {
|
||||
const tab = getInstanceById(element.getAttribute("data-id")) as Tab;
|
||||
if (tab && tab.model instanceof Editor) {
|
||||
tab.model.editor.protyle.wysiwyg.element.blur();
|
||||
tab.model.editor.protyle.title.editElement.blur();
|
||||
await files.selectItem(tab.model.editor.protyle.notebookId, tab.model.editor.protyle.path);
|
||||
files.lastSelectedElement = files.element.querySelector(".b3-list-item--focus");
|
||||
}
|
||||
}
|
||||
dockFile.toggleModel("file", true);
|
||||
};
|
||||
|
|
|
|||
|
|
@ -39,12 +39,12 @@ export const initStatus = (isWindow = false) => {
|
|||
break;
|
||||
} else if (target.classList.contains("status__backgroundtask")) {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "statusBackgroundTask") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_STATUS_BACKGROUND_TASK) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "statusBackgroundTask");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_STATUS_BACKGROUND_TASK);
|
||||
JSON.parse(target.getAttribute("data-tasks")).forEach((item: { action: string }) => {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
type: "readonly",
|
||||
|
|
@ -58,12 +58,12 @@ export const initStatus = (isWindow = false) => {
|
|||
break;
|
||||
} else if (target.id === "statusHelp") {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "statusHelp") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_STATUS_HELP) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "statusHelp");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_STATUS_HELP);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
label: window.siyuan.languages.userGuide,
|
||||
icon: "iconHelp",
|
||||
|
|
|
|||
|
|
@ -75,12 +75,12 @@ export const initBar = (app: App) => {
|
|||
break;
|
||||
} else if (targetId === "barMore") {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "barmore") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BAR_MORE) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "barmore");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BAR_MORE);
|
||||
(target.getAttribute("data-hideids") || "").split(",").forEach((itemId) => {
|
||||
const hideElement = toolbarElement.querySelector("#" + itemId);
|
||||
const useElement = hideElement.querySelector("use");
|
||||
|
|
@ -127,12 +127,12 @@ export const initBar = (app: App) => {
|
|||
break;
|
||||
} else if (targetId === "barMode") {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "barmode") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BAR_MODE) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "barmode");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BAR_MODE);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "themeLight",
|
||||
label: window.siyuan.languages.themeLight,
|
||||
|
|
@ -191,12 +191,12 @@ export const initBar = (app: App) => {
|
|||
break;
|
||||
} else if (targetId === "barZoom") {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "barZoom") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BAR_ZOOM) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "barZoom");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BAR_ZOOM);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
label: window.siyuan.languages.zoomIn,
|
||||
icon: "iconZoomIn",
|
||||
|
|
|
|||
|
|
@ -578,7 +578,7 @@ export const layoutToJSON = (layout: Layout | Wnd | Tab | Model, json: any, brea
|
|||
json.blockId = layout.editor.protyle.block.id;
|
||||
json.rootId = layout.editor.protyle.block.rootID;
|
||||
json.mode = layout.editor.protyle.preview.element.classList.contains("fn__none") ? "wysiwyg" : "preview";
|
||||
json.action = layout.editor.protyle.block.showAll ? Constants.CB_GET_ALL : Constants.CB_GET_SCROLL;
|
||||
json.action = (layout.editor.protyle.block.showAll && layout.editor.protyle.block.id !== layout.editor.protyle.block.rootID) ? Constants.CB_GET_ALL : Constants.CB_GET_SCROLL;
|
||||
json.instance = "Editor";
|
||||
} else if (layout instanceof Asset) {
|
||||
json.path = layout.path;
|
||||
|
|
@ -744,13 +744,20 @@ export const newModelByInitData = (app: App, tab: Tab, json: any) => {
|
|||
});
|
||||
}
|
||||
} else if (json.instance === "Editor") {
|
||||
if (json.rootId === json.blockId && json.action) {
|
||||
if (typeof json.action === "string") {
|
||||
json.action = json.action.replace(Constants.CB_GET_ALL, "");
|
||||
} else if (typeof json.action === "object" && Array.isArray(json.action)) {
|
||||
json.action = json.action.filter((item: string) => item !== Constants.CB_GET_ALL);
|
||||
}
|
||||
}
|
||||
model = new Editor({
|
||||
app,
|
||||
tab,
|
||||
rootId: json.rootId,
|
||||
blockId: json.blockId,
|
||||
mode: json.mode,
|
||||
action: typeof json.action === "string" ? [json.action] : json.action,
|
||||
action: typeof json.action === "string" ? (json.action ? [json.action, Constants.CB_GET_FOCUS] : [Constants.CB_GET_FOCUS]) : json.action.concat(Constants.CB_GET_FOCUS),
|
||||
});
|
||||
}
|
||||
return model;
|
||||
|
|
|
|||
|
|
@ -89,8 +89,10 @@ export class Menu {
|
|||
|
||||
public addItem(option: IMenu) {
|
||||
const menuItem = new MenuItem(option);
|
||||
this.append(menuItem.element, option.index);
|
||||
return menuItem.element;
|
||||
if (menuItem) {
|
||||
this.append(menuItem.element, option.index);
|
||||
return menuItem.element;
|
||||
}
|
||||
}
|
||||
|
||||
public removeScrollEvent() {
|
||||
|
|
@ -120,7 +122,7 @@ export class Menu {
|
|||
this.element.classList.remove("b3-menu--list", "b3-menu--fullscreen");
|
||||
this.element.removeAttribute("style"); // zIndex
|
||||
this.element.removeAttribute("data-name"); // 标识再次点击不消失
|
||||
this.element.removeAttribute("data-from"); // 标识是否在浮窗内打开
|
||||
this.element.removeAttribute("data-from"); // 标识菜单入口
|
||||
this.data = undefined; // 移除数据
|
||||
}
|
||||
|
||||
|
|
@ -236,7 +238,7 @@ export class MenuItem {
|
|||
html = `<svg class="b3-menu__icon ${options.iconClass || ""}" style="${options.icon === "iconClose" ? "height:10px;" : ""}"><use xlink:href="#${options.icon || ""}"></use></svg>${html}`;
|
||||
}
|
||||
if (options.accelerator) {
|
||||
html += `<span class="b3-menu__accelerator">${updateHotkeyTip(options.accelerator)}</span>`;
|
||||
html += `<span class="b3-menu__accelerator b3-menu__accelerator--hotkey">${updateHotkeyTip(options.accelerator)}</span>`;
|
||||
}
|
||||
if (options.action) {
|
||||
html += `<svg class="b3-menu__action${options.action === "iconCloseRound" ? " b3-menu__action--close" : ""}"><use xlink:href="#${options.action}"></use></svg>`;
|
||||
|
|
@ -258,7 +260,7 @@ export class MenuItem {
|
|||
submenuElement.classList.add("b3-menu__submenu");
|
||||
submenuElement.innerHTML = '<div class="b3-menu__items"></div>';
|
||||
options.submenu.forEach((item) => {
|
||||
submenuElement.firstElementChild.append(new MenuItem(item).element);
|
||||
submenuElement.firstElementChild.append(new MenuItem(item)?.element || "");
|
||||
});
|
||||
this.element.insertAdjacentHTML("beforeend", '<svg class="b3-menu__icon b3-menu__icon--small"><use xlink:href="#iconRight"></use></svg>');
|
||||
this.element.append(submenuElement);
|
||||
|
|
|
|||
|
|
@ -11,7 +11,7 @@ import {Constants} from "../constants";
|
|||
|
||||
export const openBookmarkMenu = (element: HTMLElement, event: MouseEvent, bookmarkObj: Bookmark | MobileBookmarks) => {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "bookmarkMenu") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BOOKMARK) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
|
|
@ -92,6 +92,6 @@ export const openBookmarkMenu = (element: HTMLElement, event: MouseEvent, bookma
|
|||
}
|
||||
}).element);
|
||||
}
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "bookmarkMenu");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BOOKMARK);
|
||||
window.siyuan.menus.menu.popup({x: event.clientX - 11, y: event.clientY + 11, h: 22, w: 12});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ import {confirmDialog} from "../dialog/confirmDialog";
|
|||
import {getSearch, isMobile, isValidAttrName} from "../util/functions";
|
||||
import {isLocalPath, movePathTo, moveToPath, pathPosix} from "../util/pathName";
|
||||
import {MenuItem} from "./Menu";
|
||||
import {saveExport} from "../protyle/export";
|
||||
import {onExport, saveExport} from "../protyle/export";
|
||||
import {isInAndroid, isInHarmony, openByMobile, writeText} from "../protyle/util/compatibility";
|
||||
import {fetchPost, fetchSyncPost} from "../util/fetch";
|
||||
import {hideMessage, showMessage} from "../dialog/message";
|
||||
|
|
@ -24,6 +24,8 @@ import {openAssetNewWindow} from "../window/openNewWindow";
|
|||
import {escapeHtml} from "../util/escape";
|
||||
import {copyTextByType} from "../protyle/toolbar/util";
|
||||
import {hideElements} from "../protyle/ui/hideElements";
|
||||
import {Protyle} from "../protyle";
|
||||
import {getAllEditor} from "../layout/getAll";
|
||||
|
||||
const bindAttrInput = (inputElement: HTMLInputElement, id: string) => {
|
||||
inputElement.addEventListener("change", () => {
|
||||
|
|
@ -160,6 +162,20 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
|
|||
let notifyHTML = "";
|
||||
let hasAV = false;
|
||||
const range = getSelection().rangeCount > 0 ? getSelection().getRangeAt(0) : null;
|
||||
let ghostProtyle: Protyle;
|
||||
if (!protyle) {
|
||||
getAllEditor().find(item => {
|
||||
if (attrs.id === item.protyle.block.rootID) {
|
||||
protyle = item.protyle;
|
||||
return true;
|
||||
}
|
||||
});
|
||||
if (!protyle) {
|
||||
ghostProtyle = new Protyle(window.siyuan.ws.app, document.createElement("div"), {
|
||||
blockId: attrs.id,
|
||||
});
|
||||
}
|
||||
}
|
||||
Object.keys(attrs).forEach(item => {
|
||||
if (Constants.CUSTOM_RIFF_DECKS === item || item.startsWith("custom-sy-")) {
|
||||
return;
|
||||
|
|
@ -247,6 +263,8 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
|
|||
focusByRange(range);
|
||||
if (protyle) {
|
||||
hideElements(["select"], protyle);
|
||||
} else {
|
||||
ghostProtyle.destroy();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
|
@ -266,8 +284,8 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
|
|||
target.classList.add("item--focus");
|
||||
dialog.element.querySelectorAll(".custom-attr").forEach((item: HTMLElement) => {
|
||||
if (item.dataset.type === target.dataset.type) {
|
||||
if (item.dataset.type === "NodeAttributeView" && item.innerHTML === "" && protyle) {
|
||||
renderAVAttribute(item, attrs.id, protyle);
|
||||
if (item.dataset.type === "NodeAttributeView" && item.innerHTML === "") {
|
||||
renderAVAttribute(item, attrs.id, protyle || ghostProtyle.protyle);
|
||||
}
|
||||
item.classList.remove("fn__none");
|
||||
} else {
|
||||
|
|
@ -370,7 +388,7 @@ export const openFileAttr = (attrs: IObject, focusName = "bookmark", protyle?: I
|
|||
}
|
||||
};
|
||||
|
||||
export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle?: IProtyle) => {
|
||||
export const openAttr = (nodeElement: Element, focusName = "bookmark", protyle: IProtyle) => {
|
||||
if (nodeElement.getAttribute("data-type") === "NodeThematicBreak") {
|
||||
return;
|
||||
}
|
||||
|
|
@ -448,7 +466,7 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El
|
|||
}
|
||||
}
|
||||
}];
|
||||
|
||||
|
||||
if (stdMarkdownId) {
|
||||
menuItems.push({
|
||||
id: "copyMarkdown",
|
||||
|
|
@ -472,7 +490,7 @@ export const copySubMenu = (ids: string[], accelerator = true, focusElement?: El
|
|||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
return menuItems;
|
||||
};
|
||||
|
||||
|
|
@ -734,7 +752,34 @@ export const exportMd = (id: string) => {
|
|||
}
|
||||
},
|
||||
]
|
||||
}
|
||||
},
|
||||
/// #else
|
||||
{
|
||||
id: "exportPDF",
|
||||
label: window.siyuan.languages.print,
|
||||
icon: "iconPDF",
|
||||
ignore: !isInAndroid() && !isInHarmony(),
|
||||
click: () => {
|
||||
const msId = showMessage(window.siyuan.languages.exporting);
|
||||
const localData = window.siyuan.storage[Constants.LOCAL_EXPORTPDF];
|
||||
fetchPost("/api/export/exportPreviewHTML", {
|
||||
id,
|
||||
keepFold: localData.keepFold,
|
||||
merge: localData.mergeSubdocs,
|
||||
}, async response => {
|
||||
const html = await onExport(response, undefined, {type: "pdf", id});
|
||||
if (isInAndroid()) {
|
||||
window.JSAndroid.print(html);
|
||||
} else if (isInHarmony()) {
|
||||
window.JSHarmony.print(html);
|
||||
}
|
||||
|
||||
setTimeout(() => {
|
||||
hideMessage(msId);
|
||||
}, 3000);
|
||||
});
|
||||
}
|
||||
},
|
||||
/// #endif
|
||||
]
|
||||
}).element;
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ import {openByMobile} from "../protyle/util/compatibility";
|
|||
import {addFilesToDatabase} from "../protyle/render/av/addToDatabase";
|
||||
|
||||
const initMultiMenu = (selectItemElements: Element[], app: App) => {
|
||||
window.siyuan.menus.menu.element.setAttribute("data-from", Constants.MENU_FROM_DOC_TREE_MORE_ITEMS);
|
||||
const items: { id: string, path: string }[] = [];
|
||||
const blockIDs: string[] = [];
|
||||
const fileItemElements = selectItemElements.filter(item => {
|
||||
|
|
@ -191,6 +192,7 @@ const initMultiMenu = (selectItemElements: Element[], app: App) => {
|
|||
|
||||
export const initNavigationMenu = (app: App, liElement: HTMLElement) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_DOC_TREE_MORE);
|
||||
const fileElement = hasClosestByTag(liElement, "DIV");
|
||||
if (!fileElement) {
|
||||
return window.siyuan.menus.menu;
|
||||
|
|
@ -207,6 +209,7 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => {
|
|||
if (selectItemElements.length > 1) {
|
||||
return initMultiMenu(selectItemElements, app);
|
||||
}
|
||||
window.siyuan.menus.menu.element.setAttribute("data-from", Constants.MENU_FROM_DOC_TREE_MORE_NOTEBOOK);
|
||||
const notebookId = liElement.parentElement.getAttribute("data-url");
|
||||
const name = getNotebookName(notebookId);
|
||||
if (!window.siyuan.config.readonly) {
|
||||
|
|
@ -422,6 +425,7 @@ export const initNavigationMenu = (app: App, liElement: HTMLElement) => {
|
|||
|
||||
export const initFileMenu = (app: App, notebookId: string, pathString: string, liElement: Element) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_DOC_TREE_MORE);
|
||||
const fileElement = hasClosestByTag(liElement, "DIV");
|
||||
if (!fileElement) {
|
||||
return window.siyuan.menus.menu;
|
||||
|
|
@ -713,7 +717,7 @@ export const initFileMenu = (app: App, notebookId: string, pathString: string, l
|
|||
separatorPosition: "top",
|
||||
});
|
||||
}
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "docTreeMore");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-from", Constants.MENU_FROM_DOC_TREE_MORE_DOC);
|
||||
return window.siyuan.menus.menu;
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,8 +1,10 @@
|
|||
import {
|
||||
hasClosestBlock,
|
||||
hasClosestByAttribute,
|
||||
hasClosestByClassName, hasClosestByTag,
|
||||
hasTopClosestByClassName
|
||||
hasClosestByClassName,
|
||||
hasClosestByTag,
|
||||
hasTopClosestByClassName,
|
||||
isInEmbedBlock
|
||||
} from "../protyle/util/hasClosest";
|
||||
import {MenuItem} from "./Menu";
|
||||
import {focusBlock, focusByRange, focusByWbr, getEditorRange, selectAll,} from "../protyle/util/selection";
|
||||
|
|
@ -24,13 +26,7 @@ import {transaction, updateTransaction} from "../protyle/wysiwyg/transaction";
|
|||
import {openMenu} from "./commonMenuItem";
|
||||
import {fetchPost, fetchSyncPost} from "../util/fetch";
|
||||
import {Constants} from "../constants";
|
||||
import {
|
||||
copyPlainText,
|
||||
readClipboard,
|
||||
setStorageVal,
|
||||
updateHotkeyTip,
|
||||
writeText
|
||||
} from "../protyle/util/compatibility";
|
||||
import {copyPlainText, readClipboard, setStorageVal, updateHotkeyTip, writeText} from "../protyle/util/compatibility";
|
||||
import {preventScroll} from "../protyle/scroll/preventScroll";
|
||||
import {onGet} from "../protyle/util/onGet";
|
||||
import {getAllModels} from "../layout/getAll";
|
||||
|
|
@ -99,7 +95,7 @@ const renderAssetList = (element: Element, k: string, position: IPosition, exts:
|
|||
};
|
||||
|
||||
export const assetMenu = (protyle: IProtyle, position: IPosition, callback?: (url: string, name: string) => void, exts?: string[]) => {
|
||||
const menu = new Menu("background-asset");
|
||||
const menu = new Menu(Constants.MENU_BACKGROUND_ASSET);
|
||||
if (menu.isOpen) {
|
||||
return;
|
||||
}
|
||||
|
|
@ -218,6 +214,7 @@ export const fileAnnotationRefMenu = (protyle: IProtyle, refElement: HTMLElement
|
|||
const id = nodeElement.getAttribute("data-node-id");
|
||||
let oldHTML = nodeElement.outerHTML;
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_FILE_ANNOTATION_REF);
|
||||
let anchorElement: HTMLInputElement;
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "idAndAnchor",
|
||||
|
|
@ -352,6 +349,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
|
|||
const id = nodeElement.getAttribute("data-node-id");
|
||||
let oldHTML = nodeElement.outerHTML;
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_REF);
|
||||
if (!protyle.disabled) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "anchor",
|
||||
|
|
@ -710,6 +708,7 @@ export const refMenu = (protyle: IProtyle, element: HTMLElement) => {
|
|||
export const contentMenu = (protyle: IProtyle, nodeElement: Element) => {
|
||||
const range = getEditorRange(nodeElement);
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_CONTEXT);
|
||||
/// #if MOBILE
|
||||
protyle.toolbar.showContent(protyle, range, nodeElement);
|
||||
/// #else
|
||||
|
|
@ -1021,7 +1020,7 @@ export const zoomOut = (options: {
|
|||
}
|
||||
focusBlock(showElement);
|
||||
const resizeObserver = new ResizeObserver(() => {
|
||||
scrollCenter(options.protyle, focusElement, true, "smooth");
|
||||
scrollCenter(options.protyle, focusElement, true);
|
||||
});
|
||||
resizeObserver.observe(options.protyle.wysiwyg.element);
|
||||
setTimeout(() => {
|
||||
|
|
@ -1078,6 +1077,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
|
|||
clientY: number
|
||||
}) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_IMG);
|
||||
const nodeElement = hasClosestBlock(assetElement);
|
||||
if (!nodeElement) {
|
||||
return;
|
||||
|
|
@ -1087,6 +1087,10 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
|
|||
const imgElement = assetElement.querySelector("img");
|
||||
const titleElement = assetElement.querySelector(".protyle-action__title span") as HTMLElement;
|
||||
const html = nodeElement.outerHTML;
|
||||
let src = imgElement.getAttribute("src");
|
||||
if (!src) {
|
||||
src = "";
|
||||
}
|
||||
if (!protyle.disabled) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "imageUrlAndTitleAndTooltipText",
|
||||
|
|
@ -1098,7 +1102,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
|
|||
<span data-action="copy" class="block__icon block__icon--show b3-tooltips b3-tooltips__e fn__flex-center" aria-label="${window.siyuan.languages.copy}">
|
||||
<svg><use xlink:href="#iconCopy"></use></svg>
|
||||
</span>
|
||||
</div><textarea spellcheck="false" style="margin:4px 0;width: ${isMobile() ? "100%" : "360px"}" rows="1" class="b3-text-field">${imgElement.getAttribute("src")}</textarea><div class="fn__hr"></div><div class="fn__flex">
|
||||
</div><textarea spellcheck="false" style="margin:4px 0;width: ${isMobile() ? "100%" : "360px"}" rows="1" class="b3-text-field">${src}</textarea><div class="fn__hr"></div><div class="fn__flex">
|
||||
<span class="fn__flex-center">${window.siyuan.languages.title}</span>
|
||||
<span class="fn__space"></span>
|
||||
<span data-action="copy" class="block__icon block__icon--show b3-tooltips b3-tooltips__e fn__flex-center" aria-label="${window.siyuan.languages.copy}">
|
||||
|
|
@ -1454,6 +1458,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
|
|||
|
||||
export const linkMenu = (protyle: IProtyle, linkElement: HTMLElement, focusText = false) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_A);
|
||||
const nodeElement = hasClosestBlock(linkElement);
|
||||
if (!nodeElement) {
|
||||
return;
|
||||
|
|
@ -1588,7 +1593,7 @@ style="margin:4px 0;width: ${isMobile() ? "100%" : "360px"}" class="b3-text-fiel
|
|||
if (protyle.disabled) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "copyAHref",
|
||||
label: window.siyuan.languages.copy + " " + window.siyuan.languages.replaceTypes.aHref,
|
||||
label: window.siyuan.languages.copyAHref,
|
||||
icon: "iconLink",
|
||||
click() {
|
||||
writeText(linkAddress);
|
||||
|
|
@ -1742,6 +1747,7 @@ style="margin:4px 0;width: ${isMobile() ? "100%" : "360px"}" class="b3-text-fiel
|
|||
|
||||
export const tagMenu = (protyle: IProtyle, tagElement: HTMLElement) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_TAG);
|
||||
const nodeElement = hasClosestBlock(tagElement);
|
||||
if (!nodeElement) {
|
||||
return;
|
||||
|
|
@ -1900,6 +1906,7 @@ export const tagMenu = (protyle: IProtyle, tagElement: HTMLElement) => {
|
|||
|
||||
export const inlineMathMenu = (protyle: IProtyle, element: Element) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_INLINE_MATH);
|
||||
const nodeElement = hasClosestBlock(element);
|
||||
if (!nodeElement) {
|
||||
return;
|
||||
|
|
@ -2433,18 +2440,35 @@ export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement:
|
|||
return {menus, removeMenus, insertMenus, otherMenus, other2Menus};
|
||||
};
|
||||
|
||||
export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolean, isRemove?: boolean, addLoading = true) => {
|
||||
export const setFoldById = (data: {
|
||||
id: string,
|
||||
currentNodeID: string,
|
||||
}, protyle: IProtyle) => {
|
||||
Array.from(protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${data.id}"]`)).find((item: Element) => {
|
||||
if (!isInEmbedBlock(item)) {
|
||||
const operations = setFold(protyle, item, true, false, true, true);
|
||||
operations.doOperations[0].context = {
|
||||
focusId: data.currentNodeID,
|
||||
};
|
||||
transaction(protyle, operations.doOperations, operations.undoOperations);
|
||||
return true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolean,
|
||||
isRemove?: boolean, addLoading = true, getOperations = false) => {
|
||||
if (nodeElement.getAttribute("data-type") === "NodeListItem" && nodeElement.childElementCount < 4) {
|
||||
// 没有子列表或多个块的列表项不进行折叠
|
||||
return -1;
|
||||
return {fold: -1};
|
||||
}
|
||||
if (nodeElement.getAttribute("data-type") === "NodeThematicBreak") {
|
||||
return -1;
|
||||
return {fold: -1};
|
||||
}
|
||||
const hasFold = nodeElement.getAttribute("fold") === "1";
|
||||
if (hasFold) {
|
||||
if (typeof isOpen === "boolean" && !isOpen) {
|
||||
return -1;
|
||||
return {fold: -1};
|
||||
}
|
||||
nodeElement.removeAttribute("fold");
|
||||
// https://github.com/siyuan-note/siyuan/issues/4411
|
||||
|
|
@ -2453,7 +2477,7 @@ export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolea
|
|||
});
|
||||
} else {
|
||||
if (typeof isOpen === "boolean" && isOpen) {
|
||||
return -1;
|
||||
return {fold: -1};
|
||||
}
|
||||
nodeElement.setAttribute("fold", "1");
|
||||
// 光标在子列表中,再次 focus 段尾的时候不会变 https://ld246.com/article/1647099132461
|
||||
|
|
@ -2468,41 +2492,49 @@ export const setFold = (protyle: IProtyle, nodeElement: Element, isOpen?: boolea
|
|||
clearSelect(["img", "av"], nodeElement);
|
||||
}
|
||||
const id = nodeElement.getAttribute("data-node-id");
|
||||
const doOperations: IOperation[] = [];
|
||||
const undoOperations: IOperation[] = [];
|
||||
if (nodeElement.getAttribute("data-type") === "NodeHeading") {
|
||||
if (hasFold) {
|
||||
if (addLoading) {
|
||||
nodeElement.insertAdjacentHTML("beforeend", '<div spin="1" style="text-align: center"><img width="24px" height="24px" src="/stage/loading-pure.svg"></div>');
|
||||
}
|
||||
transaction(protyle, [{
|
||||
doOperations.push({
|
||||
action: "unfoldHeading",
|
||||
id,
|
||||
data: isRemove ? "remove" : undefined,
|
||||
}], [{
|
||||
});
|
||||
undoOperations.push({
|
||||
action: "foldHeading",
|
||||
id
|
||||
}]);
|
||||
});
|
||||
} else {
|
||||
transaction(protyle, [{
|
||||
doOperations.push({
|
||||
action: "foldHeading",
|
||||
id
|
||||
}], [{
|
||||
});
|
||||
undoOperations.push({
|
||||
action: "unfoldHeading",
|
||||
id
|
||||
}]);
|
||||
});
|
||||
removeFoldHeading(nodeElement);
|
||||
}
|
||||
} else {
|
||||
transaction(protyle, [{
|
||||
doOperations.push({
|
||||
action: "setAttrs",
|
||||
id,
|
||||
data: JSON.stringify({fold: hasFold ? "" : "1"})
|
||||
}], [{
|
||||
});
|
||||
undoOperations.push({
|
||||
action: "setAttrs",
|
||||
id,
|
||||
data: JSON.stringify({fold: hasFold ? "1" : ""})
|
||||
}]);
|
||||
});
|
||||
}
|
||||
if (!getOperations) {
|
||||
transaction(protyle, doOperations, undoOperations);
|
||||
}
|
||||
// 折叠后,防止滚动条滚动后调用 get 请求 https://github.com/siyuan-note/siyuan/issues/2248
|
||||
preventScroll(protyle);
|
||||
return !hasFold ? 1 : 0;
|
||||
return {fold: !hasFold ? 1 : 0, undoOperations, doOperations};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -13,6 +13,7 @@ import {getAllWnds} from "../layout/getAll";
|
|||
import {Asset} from "../asset";
|
||||
import {writeText} from "../protyle/util/compatibility";
|
||||
import {getAssetName, pathPosix} from "../util/pathName";
|
||||
import {Constants} from "../constants";
|
||||
|
||||
const closeMenu = (tab: Tab) => {
|
||||
const unmodifiedTabs: Tab[] = [];
|
||||
|
|
@ -181,6 +182,7 @@ const splitSubMenu = (app: App, tab: Tab) => {
|
|||
|
||||
export const initTabMenu = (app: App, tab: Tab) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_TAB);
|
||||
closeMenu(tab);
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "split",
|
||||
|
|
|
|||
|
|
@ -5,10 +5,11 @@ import {escapeHtml} from "../util/escape";
|
|||
import {renameTag} from "../util/noRelyPCFunction";
|
||||
import {getDockByType} from "../layout/tabUtil";
|
||||
import {Tag} from "../layout/dock/Tag";
|
||||
import {Constants} from "../constants";
|
||||
|
||||
export const openTagMenu = (element: HTMLElement, event: MouseEvent, labelName: string) => {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "tagMenu") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_TAG) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
|
|
@ -36,6 +37,6 @@ export const openTagMenu = (element: HTMLElement, event: MouseEvent, labelName:
|
|||
}, undefined, true);
|
||||
}
|
||||
}).element);
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "tagMenu");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_TAG);
|
||||
window.siyuan.menus.menu.popup({x: event.clientX - 11, y: event.clientY + 11, h: 22, w: 12});
|
||||
};
|
||||
|
|
|
|||
|
|
@ -67,7 +67,7 @@ export const openEditorTab = (app: App, ids: string[], notebookId?: string, path
|
|||
id: "insertBottom",
|
||||
icon: "iconLayoutBottom",
|
||||
label: window.siyuan.languages.insertBottom,
|
||||
accelerator: ids.length === 1 ? "⇧" + window.siyuan.languages.click : "",
|
||||
accelerator: ids.length === 1 ? "⇧⌘" + window.siyuan.languages.click : "",
|
||||
click: () => {
|
||||
if (notebookId) {
|
||||
openFileById({
|
||||
|
|
|
|||
|
|
@ -145,13 +145,13 @@ const togglePinDock = (id: string, dock: Dock, icon: string) => {
|
|||
|
||||
export const workspaceMenu = (app: App, rect: DOMRect) => {
|
||||
if (!window.siyuan.menus.menu.element.classList.contains("fn__none") &&
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === "barWorkspace") {
|
||||
window.siyuan.menus.menu.element.getAttribute("data-name") === Constants.MENU_BAR_WORKSPACE) {
|
||||
window.siyuan.menus.menu.remove();
|
||||
return;
|
||||
}
|
||||
fetchPost("/api/system/getWorkspaces", {}, (response) => {
|
||||
window.siyuan.menus.menu.remove();
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", "barWorkspace");
|
||||
window.siyuan.menus.menu.element.setAttribute("data-name", Constants.MENU_BAR_WORKSPACE);
|
||||
if (!window.siyuan.config.readonly) {
|
||||
window.siyuan.menus.menu.append(new MenuItem({
|
||||
id: "config",
|
||||
|
|
|
|||
|
|
@ -9,7 +9,6 @@ import {genUUID} from "../../util/genID";
|
|||
import {openMobileFileById} from "../editor";
|
||||
import {unicode2Emoji} from "../../emoji";
|
||||
import {mountHelp, newNotebook} from "../../util/mount";
|
||||
import {confirmDialog} from "../../dialog/confirmDialog";
|
||||
import {newFile} from "../../util/newFile";
|
||||
import {MenuItem} from "../../menus/Menu";
|
||||
import {App} from "../../index";
|
||||
|
|
@ -112,6 +111,9 @@ export class MobileFiles extends Model {
|
|||
filesElement.addEventListener("click", (event: MouseEvent & { target: HTMLElement }) => {
|
||||
let target = event.target as HTMLElement;
|
||||
while (target && !target.isEqualNode(this.actionsElement)) {
|
||||
if (target.classList.contains("b3-list-item__icon")) {
|
||||
target = target.previousElementSibling as HTMLElement;
|
||||
}
|
||||
const type = target.getAttribute("data-type");
|
||||
if (type === "refresh") {
|
||||
if (!target.getAttribute("disabled")) {
|
||||
|
|
@ -176,17 +178,6 @@ export class MobileFiles extends Model {
|
|||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (type === "remove") {
|
||||
confirmDialog(window.siyuan.languages.deleteOpConfirm,
|
||||
`${window.siyuan.languages.confirmDelete} <b>${escapeHtml(target.parentElement.querySelector(".b3-list-item__text").textContent)}</b>?`, () => {
|
||||
fetchPost("/api/notebook/removeNotebook", {
|
||||
notebook: target.getAttribute("data-url"),
|
||||
callback: Constants.CB_MOUNT_REMOVE
|
||||
});
|
||||
}, undefined, true);
|
||||
event.stopPropagation();
|
||||
event.preventDefault();
|
||||
break;
|
||||
} else if (type === "open") {
|
||||
fetchPost("/api/notebook/openNotebook", {
|
||||
notebook: target.getAttribute("data-url")
|
||||
|
|
@ -309,14 +300,14 @@ export class MobileFiles extends Model {
|
|||
private genNotebook(item: INotebook) {
|
||||
const emojiHTML = `<span class="b3-list-item__icon b3-tooltips b3-tooltips__e" aria-label="${window.siyuan.languages.changeIcon}">${unicode2Emoji(item.icon || window.siyuan.storage[Constants.LOCAL_IMAGES].note)}</span>`;
|
||||
if (item.closed) {
|
||||
return `<li data-type="open" data-url="${item.id}" class="b3-list-item">
|
||||
return `<li data-url="${item.id}" class="b3-list-item">
|
||||
<span class="b3-list-item__toggle fn__hidden">
|
||||
<svg class="b3-list-item__arrow"><use xlink:href="#iconRight"></use></svg>
|
||||
</span>
|
||||
${emojiHTML}
|
||||
<span class="b3-list-item__text">${escapeHtml(item.name)}</span>
|
||||
<span data-type="remove" data-url="${item.id}" class="b3-list-item__action${(window.siyuan.config.readonly) ? " fn__none" : ""}">
|
||||
<svg><use xlink:href="#iconTrashcan"></use></svg>
|
||||
<span data-type="open" data-url="${item.id}" class="b3-list-item__action${(window.siyuan.config.readonly) ? " fn__none" : ""}">
|
||||
<svg><use xlink:href="#iconOpen"></use></svg>
|
||||
</span>
|
||||
</li>`;
|
||||
} else {
|
||||
|
|
@ -402,6 +393,12 @@ export class MobileFiles extends Model {
|
|||
} else {
|
||||
sourceElement.remove();
|
||||
}
|
||||
} else {
|
||||
const parentElement = this.element.querySelector(`ul[data-url="${data.fromNotebook}"] li[data-path="${pathPosix().dirname(data.fromPath)}.sy"]`) as HTMLElement;
|
||||
if (parentElement && parentElement.getAttribute("data-count") === "1") {
|
||||
parentElement.querySelector(".b3-list-item__toggle").classList.add("fn__hidden");
|
||||
parentElement.querySelector(".b3-list-item__arrow").classList.remove("b3-list-item__arrow--open");
|
||||
}
|
||||
}
|
||||
const newElement = this.element.querySelector(`[data-url="${data.toNotebook}"] li[data-path="${data.toPath}"]`) as HTMLElement;
|
||||
// 重新展开移动到的新文件夹
|
||||
|
|
@ -609,7 +606,8 @@ export class MobileFiles extends Model {
|
|||
} else if (filePath.startsWith(item.path.replace(".sy", ""))) {
|
||||
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
|
||||
notebook: data.box,
|
||||
path: item.path
|
||||
path: item.path,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
});
|
||||
newLiElement = await this.selectItem(response.data.box, filePath, response.data, setStorage, isSetCurrent);
|
||||
}
|
||||
|
|
@ -646,6 +644,7 @@ export class MobileFiles extends Model {
|
|||
fetchPost("/api/filetree/listDocsByPath", {
|
||||
notebook: notebookId,
|
||||
path: liElement.getAttribute("data-path"),
|
||||
app: Constants.SIYUAN_APPID,
|
||||
}, response => {
|
||||
if (response.data.path === "/" && response.data.files.length === 0) {
|
||||
newFile({
|
||||
|
|
@ -701,7 +700,8 @@ export class MobileFiles extends Model {
|
|||
} else {
|
||||
const response = await fetchSyncPost("/api/filetree/listDocsByPath", {
|
||||
notebook: notebookId,
|
||||
path: currentPath
|
||||
path: currentPath,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
});
|
||||
liElement = await this.onLsSelect(response.data, filePath, setStorage, isSetCurrent);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ import {MenuItem} from "../../menus/Menu";
|
|||
import {popSearch} from "../menu/search";
|
||||
import {App} from "../../index";
|
||||
import {openTagMenu} from "../../menus/tag";
|
||||
import {Constants} from "../../constants";
|
||||
|
||||
export class MobileTags {
|
||||
public element: HTMLElement;
|
||||
|
|
@ -128,13 +129,15 @@ export class MobileTags {
|
|||
target = target.parentElement;
|
||||
}
|
||||
});
|
||||
this.update();
|
||||
this.update(false);
|
||||
}
|
||||
|
||||
public update() {
|
||||
public update(ignoreMaxListHint = true) {
|
||||
this.element.lastElementChild.classList.remove("fn__none");
|
||||
fetchPost("/api/tag/getTag", {
|
||||
sort: window.siyuan.config.tag.sort
|
||||
sort: window.siyuan.config.tag.sort,
|
||||
app: Constants.SIYUAN_APPID,
|
||||
ignoreMaxListHint,
|
||||
}, response => {
|
||||
if (this.openNodes) {
|
||||
this.openNodes = this.tree.getExpandIds();
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ window.reconnectWebSocket = () => {
|
|||
window.siyuan.ws.send("ping", {});
|
||||
window.siyuan.mobile.docks.file.send("ping", {});
|
||||
window.siyuan.mobile.editor.protyle.ws.send("ping", {});
|
||||
window.siyuan.mobile.popEditor.protyle.ws.send("ping", {});
|
||||
window.siyuan.mobile.popEditor?.protyle.ws.send("ping", {});
|
||||
};
|
||||
window.goBack = goBack;
|
||||
window.showMessage = showMessage;
|
||||
|
|
|
|||
|
|
@ -88,7 +88,7 @@ export const initRightMenu = (app: App) => {
|
|||
<svg class="b3-menu__icon"><use xlink:href="#iconCalendar"></use></svg><span class="b3-menu__label">${window.siyuan.languages.dailyNote}</span>
|
||||
</div>
|
||||
<div id="menuCard" class="b3-menu__item${window.siyuan.config.readonly ? " fn__none" : ""}">
|
||||
<svg class="b3-menu__icon" style="color: var(--b3-theme-secondary)"><use xlink:href="#iconRiffCard"></use></svg><span class="b3-menu__label">${window.siyuan.languages.spaceRepetition}</span>
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconRiffCard"></use></svg><span class="b3-menu__label">${window.siyuan.languages.spaceRepetition}</span>
|
||||
</div>
|
||||
<div class="b3-menu__item${window.siyuan.config.readonly ? " fn__none" : ""}" id="menuLock">
|
||||
<svg class="b3-menu__icon"><use xlink:href="#iconLock"></use></svg><span class="b3-menu__label">${window.siyuan.languages.lockScreen}</span>
|
||||
|
|
|
|||
|
|
@ -717,7 +717,7 @@ export const popSearch = (app: App, searchConfig?: any) => {
|
|||
<svg class="svg--mid"><use xlink:href="#iconSearch"></use></svg>
|
||||
<svg class="svg--smaller"><use xlink:href="#iconDown"></use></svg>
|
||||
</span>
|
||||
<input id="toolbarSearch" placeholder="${window.siyuan.languages.showRecentUpdatedBlocks}" class="toolbar__title fn__block">
|
||||
<input id="toolbarSearch" placeholder="${window.siyuan.languages.showRecentUpdatedBlocks}" class="toolbar__title fn__block" autocomplete="off" autocorrect="off" spellcheck="false">
|
||||
<svg id="toolbarSearchNew" class="toolbar__icon"><use xlink:href="#iconFile"></use></svg>
|
||||
</div>`,
|
||||
html: `<div class="fn__flex-column" style="height: 100%">
|
||||
|
|
@ -752,7 +752,7 @@ export const popSearch = (app: App, searchConfig?: any) => {
|
|||
<div class="toolbar">
|
||||
<span class="fn__flex-1"></span>
|
||||
<svg data-type="toggle-replace" class="toolbar__icon${config.hasReplace ? " toolbar__icon--active" : ""}"><use xlink:href="#iconReplace"></use></svg>
|
||||
<svg ${enableIncludeChild ? "" : "disabled"} data-type="include" class="toolbar__icon${includeChild ? " toolbar__icon--active" : ""}"><use xlink:href="#iconCopy"></use></svg>
|
||||
<svg ${enableIncludeChild ? "" : "disabled"} data-type="include" class="toolbar__icon${includeChild ? " toolbar__icon--active" : ""}"><use xlink:href="#iconInclude"></use></svg>
|
||||
<svg data-type="path" class="toolbar__icon"><use xlink:href="#iconFolder"></use></svg>
|
||||
<svg ${document.querySelector("#empty").classList.contains("fn__none") ? "" : "disabled"} data-type="currentPath" class="toolbar__icon"><use xlink:href="#iconFocus"></use></svg>
|
||||
<svg data-type="expand" class="toolbar__icon${config.group === 0 ? " fn__none" : ""}"><use xlink:href="#iconExpand"></use></svg>
|
||||
|
|
|
|||
|
|
@ -33,6 +33,7 @@ const setEditor = (modelMainElement: Element) => {
|
|||
window.siyuan.config.editor.displayNetImgMark = (modelMainElement.querySelector("#displayNetImgMark") as HTMLInputElement).checked;
|
||||
window.siyuan.config.editor.codeSyntaxHighlightLineNum = (modelMainElement.querySelector("#codeSyntaxHighlightLineNum") as HTMLInputElement).checked;
|
||||
window.siyuan.config.editor.embedBlockBreadcrumb = (modelMainElement.querySelector("#embedBlockBreadcrumb") as HTMLInputElement).checked;
|
||||
window.siyuan.config.editor.headingEmbedMode = parseInt((modelMainElement.querySelector("#headingEmbedMode") as HTMLSelectElement).value);
|
||||
window.siyuan.config.editor.listLogicalOutdent = (modelMainElement.querySelector("#listLogicalOutdent") as HTMLInputElement).checked;
|
||||
window.siyuan.config.editor.listItemDotNumberClickFocus = (modelMainElement.querySelector("#listItemDotNumberClickFocus") as HTMLInputElement).checked;
|
||||
window.siyuan.config.editor.spellcheck = (modelMainElement.querySelector("#spellcheck") as HTMLInputElement).checked;
|
||||
|
|
@ -115,6 +116,16 @@ export const initEditor = () => {
|
|||
<span class="fn__space"></span>
|
||||
<input class="b3-switch fn__flex-center" id="embedBlockBreadcrumb" type="checkbox"${window.siyuan.config.editor.embedBlockBreadcrumb ? " checked" : ""}/>
|
||||
</label>
|
||||
<div class="b3-label">
|
||||
${window.siyuan.languages.headingEmbedMode}
|
||||
<span class="fn__hr"></span>
|
||||
<select class="b3-select fn__block" id="headingEmbedMode">
|
||||
<option value="0" ${window.siyuan.config.editor.headingEmbedMode === 0 ? "selected" : ""}>${window.siyuan.languages.showHeadingWithBlocks}</option>
|
||||
<option value="1" ${window.siyuan.config.editor.headingEmbedMode === 1 ? "selected" : ""}>${window.siyuan.languages.showHeadingOnlyTitle}</option>
|
||||
<option value="2" ${window.siyuan.config.editor.headingEmbedMode === 2 ? "selected" : ""}>${window.siyuan.languages.showHeadingOnlyBlocks}</option>
|
||||
</select>
|
||||
<div class="b3-label__text">${window.siyuan.languages.headingEmbedModeTip}</div>
|
||||
</div>
|
||||
<label class="fn__flex b3-label">
|
||||
<div class="fn__flex-1">
|
||||
${window.siyuan.languages.outlineOutdent}
|
||||
|
|
@ -240,7 +251,7 @@ export const initEditor = () => {
|
|||
${window.siyuan.languages.historyRetentionDays}
|
||||
<a href="javascript:void(0)" id="clearHistory">${window.siyuan.languages.clearHistory}</a>
|
||||
<span class="fn__hr"></span>
|
||||
<input class="b3-text-field fn__block" id="historyRetentionDays" type="number" min="0" value="${window.siyuan.config.editor.historyRetentionDays}"/>
|
||||
<input class="b3-text-field fn__block" id="historyRetentionDays" type="number" min="1" max="3650" value="${window.siyuan.config.editor.historyRetentionDays}"/>
|
||||
<div class="b3-label__text">${window.siyuan.languages.historyRetentionDaysTip}</div>
|
||||
</div>
|
||||
<div class="b3-label">
|
||||
|
|
|
|||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue