using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Microsoft.Office.Core; using Microsoft.Office.Interop.Word; using UtilLib; namespace AIProofread.Model { /// /// 文档信息 包含文档相关数据、面板及对文档的相关操作 /// public class DocumentInfo { private static char[] ArticleSpecialChars = new char[4] { '\a', '\r', '\v', '\f' }; //private Document currentDocument; public Document CurrentDocument { get; set; } private string fileName; private string uniqueId; private List ranges = new List(); public string UniqueId { get { return uniqueId; } } // 计算uniqueId private void ComputeUniqueId() { string filename = CurrentDocument.FullName; if (!string.IsNullOrEmpty(uniqueId) || string.IsNullOrEmpty(filename)) { return; } // 通过文档路径生成唯一id uniqueId = filename.GetHashCode().ToString(); } // 初始化 public DocumentInfo(Document doc) { this.CurrentDocument = doc; } public void Initialize() { ranges.Clear(); ComputeUniqueId(); } //处理文档选区时 判断当前选区是否有校对项 有则选择该范围 public void ProcessSelectionChange(Selection s) { // 判断选区内是否有书签 if (s.Bookmarks != null && s.Bookmarks.Count > 0) { // 判断是否时点击 点击的起始和结束位置相同 if (s.Range.Start == s.Range.End) { // var count = s.Bookmarks.Count; // 原则只有一个书签 //foreach (Microsoft.Office.Interop.Word.Bookmark item in s.Bookmarks) //{ // int proofreadId = Config.GetBookmarkIdByName(item.Name); // if (proofreadId > 0) // { // //Bridge.bridge.SelectMarkById(proofreadId, 0); // return; // } //} } } } // 获取当前文档文本 public string GetText() { return CurrentDocument.Range().Text; } /// /// 获取当前选中文本 /// /// public string GetSelectedText() { return CurrentDocument.Range().Text; } /// /// 获取指定选区的文本 /// /// /// public string GetRangeText(Range range) { string text = range?.Text; return string.IsNullOrEmpty(text) ? "" : text; } // 定位所有的校对项 public void LocateAllProofreadItems(List list) { // 获取所有的校对项 //List proofreadItems = GetProofreadItems(); var prevOffset = 0; foreach (var item in list) { if (item.CorrectItems != null && item.CorrectItems.Count > 0) { foreach (var correct in item.CorrectItems) { var range = LocateProofreadItem(correct,item,ref prevOffset); if (range == null) continue; } } } } /// /// 查找偏移量 /// private static readonly int INSERT_FIND_OFFSET = 5; /// /// 定位校对项 /// /// 校对项 /// 校对上下文 /// 上一步的 /// private Range LocateProofreadItem(CorrectItem correct, CorrectContext ctx, ref int prevOffset) { var document = CurrentDocument; // 校对项的段落号超过文档的段落数,直接返回 if (ctx.ParagraphNumber > document.Paragraphs.Count) return null; // 获取当前段落 var paragraph = document.Paragraphs[ctx.ParagraphNumber]; if (paragraph == null) return null; var paraRange = paragraph.Range; var paraText = paraRange.Text; var paraStart = paraRange.Start; var offset = paraStart + ctx.SentenceOffset; //var cutLength = Math.Min(c.InsertLen, paraText.Length - offset); var sentence = paraText.Substring(ctx.SentenceOffset, ctx.InsertLength); if (sentence == ctx.Insert) { // 比对原始内容与校对原文是否一致 var range = document.Range(offset + correct.Start, offset + correct.End); // if (range.Text == correct.Origin) return range; } var originText = ctx.Insert; // 如果是新增 则查找定位 if (correct.Tag == "i") { // 找前缀 var prefix1 = correct.Start > 2 ? ( correct.Start > INSERT_FIND_OFFSET ? originText.Substring(correct.Start - INSERT_FIND_OFFSET, INSERT_FIND_OFFSET) : originText.Substring(0, correct.Start) ) : null; // 找后缀 var suffix1 = prefix1 == null ? ( correct.End + INSERT_FIND_OFFSET < originText.Length ? originText.Substring(correct.Start, INSERT_FIND_OFFSET) : originText.Substring(correct.Start, originText.Length - correct.Start) ) : null; // 偏移量 var start1 = prefix1 != null || suffix1 != null ? paraText.IndexOf(prefix1 ?? suffix1, prevOffset) : -1; if (start1 != -1) { var findOffset = paraStart + start1 + (prefix1 != null ? prefix1.Length : 0); return document.Range(findOffset, findOffset); } } // 执行查找 int wordStart = correct.Start; int wordEnd = correct.End; // 找前缀 var prefix = wordStart > 2 ? ( wordStart > INSERT_FIND_OFFSET ? originText.Substring(wordStart - INSERT_FIND_OFFSET, INSERT_FIND_OFFSET) : originText.Substring(0, wordStart) ) : null; // 找后缀 var suffix = prefix == null ? ( wordEnd + INSERT_FIND_OFFSET < originText.Length ? originText.Substring(wordStart, INSERT_FIND_OFFSET) : originText.Substring(wordStart, originText.Length - wordStart) ) : null; var start = prefix != null || suffix != null ? paraText.IndexOf(prefix ?? suffix, prevOffset) // item.start + : -1; if (start != -1) { var findOffset = paraRange.Start + start + (prefix != null ? prefix.Length : 0); var range = document.Range(findOffset, findOffset + wordEnd - wordStart); if (range.Text == correct.Origin) { return range; } } // 直接定位查找 start = paraText.IndexOf(correct.Origin, prevOffset); if (start == -1) return null; // 定位整体开始位置 start = paraStart + start; return document.Range(start, start + correct.Origin.Length); } } }