diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts
index 2f1c10a18..2f88f74d1 100644
--- a/app/src/menus/protyle.ts
+++ b/app/src/menus/protyle.ts
@@ -1,8 +1,10 @@
import {
hasClosestBlock,
hasClosestByAttribute,
- hasClosestByClassName, hasClosestByTag,
- hasTopClosestByClassName, isInEmbedBlock
+ 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";
@@ -1087,6 +1083,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 +1098,7 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme
-
+
${window.siyuan.languages.title}
diff --git a/kernel/api/asset.go b/kernel/api/asset.go
index 2d660cb72..6225c1cd8 100644
--- a/kernel/api/asset.go
+++ b/kernel/api/asset.go
@@ -113,7 +113,15 @@ func getImageOCRText(c *gin.Context) {
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{}{
"text": util.GetAssetText(path),
diff --git a/kernel/av/filter.go b/kernel/av/filter.go
index 9231b2f2e..4f15492ad 100644
--- a/kernel/av/filter.go
+++ b/kernel/av/filter.go
@@ -233,18 +233,16 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
}
return true
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
- } else if FilterOperatorIsNotEmpty == filter.Operator {
+ }
+ } else if FilterOperatorIsNotEmpty == filter.Operator {
+ if 1 > len(value.Rollup.Contents) {
return true
}
}
- if 1 > len(filter.Value.Rollup.Contents) {
- return true
- }
-
for _, content := range value.Rollup.Contents {
if content.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {
return false
@@ -304,12 +302,28 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
switch filter.Qualifier {
case FilterQuantifierUndefined, FilterQuantifierAny:
- if 1 > len(value.MAsset) { // 说明资源字段为空
- if FilterOperatorIsEmpty == filter.Operator {
+ if FilterOperatorIsEmpty == filter.Operator {
+ if 1 > len(value.MAsset) {
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
}
+
+ for _, asset := range value.MAsset {
+ if "" != strings.TrimSpace(asset.Content) {
+ return true
+ }
+ }
+ return false
}
for _, asset := range value.MAsset {
@@ -326,12 +340,28 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
}
}
case FilterQuantifierAll:
- if 1 > len(value.MAsset) {
- if FilterOperatorIsEmpty == filter.Operator {
+ if FilterOperatorIsEmpty == filter.Operator {
+ if 1 > len(value.MAsset) {
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
}
+
+ for _, asset := range value.MAsset {
+ if "" == strings.TrimSpace(asset.Content) {
+ return false
+ }
+ }
+ return true
}
for _, asset := range value.MAsset {
@@ -349,26 +379,38 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, itemID s
}
return true
case FilterQuantifierNone:
- if 1 > len(value.MAsset) {
- if FilterOperatorIsEmpty == filter.Operator {
- return false
- } else if FilterOperatorIsNotEmpty == filter.Operator {
+ if FilterOperatorIsEmpty == filter.Operator {
+ if 1 > len(value.MAsset) {
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 {
switch asset.Type {
case AssetTypeFile:
- if "" != strings.TrimSpace(asset.Name) {
- if filterTextContent(filter.Operator, asset.Name, filterContent) {
- return false
- }
+ if filterTextContent(filter.Operator, asset.Name, filterContent) {
+ return false
}
- if "" != strings.TrimSpace(asset.Content) {
- if filterTextContent(filter.Operator, asset.Content, filterContent) {
- return false
- }
+ if filterTextContent(filter.Operator, asset.Content, filterContent) {
+ return false
}
case AssetTypeImage:
if filterTextContent(filter.Operator, asset.Content, filterContent) {