From bcc0472ed099c9ea0e3a907f9197b38e64b28efc Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sat, 13 Sep 2025 11:50:13 +0800 Subject: [PATCH 1/3] :art: https://github.com/siyuan-note/siyuan/issues/15839 --- app/src/protyle/render/av/cell.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/protyle/render/av/cell.ts b/app/src/protyle/render/av/cell.ts index 1f95b037b..c35bd0039 100644 --- a/app/src/protyle/render/av/cell.ts +++ b/app/src/protyle/render/av/cell.ts @@ -863,6 +863,10 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va doOperations.push(...operations.doOperations); undoOperations.push(...operations.undoOperations); } + // formattedContent 在单元格渲染时没有用到,需对比保持一致 + if (type === "date") { + cellValue.date.formattedContent= oldValue.date.formattedContent ; + } if (objEquals(cellValue, oldValue)) { return; } From be6e92ad7addad9e3777a1e724ee057b91903c80 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Sat, 13 Sep 2025 11:58:52 +0800 Subject: [PATCH 2/3] :bug: `Optimize typography` exception when code block contains ``` https://github.com/siyuan-note/siyuan/issues/15843 Signed-off-by: Daniel <845765@qq.com> --- kernel/model/format.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/kernel/model/format.go b/kernel/model/format.go index 2a324f47c..a28bd9e8d 100644 --- a/kernel/model/format.go +++ b/kernel/model/format.go @@ -17,7 +17,10 @@ package model import ( + "bytes" + "github.com/88250/lute/ast" + "github.com/88250/lute/editor" "github.com/88250/lute/render" "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/util" @@ -37,13 +40,18 @@ func AutoSpace(rootID string) (err error) { generateOpTypeHistory(tree, HistoryOpFormat) luteEngine := NewLute() - // 合并相邻的同类行级节点 ast.Walk(tree.Root, func(n *ast.Node, entering bool) ast.WalkStatus { - if entering { - switch n.Type { - case ast.NodeTextMark: - luteEngine.MergeSameTextMark(n) - } + if !entering { + return ast.WalkContinue + } + + switch n.Type { + case ast.NodeTextMark: + luteEngine.MergeSameTextMark(n) // 合并相邻的同类行级节点 + case ast.NodeCodeBlockCode: + // 代码块中包含 ``` 时 `优化排版` 异常 `Optimize typography` exception when code block contains ``` https://github.com/siyuan-note/siyuan/issues/15843 + n.Tokens = bytes.ReplaceAll(n.Tokens, []byte(editor.Zwj+"```"), []byte("```")) + n.Tokens = bytes.ReplaceAll(n.Tokens, []byte("```"), []byte(editor.Zwj+"```")) } return ast.WalkContinue }) From 9fff044869f9b386119bfe015c2d52e8bd0be44a Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sat, 13 Sep 2025 12:25:13 +0800 Subject: [PATCH 3/3] :art: https://github.com/siyuan-note/siyuan/issues/15839 --- app/src/protyle/render/av/cell.ts | 4 ++-- app/src/protyle/render/av/date.ts | 10 +++++----- app/src/protyle/render/av/openMenuPanel.ts | 23 ++++++++++++++++------ 3 files changed, 24 insertions(+), 13 deletions(-) diff --git a/app/src/protyle/render/av/cell.ts b/app/src/protyle/render/av/cell.ts index c35bd0039..4bb1204b1 100644 --- a/app/src/protyle/render/av/cell.ts +++ b/app/src/protyle/render/av/cell.ts @@ -335,7 +335,7 @@ export const genCellValue = (colType: TAVCol, value: string | any) => { cellValue = { type: colType, number: { - content: null, + content: 0, isNotEmpty: false } }; @@ -865,7 +865,7 @@ export const updateCellsValue = (protyle: IProtyle, nodeElement: HTMLElement, va } // formattedContent 在单元格渲染时没有用到,需对比保持一致 if (type === "date") { - cellValue.date.formattedContent= oldValue.date.formattedContent ; + cellValue.date.formattedContent = oldValue.date.formattedContent; } if (objEquals(cellValue, oldValue)) { return; diff --git a/app/src/protyle/render/av/date.ts b/app/src/protyle/render/av/date.ts index 2a887b114..41d166789 100644 --- a/app/src/protyle/render/av/date.ts +++ b/app/src/protyle/render/av/date.ts @@ -2,7 +2,7 @@ import * as dayjs from "dayjs"; import {genCellValueByElement, updateCellsValue} from "./cell"; export const getDateHTML = (cellElements: HTMLElement[]) => { - const cellValue = genCellValueByElement("date", cellElements[0]).date; + const cellValue = genCellValueByElement("date", cellElements[0]).date; const isNotTime = cellValue.isNotTime; let value = ""; const currentDate = new Date().getTime(); @@ -64,9 +64,9 @@ export const bindDateEvent = (options: { } if (event.key === "Enter") { updateCellsValue(options.protyle, options.blockElement as HTMLElement, { - content: getFullYearTime(inputElements[0].dataset.value), + content: getFullYearTime(inputElements[0].dataset.value) || 0, isNotEmpty: inputElements[0].value !== "", - content2: getFullYearTime(inputElements[1].dataset.value), + content2: getFullYearTime(inputElements[1].dataset.value) || 0, isNotEmpty2: inputElements[1].value !== "", hasEndDate: inputElements[2].checked, isNotTime: !inputElements[3].checked, @@ -114,9 +114,9 @@ export const bindDateEvent = (options: { }); return () => { updateCellsValue(options.protyle, options.blockElement as HTMLElement, { - content: getFullYearTime(inputElements[0].dataset.value), + content: getFullYearTime(inputElements[0].dataset.value) || 0, isNotEmpty: inputElements[0].value !== "", - content2: getFullYearTime(inputElements[1].dataset.value), + content2: getFullYearTime(inputElements[1].dataset.value) || 0, isNotEmpty2: inputElements[1].value !== "", hasEndDate: inputElements[2].checked, isNotTime: !inputElements[3].checked, diff --git a/app/src/protyle/render/av/openMenuPanel.ts b/app/src/protyle/render/av/openMenuPanel.ts index 8a7d3564e..5057b73c4 100644 --- a/app/src/protyle/render/av/openMenuPanel.ts +++ b/app/src/protyle/render/av/openMenuPanel.ts @@ -39,7 +39,7 @@ import { openViewMenu } from "./view"; import {focusBlock} from "../../util/selection"; -import {setPageSize} from "./row"; +import {getFieldIdByCellElement, setPageSize} from "./row"; import {bindRelationEvent, getRelationHTML, openSearchAV, setRelationCell, updateRelation} from "./relation"; import {bindRollupData, getRollupHTML, goSearchRollupCol} from "./rollup"; import {updateCellsValue} from "./cell"; @@ -157,7 +157,18 @@ export const openMenuPanel = (options: { const menuElement = avPanelElement.lastElementChild as HTMLElement; let tabRect = options.blockElement.querySelector(`.av__views, .av__row[data-col-id="${options.colId}"] > .block__logo`)?.getBoundingClientRect(); if (["select", "date", "asset", "relation", "rollup"].includes(options.type)) { - const cellRect = options.cellElements[options.cellElements.length - 1].getBoundingClientRect(); + let lastElement = options.cellElements[options.cellElements.length - 1]; + if (!options.blockElement.contains(lastElement)) { + // https://github.com/siyuan-note/siyuan/issues/15839 + const rowID = getFieldIdByCellElement(lastElement, data.viewType); + if (data.viewType === "table") { + lastElement = options.blockElement.querySelector(`.av__row[data-id="${rowID}"] .av__cell[data-col-id="${lastElement.dataset.colId}"]`); + } else { + lastElement = options.blockElement.querySelector(`.av__gallery-item[data-id="${rowID}"] .av__cell[data-field-id="${lastElement.dataset.fieldId}"]`); + } + } + const cellRect = (lastElement || options.cellElements[options.cellElements.length - 1]).getBoundingClientRect(); + if (options.type === "select") { bindSelectEvent(options.protyle, data, menuElement, options.cellElements, options.blockElement); } else if (options.type === "date") { @@ -1201,10 +1212,10 @@ export const openMenuPanel = (options: { title: isTwoWay ? window.siyuan.languages.removeColConfirm : window.siyuan.languages.deleteOpConfirm, content: `
${isTwoWay ? window.siyuan.languages.confirmRemoveRelationField - .replace("${x}", menuElement.querySelector("input").value || window.siyuan.languages._kernel[272]) - .replace("${y}", menuElement.querySelector('.b3-menu__item[data-type="goSearchAV"] .b3-menu__accelerator').textContent) - .replace("${z}", (menuElement.querySelector('input[data-type="colName"]') as HTMLInputElement).value || window.siyuan.languages._kernel[272]) - : window.siyuan.languages.removeCol.replace("${x}", menuElement.querySelector("input").value || window.siyuan.languages._kernel[272])} + .replace("${x}", menuElement.querySelector("input").value || window.siyuan.languages._kernel[272]) + .replace("${y}", menuElement.querySelector('.b3-menu__item[data-type="goSearchAV"] .b3-menu__accelerator').textContent) + .replace("${z}", (menuElement.querySelector('input[data-type="colName"]') as HTMLInputElement).value || window.siyuan.languages._kernel[272]) + : window.siyuan.languages.removeCol.replace("${x}", menuElement.querySelector("input").value || window.siyuan.languages._kernel[272])}