Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2025-10-17 00:06:34 +08:00
commit f9949e3e73
3 changed files with 86 additions and 36 deletions

View file

@ -1,8 +1,10 @@
import { import {
hasClosestBlock, hasClosestBlock,
hasClosestByAttribute, hasClosestByAttribute,
hasClosestByClassName, hasClosestByTag, hasClosestByClassName,
hasTopClosestByClassName, isInEmbedBlock hasClosestByTag,
hasTopClosestByClassName,
isInEmbedBlock
} from "../protyle/util/hasClosest"; } from "../protyle/util/hasClosest";
import {MenuItem} from "./Menu"; import {MenuItem} from "./Menu";
import {focusBlock, focusByRange, focusByWbr, getEditorRange, selectAll,} from "../protyle/util/selection"; 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 {openMenu} from "./commonMenuItem";
import {fetchPost, fetchSyncPost} from "../util/fetch"; import {fetchPost, fetchSyncPost} from "../util/fetch";
import {Constants} from "../constants"; import {Constants} from "../constants";
import { import {copyPlainText, readClipboard, setStorageVal, updateHotkeyTip, writeText} from "../protyle/util/compatibility";
copyPlainText,
readClipboard,
setStorageVal,
updateHotkeyTip,
writeText
} from "../protyle/util/compatibility";
import {preventScroll} from "../protyle/scroll/preventScroll"; import {preventScroll} from "../protyle/scroll/preventScroll";
import {onGet} from "../protyle/util/onGet"; import {onGet} from "../protyle/util/onGet";
import {getAllModels} from "../layout/getAll"; import {getAllModels} from "../layout/getAll";
@ -1087,6 +1083,10 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
const imgElement = assetElement.querySelector("img"); const imgElement = assetElement.querySelector("img");
const titleElement = assetElement.querySelector(".protyle-action__title span") as HTMLElement; const titleElement = assetElement.querySelector(".protyle-action__title span") as HTMLElement;
const html = nodeElement.outerHTML; const html = nodeElement.outerHTML;
let src = imgElement.getAttribute("src");
if (!src) {
src = ""
}
if (!protyle.disabled) { if (!protyle.disabled) {
window.siyuan.menus.menu.append(new MenuItem({ window.siyuan.menus.menu.append(new MenuItem({
id: "imageUrlAndTitleAndTooltipText", id: "imageUrlAndTitleAndTooltipText",
@ -1098,7 +1098,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}"> <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> <svg><use xlink:href="#iconCopy"></use></svg>
</span> </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__flex-center">${window.siyuan.languages.title}</span>
<span class="fn__space"></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}"> <span data-action="copy" class="block__icon block__icon--show b3-tooltips b3-tooltips__e fn__flex-center" aria-label="${window.siyuan.languages.copy}">

View file

@ -113,7 +113,15 @@ func getImageOCRText(c *gin.Context) {
return return
} }
path := arg["path"].(string) var path string
if nil == arg["path"] {
ret.Data = map[string]interface{}{
"text": "",
}
return
} else {
path = arg["path"].(string)
}
ret.Data = map[string]interface{}{ ret.Data = map[string]interface{}{
"text": util.GetAssetText(path), "text": util.GetAssetText(path),

View file

@ -233,18 +233,16 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
return true return true
case FilterQuantifierNone: case FilterQuantifierNone:
if len(value.Rollup.Contents) < len(relVal.Relation.Contents) { if FilterOperatorIsEmpty == filter.Operator {
if FilterOperatorIsEmpty == filter.Operator { if len(value.Rollup.Contents) < len(relVal.Relation.Contents) || 1 > len(value.Rollup.Contents) {
return false return false
} else if FilterOperatorIsNotEmpty == filter.Operator { }
} else if FilterOperatorIsNotEmpty == filter.Operator {
if 1 > len(value.Rollup.Contents) {
return true return true
} }
} }
if 1 > len(filter.Value.Rollup.Contents) {
return true
}
for _, content := range value.Rollup.Contents { for _, content := range value.Rollup.Contents {
if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) { if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {
return false return false
@ -304,12 +302,28 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
switch filter.Qualifier { switch filter.Qualifier {
case FilterQuantifierUndefined, FilterQuantifierAny: case FilterQuantifierUndefined, FilterQuantifierAny:
if 1 > len(value.MAsset) { // 说明资源字段为空 if FilterOperatorIsEmpty == filter.Operator {
if FilterOperatorIsEmpty == filter.Operator { if 1 > len(value.MAsset) {
return true return true
} else if FilterOperatorIsNotEmpty == filter.Operator { }
for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) {
return true
}
}
return false
} else if FilterOperatorIsNotEmpty == filter.Operator {
if 1 > len(value.MAsset) {
return false return false
} }
for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) {
return true
}
}
return false
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
@ -326,12 +340,28 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
} }
case FilterQuantifierAll: case FilterQuantifierAll:
if 1 > len(value.MAsset) { if FilterOperatorIsEmpty == filter.Operator {
if FilterOperatorIsEmpty == filter.Operator { if 1 > len(value.MAsset) {
return true return true
} else if FilterOperatorIsNotEmpty == filter.Operator { }
for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) {
return false
}
}
return true
} else if FilterOperatorIsNotEmpty == filter.Operator {
if 1 > len(value.MAsset) {
return false return false
} }
for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) {
return false
}
}
return true
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
@ -349,26 +379,38 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
} }
return true return true
case FilterQuantifierNone: case FilterQuantifierNone:
if 1 > len(value.MAsset) { if FilterOperatorIsEmpty == filter.Operator {
if FilterOperatorIsEmpty == filter.Operator { if 1 > len(value.MAsset) {
return false
} else if FilterOperatorIsNotEmpty == filter.Operator {
return true return true
} }
for _, asset := range value.MAsset {
if "" == strings.TrimSpace(asset.Content) {
return false
}
}
return true
} else if FilterOperatorIsNotEmpty == filter.Operator {
if 1 > len(value.MAsset) {
return false
}
for _, asset := range value.MAsset {
if "" != strings.TrimSpace(asset.Content) {
return false
}
}
return true
} }
for _, asset := range value.MAsset { for _, asset := range value.MAsset {
switch asset.Type { switch asset.Type {
case AssetTypeFile: case AssetTypeFile:
if "" != strings.TrimSpace(asset.Name) { if filterTextContent(filter.Operator, asset.Name, filterContent) {
if filterTextContent(filter.Operator, asset.Name, filterContent) { return false
return false
}
} }
if "" != strings.TrimSpace(asset.Content) { if filterTextContent(filter.Operator, asset.Content, filterContent) {
if filterTextContent(filter.Operator, asset.Content, filterContent) { return false
return false
}
} }
case AssetTypeImage: case AssetTypeImage:
if filterTextContent(filter.Operator, asset.Content, filterContent) { if filterTextContent(filter.Operator, asset.Content, filterContent) {