From 32e85c62c02d2b3e8a38e64a4a4cfabebc2bd710 Mon Sep 17 00:00:00 2001 From: callmeyan Date: Thu, 8 May 2025 13:57:12 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=97=A5=E5=BF=97=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E3=80=81=E8=B5=84=E6=BA=90=E7=AE=A1=E7=90=86=E5=8F=8A?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=94=AF=E6=8C=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 引入 log4net 库,统一日志记录方式,提升可维护性。 - 优化异常处理,增加详细日志记录,增强代码健壮性。 - 调整资源文件引用,新增图标资源,删除无用资源。 - 优化文档事件处理逻辑,改进面板显示与隐藏逻辑。 - 增加对 WPS 环境的支持,动态调整功能行为。 - 禁用部分功能(如常识性检测、客服、升级和帮助)。 - 删除冗余代码,清理注释,统一代码风格。 - 更新程序集版本至 2.2.5,改进调试与生产环境配置。 --- .vs/AIProofread/v17/.suo | Bin 3148800 -> 3137024 bytes AIProofread/AIProofread.csproj | 2 + AIProofread/AIProofread.csproj.user | 4 +- AIProofread/Bridge.cs | 33 +++- AIProofread/Config.cs | 32 ++-- AIProofread/Controls/ProofreadMainControl.cs | 8 +- AIProofread/LogHelper.cs | 2 +- AIProofread/Model/DocumentInfo.cs | 99 +++++++----- AIProofread/Model/DocumentList.cs | 24 +-- AIProofread/Properties/AssemblyInfo.cs | 4 +- AIProofread/Properties/Resources.Designer.cs | 20 +++ AIProofread/Properties/Resources.resx | 40 +++-- AIProofread/Resources/icon-update-new-wps.jpg | Bin 0 -> 3941 bytes AIProofread/Resources/icon-update-new.png | Bin 0 -> 843 bytes AIProofread/Ribbon1.Designer.cs | 2 + AIProofread/Ribbon1.cs | 5 + AIProofread/ThisAddIn.cs | 150 +++++++++++------- AIProofread/core/AppModule.cs | 8 +- AIProofread/core/CorrectResultExportor.cs | 2 +- AIProofread/core/DocumentUtil.cs | 101 ++---------- AIProofread/core/Tools.cs | 3 + 21 files changed, 291 insertions(+), 248 deletions(-) create mode 100644 AIProofread/Resources/icon-update-new-wps.jpg create mode 100644 AIProofread/Resources/icon-update-new.png diff --git a/.vs/AIProofread/v17/.suo b/.vs/AIProofread/v17/.suo index 6d3ee23bcb8f97bbc39393b3a2d37adc01f14c59..6ec16fec720d654c383993865ad82dbc20da9d91 100644 GIT binary patch delta 54207 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 + + 10.0 diff --git a/AIProofread/AIProofread.csproj.user b/AIProofread/AIProofread.csproj.user index 78e7ff7..f4331b6 100644 --- a/AIProofread/AIProofread.csproj.user +++ b/AIProofread/AIProofread.csproj.user @@ -7,8 +7,8 @@ - Project - C:\Soft\Kingsoft\WPS Office\12.1.0.18608\office6\wps.exe + Program + C:\Soft\Kingsoft\WPS Office\12.1.0.20784\office6\wps.exe Project diff --git a/AIProofread/Bridge.cs b/AIProofread/Bridge.cs index d762260..c171648 100644 --- a/AIProofread/Bridge.cs +++ b/AIProofread/Bridge.cs @@ -109,6 +109,10 @@ namespace AIProofread Globals.ThisAddIn.formCommonsenseDetection.SendMessageToWeb("show-history", null); } + public void HasNewVersion() + { + Globals.ThisAddIn.ribbon.ShowNewVersionIcon(); + } /// /// 检查插件更新信息 /// @@ -315,6 +319,19 @@ namespace AIProofread { return Tools.GetAllText(Globals.ThisAddIn.Application.ActiveDocument); } + public bool SaveDocument(int documentId) + { + var document = documentId > 0 ? Globals.ThisAddIn.GetDocumentById(documentId) : Globals.ThisAddIn.ActiveDocument; + try + { + document.Save(); + return true; + }catch (Exception ex) + { + Logger.Error("保存文档失败", ex); + } + return false; + } public bool Saved(int documentId) { @@ -576,18 +593,15 @@ namespace AIProofread webViewDict.Add(name, webView); } - Logger.Error("初始化Main Pane Web环境 开始"); + Logger.Debug("初始化Main Pane Web环境 开始"); // 禁用web安全,允许跨域 否则需要web编译为umd加载模式 var ops = new CoreWebView2EnvironmentOptions("--disable-web-security"); var env = await CoreWebView2Environment.CreateAsync(null, Config.WEB_DATA_PATH, ops); await webView.EnsureCoreWebView2Async(env); - //webView.CoreWebView2.Settings.AreDevToolsEnabled = false; - //webView.CoreWebView2.Settings.AreDefaultScriptDialogsEnabled = false; - //webView.CoreWebView2.Settings.AreHostObjectsAllowed = true; // 添加 js与客户端代理 webView.CoreWebView2.AddHostObjectToScript("bridge", bridge); - Logger.Error("初始化Main Pane Web环境 结束"); + Logger.Debug("初始化Main Pane Web环境 结束"); } catch (Exception ex) { @@ -864,6 +878,7 @@ namespace AIProofread } catch (Exception ex) { + Logger.Error("读取文件失败:" + ex.Message, ex); return BridgeResult.Error(-1, ex.Message); } } @@ -901,7 +916,7 @@ namespace AIProofread } try { - Logger.Info("SaveCache " + document.fileName + " used " + document.ProofreadCachePath); + Logger.Debug("SaveCache " + document.fileName + " used " + document.ProofreadCachePath); if (File.Exists(document.ProofreadCachePath)) { @@ -914,6 +929,7 @@ namespace AIProofread } catch (Exception ex) { + Logger.Error("保存缓存失败:" + ex.Message, ex); return BridgeResult.Error(-1, ex.Message); } } @@ -938,6 +954,7 @@ namespace AIProofread } catch (Exception ex) { + Logger.Error("加载缓存失败:" + ex.Message, ex); return BridgeResult.Error(ex.Message); } } @@ -951,8 +968,9 @@ namespace AIProofread File.Delete(Globals.ThisAddIn.ActiveDocument.ProofreadCachePath); } } - catch (Exception) + catch (Exception ex) { + Logger.Error("删除缓存失败:" + ex.Message, ex); return false; } return true; @@ -976,6 +994,7 @@ namespace AIProofread } catch (Exception ex) { + Logger.Error("初始化缓存失败:" + ex.Message, ex); return BridgeResult.Error(ex); } } diff --git a/AIProofread/Config.cs b/AIProofread/Config.cs index 88524f1..3324faf 100644 --- a/AIProofread/Config.cs +++ b/AIProofread/Config.cs @@ -19,19 +19,8 @@ namespace AIProofread /// /// 测试环境 /// - public const string TEST = "http://gm2-plugin.zverse.group/"; - /// - /// 果麦预发布-灰度 - /// - public const string PRE = "https://pre-gm-plugin.gachafun.com/"; - /// - /// 果麦生产 - /// - public const string PROD = "https://gm-plugin.gachafun.com/"; - /// - /// 果麦金融 - /// - public const string GM_FN = "https://gm-plugin-fn.gachafun.com/"; + public const string PROD = "http://aijdw1.goldmye.com/"; + public const string TEST = "http://tt-plugin.zverse.group/"; } public class Config { @@ -48,18 +37,19 @@ namespace AIProofread public static readonly string TextBackgroundColor = "#E9DABB"; // e9dabb D6AA69 public static string DeviceId = ""; -#if DEBUG + + #if DEBUG /// /// 网页访问地址 /// - public static string WEB_PATH = AppServer.DEV; //pre-gm-plugin.gachafun.com localhost:5173 gm2-plugin.zverse.group + public static string WEB_PATH = AppServer.PROD; //pre-gm-plugin.gachafun.com localhost:5173 gm2-plugin.zverse.group public static bool RUN_IN_DEBUG = true; - public static AppEnvironment APP_ENV = AppEnvironment.Dev; -#else - public static string WEB_PATH = AppServer.DEV; // gm-plugin.gachafun.com pre-gm-plugin.gachafun.com - public static bool RUN_IN_DEBUG = true; - public static AppEnvironment APP_ENV = AppEnvironment.Dev; -#endif + public static AppEnvironment APP_ENV = AppEnvironment.Prod; + #else + public static string WEB_PATH = AppServer.PROD; // gm-plugin.gachafun.com pre-gm-plugin.gachafun.com + public static bool RUN_IN_DEBUG = false; + public static AppEnvironment APP_ENV = AppEnvironment.Prod; + #endif public static readonly string APP_DATA_PATH = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\ai_proofread"; public static readonly string APP_LOG_PATH = APP_DATA_PATH + "\\logs\\"; diff --git a/AIProofread/Controls/ProofreadMainControl.cs b/AIProofread/Controls/ProofreadMainControl.cs index 7ed3bf9..c64e8bc 100644 --- a/AIProofread/Controls/ProofreadMainControl.cs +++ b/AIProofread/Controls/ProofreadMainControl.cs @@ -39,9 +39,9 @@ namespace AIProofread.Controls -

