diff --git a/kernel/api/asset.go b/kernel/api/asset.go index 17ac70be7..9e1d94220 100644 --- a/kernel/api/asset.go +++ b/kernel/api/asset.go @@ -29,6 +29,40 @@ import ( "github.com/siyuan-note/siyuan/kernel/util" ) +func getImageOCRText(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + path := arg["path"].(string) + force := false + if forceArg := arg["force"]; nil != forceArg { + force = forceArg.(bool) + } + + ret.Data = map[string]interface{}{ + "text": util.GetAssetText(path, force), + } +} + +func setImageOCRText(c *gin.Context) { + ret := gulu.Ret.NewResult() + defer c.JSON(http.StatusOK, ret) + + arg, ok := util.JsonArg(c, ret) + if !ok { + return + } + + path := arg["path"].(string) + text := arg["text"].(string) + util.SetAssetText(path, text) +} + func renameAsset(c *gin.Context) { ret := gulu.Ret.NewResult() defer c.JSON(http.StatusOK, ret) diff --git a/kernel/api/router.go b/kernel/api/router.go index 8d7e4cf6f..2fc946386 100644 --- a/kernel/api/router.go +++ b/kernel/api/router.go @@ -226,6 +226,8 @@ func ServeAPI(ginServer *gin.Engine) { ginServer.Handle("POST", "/api/asset/removeUnusedAssets", model.CheckAuth, model.CheckReadonly, removeUnusedAssets) ginServer.Handle("POST", "/api/asset/getDocImageAssets", model.CheckAuth, model.CheckReadonly, getDocImageAssets) ginServer.Handle("POST", "/api/asset/renameAsset", model.CheckAuth, model.CheckReadonly, renameAsset) + ginServer.Handle("POST", "/api/asset/getImageOCRText", model.CheckAuth, model.CheckReadonly, getImageOCRText) + ginServer.Handle("POST", "/api/asset/setImageOCRText", model.CheckAuth, model.CheckReadonly, setImageOCRText) ginServer.Handle("POST", "/api/export/batchExportMd", model.CheckAuth, batchExportMd) ginServer.Handle("POST", "/api/export/exportMd", model.CheckAuth, exportMd) diff --git a/kernel/util/tesseract.go b/kernel/util/tesseract.go index abbe5d47c..0e06e7bfc 100644 --- a/kernel/util/tesseract.go +++ b/kernel/util/tesseract.go @@ -44,21 +44,31 @@ var ( TesseractLangs []string ) -func GetAssetText(asset string) string { +func SetAssetText(asset, text string) { AssetsTextsLock.Lock() - ret, ok := AssetsTexts[asset] + AssetsTexts[asset] = text AssetsTextsLock.Unlock() - if ok { - return ret + AssetsTextsChanged = true +} + +func GetAssetText(asset string, force bool) string { + if !force { + AssetsTextsLock.Lock() + ret, ok := AssetsTexts[asset] + AssetsTextsLock.Unlock() + if ok { + return ret + } } assetsPath := GetDataAssetsAbsPath() assetAbsPath := strings.TrimPrefix(asset, "assets") assetAbsPath = filepath.Join(assetsPath, assetAbsPath) - ret = Tesseract(assetAbsPath) + ret := Tesseract(assetAbsPath) AssetsTextsLock.Lock() AssetsTexts[asset] = ret AssetsTextsLock.Unlock() + AssetsTextsChanged = true return ret }