优化多文档校对性能;

修复多文档同时校对时有几率数据错乱的问题;
This commit is contained in:
LittleBoy 2024-08-24 12:20:47 +08:00
parent 93b46c16bf
commit d2e960243c
17 changed files with 292 additions and 212 deletions

Binary file not shown.

View File

@ -83,16 +83,41 @@ namespace AIProofread
public void SetCurrentDocumentId(int id) public void SetCurrentDocumentId(int id)
{ {
var doc = Globals.ThisAddIn.Application.ActiveDocument; SetDocumentId(id, Globals.ThisAddIn.Application.ActiveDocument);
Globals.ThisAddIn.documentIdDics[doc] = id;
} }
public void SetDocumentId(int id, Document document)
{
Globals.ThisAddIn.documentIdDics[document] = id;
}
public Document GetDocumentById(int id)
{
//return GeIdBytDocument(Globals.ThisAddIn.Application.ActiveDocument);
var documentDic = Globals.ThisAddIn.documentIdDics;
foreach (var doc in documentDic.Keys)
{
if (documentDic[doc] == id) return doc;
}
return null;
}
public int GetCurrentDocumentId() public int GetCurrentDocumentId()
{ {
var doc = Globals.ThisAddIn.Application.ActiveDocument; return GeIdBytDocument(Globals.ThisAddIn.Application.ActiveDocument);
var dics = Globals.ThisAddIn.documentIdDics; }
return dics.ContainsKey(doc) ? dics[doc] : 0;
public int GeIdBytDocument(Document document)
{
if (Globals.ThisAddIn.documentIdDics.ContainsKey(document))
{
return Globals.ThisAddIn.documentIdDics[document];
}
//int id = Globals.ThisAddIn.documentIdDics.Count + 1;
//// 设置文档编号
//SetCurrentDocumentId((int)id);
//return id ;
return 0;
} }
// 打开网页 // 打开网页
@ -162,6 +187,7 @@ namespace AIProofread
var doc = Globals.ThisAddIn.Application.ActiveDocument; var doc = Globals.ThisAddIn.Application.ActiveDocument;
data.Add("name", doc.Name); data.Add("name", doc.Name);
data.Add("fullName", doc.FullName); data.Add("fullName", doc.FullName);
//data.Add("documentId", GeIdBytDocument(doc));
data.Add("wordsCount", doc.Words.Count); data.Add("wordsCount", doc.Words.Count);
data.Add("charactersCount", doc.Characters.Count); data.Add("charactersCount", doc.Characters.Count);
data.Add("content", Tools.GetAllText(doc)); data.Add("content", Tools.GetAllText(doc));
@ -310,10 +336,10 @@ namespace AIProofread
// 清除所有标记 // 清除所有标记
public void clearAllProofreadMark() public void clearAllProofreadMark(Document document)
{ {
// 标记当前文档所有书签数据 // 标记当前文档所有书签数据
Globals.ThisAddIn.ActiveCurrentDocumentMarks(); Globals.ThisAddIn.ActiveCurrentDocumentMarks(document);
try try
{ {
selectProofreadId = -1; selectProofreadId = -1;
@ -346,13 +372,13 @@ namespace AIProofread
{ {
DocumentUtil.RemoveBookmark(markId); DocumentUtil.RemoveBookmark(markId);
} }
public void addBookmark(string data) //public void addBookmark(string data)
{ //{
var item = JsonConvert.DeserializeObject<CorrectedContent>(data); // var item = JsonConvert.DeserializeObject<CorrectedContent>(data);
//var mark = DocumentUtil.AddBookmark(item.color, item.start, item.end); // //var mark = DocumentUtil.AddBookmark(item.color, item.start, item.end);
// 初始化校对对象 // // 初始化校对对象
marks.Add(item.id, new ProofreadItem(item)); // marks.Add(item.id, new ProofreadItem(item));
} //}
public string getAllBookmark() public string getAllBookmark()
{ {
@ -470,14 +496,14 @@ namespace AIProofread
rng.Select(); rng.Select();
} }
public void SelectMarkById(int proofreadId) public void SelectMarkById(int proofreadId,int documentId)
{ {
var doc = documentId < 1 ? Globals.ThisAddIn.Application.ActiveDocument : GetDocumentById(documentId);
//
// 设置当前文档数据 // 设置当前文档数据
Globals.ThisAddIn.ActiveCurrentDocumentMarks(); Globals.ThisAddIn.ActiveCurrentDocumentMarks(doc);
if (proofreadId == selectProofreadId) return; if (proofreadId == selectProofreadId) return;
var doc = Globals.ThisAddIn.Application.ActiveDocument;
// 取消上一个标签移除 // 取消上一个标签移除
if (selectProofreadId > 0 && marks.ContainsKey(selectProofreadId)) if (selectProofreadId > 0 && marks.ContainsKey(selectProofreadId))
{ {
@ -540,34 +566,51 @@ namespace AIProofread
} }
} }
public string InitContent(string content) public string InitContent(string content,int documentId)
{ {
try try
{ {
// 根据文档编号 获取当前文档避免数据混乱
CurrentDocument = GetDocumentById(documentId);
if(CurrentDocument == null)
{
throw new Exception("没有找到校对文档对象");
}
List<DocumentCorrectItem> list = JsonConvert.DeserializeObject<List<DocumentCorrectItem>>(content); List<DocumentCorrectItem> list = JsonConvert.DeserializeObject<List<DocumentCorrectItem>>(content);
// 先清除所有数据 // 先清除所有数据
clearAllProofreadMark(); clearAllProofreadMark(CurrentDocument);
//var app = Globals.ThisAddIn.Application; //var app = Globals.ThisAddIn.Application;
//var cur = app.Selection; //var cur = app.Selection;
// //
var prevOffset = 0;
List<int> disabledList = new List<int>(); List<int> disabledList = new List<int>();
foreach (var correct in list) foreach (var correct in list)
{ {
if (correct.Diffs != null && correct.Diffs.Count > 0) if (correct.Diffs != null && correct.Diffs.Count > 0)
{ {
prevOffset = 0;
int index = 0; int index = 0;
foreach (var item in correct.Diffs) foreach (var item in correct.Diffs)
{ {
if(item.id == 187117) if (item.id == 187095)
{ {
Console.WriteLine("xx"); Console.WriteLine("xx");
} }
var mark = FindRangeAndCreateBookmark(correct.Insert, item, index, correct.Sentence_offset, correct.Insert_len, correct.Paragraph_num); int _prev = prevOffset;
// 查找对应区域并再该区域添加书签
var mark = FindRangeAndCreateBookmark(item, correct,ref prevOffset);
// 防止调用方法中没有更新
if (_prev >= prevOffset)
{
prevOffset = correct.SentenceOffset + item.end;
}
if (item.tag != "i") index++; if (item.tag != "i") index++;
if (mark != null) if (mark != null)
{ {
marks.Add(item.id, new ProofreadItem(item, mark)); marks.Add(item.id, new ProofreadItem(item, mark,documentId));
} }
else else
{ {
@ -576,8 +619,8 @@ namespace AIProofread
{"message","没有找到标记对象" }, {"message","没有找到标记对象" },
{ "origin",item }, { "origin",item },
{ "origin_correct",correct }, { "origin_correct",correct },
{ "new_text",correct.New_text }, { "new_text",correct.NewText },
{ "paragraph_num",correct.Paragraph_num }, { "paragraph_num",correct.ParagraphNumber },
}; };
Logger.Log(JsonConvert.SerializeObject(msg)); Logger.Log(JsonConvert.SerializeObject(msg));
} }
@ -646,21 +689,18 @@ namespace AIProofread
/// <summary> /// <summary>
/// 根据校对项查找文档对应的位置 并创建书签 /// 根据校对项查找文档对应的位置 并创建书签
/// </summary> /// </summary>
/// <param name="originText">接口原始文档</param> /// <param name="correct">校对项</param>
/// <param name="item">校对项</param> /// <param name="sentense">校对</param>
/// <param name="findIndex"></param> /// <param name="prevOffset"></param>
/// <param name="offset"></param>
/// <param name="length"></param>
/// <param name="paragraphIndex"></param>
/// <returns></returns> /// <returns></returns>
public Microsoft.Office.Tools.Word.Bookmark FindRangeAndCreateBookmark(string originText, CorrectedContent item, int findIndex, int offset, int length, int paragraphIndex) public Microsoft.Office.Tools.Word.Bookmark FindRangeAndCreateBookmark(CorrectedContent correct, DocumentCorrectItem sentense,ref int prevOffset)
{ {
Microsoft.Office.Tools.Word.Bookmark bookmark = null; Microsoft.Office.Tools.Word.Bookmark bookmark = null;
try try
{ {
var document = CurrentDocument; var document = CurrentDocument;
ControlCollection controls = Globals.Factory.GetVstoObject(document).Controls; ControlCollection controls = Globals.Factory.GetVstoObject(document).Controls;
var markName = Config.BuildBookmarkName(item.id); var markName = Config.BuildBookmarkName(correct.id);
// 判断是否已经存在 // 判断是否已经存在
if (controls.Contains(markName)) if (controls.Contains(markName))
@ -672,14 +712,16 @@ namespace AIProofread
catch (Exception) { } catch (Exception) { }
} }
Range findRange = null; Range findRange = null;
if (paragraphIndex > document.Paragraphs.Count) return null; // 判断段落是否存在
var paragraph = document.Paragraphs[paragraphIndex]; if (sentense.ParagraphNumber > document.Paragraphs.Count) return null;
var paragraph = document.Paragraphs[sentense.ParagraphNumber];
Range paragraphRange = paragraph.Range; Range paragraphRange = paragraph.Range;
var paragraphStart = paragraphRange.Start; var paragraphStart = paragraphRange.Start;
//offset += paragraphStart;
var Start = paragraphStart + offset;
var End = Start + length - 1; var Start = paragraphStart + sentense.SentenceOffset;
var End = Start + sentense.InsertLength - 1;
if (End > paragraphRange.End) if (End > paragraphRange.End)
{ {
End = paragraphRange.End; End = paragraphRange.End;
@ -691,16 +733,22 @@ namespace AIProofread
string fullText = fullRange.Text ?? paragraphRange.Text; string fullText = fullRange.Text ?? paragraphRange.Text;
// 当前段落文本 // 当前段落文本
string paragraphText = paragraphRange.Text; string paragraphText = paragraphRange.Text;
End = Start + item.end; End = Start + correct.end;
Start = Start + item.start; Start = Start + correct.start;
// 避免越界
prevOffset = Math.Min(prevOffset, paragraphText.Length - 1);
int offset = sentense.SentenceOffset;
int length = sentense.InsertLength;
string originText = sentense.Insert;
// 如果是新增 则查找定位 // 如果是新增 则查找定位
if (item.tag == "i") if (correct.tag == "i")
{ {
// s1. 通过接口的位置 和 文档内容进行比对 // s1. 通过接口的位置 和 文档内容进行比对
try try
{ {
// 判断接口的定位字符串和文档截取的字符串是否一致
if (paragraphText.Substring(offset, length) == originText) if (paragraphText.Substring(offset, length) == originText)
{ {
// 直接使用接口定位 // 直接使用接口定位
@ -715,20 +763,20 @@ namespace AIProofread
if (findRange == null) if (findRange == null)
{ {
// 找前缀 // 找前缀
var prefix = item.start > 2 ? ( var prefix = correct.start > 2 ? (
item.start > INSERT_FIND_OFFSET correct.start > INSERT_FIND_OFFSET
? originText.Substring(item.start - INSERT_FIND_OFFSET, INSERT_FIND_OFFSET) ? originText.Substring(correct.start - INSERT_FIND_OFFSET, INSERT_FIND_OFFSET)
: originText.Substring(0, item.start) : originText.Substring(0, correct.start)
) : null; ) : null;
// 找后缀 // 找后缀
var suffix = prefix == null ? ( var suffix = prefix == null ? (
item.end + INSERT_FIND_OFFSET < originText.Length correct.end + INSERT_FIND_OFFSET < originText.Length
? originText.Substring(item.start, INSERT_FIND_OFFSET) ? originText.Substring(correct.start, INSERT_FIND_OFFSET)
: originText.Substring(item.start, originText.Length - item.start) : originText.Substring(correct.start, originText.Length - correct.start)
) : null; ) : null;
// 偏移量 // 偏移量
var start = prefix != null || suffix != null var start = prefix != null || suffix != null
? paragraphText.IndexOf(prefix ?? suffix, offset) // item.start + ? paragraphText.IndexOf(prefix ?? suffix, prevOffset)
: -1; : -1;
if (start != -1) if (start != -1)
{ {
@ -741,14 +789,18 @@ namespace AIProofread
{ {
findRange = document.Range(Start, End); findRange = document.Range(Start, End);
} }
// 不是新增模式 且定位区域文本和原始文本不匹配
if (item.tag != "i" && findRange.Text != item.origin) if (correct.tag != "i" && findRange.Text != correct.origin)
{ {
findRange = DocumentUtil.FindRange(paragraphIndex, offset, originText, item.origin, item.start, item.end); // 查找
findRange = DocumentUtil.FindRange(correct,sentense,ref prevOffset,CurrentDocument, paragraphRange);
} }
// 能够找到对应的区域 则再对应区域添加书签
if (findRange != null) if (findRange != null)
{ {
// 更新查找的结束位置
prevOffset = findRange.End - paragraphStart;
bookmark = controls.AddBookmark(findRange, markName); bookmark = controls.AddBookmark(findRange, markName);
bookmark.Tag = "ai_proofread"; bookmark.Tag = "ai_proofread";
} }
@ -801,6 +853,11 @@ namespace AIProofread
return bookmark; return bookmark;
} }
/// <summary>
///
/// </summary>
/// <param name="range"></param>
/// <param name="whatToFind"></param>
private void FindRange(ref Range range, ref object whatToFind) private void FindRange(ref Range range, ref object whatToFind)
{ {
object matchCase = false; // 是否区分大小写 object matchCase = false; // 是否区分大小写

View File

@ -3,6 +3,12 @@ using System.Text.RegularExpressions;
namespace AIProofread namespace AIProofread
{ {
public enum AppEnvironment
{
Dev,
Test,
Prod
}
public class Config public class Config
{ {
public static readonly string APP_NAME = "AI校对王"; public static readonly string APP_NAME = "AI校对王";
@ -16,10 +22,13 @@ namespace AIProofread
/// </summary> /// </summary>
public static string WEB_PATH = "http://192.168.10.100:5173/"; public static string WEB_PATH = "http://192.168.10.100:5173/";
public static bool RUN_IN_DEBUG = true; public static bool RUN_IN_DEBUG = true;
public static AppEnvironment APP_ENV = AppEnvironment.Dev;
#else #else
public static string WEB_PATH = "https://gm-plugin.gachafun.com/"; public static string WEB_PATH = "https://gm-plugin.gachafun.com/";
public static bool RUN_IN_DEBUG = false; public static bool RUN_IN_DEBUG = false;
public static AppEnvironment APP_ENV = AppEnvironment.Prod;
#endif #endif
public static readonly string APP_DATA_PATH = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\ai_proofread"; 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\\"; public static readonly string APP_LOG_PATH = APP_DATA_PATH + "\\logs\\";
public static readonly string WEB_DATA_PATH = APP_DATA_PATH + "\\userdata"; public static readonly string WEB_DATA_PATH = APP_DATA_PATH + "\\userdata";

View File

@ -16,9 +16,12 @@ namespace UtilLib
private WdColor originColor; private WdColor originColor;
private WdColor originBackgroundColor; private WdColor originBackgroundColor;
public string Name { get; set; } public string Name { get; set; }
public ProofreadItem(CorrectedContent content) public int DocumentId { get; set; }
public ProofreadItem(CorrectedContent content,int documentId)
{ {
this.content = content; this.content = content;
this.DocumentId = documentId;
InitBookMark(null); InitBookMark(null);
SetMarkName(); SetMarkName();
} }
@ -28,8 +31,9 @@ namespace UtilLib
this.Name = this.mark != null ? mark.Name : Config.BuildBookmarkName(content.id); this.Name = this.mark != null ? mark.Name : Config.BuildBookmarkName(content.id);
} }
public ProofreadItem(CorrectedContent content, Bookmark bookmark) public ProofreadItem(CorrectedContent content, Bookmark bookmark, int documentId)
{ {
this.DocumentId = documentId;
this.content = content; this.content = content;
if (bookmark != null) if (bookmark != null)
{ {
@ -68,7 +72,7 @@ namespace UtilLib
private void OnMarkSelected(object sender, Microsoft.Office.Tools.Word.SelectionEventArgs e) private void OnMarkSelected(object sender, Microsoft.Office.Tools.Word.SelectionEventArgs e)
{ {
//throw new System.NotImplementedException(); //throw new System.NotImplementedException();
Bridge.bridge.SelectMarkById(content.id); Bridge.bridge.SelectMarkById(content.id,DocumentId);
} }
public void Select() public void Select()

View File

@ -51,7 +51,6 @@ namespace AIProofread
this.grpDebug = this.Factory.CreateRibbonGroup(); this.grpDebug = this.Factory.CreateRibbonGroup();
this.btnShowPane = this.Factory.CreateRibbonButton(); this.btnShowPane = this.Factory.CreateRibbonButton();
this.btnHidePane = this.Factory.CreateRibbonButton(); this.btnHidePane = this.Factory.CreateRibbonButton();
this.btnSelectionPosition = this.Factory.CreateRibbonButton();
this.BtnOpenLog = this.Factory.CreateRibbonButton(); this.BtnOpenLog = this.Factory.CreateRibbonButton();
this.button1 = this.Factory.CreateRibbonButton(); this.button1 = this.Factory.CreateRibbonButton();
this.tabAIProofread.SuspendLayout(); this.tabAIProofread.SuspendLayout();
@ -170,7 +169,6 @@ namespace AIProofread
// //
this.grpDebug.Items.Add(this.btnShowPane); this.grpDebug.Items.Add(this.btnShowPane);
this.grpDebug.Items.Add(this.btnHidePane); this.grpDebug.Items.Add(this.btnHidePane);
this.grpDebug.Items.Add(this.btnSelectionPosition);
this.grpDebug.Items.Add(this.BtnOpenLog); this.grpDebug.Items.Add(this.BtnOpenLog);
this.grpDebug.Items.Add(this.button1); this.grpDebug.Items.Add(this.button1);
this.grpDebug.Label = "开发调试"; this.grpDebug.Label = "开发调试";
@ -189,12 +187,6 @@ namespace AIProofread
this.btnHidePane.Name = "btnHidePane"; this.btnHidePane.Name = "btnHidePane";
this.btnHidePane.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnHidePane_Click); this.btnHidePane.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnHidePane_Click);
// //
// btnSelectionPosition
//
this.btnSelectionPosition.Label = "测试分段速度";
this.btnSelectionPosition.Name = "btnSelectionPosition";
this.btnSelectionPosition.Click += new Microsoft.Office.Tools.Ribbon.RibbonControlEventHandler(this.btnSelectionPosition_Click);
//
// BtnOpenLog // BtnOpenLog
// //
this.BtnOpenLog.Label = "打开日志目录"; this.BtnOpenLog.Label = "打开日志目录";
@ -240,7 +232,6 @@ namespace AIProofread
internal Microsoft.Office.Tools.Ribbon.RibbonGroup grpDebug; internal Microsoft.Office.Tools.Ribbon.RibbonGroup grpDebug;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnShowPane; internal Microsoft.Office.Tools.Ribbon.RibbonButton btnShowPane;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnHidePane; internal Microsoft.Office.Tools.Ribbon.RibbonButton btnHidePane;
internal Microsoft.Office.Tools.Ribbon.RibbonButton btnSelectionPosition;
internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnOpenLog; internal Microsoft.Office.Tools.Ribbon.RibbonButton BtnOpenLog;
internal Microsoft.Office.Tools.Ribbon.RibbonButton button1; internal Microsoft.Office.Tools.Ribbon.RibbonButton button1;
} }

View File

@ -31,6 +31,9 @@ namespace AIProofread
ShowDebug(); ShowDebug();
} }
/// <summary>
/// 用于调试或测试
/// </summary>
public void ShowDebug() public void ShowDebug()
{ {
if (Config.RUN_IN_DEBUG) if (Config.RUN_IN_DEBUG)
@ -136,7 +139,7 @@ namespace AIProofread
var result = MessageBox.Show("请确认是否清除此文档的所有校对标注?", "提示", MessageBoxButtons.OKCancel); var result = MessageBox.Show("请确认是否清除此文档的所有校对标注?", "提示", MessageBoxButtons.OKCancel);
if(result == DialogResult.OK) if(result == DialogResult.OK)
{ {
Bridge.bridge.clearAllProofreadMark(); Bridge.bridge.clearAllProofreadMark(null);
Globals.ThisAddIn.SendMessageToWeb("clear-tips", null); Globals.ThisAddIn.SendMessageToWeb("clear-tips", null);
} }
} }
@ -153,28 +156,6 @@ namespace AIProofread
private Microsoft.Office.Interop.Word.Document CurrentDocument; private Microsoft.Office.Interop.Word.Document CurrentDocument;
private void btnSelectionPosition_Click(object sender, RibbonControlEventArgs e)
{
// 测试加快速度处理 段落
//CurrentDocument = Globals.ThisAddIn.Application.ActiveDocument;
//var tables = CurrentDocument.Tables;
//var tableCount = tables.Count;
//System.Windows.Forms.MessageBox.Show("tables "+ tableCount);
//var footNotes = CurrentDocument.Footnotes;
//System.Windows.Forms.MessageBox.Show("footNotes " + footNotes.Count);
//var endNotes = CurrentDocument.Endnotes;
//System.Windows.Forms.MessageBox.Show("endNotes " + endNotes.Count);
//Bridge.bridge.getDocumentData();
CurrentDocument = Globals.ThisAddIn.Application.ActiveDocument;
string path = Tools.GetReadDocumentFilePath(CurrentDocument);
Debug.WriteLine(path);
Logger.Log(path);
System.Windows.Forms.MessageBox.Show("Test");
}
private void TestSplit() private void TestSplit()
{ {
//try //try

View File

@ -47,6 +47,7 @@ namespace AIProofread
public Dictionary<Word.Document, CustomTaskPane> taskPanels = new Dictionary<Word.Document, CustomTaskPane>(); public Dictionary<Word.Document, CustomTaskPane> taskPanels = new Dictionary<Word.Document, CustomTaskPane>();
public Dictionary<Word.Document, bool> panelsVisibleStatus = new Dictionary<Word.Document, bool>(); public Dictionary<Word.Document, bool> panelsVisibleStatus = new Dictionary<Word.Document, bool>();
public Dictionary<Word.Document, int> documentIdDics = new Dictionary<Word.Document, int>(); public Dictionary<Word.Document, int> documentIdDics = new Dictionary<Word.Document, int>();
public CustomTaskPane currentDocumentTaskPane; public CustomTaskPane currentDocumentTaskPane;
private static readonly Dictionary<Word.Document, Dictionary<int, ProofreadItem>> allMarks = new Dictionary<Word.Document, Dictionary<int, ProofreadItem>>(); private static readonly Dictionary<Word.Document, Dictionary<int, ProofreadItem>> allMarks = new Dictionary<Word.Document, Dictionary<int, ProofreadItem>>();
@ -99,10 +100,10 @@ namespace AIProofread
DisposePanel(currentDoc); DisposePanel(currentDoc);
} }
public void ActiveCurrentDocumentMarks() public void ActiveCurrentDocumentMarks(Word.Document document)
{ {
// 判断是否存在 没有的话初始化 // 判断是否存在 没有的话初始化
var currentDoc = Application.ActiveDocument; var currentDoc = document ?? Application.ActiveDocument ;
if (!allMarks.ContainsKey(currentDoc)) if (!allMarks.ContainsKey(currentDoc))
{ {
allMarks[currentDoc] = new Dictionary<int, ProofreadItem>(); allMarks[currentDoc] = new Dictionary<int, ProofreadItem>();
@ -121,6 +122,7 @@ namespace AIProofread
Logger.Log("Application_DocumentOpen -- " + Doc.FullName); Logger.Log("Application_DocumentOpen -- " + Doc.FullName);
ShowPanel(Doc); ShowPanel(Doc);
} }
void DisposePanel(Word.Document doc) void DisposePanel(Word.Document doc)
{ {
if (panelsVisibleStatus.ContainsKey(doc)) if (panelsVisibleStatus.ContainsKey(doc))
@ -249,17 +251,22 @@ namespace AIProofread
Logger.Log("Found app.json " + content); Logger.Log("Found app.json " + content);
if (content == null || content.Length == 0) return; if (content == null || content.Length == 0) return;
AppConfig config = JsonConvert.DeserializeObject<AppConfig>(content); AppConfig config = JsonConvert.DeserializeObject<AppConfig>(content);
if (config.AppUrl?.Length > 0)
// 插件网址
if (!string.IsNullOrEmpty(config.AppUrl))
{ {
Config.WEB_PATH = config.AppUrl; Config.WEB_PATH = config.AppUrl;
} }
if (config.AppRunInDebug) // 运行环境
if (!string.IsNullOrEmpty(config.Environment))
{ {
Config.RUN_IN_DEBUG = config.AppRunInDebug; Config.APP_ENV = config.Environment == "dev" ? AppEnvironment.Dev : (
if (this.ribbon != null) config.Environment == "test" ? AppEnvironment.Test : AppEnvironment.Prod
{ );
this.ribbon.ShowDebug(); }
} if (Config.APP_ENV != AppEnvironment.Prod && this.ribbon != null)
{
this.ribbon.ShowDebug();
} }
} }
} }
@ -316,9 +323,6 @@ namespace AIProofread
} }
} }
private void Application_WindowSelectionChange(Word.Selection s) private void Application_WindowSelectionChange(Word.Selection s)
{ {
if (s.Bookmarks != null) if (s.Bookmarks != null)
@ -333,14 +337,14 @@ namespace AIProofread
int proofreadId = Config.GetBookmarkIdByName(item.Name); int proofreadId = Config.GetBookmarkIdByName(item.Name);
if (proofreadId > 0) if (proofreadId > 0)
{ {
Bridge.bridge.SelectMarkById(proofreadId); Bridge.bridge.SelectMarkById(proofreadId,0);
return; return;
} }
} }
} }
} }
} }
Bridge.bridge.SelectMarkById(-1); Bridge.bridge.SelectMarkById(-1,0);
} }
public int MyProperty { get; set; } public int MyProperty { get; set; }

View File

@ -160,47 +160,48 @@ namespace AIProofread
return list; return list;
} }
private static readonly int INSERT_FIND_OFFSET = 5;
/// <summary> /// <summary>
/// 查找对应段落的range /// 查找偏移量
/// </summary> /// </summary>
/// <param name="paragraphsIndex">段落index从第1开始计数</param> private static readonly int INSERT_FIND_OFFSET = 5;
/// <param name="offset">当前偏移量</param>
/// <param name="findText">要查找字符串</param> /// <summary>
/// <param name="wordStart">字符串原始起始位置</param> /// 查找校对项对应的range
/// <param name="wordEnd">字符串原始结束位置</param> /// </summary>
/// <param name="correct">校对项</param>
/// <param name="sentense">当前校对项所在句子</param>
/// <param name="prevOffset">上一个校对项结束位置</param>
/// <param name="document"></param>
/// <param name="range"></param>
/// <returns></returns> /// <returns></returns>
public static Range FindRange(int paragraphsIndex,int offset,string originText, string findText, int wordStart, int wordEnd) public static Range FindRange(CorrectedContent correct, DocumentCorrectItem sentense,ref int prevOffset, Microsoft.Office.Interop.Word.Document document, Range range)
{ {
// <param name="findIndex"></param> 暂时接口无法支持
var document = Globals.ThisAddIn.Application.ActiveDocument;
if (paragraphsIndex > document.Paragraphs.Count) return null;
var paragraph = document.Paragraphs[paragraphsIndex];
var range = paragraph.Range;
var paragraphText = range.Text; var paragraphText = range.Text;
string findText = correct.origin;
int wordStart = correct.start;
int wordEnd = correct.end;
int offset = sentense.SentenceOffset;
string originText = sentense.Insert;
object Start = range.Start + offset + wordStart;
object End = range.Start + offset + wordEnd;
try try
{ {
//int num = 0;
int num3 = 0;
// 段落开始和结束
object Start = paragraph.Range.Start;
object End = paragraph.Range.End;
// 段落选区
//Range range = document.Range(ref Start, ref End);
var activeDocument = document; var activeDocument = document;
// 查找对象位置 // 查找对象位置
End = range.Start + offset + wordStart; End = range.Start + offset + wordEnd;
Start = range.Start + offset + wordEnd; Start = range.Start + offset + wordStart;
// 直接找到 // 直接找到
var findRange = activeDocument.Range(ref End, ref Start); var findRange = activeDocument.Range(ref Start,ref End);
// 判断对应选区是否是要找的文本 // 判断对应选区是否是要找的文本
if (findRange.Text == findText) if (findRange.Text == findText)
{ {
return findRange; return findRange;
} }
#region 使
// 找前缀 // 找前缀
var prefix = wordStart > 2 ? ( var prefix = wordStart > 2 ? (
wordStart > INSERT_FIND_OFFSET wordStart > INSERT_FIND_OFFSET
@ -214,53 +215,25 @@ namespace AIProofread
: originText.Substring(wordStart, originText.Length - wordStart) : originText.Substring(wordStart, originText.Length - wordStart)
) : null; ) : null;
var start = prefix != null || suffix != null var start = prefix != null || suffix != null
? paragraphText.IndexOf(prefix ?? suffix, offset) // item.start + ? paragraphText.IndexOf(prefix ?? suffix, prevOffset) // item.start +
: -1; : -1;
if (start != -1) if (start != -1)
{ {
var findOffset = range.Start + start + (prefix != null ? prefix.Length : 0); var findOffset = range.Start + start + (prefix != null ? prefix.Length : 0);
findRange = document.Range(findOffset, findOffset + wordEnd - wordStart); findRange = document.Range(findOffset, findOffset + wordEnd - wordStart);
if(findRange.Text == findText) { return findRange; } if (findRange.Text == findText) { return findRange; }
} }
var msg = new Dictionary<string, object>{ #endregion
{"message","后端接口位置不可用,开始执行查找" },
{ "origin_start",wordStart },
{ "origin_end",wordEnd },
{"find_text",findRange.Text },
{"origin_text", findText}
};
Logger.Log(JsonConvert.SerializeObject(msg));
// 查找
range.Find.MatchByte = true;
// 使用选区查找功能
Find find = range.Find;
// 节约变量
End = findText;
Start = true;
object MatchWholeWord = Type.Missing; // 使用段落字符串进行强匹配
object MatchWildcards = Type.Missing; start = paragraphText.IndexOf(findText, prevOffset);
object MatchSoundsLike = Type.Missing; if (start != -1)
object MatchAllWordForms = Type.Missing; {
object Forward = Type.Missing; start += range.Start;
object Wrap = Type.Missing; return document.Range(start, start + findText.Length);
object Format = Type.Missing; }
object ReplaceWith = Type.Missing;
object Replace = Type.Missing;
object MatchKashida = Type.Missing;
object MatchDiacritics = Type.Missing;
object MatchAlefHamza = Type.Missing;
object MatchControl = Type.Missing;
// 没有找到则执行查询
find.Execute(
ref End, ref Start, ref MatchWholeWord,
ref MatchWildcards, ref MatchSoundsLike,
ref MatchAllWordForms, ref Forward, ref Wrap,
ref Format, ref ReplaceWith, ref Replace,
ref MatchKashida, ref MatchDiacritics,
ref MatchAlefHamza, ref MatchControl
);
var msg1 = new Dictionary<string, object>{ var msg1 = new Dictionary<string, object>{
{"message",range.Find.Found?"搜索到可用位置":"没有搜索到可用位置" }, {"message",range.Find.Found?"搜索到可用位置":"没有搜索到可用位置" },
@ -269,50 +242,51 @@ namespace AIProofread
{ "search_text",range.Text } { "search_text",range.Text }
}; };
Logger.Log(JsonConvert.SerializeObject(msg1)); Logger.Log(JsonConvert.SerializeObject(msg1));
while (range.Find.Found) //while (range.Find.Found)
{ //{
var obj4 = range.Document; // var obj4 = range.Document;
MatchControl = range.Start; // MatchControl = range.Start;
MatchAlefHamza = range.End; // MatchAlefHamza = range.End;
var range2 = obj4.Range(ref MatchControl, ref MatchAlefHamza); // var range2 = obj4.Range(ref MatchControl, ref MatchAlefHamza);
num3 = range2.End; // num3 = range2.End;
if (range2.Text == findText) // if (range2.Text == findText)
{ // {
return range2; // return range2;
} // }
break; // break;
//if (findIndex == num) // //if (findIndex == num)
//{ // //{
//} // //}
//num++; // //num++;
//range.Find.MatchByte = true; // //range.Find.MatchByte = true;
//Find find2 = range.Find; // //Find find2 = range.Find;
//MatchAlefHamza = missword; // //MatchAlefHamza = missword;
//MatchControl = true; // //MatchControl = true;
//MatchDiacritics = Type.Missing; // //MatchDiacritics = Type.Missing;
//MatchKashida = Type.Missing; // //MatchKashida = Type.Missing;
//Replace = Type.Missing; // //Replace = Type.Missing;
//ReplaceWith = Type.Missing; // //ReplaceWith = Type.Missing;
//Format = Type.Missing; // //Format = Type.Missing;
//Wrap = Type.Missing; // //Wrap = Type.Missing;
//Forward = Type.Missing; // //Forward = Type.Missing;
//MatchAllWordForms = Type.Missing; // //MatchAllWordForms = Type.Missing;
//MatchSoundsLike = Type.Missing; // //MatchSoundsLike = Type.Missing;
//MatchWildcards = Type.Missing; // //MatchWildcards = Type.Missing;
//MatchWholeWord = Type.Missing; // //MatchWholeWord = Type.Missing;
//Start = Type.Missing; // //Start = Type.Missing;
//End = 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); // //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) //if (num3 == 0)
{ //{
return null; // return null;
} //}
} }
catch (Exception) catch (Exception ex)
{ {
Logger.Log(ex);
} }
return null; return null;
} }

View File

@ -5,5 +5,9 @@ namespace UtilLib
{ {
public string AppUrl { get; set; } public string AppUrl { get; set; }
public bool AppRunInDebug { get; set; } public bool AppRunInDebug { get; set; }
/// <summary>
/// dev | test | product
/// </summary>
public string Environment { get; set; }
} }
} }

View File

@ -2,15 +2,45 @@
{ {
public class CorrectedContent public class CorrectedContent
{ {
/// <summary>
/// 校对类别()
/// </summary>
public string tag { get; set; } public string tag { get; set; }
/// <summary>
/// 校对原始文本
/// </summary>
public string origin { get; set; } public string origin { get; set; }
/// <summary>
/// 校对文本
/// </summary>
public string text { get; set; } public string text { get; set; }
/// <summary>
/// 校对项在句子中的开始位置
/// </summary>
public int start { get; set; } public int start { get; set; }
/// <summary>
/// 校对项在句子中的结束位置
/// </summary>
public int end { get; set; } public int end { get; set; }
/// <summary>
/// 校对项ID
/// </summary>
public int id { get; set; } public int id { get; set; }
/// <summary>
/// 校对项索引
/// </summary>
public int idx { get; set; } public int idx { get; set; }
/// <summary>
/// 校对所属分类
/// </summary>
public int type { get; set; } public int type { get; set; }
/// <summary>
/// 校对状态
/// </summary>
public int isAccept { get; set; } public int isAccept { get; set; }
/// <summary>
/// 校对项颜色
/// </summary>
public string color { get; set; } public string color { get; set; }
} }
} }

View File

@ -1,17 +1,43 @@
using System.Collections.Generic; using Newtonsoft.Json;
using System.Collections.Generic;
namespace UtilLib namespace UtilLib
{ {
public class DocumentCorrectItem public class DocumentCorrectItem
{ {
public string Key { get; set; } public string Key { get; set; }
/// <summary>
/// 句子原始文本(可能过滤掉空格等特殊字符)
/// </summary>
public string Insert { get; set; } public string Insert { get; set; }
public string New_text { get; set; }
public int Insert_len { get; set; } /// <summary>
/// 校对后的文本
/// </summary>
[JsonProperty("new_text")]
public string NewText { get; set; }
/// <summary>
/// 句子原始文本长度
/// </summary>
[JsonProperty("insert_len")]
public int InsertLength { get; set; }
public int Offset { get; set; } public int Offset { get; set; }
public int Paragraph_offset { get; set; } public int Paragraph_offset { get; set; }
public int Paragraph_num { get; set; } /// <summary>
public int Sentence_offset { get; set; } /// 句子所在文档的段落数(从1开始)
/// </summary>
[JsonProperty("paragraph_num")]
public int ParagraphNumber { get; set; }
/// <summary>
/// 句子在段落中的其实位置
/// </summary>
[JsonProperty("sentence_offset")]
public int SentenceOffset { get; set; }
/// <summary>
/// 当前句子的校对列表项
/// </summary>
public List<CorrectedContent> Diffs { get; set; } public List<CorrectedContent> Diffs { get; set; }
} }
} }