页面加载失败

-

请检查您的网络连接或稍后再试。

- 重新加载 +

加载组件失败

+

请检查您的网络连接并重启软件。

+ 重新加载 "; (sender as WebView2).CoreWebView2.NavigateToString(errorPageHtml); @@ -57,7 +57,7 @@ namespace AIProofread.Controls if (ex.TryGetWebMessageAsString() == "reload") { isShowingErrorPage = false; - //web.Source = new Uri(Config.WebPath("correct")); + web.Source = new Uri(Config.WebPath("correct")); } }; this.web.Source = new Uri(Config.WebPath("correct" )); diff --git a/AIProofread/LogHelper.cs b/AIProofread/LogHelper.cs index 22be393..0fdae97 100644 --- a/AIProofread/LogHelper.cs +++ b/AIProofread/LogHelper.cs @@ -37,7 +37,7 @@ namespace AIProofread roller.Layout = layout; roller.ActivateOptions(); hierarchy.Root.AddAppender(roller); - hierarchy.Root.Level = log4net.Core.Level.Debug; + hierarchy.Root.Level = log4net.Core.Level.Info; hierarchy.Configured = true; } diff --git a/AIProofread/Model/DocumentInfo.cs b/AIProofread/Model/DocumentInfo.cs index bd2fc76..302a4dd 100644 --- a/AIProofread/Model/DocumentInfo.cs +++ b/AIProofread/Model/DocumentInfo.cs @@ -8,6 +8,7 @@ using System.Windows.Forms; using AIProofread.Controls; using AIProofread.core; using AIProofread.Util; +using DocumentFormat.OpenXml.Office2013.WebExtentionPane; using log4net; using Microsoft.Office.Interop.Word; using Newtonsoft.Json; @@ -104,11 +105,11 @@ namespace AIProofread.Model /// public void ShowPane() { - if(null == TaskPane) + if (null == TaskPane) { CreateTaskPane(); } - Logger.Debug("TaskPane.Visible {"+TaskPane==null?"null":(TaskPane.Visible?"true":"false")+" => true"); + Logger.Debug("TaskPane.Visible {" + TaskPane == null ? "null" : (TaskPane.Visible ? "true" : "false") + " => true"); TaskPane.Visible = PaneVisible = true; } @@ -117,12 +118,13 @@ namespace AIProofread.Model /// public void HidePane() { - if (!PaneVisible) return; + //if (!PaneVisible) return; ShowDocumentStatus("HidePane"); Logger.Debug($"TaskPane.Visible {TaskPane.Visible} => false"); TaskPane.Visible = PaneVisible = false; } + public void RunInMainThread(Action action) { Logger.Debug($"RunInMainThread {action}"); @@ -184,54 +186,59 @@ namespace AIProofread.Model /// public void Active() { - ShowDocumentStatus("Active"); - IsActive = true; - if (Config.IS_WPS && null != TaskPane && PaneVisible) + try { - TaskPane.Visible = true; + Logger.Debug("激活 for " + CurrentDocument.FullName + " 没有 visible is " + PaneVisible); + ShowDocumentStatus("Active"); + IsActive = true; + if (Config.IS_WPS && null != TaskPane) + { + TaskPane.Visible = PaneVisible; + } + } + catch (Exception e) + { + Logger.Error("Active Error", e); } } public void Deactive() { - ShowDocumentStatus("Deactive"); - IsActive = false; - if (Config.IS_WPS) + try { - if (PaneVisible) - { - // 异步等待一段时间 重新设置为true,防止面板关闭时,触发事件 - ThreadPool.QueueUserWorkItem(state => - { - Thread.Sleep(500); - PaneVisible = true; - }); - } - if (null != TaskPane && PaneVisible) + ShowDocumentStatus("Deactive"); + IsActive = false; + if (Config.IS_WPS && null != TaskPane) { + PaneVisible = TaskPane.Visible; TaskPane.Visible = false; + Logger.Debug("取消 for " + CurrentDocument.FullName + " current visible " + PaneVisible); } + }catch (Exception e) + { + Logger.Error("Deactive Error", e); } - - } public void Dispose() { try { + // 判断TaskPane是否已经释放 + if (null == TaskPane) return; + if (TaskPane.Control.IsDisposed) return; + + ProofreadMainControl control = (ProofreadMainControl)TaskPane.Control; + control.ResetWeb(); + + HidePane(); + TaskPane?.Dispose(); // 释放com try { Marshal.ReleaseComObject(CurrentDocument); } catch (Exception) { } - if(TaskPane.Control.IsDisposed) return; - ProofreadMainControl control = (ProofreadMainControl)TaskPane.Control; - control.ResetWeb(); - - HidePane(); - TaskPane?.Dispose(); } catch (Exception e) { @@ -277,7 +284,7 @@ namespace AIProofread.Model MinWidth = MIN_WIDTH * control.LabelWidth() / 42; } // 创建pane - TaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(control, " "); + TaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(control, Config.RUN_IN_DEBUG ? CurrentDocument.Name : " "); // 默认隐藏 TaskPane.Visible = false; // 设置宽度 @@ -289,7 +296,9 @@ namespace AIProofread.Model TaskPane.VisibleChanged += TaskPane_VisibleChanged; } - + /// + /// 检查按钮状态 + /// public void CheckBtnStatus() { // @@ -302,8 +311,15 @@ namespace AIProofread.Model private void TaskPane_VisibleChanged(object sender, EventArgs e) { - // 如果已经隐藏 则记录隐藏用于(WPS)多面板的切换的处理 - PaneVisible = TaskPane.Visible; + if (Config.IS_WPS) + { + if(CurrentDocument == Globals.ThisAddIn.ActiveDocument) + { + Logger.Debug($"VisibleChanged ${CurrentDocument.Name} is {TaskPane.Visible}"); + // 如果已经隐藏 则记录隐藏用于(WPS)多面板的切换的处理 + PaneVisible = TaskPane.Visible; + } + } CheckBtnStatus(); //Globals.ThisAddIn.ribbon.BtnShowPanel.Enabled = !TaskPane.Visible && Proofread; } @@ -648,7 +664,7 @@ namespace AIProofread.Model // 选中 targetRange.Select(); Globals.ThisAddIn.Application.ActiveWindow.ScrollIntoView(targetRange);//.Selection.GoTo(ref bookmark, ref missing, ref missing, ref bookmarkName); - + // //mark.DisableCharacterSpaceGrid = false; // 先滚动到可视区域 @@ -672,7 +688,7 @@ namespace AIProofread.Model List insertMarks = new List(); foreach (var correct in list) { - if(LogHelper.LoggerForm != null) + if (LogHelper.LoggerForm != null) { LogHelper.Log(string.Format("correct content:{0}", correct.Insert)); } @@ -688,7 +704,7 @@ namespace AIProofread.Model int _prev = prevOffset; bool isDisabled = false; // 判断查找内容是否在原始数据中,否则直跳过 - if(item.Tag != "i" && item.Origin.Trim().Length > 0) + if (item.Tag != "i" && item.Origin.Trim().Length > 0) { isDisabled = correct.Insert.IndexOf(item.Origin) == -1; } @@ -787,7 +803,7 @@ namespace AIProofread.Model } - public void InitProofreadCache(List list,Dictionary itemInfoDic) + public void InitProofreadCache(List list, Dictionary itemInfoDic) { marks.Clear(); @@ -800,7 +816,7 @@ namespace AIProofread.Model { var pi = new ProofreadItem(item, correct.Insert, mark, Id); // 是否存在样式信息 - if (itemInfoDic!= null && itemInfoDic.ContainsKey(item.Id)) + if (itemInfoDic != null && itemInfoDic.ContainsKey(item.Id)) { // 获取样式信息并还原 var info = itemInfoDic[item.Id]; @@ -890,6 +906,10 @@ namespace AIProofread.Model // 采纳 marks[proofreadId].Process(status); } + else + { + Logger.Debug("不存在此校对项"); + } } internal bool Saved() @@ -914,7 +934,8 @@ namespace AIProofread.Model try { CurrentDocument.Save(); - }catch (Exception ex) + } + catch (Exception ex) { LogHelper.Log(ex); } @@ -1031,7 +1052,7 @@ namespace AIProofread.Model public Dictionary GetProofreadOriginData() { - Dictionary dic = new Dictionary(); + Dictionary dic = new Dictionary(); // 变量文档所有marks 记录mark对应range的背景、大小、颜色 foreach (var item in marks) { diff --git a/AIProofread/Model/DocumentList.cs b/AIProofread/Model/DocumentList.cs index 3418a07..c51ba39 100644 --- a/AIProofread/Model/DocumentList.cs +++ b/AIProofread/Model/DocumentList.cs @@ -24,7 +24,7 @@ namespace AIProofread.Model public void Clear() { - documentList.ForEach(doc =>{ doc.Dispose(); }); + documentList.ForEach(doc => { doc.Dispose(); }); documentList.Clear(); } @@ -118,9 +118,8 @@ namespace AIProofread.Model Logger.Error("Document not exists SetActiveDocument"); return null; } - if (ActiveDocument == document) return document; - - if (Globals.ThisAddIn.IsWPS) + + if (ActiveDocument != null && ActiveDocument.CurrentDocument != originDocument) { // WPS 只有一个窗口 所以需要先关闭之前文档的面板 ActiveDocument?.Deactive(); @@ -129,6 +128,7 @@ namespace AIProofread.Model ActiveDocument = document; //document.IsActive = true; document.Active(); + document.CheckBtnStatus(); return document; } @@ -141,12 +141,18 @@ namespace AIProofread.Model { var document = Get(originDocument); - // 如果不存在,则添加 - if (document == null) + try { - Logger.Debug("Document not exists,InitDocument: " + originDocument.Name); - document = new DocumentInfo(originDocument); - Add(document); + // 如果不存在,则添加 + if (document == null) + { + Logger.Debug("Document not exists,InitDocument: " + originDocument.Name); + document = new DocumentInfo(originDocument); + Add(document); + } + }catch(Exception ex) + { + Logger.Error("InitDocument error: " + ex.Message,ex); } return document; } diff --git a/AIProofread/Properties/AssemblyInfo.cs b/AIProofread/Properties/AssemblyInfo.cs index 78e4918..5f3f4d9 100644 --- a/AIProofread/Properties/AssemblyInfo.cs +++ b/AIProofread/Properties/AssemblyInfo.cs @@ -7,10 +7,10 @@ using System.Security; // 控制。更改这些特性值可修改 // 与程序集关联的信息。 [assembly: AssemblyTitle("AI校对王")] -[assembly: AssemblyDescription("AI校对王 2.2.4")] +[assembly: AssemblyDescription("AI校对王 2.2.5")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("果麦文化传媒股份有限公司")] -[assembly: AssemblyProduct("AI校对王 2.2.4")] +[assembly: AssemblyProduct("AI校对王 2.2.5")] [assembly: AssemblyCopyright("Copyright © 果麦文化传媒股份有限公司 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/AIProofread/Properties/Resources.Designer.cs b/AIProofread/Properties/Resources.Designer.cs index aad8863..6579ec8 100644 --- a/AIProofread/Properties/Resources.Designer.cs +++ b/AIProofread/Properties/Resources.Designer.cs @@ -380,6 +380,26 @@ namespace AIProofread.Properties { } } + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap icon_update_new { + get { + object obj = ResourceManager.GetObject("icon-update-new", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + + /// + /// 查找 System.Drawing.Bitmap 类型的本地化资源。 + /// + internal static System.Drawing.Bitmap icon_update_new_wps { + get { + object obj = ResourceManager.GetObject("icon-update-new-wps", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } + /// /// 查找 System.Drawing.Bitmap 类型的本地化资源。 /// diff --git a/AIProofread/Properties/Resources.resx b/AIProofread/Properties/Resources.resx index b8833c2..5ca8f90 100644 --- a/AIProofread/Properties/Resources.resx +++ b/AIProofread/Properties/Resources.resx @@ -136,9 +136,6 @@ ..\Resources\icon-history.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-proofread.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - ..\Resources\icon-phone.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -160,6 +157,9 @@ ..\Resources\icon-update-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-manual.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Resources\icon-setting.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -187,8 +187,11 @@ ..\Resources\icon-refresh-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icon-manual-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\button_default.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -202,14 +205,14 @@ ..\Resources\logo_no_text.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-ai-robot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\logo_no_text_wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\logo_wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-clear.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\icon-phone-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -217,8 +220,11 @@ ..\Resources\icon-history-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\logo_no_text_wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-panel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + + ..\Resources\icon-ai-robot.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a ..\Resources\icon-logout.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a @@ -226,13 +232,13 @@ ..\Resources\icon_close.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-panel.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-proofread.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-manual.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-update-new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - ..\Resources\icon-manual-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Resources\icon-update-new-wps.jpg;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a \ No newline at end of file diff --git a/AIProofread/Resources/icon-update-new-wps.jpg b/AIProofread/Resources/icon-update-new-wps.jpg new file mode 100644 index 0000000000000000000000000000000000000000..769232baae30cd846b2b4ba2f4f5837c1247c463 GIT binary patch literal 3941 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 sY`o#+(9$e=9bh-9uITSPGWImC>N~i*`{w*UYD literal 0 HcmV?d00001 diff --git a/AIProofread/Resources/icon-update-new.png b/AIProofread/Resources/icon-update-new.png new file mode 100644 index 0000000000000000000000000000000000000000..72617e98bad15b0669a0a77b11b66d79fdea5fe3 GIT binary patch literal 843 zcmV-R1GM~!P)00007bW%=J0GRN08^urJtm5zh000SaNLh0L z01FcU01FcV0GgZ_0008UNklfQe#x5h)=UAYG*%Vo6&G0IA#|?Re$)P(1^tJH&Enq3MP7 zSUuvU*pJk-DuvXnQpc*4!F~yOZuygsn zTFBk`?9~G9K5?@aFn86vwSZTH*scZlip|8%RZJ_lKf?D7V>qUj`W^FG4b;#I;{g+O zw8~(5X=#=I^YpYzuOk(;N~a?=wMsiN(A6s8oEGNP=lY6i3@~Y}JSgkks1Gn%E#wsD z!fvg^kg9j2q*mZr)w~3?0@tdNe#&VjzSVvC64OGqRBbMbX%W||x^hWrA=j$@SShV^ z`T2Q}<6X;ljkmRw7O~oC<~BlF_<9n|x6{tJgtYR?Nog3@JH)kcR;!!Mt7%d9i&|Qt z{}m;z1opHt4d;c1)&#D#f=BDuL@Ur20WE3a_FO*O)WTqTKL$?TGPs3O&Zfm)6MnvywX}>zPU@?0*_Ui!$NcSx`n7#o002ovPDHLkV1ifTlGOkJ literal 0 HcmV?d00001 diff --git a/AIProofread/Ribbon1.Designer.cs b/AIProofread/Ribbon1.Designer.cs index 44c4699..28810f1 100644 --- a/AIProofread/Ribbon1.Designer.cs +++ b/AIProofread/Ribbon1.Designer.cs @@ -255,7 +255,9 @@ namespace AIProofread this.btnLogin.Image = global::AIProofread.Properties.Resources.icon_user; this.btnLogin.Label = "用户登录\r\n"; this.btnLogin.Name = "btnLogin"; + this.btnLogin.ScreenTip = "用户登录\r\n"; this.btnLogin.ShowImage = true; + this.btnLogin.SuperTip = "通过手机验证码或者密码登录账号"; this.btnLogin.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnLogin_Click); // // btnLogout diff --git a/AIProofread/Ribbon1.cs b/AIProofread/Ribbon1.cs index 904db45..eba7bdf 100644 --- a/AIProofread/Ribbon1.cs +++ b/AIProofread/Ribbon1.cs @@ -178,6 +178,11 @@ namespace AIProofread //Globals.ThisAddIn.SendMessageToWeb("confirm-logout", null); } + public void ShowNewVersionIcon() + { + BtnUpdate.Image = Globals.ThisAddIn.IsWPS? Resources.icon_update_new_wps : Resources.icon_update_new; + } + private void btnOpenLexicon_Click(object sender, RibbonControlEventArgs e) { diff --git a/AIProofread/ThisAddIn.cs b/AIProofread/ThisAddIn.cs index b6b2df7..9420661 100644 --- a/AIProofread/ThisAddIn.cs +++ b/AIProofread/ThisAddIn.cs @@ -62,6 +62,9 @@ namespace AIProofread /// 智能常识检测对话框 = new FormCommonsenseDetection() /// public FormCommonsenseDetection formCommonsenseDetection; + /// + /// 是否为wps + /// public bool IsWPS { get; set; } public List LoginFormList = new List(); @@ -161,6 +164,11 @@ namespace AIProofread } } + private void Application_DocumentBeforePrint(Document Doc, ref bool Cancel) + { + throw new NotImplementedException(); + } + // 异步获取设备唯一标识 public void InitDeviceId() { @@ -176,7 +184,7 @@ namespace AIProofread if (!string.IsNullOrEmpty(deviceId)) { Config.DeviceId = deviceId; - Logger.Debug("设备唯一标识:" + deviceId); + Logger.Info("设备唯一标识:" + deviceId); } } catch (Exception ex) @@ -227,25 +235,25 @@ namespace AIProofread item.Dispose(); }); } - catch (Exception ext) + catch (Exception ex1) { - Logger.Debug(ext); + Logger.Error("移除已关闭文档->释放面板", ex1); } try { documentList.Remove(item); } - catch (Exception ext) + catch (Exception ex2) { - Logger.Debug(ext); + Logger.Error("移除已关闭文档",ex2); } } } } catch (Exception ex) { - Logger.Debug(ex.Message, ex); + Logger.Error("检测已关闭文档", ex); } //await System.Threading.Tasks.Task.Run(() => // { @@ -306,7 +314,6 @@ namespace AIProofread { Config.IS_WPS = true; IsWPS = true; - try { Globals.Ribbons.Ribbon1.InitWPS(); @@ -316,15 +323,16 @@ namespace AIProofread Logger.Error("Init WPS Error ", ex); } } - string verTextFile = Config.APP_BASE_DIR + Path.GetFileName("app_version.txt"); - try - { - File.WriteAllText(verTextFile, Config.APP_VERSION); - } - catch (Exception ex) - { - Logger.Error("Write App Version Error ", ex); - } + //string verTextFile = Config.APP_BASE_DIR + Path.GetFileName("app_version.txt"); + //try + //{ + // File.WriteAllText(verTextFile, Config.APP_VERSION); + //} + //catch (Exception ex) + //{ + // Logger.Error("Write App Version Error ", ex); + //} + Logger.Info("init " + (Config.IS_WPS ? "WPS" : "WORD") + " end"); } private void InitAppByConfig() @@ -368,21 +376,14 @@ namespace AIProofread { return; } - var document = CurrentWordApplication.ActiveDocument; - Logger.Debug("Application_DocumentChange -- " + document.Name + " 修订模式: is " + document.TrackRevisions); - // 设置当前文档 - ActiveDocument = documentList.SetActiveDocument(document); - if (ActiveDocument == null) - { - return; - } - ActiveDocument.CheckBtnStatus(); + var document = documentList.InitDocument(CurrentWordApplication.ActiveDocument); + if(document == null) return; + CheckDocumentClosed(null, null); if (formCommonsenseDetection != null) { formCommonsenseDetection.SendMessageToWeb("document-change", null); } - // } public void SetActiveDocument(Document doc) @@ -408,9 +409,15 @@ namespace AIProofread private void Application_WindowActivate(Document activeDoc, Window Wn) { Logger.Debug("Application_WindowActivate -- " + activeDoc.Name); - if (activeDoc != null && (ActiveDocument == null || activeDoc != ActiveDocument.CurrentDocument)) + if (activeDoc != null) { - documentList.SetActiveDocument(activeDoc); + Logger.Debug("DocumentChange -- " + activeDoc.Name + + " 修订模式: is " + activeDoc.TrackRevisions + + ActiveDocument?.CurrentDocument?.Name + "==》" + activeDoc.Name); + + var document = documentList.SetActiveDocument(activeDoc); + // 设置当前文档 + ActiveDocument = document; } //// 当前文档添加书签集合 //if (!allMarks.ContainsKey(activeDoc)) @@ -443,18 +450,12 @@ namespace AIProofread /// private void Application_DocumentBeforeClose(Document currentDoc, ref bool Cancel) { + Logger.Debug("will close " + currentDoc.Name); var doc = documentList.Get(currentDoc); - if (doc != null) + if (Config.IS_WPS && doc != null) { doc.HidePane(); } - //LogHelper.Log("DocumentBeforeClose", currentDoc.FullName); - //if (allMarks.ContainsKey(currentDoc)) - //{ - // allMarks.Remove(currentDoc); - //} - - //DisposePanel(currentDoc); } //public void ActiveCurrentDocumentMarks(Document document) @@ -476,7 +477,7 @@ namespace AIProofread private void Application_DocumentOpen(Document doc) { //LogHelper.Log("DocumentOpen " + doc.Name); - } + } public int GetMinWidth() @@ -491,34 +492,69 @@ namespace AIProofread private void Application_WindowSelectionChange(Selection s) { + // 处理当前文档选区,用于判断是否显示常识性检测 ribbon.ParseSelectionChange(s); + if (ActiveDocument == null || !s.Active) return; + // 当前选区是否存在书签 + if (s.Range.Start != s.Range.End || s.Bookmarks.Count == 0) return; + var bookmarks = s.Bookmarks; + // 获取当前选区书签的起始位置 + var currentPosition = s.Range.Start; - if (s.Bookmarks != null) + // Logger.Info("当前选区书签数量: " + s.Bookmarks.Count); + // 遍历书签 找到所需的书签 + foreach (Bookmark item in s.Bookmarks) { - if (s.Range.Start == s.Range.End) // 说明是点击呀 + // 判断书签的选区不包含当前选中区域 + if (currentPosition < item.Range.Start || currentPosition > item.Range.End) { - //var count = s.Bookmarks.Count; - if (s.Bookmarks.Count >= 1) // 只有这一个 - { - foreach (Bookmark item in s.Bookmarks) - { - int proofreadId = Config.GetBookmarkIdByName(item.Name); - if (proofreadId > 0) - { - // 只选择第一个书签 - // TODO: 优化 - //Bridge.bridge.SelectMarkById(proofreadId, 0); - ActiveDocument?.SelectMarkById(proofreadId, true); - return; - } - } - } + ReleaseComObject(item); + continue; } + + Logger.Debug("当前选区书签名称: " + item.Name + "范围:" + item.Range.Start + "," + item.Range.End); + //Logger.Debug("当前选区书签内容: " + item.Range.Text); + // 获取书签id + int proofreadId = Config.GetBookmarkIdByName(item.Name); + // 释放com对象 + ReleaseComObject(item); + Logger.Debug("当前选区proofreadId: " + proofreadId); + if (proofreadId > 0) + { + //var targetRange = item.Range; + //// 选中 + //targetRange.Select(); + //Globals.ThisAddIn.Application.ActiveWindow.ScrollIntoView(targetRange); + // 只选择第一个书签 + ActiveDocument?.SelectMarkById(proofreadId, true); + ReleaseComObject(bookmarks); + return; + } + // } + + ReleaseComObject(bookmarks); //Bridge.bridge.SelectMarkById(-1, 0); } - - public int MyProperty { get; set; } + // 释放COM对象 + private void ReleaseComObject(object obj) + { + if (obj != null) + { + try + { + System.Runtime.InteropServices.Marshal.ReleaseComObject(obj); + } + catch (Exception ex) + { + Logger.Error("ReleaseComObject Error", ex); + } + finally + { + obj = null; + } + } + } public void SendMessageToWeb(string msg, object data) { diff --git a/AIProofread/core/AppModule.cs b/AIProofread/core/AppModule.cs index 072ecd2..5da88c1 100644 --- a/AIProofread/core/AppModule.cs +++ b/AIProofread/core/AppModule.cs @@ -13,7 +13,7 @@ /// /// 是否启用常识性检测 /// - public const bool ENABLE_COMMONSENSE_CHECK = true; + public const bool ENABLE_COMMONSENSE_CHECK = false; /// /// 设置功能 /// @@ -34,9 +34,9 @@ public const bool ENABLE_SAVE_CACHE = true; public const bool ENABLE_LOAD_CACHE = true; - public const bool ENABLE_CUSTOMER_SERVICE = true; - public const bool ENABLE_UPGRADE = true; - public const bool ENABLE_HELP = true; + public const bool ENABLE_CUSTOMER_SERVICE = false; + public const bool ENABLE_UPGRADE = false; + public const bool ENABLE_HELP = false; } } diff --git a/AIProofread/core/CorrectResultExportor.cs b/AIProofread/core/CorrectResultExportor.cs index 0416dd4..8a4cf01 100644 --- a/AIProofread/core/CorrectResultExportor.cs +++ b/AIProofread/core/CorrectResultExportor.cs @@ -343,7 +343,7 @@ namespace AIProofread.core }; var beforeText = it.Start == 0 ? null : originSentence.Substring(0, it.Start); - var richTextLength = it.Origin.Length; // it.Tag == "i" ? 1 : it.Text.Length + var richTextLength = it.Tag == "i" ? it.Text.Length:it.Origin.Length; // it.Tag == "i" ? 1 : it.Text.Length var richText = originSentence.Substring(it.Start, richTextLength); var afterText = it.Start >= originSentence.Length ? null : originSentence.Substring(it.Start + richTextLength); diff --git a/AIProofread/core/DocumentUtil.cs b/AIProofread/core/DocumentUtil.cs index 6daa028..fbdea9a 100644 --- a/AIProofread/core/DocumentUtil.cs +++ b/AIProofread/core/DocumentUtil.cs @@ -17,12 +17,14 @@ using AIProofread.Model; using NPOI.SS.Util; using NPOI.HSSF.Util; using AIProofread.core; +using log4net; namespace AIProofread { public class DocumentUtil { static int markId = 0; + public static readonly ILog Logger = LogHelper.GetLogger(typeof(DocumentUtil)); /// /// 添加一个书签 @@ -117,7 +119,7 @@ namespace AIProofread } catch (Exception e) { - LogHelper.Log("remove mark", e); + Logger.Error("remove mark" + e.Message, e); } } } @@ -142,23 +144,6 @@ namespace AIProofread mark.Delete(); } } - //foreach (var mark in document.Bookmarks) - //{ - // if (markId != null) - // { - // if (mark.Name == markId) - // { - // // 删除 - // mark.Delete(); - // mark.Range.Shading.BackgroundPatternColor = (WdColor)WdColorIndex.wdAuto; - // return; - // } - // } - // else - // { - // mark.Delete(); - // } - //} } public static System.Collections.Generic.List GetSectionText() @@ -254,52 +239,11 @@ namespace AIProofread { "search_end",range.End }, { "search_text",range.Text } }; - LogHelper.Log(JsonConvert.SerializeObject(msg1)); - //while (range.Find.Found) - //{ - // var obj4 = range.Document; - // MatchControl = range.Start; - // MatchAlefHamza = range.End; - // var range2 = obj4.Range(ref MatchControl, ref MatchAlefHamza); - // num3 = range2.End; - // if (range2.Text == findText) - // { - // return range2; - // } - // break; - // //if (findIndex == num) - // //{ - - // //} - // //num++; - // //range.Find.MatchByte = true; - // //Find find2 = range.Find; - // //MatchAlefHamza = missword; - // //MatchControl = true; - // //MatchDiacritics = Type.Missing; - // //MatchKashida = Type.Missing; - // //Replace = Type.Missing; - // //ReplaceWith = Type.Missing; - // //Format = Type.Missing; - // //Wrap = Type.Missing; - // //Forward = Type.Missing; - // //MatchAllWordForms = Type.Missing; - // //MatchSoundsLike = Type.Missing; - // //MatchWildcards = Type.Missing; - // //MatchWholeWord = Type.Missing; - // //Start = Type.Missing; - // //End = Type.Missing; - // //// 再次重复查找 - // //find2.Execute(ref MatchAlefHamza, ref MatchControl, ref MatchDiacritics, ref MatchKashida, ref Replace, ref ReplaceWith, ref Format, ref Wrap, ref Forward, ref MatchAllWordForms, ref MatchSoundsLike, ref MatchWildcards, ref MatchWholeWord, ref Start, ref End); - //} - //if (num3 == 0) - //{ - // return null; - //} + Logger.Debug(JsonConvert.SerializeObject(msg1)); } catch (Exception ex) { - LogHelper.Log(ex); + Logger.Error(ex); } return null; } @@ -327,24 +271,9 @@ namespace AIProofread } catch (Exception ex) { - LogHelper.Log(ex); + Logger.Error(ex); } return null; - - //if(bookmark == null) - //{ - // foreach (var m in marks) - // { - // var mark = m as Bookmark; - // var name = mark.Name; - // var tag = mark.Tag?.ToString(); - // if(tag == markName || name == markName) - // { - // return mark; - // } - // } - //} - //return bookmark as Bookmark; } public static Bookmark FindRangeAndCreateBookmark(CorrectItem correct, CorrectContext sentense, Microsoft.Office.Interop.Word.Document document, ref int prevOffset) @@ -381,7 +310,7 @@ namespace AIProofread } catch (Exception ex) { - LogHelper.Log("create mark error:" + ex.Message + "\n" + ex.StackTrace + "\n\n"); + Logger.Error("create mark error:" + ex.Message + "\n" + ex.StackTrace + "\n\n"); } return bookmark; } @@ -404,6 +333,7 @@ namespace AIProofread } //int count = 0; var range = document.Range(offset + item.Start, offset + item.End + 1); + #region 删除批注 //while (true && count++ < 10) //{ // // @@ -428,6 +358,7 @@ namespace AIProofread // Logger.Log(dce); // } //} + #endregion // 比对原始内容与校对原文是否一致 if (range.Text == item.Origin) { @@ -446,11 +377,13 @@ namespace AIProofread { return range1; } + return null; // 执行查找 - return FindTextInRange(sentence, item.Origin); + //return FindTextInRange(sentence, item.Origin); } - catch (Exception) + catch (Exception e) { + Logger.Error("find by sentence error",e); } return null; @@ -521,7 +454,7 @@ namespace AIProofread if (prevOffset >= paraText.Length) { // 查找位置已经超过了整段长度了 - LogHelper.Log("prevOffset:" + prevOffset + " paraText.Length:" + paraText.Length); + Logger.Debug("prevOffset:" + prevOffset + " paraText.Length:" + paraText.Length); return null; } // 执行查找 @@ -608,7 +541,7 @@ namespace AIProofread } catch (Exception e) { - LogHelper.Log(e); + Logger.Error("导出勘误表失败",e); Globals.ThisAddIn.ShowDialog("导出勘误表失败,请重试", null, null); } } @@ -751,7 +684,7 @@ namespace AIProofread } catch (Exception e) { - LogHelper.Log(e); + Logger.Error(e); } var oriCell = row.CreateCell(3); @@ -862,7 +795,7 @@ namespace AIProofread } catch (Exception ex) { - LogHelper.Log(ex); + Logger.Error(ex); } id++; } diff --git a/AIProofread/core/Tools.cs b/AIProofread/core/Tools.cs index 2b946e3..d9c2b01 100644 --- a/AIProofread/core/Tools.cs +++ b/AIProofread/core/Tools.cs @@ -153,6 +153,9 @@ namespace AIProofread public static string GetReadDocumentFilePath(Microsoft.Office.Interop.Word.Document doc) { + + // 保存文档确保内容是最新的 + doc.Save(); // string docPath = doc.FullName; string ext = Path.GetExtension(docPath);