diff --git a/README.md b/README.md index 3ef26b3..6033980 100644 --- a/README.md +++ b/README.md @@ -387,6 +387,10 @@ Ctrl + Shift + ` 切換OBS開始串流和停止串流時可處理的程序(這 Ctrl + Alt + i 顯示IP現狀訊息方塊 +Ctrl + Alt + pageup : 在新的分頁開啟CTP圖文對照前一頁以供檢視 20240920 + +Ctrl + Alt + pagedown : 在新的分頁開啟CTP圖文對照下一頁以供檢視 + Ctrl + Shift + o 執行《看典古籍》OCR API ,執行 GetOCRResult 方法。(須將token存成「OCRAPItoken.txt」檔置於「我的文件\\CtextTempFiles」下,並在程式碼中覆寫本人帳號/郵箱。) Ctrl + Shift + w 關閉 Chrome 網頁視窗 @@ -711,11 +715,16 @@ Ctrl + Delete : 將插入點所在位置之後的文字一律清除(Ctrl + z Alt + 滑鼠左鍵 : 更新最後的備份頁文本 -Ctrl+ 滑鼠左鍵:在插入點後分行分段(原為切換RichTextBox用) +Ctrl + 滑鼠左鍵:在插入點後分行分段(原為切換RichTextBox用) + +Ctrl + 滑鼠右鍵:切換RichTextBox用 + +Ctrl + Alt + 滑鼠左鍵:將插入點後的分行分段清除 -Ctrl+ 滑鼠右鍵:切換RichTextBox用 +Ctrl + Alt + = : 以選取文字檢索CTP中阮元刻《十三經注疏》本《周易正義》。便於擷取《易》學資料用。20240920 +> 選取字串將複製至剪貼簿備用。 -Ctrl+ Alt + 滑鼠左鍵:將插入點後的分行分段清除 +> https://ctext.org/library.pl?if=gb&res=83519&by_collection=127 滑鼠點二下,執行 Ctrl + + , 將插入點所在之前的文本貼到 Ctext 網頁 [簡單修改模式] 文字方塊中,並會重設以插入點位置為頁面結束位國(同Ctrl + -(數字鍵盤)) diff --git a/TextForCtextPortable.zip b/TextForCtextPortable.zip index 6ed4c19..00d2eaa 100644 Binary files a/TextForCtextPortable.zip and b/TextForCtextPortable.zip differ diff --git a/WindowsFormsApp1/Browser.cs b/WindowsFormsApp1/Browser.cs index c3662d5..d8641a1 100644 --- a/WindowsFormsApp1/Browser.cs +++ b/WindowsFormsApp1/Browser.cs @@ -5451,7 +5451,7 @@ internal static bool OCR_GJcool_AutoRecognizeVertical(string downloadImgFullName #endregion - if (ActiveForm1.TopMost) ActiveForm1.TopMost = false; + ActiveForm1.TopMost = false; //點數(算力值、算力配额)不足逕用「快速體驗」執行 if (!OCR_GJcool_AccountChanged && waitGJcoolPoint || (!OCR_GJcool_AccountChanged && waitGJcoolPoint && DateTime.Now.Subtract(gjCoolPointLess150When) < gjCoolPointEnoughTimespan)) { @@ -5792,7 +5792,7 @@ internal static bool OCR_GJcool_AutoRecognizeVertical(string downloadImgFullName //Thread.Sleep(3200); //等待「選擇檔案」控制項出現,最多等timeSpanSecs秒; //為免tab鍵數不同,而須手動操作,以免表單遮住畫面: - if (ActiveForm1.TopMost) ActiveForm1.TopMost = false; + ActiveForm1.TopMost = false; Clipboard.Clear(); DateTime begin = DateTime.Now; const int timeSpanSecs = 30; TimeSpan timeSpan = new TimeSpan(); @@ -8057,6 +8057,24 @@ string standardizedText(ref string text) return true; } /// + /// 改變CTP圖文對照網址的 Page 參數以供翻頁 + /// 20240920 Copilot大菩薩:更改 URL 参数以翻页:https://sl.bing.net/jZV8afaj85Q + /// + /// 要改變的網址 + /// Page參數要成的數值 + /// 傳回改動後的網址 + public static string ChangePageParameter(string url, int newPageNumber) + { + var uri = new Uri(url); + var query = System.Web.HttpUtility.ParseQueryString(uri.Query); + query.Set("page", newPageNumber.ToString()); + var uriBuilder = new UriBuilder(uri) + { + Query = query.ToString() + }; + return uriBuilder.ToString(); + } + /// /// 作為「《漢籍全文資料庫》檢索易學關鍵字」的欲檢索關鍵字瀏覽清單索引(已檢索瀏覽之位置)記錄用。在textBox2中輸入「lx」(list index clear(x=叉=清除))以歸零 /// internal static int ListIndex_Hanchi_SearchingKeywordsYijing = 0; @@ -8072,12 +8090,91 @@ internal static bool Hanchi_CTP_SearchingKeywordsYijing() { if (driver == null) return true; - string title; + string title = null; + + #region 檢查title creedit_with_Copilot大菩薩: C# 比對字串中的特定子字串: https://sl.bing.net/dy0lfJJXE72 + //檢查title 如果不包含指定的條件,則傳回false + bool checkTitle(string titleToCheck) + { + string pattern = "漢籍全文|中國哲學書電子化計劃|Chinese Text Project"; + return Regex.IsMatch(title, pattern); + //string[] keywords = { "漢籍全文", "中國哲學書電子化計劃", "Chinese Text Project" }; + //var foundKeywords = keywords.Where(keyword => title.Contains(keyword)); + } + + void forEachTabChectTitle() + { + //《漢籍全文資料庫》網頁介面 + foreach (var item in driver.WindowHandles) + { + driver.SwitchTo().Window(item); + try + { + if (driver.Title.Contains("漢籍全文")) break; + } + catch (Exception exx) + { + switch (exx.HResult) + { + case -2146233088: + if (exx.Message.StartsWith("unknown error\nfrom no such execution context:"))//unknown error + //from no such execution context: frame does not have execution context + // (Session info: chrome = 128.0.6613.138) + continue; + break; + default: + Console.WriteLine(exx.HResult + exx.Message); + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(exx.HResult + exx.Message); + break; + } + } + } + if (!driver.Title.Contains("漢籍全文")) + { + title = string.Empty; + foreach (var item in driver.WindowHandles) + { + try + { + if (driver.SwitchTo().Window(item).Url.StartsWith("https://ctext.org/wiki.pl?if="))//https://ctext.org/wiki.pl?if=gb&res=、https://ctext.org/wiki.pl?if=en&res= + { title = driver.Title; break; } + } + catch (Exception exx) + { + switch (exx.HResult) + { + case -2146233088: + if (exx.Message.StartsWith("unknown error\nfrom no such execution context:"))//unknown error + //from no such execution context: frame does not have execution context + // (Session info: chrome = 128.0.6613.138) + continue; + break; + default: + Console.WriteLine(exx.HResult + exx.Message); + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(exx.HResult + exx.Message); + break; + } + } + + } + } + } + + #endregion + + + try { //不要切到Chrome瀏覽器!可以在等結果的時候做別的工作。20240915 //driver.SwitchTo().Window(driver.CurrentWindowHandle); title = driver.Title;//避免誤關出錯 + if (!checkTitle(title)) forEachTabChectTitle(); + if (title.IsNullOrEmpty()) + { + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly("請開啟《漢籍全文資料庫》網頁檢索介面,再開始操作"); + return true; + } } catch (Exception ex) { @@ -8096,65 +8193,11 @@ internal static bool Hanchi_CTP_SearchingKeywordsYijing() } break; default: - - //《漢籍全文資料庫》網頁介面 - foreach (var item in driver.WindowHandles) + forEachTabChectTitle(); + if (title.IsNullOrEmpty()) { - driver.SwitchTo().Window(item); - try - { - if (driver.Title.Contains("漢籍全文")) break; - } - catch (Exception exx) - { - switch (exx.HResult) - { - case -2146233088: - if (exx.Message.StartsWith("unknown error\nfrom no such execution context:"))//unknown error - //from no such execution context: frame does not have execution context - // (Session info: chrome = 128.0.6613.138) - continue; - break; - default: - Console.WriteLine(exx.HResult + exx.Message); - Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(exx.HResult + exx.Message); - break; - } - } - } - if (!driver.Title.Contains("漢籍全文")) - { - title = string.Empty; - foreach (var item in driver.WindowHandles) - { - try - { - if (driver.SwitchTo().Window(item).Url.StartsWith("https://ctext.org/wiki.pl?if="))//https://ctext.org/wiki.pl?if=gb&res=、https://ctext.org/wiki.pl?if=en&res= - { title = driver.Title; break; } - } - catch (Exception exx) - { - switch (exx.HResult) - { - case -2146233088: - if (exx.Message.StartsWith("unknown error\nfrom no such execution context:"))//unknown error - //from no such execution context: frame does not have execution context - // (Session info: chrome = 128.0.6613.138) - continue; - break; - default: - Console.WriteLine(exx.HResult + exx.Message); - Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(exx.HResult + exx.Message); - break; - } - } - - } - if (title == string.Empty) - { - Form1.MessageBoxShowOKExclamationDefaultDesktopOnly("請開啟《漢籍全文資料庫》網頁檢索介面,再開始操作"); - return true; - } + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly("請開啟《漢籍全文資料庫》網頁檢索介面,再開始操作"); + return true; } break; } @@ -8166,9 +8209,9 @@ internal static bool Hanchi_CTP_SearchingKeywordsYijing() "咸恆","老陰", "老陽", "少陰", "少陽","十翼","四象","兩儀", "无妄", "彖", "象曰", "象傳", "象日", "象云","小象", "筮", "初九","九二","九三","九四","九五","上九","初六","六二","六三","六四","六五","上六","用九","用六", "繇辭","繇詞", - "隨時之義","庖有魚","包有魚","精義入神","豶豕","童牛","承之羞","雷在天上","錫馬", "蕃庶","晝日","三接","懲忿","窒欲","敬以直內","義以方外","迷後得主","利西南","品物咸章","天下大行","益動而", "日進無疆","頻巽","豚魚","頻復", "懲窒","閑邪","存誠","乾乾","悔吝","憧憧", "類萬物","柔順利貞","比之匪人","貞厲","履貞","履道坦坦","貞吉","悔亡","時義","健順", "內健而外順", "內健外順", "外順而內健", "外順內健","敦復","直方","開物成務","窮神知化", "夕惕","惕若","研幾極深","極深研幾","一陰一陽","允升","木上有水","勞民勸相","索而得","我有好爵","言有序","有聖人之道四","長子帥師","弟子輿尸","無悶","日用而不知","之道鮮","原始反終", "寂然不動", "感而遂通","朋從", "朋盍", "容民畜眾","有過則改","見善則遷", + "隨時之義","庖有魚","包有魚","精義入神","豶豕","童牛","承之羞","雷在天上","錫馬", "蕃庶","晝日","三接","懲忿","窒欲","敬以直內","義以方外","迷後得主","利西南","品物咸章","天下大行","益動而", "日進無疆","頻巽","豚魚","頻復", "懲窒","閑邪","存誠","乾乾","悔吝","憧憧", "類萬物","柔順利貞","比之匪人","貞厲","履貞","履道坦坦","貞吉","悔亡","時義","健順", "內健而外順", "內健外順", "外順而內健", "外順內健","敦復","直方","開物成務","窮神知化", "夕惕","惕若","研幾極深","極深研幾","一陰一陽","允升","木上有水","勞民勸相","索而得","我有好爵","言有序","有聖人之道四","長子帥師","弟子輿尸","無悶","日用而不知","之道鮮","原始反終", "寂然不動", "感而遂通","朋從", "朋盍", "容民畜眾","有過則改","見善則遷","養正","養賢","知臨","臨大君", "默而成之","黙而成之","不言而信", "存乎德行","通天下之志","履正", "繼之者善", "仁者見之", "知者見之", "智者見之", "象義", - "伏羲","伏𦏁","庖𦏁","宓𦏁","伏犧","庖犧"}; + "伏羲","伏𦏁","庖羲","庖𦏁","宓𦏁","宓羲","宓犧","伏犧","庖犧"}; //異體字處理(只用在《中國哲學書電子化計劃》,因為《漢籍全文資料庫》已俱。) if (title.EndsWith("中國哲學書電子化計劃") || title.EndsWith("Chinese Text Project")) @@ -8261,11 +8304,13 @@ internal static bool Hanchi_CTP_SearchingKeywordsYijing() driver.Navigate().Back(); returnValue = false; } - else//有結果-中國哲學書電子化計劃 + else//檢索有結果-中國哲學書電子化計劃 { returnValue = true; Clipboard.SetText(keyword); ActiveForm1.KeyinTextmodeSwitcher(); //有文本的文字框 //Thread.Sleep(800); + ActiveForm1.TopMost = false; + driver.SwitchTo().Window(driver.CurrentWindowHandle); if (new StringInfo(keyword).LengthInTextElements > 1) FindPageAndPaste2Find(driver, keyword); else @@ -8273,11 +8318,13 @@ internal static bool Hanchi_CTP_SearchingKeywordsYijing() }//ActiveForm1.HideToNICo(); } } - else//有結果-中國哲學書電子化計劃 + else//檢索有結果-中國哲學書電子化計劃 { returnValue = true; Clipboard.SetText(keyword); ActiveForm1.KeyinTextmodeSwitcher(); //有文本的文字框 //Thread.Sleep(800); + ActiveForm1.TopMost = false; + driver.SwitchTo().Window(driver.CurrentWindowHandle); if (new StringInfo(keyword).LengthInTextElements > 1) FindPageAndPaste2Find(driver, keyword); else diff --git a/WindowsFormsApp1/CnText.cs b/WindowsFormsApp1/CnText.cs index bb6a8fa..cbdd475 100644 --- a/WindowsFormsApp1/CnText.cs +++ b/WindowsFormsApp1/CnText.cs @@ -1025,16 +1025,64 @@ public static void Spaces2Braces(ref string text) string result = Regex.Replace(text, pattern, replacement); if (result != text) { text = result; } } + /// + /// 縮排字級計算:計算分段符號後的全形空格數量 + /// 20240920 creedit_with_Copilot大菩薩:計算段落符號後的全形空格數量:https://sl.bing.net/f3ufxPqngjc + /// + /// 要計算的文本 + /// + public static int IndentCounter(string strToCount) + { + int count = 0; + //string pattern = @"\r\n "; // 使用正則表達式匹配 "\r\n" 後面接的全形空格 + string pattern = Environment.NewLine + @" "; // 使用正則表達式匹配 "\r\n" 後面接的全形空格 + foreach (Match match in Regex.Matches(strToCount, pattern)) + { + count++; + } + return count; + } + /// + /// 縮排字級計算:計算分段符號後的全形空格數量 + /// 20240920 creedit_with_Copilot大菩薩:計算段落符號後的全形空格數量:https://sl.bing.net/f3ufxPqngjc + /// + /// 要計算的文本 + /// + /// 傳回與縮排等量的全形空格字串 + public static string IndentCounter(string strToCount, out int count) + { + count = 0; + int s = strToCount.IndexOf(Environment.NewLine); + if (s == -1) return string.Empty; + s += Environment.NewLine.Length; + if (s + 1 >= strToCount.Length) return string.Empty; + while (s + 1 < strToCount.Length && strToCount.Substring(s + count, 1) == " ") + count++; + return new string(' ', count); // 根據計算出的全形空格數量生成等長的空格字串 + //int spaceCount = 0; + //string pattern = @"\r\n "; // 使用正則表達式匹配 "\r\n" 後面接的全形空格 + //string pattern = Environment.NewLine + @" "; // 使用正則表達式匹配 "\r\n" 後面接的全形空格 + //foreach (Match match in Regex.Matches(strToCount, pattern)) + //{ + // count++; + // spaceCount += match.Value.Length - 2; // 減去 "\r\n" 的長度,只計算全形空格的數量 + //} + //return new string(' ', spaceCount); // 根據計算出的全形空格數量生成等長的空格字串 + + } + /// /// 20240808(臺灣父親節)creedit with Copilot大菩薩:《古籍酷》自動標點完成的文本重新插入分段符號 /// /// - /// + /// /// - public static string RestoreParagraphs(string originalText,ref string punctuatedText) + public static string RestoreParagraphs(string originalText, ref string punctuatedText) //public static string RestoreParagraphs(ref string originalText, ref string punctuatedText) { + //記下縮排的字數 + int indentCount = 0; string indentStr = IndentCounter(originalText, out indentCount); // Define a set of punctuation marks to ignore HashSet punctuationMarks = new HashSet { '。', ',', ';', ':', '、', '?', '!', '《', '》', '「', '」', '『', '』' }; @@ -1119,7 +1167,8 @@ int FindAdjustedPosition(string text, int pos, string before, string after) if (afterSubTextWithoutPunctuation.Contains(after)) { //異常檢查: - if (afterSubTextWithoutPunctuation != after) Debugger.Break(); + if (afterSubTextWithoutPunctuation != after) + if (!afterSubTextWithoutPunctuation.EndsWith(after)) Debugger.Break(); return adjustedPos; } else @@ -1158,20 +1207,25 @@ int FindAdjustedPosition(string text, int pos, string before, string after) string before = originalText.Substring(start, index - start); string after = originalText.Substring(index + newLine.Length, end - index - newLine.Length); - //if (char.IsHighSurrogate(before.LastOrDefault())) - // before = originalText.Substring(start, index - start + 1); - if (char.IsLowSurrogate(before.FirstOrDefault())) - { - Debugger.Break(); - before = originalText.Substring(start - 1, index - start); - } - if (char.IsHighSurrogate(after.LastOrDefault())) - { - Debugger.Break(); - after = originalText.Substring(index + newLine.Length, end - index - newLine.Length + 1); - } - //if (char.IsLowSurrogate(after.FirstOrDefault())) - // after = originalText.Substring(index + newLine.Length, end - index - newLine.Length); + #region surrogate判斷調適:會干擾後面的判斷,須再審測(已經測試,不可用!)20240920 + + + ////if (char.IsHighSurrogate(before.LastOrDefault())) + //// before = originalText.Substring(start, index - start + 1); + //if (char.IsLowSurrogate(before.FirstOrDefault())) + //{ + // Debugger.Break(); + // before = originalText.Substring(start - 1, index - start); + //} + //if (char.IsHighSurrogate(after.LastOrDefault())) + //{ + // Debugger.Break(); + // after = originalText.Substring(index + newLine.Length, end - index - newLine.Length + 1); + //} + ////if (char.IsLowSurrogate(after.FirstOrDefault())) + //// after = originalText.Substring(index + newLine.Length, end - index - newLine.Length); + + #endregion // Ensure 'before' and 'after' do not include newline characters while (before.Contains('\r') || before.Contains('\n')) @@ -1203,14 +1257,39 @@ int FindAdjustedPosition(string text, int pos, string before, string after) //因為在子函式方法中,若沒有找到時會將標點符號清除再與原未標點之文本作比對,若原文本已略有標點,則會干擾比對結果,不如兩造一律均清除,則簡單有效 20240808 if (adjustedPos != -1) { - punctuatedText = punctuatedText.Insert(adjustedPos, newLine); - offset += newLine.Length; + //punctuatedText = punctuatedText.Insert(adjustedPos, newLine); + //offset += newLine.Length; + //以下改在迴圈後再處理--仍在這裡試看看:成功了!20240920 + punctuatedText = punctuatedText.Insert( + punctuationMarks.Contains(punctuatedText[adjustedPos]) ? + ++adjustedPos : adjustedPos + , newLine + indentStr); + offset += newLine.Length + indentCount; + } } if (Form1.CountWordsinDomain("\r", originalText) != Form1.CountWordsinDomain("\n", punctuatedText)) Debugger.Break(); + + //if (indentCount > 0) + //{ + // FormalizeText(ref punctuatedText); + // punctuatedText = punctuatedText.Replace(Environment.NewLine, Environment.NewLine + indentStr); + //} + + if (punctuatedText.IndexOf("􏿽:") > -1) punctuatedText = punctuatedText.Replace("􏿽:", "􏿽");//《古籍酷》自動標點的問題 20240920 + if (originalText.StartsWith(" ") && !punctuatedText.StartsWith(" ")) + { + int s = 0; + while (s < originalText.Length && originalText.Substring(s, 1) == " ") + { + s++; + } + punctuatedText = originalText.Substring(0, s) + punctuatedText;//亦《古籍酷》自動標點的問題 20240920 + } + return punctuatedText; } diff --git a/WindowsFormsApp1/Form1.cs b/WindowsFormsApp1/Form1.cs index bbdda92..179e821 100644 --- a/WindowsFormsApp1/Form1.cs +++ b/WindowsFormsApp1/Form1.cs @@ -67,6 +67,7 @@ public partial class Form1 : Form internal string dropBoxPathIncldBackSlash; internal string MydocumentsPathIncldBackSlash; readonly System.Drawing.Point textBox4Location; readonly Size textBox4Size; + readonly System.Drawing.Font textBox4FontDefault; private readonly Color textBox2BackColorDefault; private readonly Color FormBackColorDefault; readonly Size textBox1SizeToForm; @@ -207,6 +208,7 @@ public Form1() textBox1FontDefaultSize = textBox1.Font.Size; textBox4Location = textBox4.Location; textBox4Size = textBox4.Size; + textBox4FontDefault = textBox4.Font; textBox1SizeToForm = new Size(this.Width - textBox1.Width, this.Height - textBox1.Height); MydocumentsPathIncldBackSlash = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\"; dropBoxPathIncldBackSlash = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + @"\Dropbox\"; @@ -1983,11 +1985,99 @@ private void textBox1_KeyDown(object sender, KeyEventArgs e) #region 同時按下 Ctrl + Alt + + if (e.Control && e.Alt) + { + if (e.KeyCode == Keys.Oemplus) + { + //Ctrl + Alt + = : 以選取文字檢索CTP中阮元刻《十三經注疏》本《周易正義》。便於擷取《易》學資料用。20240920 + //if (textBox1.SelectionLength == 0) return; + e.Handled = true; + overtypeModeSelectedTextSetting(ref textBox1); + string url = "https://ctext.org/wiki.pl?if=gb&res=315747&searchu=" + textBox1.SelectedText; + textBox1.Copy(); + switch (browsrOPMode) + { + case BrowserOPMode.appActivateByName: + Process.Start(url); + break; + case BrowserOPMode.seleniumNew: + br.LastValidWindow = driver.CurrentWindowHandle; + br.openNewTabWindow(); + br.GoToUrlandActivate(url); + break; + case BrowserOPMode.seleniumGet: + break; + default: + break; + } + return; + } + + #region Ctrl + Alt + pageup Ctrl + Alt + pagedown + if (e.KeyCode == Keys.PageUp || e.KeyCode == Keys.PageDown) + {//Ctrl + Alt + pageup : 在新的分頁開啟CTP圖文對照前一頁以供檢視 20240920 + //Ctrl + Alt + pagedown : 在新的分頁開啟CTP圖文對照下一頁以供檢視 + if (browsrOPMode != BrowserOPMode.seleniumNew) return; + string url = null; + try + { + url = br.driver.Url; + } + catch (Exception ex) + { + switch (ex.HResult) + { + case -2146233088: + if (ex.Message.StartsWith("no such window: target window already closed"))//no such window: target window already closed + //from unknown error: web view not found + // (Session info: chrome = 129.0.6668.59) + try + { + br.driver.SwitchTo().Window(br.LastValidWindow); + url = br.driver.Url; + } + catch (Exception exx) + { + Console.WriteLine(exx.HResult + exx.Message); + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(exx.HResult + exx.Message); + return; + } + break; + default: + Console.WriteLine(ex.HResult + ex.Message); + Form1.MessageBoxShowOKExclamationDefaultDesktopOnly(ex.HResult + ex.Message); + return; + } + + } + if (url == null) return; + if (!IsValidUrl_ImageTextComparisonPage(url)) return; + + e.Handled = true; + int page = GetPageNumFromUrl(url); + if (e.KeyCode == Keys.PageUp) + page--; + else + page++; + url = br.ChangePageParameter(url, page); + br.LastValidWindow = br.driver.CurrentWindowHandle; + br.openNewTabWindow(); + br.GoToUrlandActivate(url, true); + return; + + }//以上 Ctrl + Alt + pageup : 在新的分頁開啟CTP圖文對照前一頁以供檢視 20240920 + //Ctrl + Alt + pagedown : 在新的分頁開啟CTP圖文對照下一頁以供檢視 + #endregion + + } + if ((m & Keys.Control) == Keys.Control && (m & Keys.Alt) == Keys.Alt)//https://zhidao.baidu.com/question/628222381668604284.html {//https://bbs.csdn.net/topics/350010591 if (e.KeyCode == Keys.G || e.KeyCode == Keys.Packet) { e.Handled = true; return; } + } //Alt + Shift + s : 所有小注文都不換行。這個和我所使用的小小輸入法繁簡轉換快捷鍵有衝突,故須先停用小小輸入法才有作用。感恩感恩 南無阿彌陀佛 @@ -2002,6 +2092,7 @@ private void textBox1_KeyDown(object sender, KeyEventArgs e) { e.Handled = true; notes_a_line_all(false, true); return; } */ if (e.Control && e.Alt && e.KeyCode == Keys.S)//chatGPT 202230107 + //ctrl + alt + s 標題下之小注文才不換行( 會與小小輸入法預設的繁簡轉換鍵衝突,使用時請先關閉輸入法。其他快捷鍵若無作用,也多係因有較其優先之如此系統快速鍵已指定的緣故) 20230108 { e.Handled = true; notes_a_line_all(false, true); return; } //以上三種皆可Alt + Shift + s : 所有小注文都不換行。 @@ -8670,7 +8761,7 @@ private void Form1_KeyDown(object sender, KeyEventArgs e) if (url != textBox3.Text) textBox3.Text = url; string input = br.Div_generic_IncludePathAndEndPageNum.GetAttribute("textContent");//"線上圖書館 -> 松煙小錄 -> 松煙小錄三 /117 "; int stopPageNum = ExtractNumberAfterSlash(input); - CheckBlankPagesBeforeOCR(url, int.Parse(br.Page_textbox.GetAttribute("defaultValue")), stopPageNum); + CheckBlankPagesBeforeOCR_NextPage(url, int.Parse(br.Page_textbox.GetAttribute("defaultValue")), stopPageNum); return; } @@ -9624,7 +9715,7 @@ private bool toOCR(br.OCRSiteTitle ocrSiteTitle, bool justDownloadImage = false) TopMost = false; - br.ActiveForm1 = this; + //br.ActiveForm1 = this; try { @@ -9764,8 +9855,10 @@ private bool toOCR(br.OCRSiteTitle ocrSiteTitle, bool justDownloadImage = false) break; //《古籍酷》 case br.OCRSiteTitle.GJcool: - br.ActiveForm1 = this; - br.ActiveForm1.TopMost = false; + //br.ActiveForm1 = this; + //br.ActiveForm1.TopMost = false; + //br.ActiveForm1 = this; + TopMost = false; //try //{ br.driver.SwitchTo().Window(currentWindowHndl); @@ -10184,7 +10277,7 @@ static int ExtractNumberAfterSlash(string input) /// 啟始頁碼 /// 結束頁碼 /// - internal static bool CheckBlankPagesBeforeOCR(string url, int startPageNum, int stopPageNum) + internal static bool CheckBlankPagesBeforeOCR_NextPage(string url, int startPageNum, int stopPageNum) { if (!Form1.IsValidUrl_ImageTextComparisonPage(url)) return false; if (br.driver == null) return false; @@ -11643,9 +11736,12 @@ private void textBox4_Enter(object sender, EventArgs e) private void textBox4SizeLarger() { textBox4.Location = new Point(button1.Location.X, textBox4Location.Y); - textBox4.Size = new Size(textBox2.Size.Width + textBox2.Size.Width + - textBox3.Width + textBox4Size.Width, textBox4Size.Height); + int width = textBox2.Size.Width + textBox2.Size.Width + textBox3.Width + textBox4Size.Width; + textBox4.Size = new Size( + (width < (Width - width - 50)) ? (Width - 50) : width + , textBox4Size.Height); textBox4.ScrollBars = ScrollBars.Horizontal; + if (textBox4.Font != textBox4FontDefault) textBox4.Font = textBox4FontDefault; } private void textBox4_KeyDown(object sender, KeyEventArgs e) diff --git a/WordVBA/Docs.bas b/WordVBA/Docs.bas index 00ebf93..9eb8e7a 100644 --- a/WordVBA/Docs.bas +++ b/WordVBA/Docs.bas @@ -263,7 +263,7 @@ Sub Dim i As Integer For i = 9312 To 9331 With Selection.Range.Find - .Replacement.Font.Name = "Arial Unicode MS" + .Replacement.font.Name = "Arial Unicode MS" .Execute VBA.ChrW(i), , , , , , , wdFindContinue, , VBA.ChrW(i), wdReplaceAll End With Next i @@ -494,12 +494,12 @@ With ActiveDocument ' Do Until Selection.End = e - 1 Selection.MoveRight - If Selection.Next.Font.Size > 12 Then 'ؿw]12r + If Selection.Next.font.Size > 12 Then 'ؿw]12r Selection.MoveRight - Do Until Selection.Next.Font.Size = 12 + Do Until Selection.Next.font.Size = 12 Selection.MoveRight , , wdExtend Loop - If MsgBox("O_nYp10r?", vbQuestion + vbOKCancel) = vbOK Then Selection.Font.Size = 10 + If MsgBox("O_nYp10r?", vbQuestion + vbOKCancel) = vbOK Then Selection.font.Size = 10 End If Loop End With @@ -656,12 +656,12 @@ Const x As String = "ahysy For Each p In d.Paragraphs If InStr(p.Range, x) Then flg = True If Not flg Then - p.Range.Font.Hidden = True + p.Range.font.Hidden = True Else prngTxt = p.Range.text s = InStr(prngTxt, " ") If VBA.Len(VBA.Mid(prngTxt, s + 1)) < 5 Then - p.Range.Font.Hidden = True + p.Range.font.Hidden = True End If End If Next p @@ -675,7 +675,7 @@ Dim d As Document Set d = ActiveDocument Dim p As Paragraph, s As Byte, prngTxt As String, msgResult As Integer For Each p In d.Paragraphs - If Not p.Range.Font.Hidden Then + If Not p.Range.font.Hidden Then prngTxt = p.Range.text s = InStr(prngTxt, VBA.Chr(32)) If VBA.Len(VBA.Mid(prngTxt, s + 1)) > 4 Then @@ -719,7 +719,7 @@ If Not Selection.Range.TextRetrievalMode.IncludeHiddenText Then Else Set pSelRng = Selection.Range For Each p In pSelRng.Paragraphs - If Not p.Range.Font.Hidden Then 'prepare to delete + If Not p.Range.font.Hidden Then 'prepare to delete 'p.Range.Cut x = p.Range.text p.Range.Delete @@ -761,7 +761,7 @@ Next myStyle If Not doNotAdd Then Set myStyle = d.Styles.Add(styleHprAn, wdStyleTypeCharacter) With myStyle - With .Font + With .font .NameFarEast = "з" .Color = 12611584 .Size = 11 @@ -780,7 +780,7 @@ If Not doNotAdd Then Set myStyle = d.Styles.Add(styleShengDiao, wdStyleTypeCharacter) 'https://docs.microsoft.com/zh-tw/office/vba/api/word.wdstyletype With myStyle .BaseStyle = d.Styles(styleHprAn) - With .Font + With .font .NameFarEast = "з" .Name = "з" .position = 3 @@ -1022,13 +1022,33 @@ pasteAnyway: ' Docs.ChangeFontOfSurrogatePairs_Range "HanaMinA", d.Range(selection.Paragraphs(1).Range.start, d.Range.End), CJK_Compatibility_Ideographs 'https://en.wikipedia.org/wiki/CJK_Compatibility_Ideographs_Supplement Dim rngChangeFontName As Range - Set rngChangeFontName = d.Range(Selection.Paragraphs(1).Range.start, d.Range.End) - Docs.ChangeFontOfSurrogatePairs_Range "HanaMinA", rngChangeFontName, CJK_Compatibility_Ideographs_Supplement + 'Set rngChangeFontName = d.Range(Selection.Paragraphs(1).Range.start, d.Range.End) + Set rngChangeFontName = d.Range(rngMark.start, d.Range.End) + Dim fontName As String '20240920 creedit_with_Copilotj:https://sl.bing.net/9KC0PtODtI + fontName = "-2" + If Fonts.IsFontInstalled(fontName) Then + 'MsgBox fontName & " ww˦btΤC" + Else 'MsgBox fontName & " w˦btΤC" + fontName = "HanaMinA" + If Fonts.IsFontInstalled("HanaMinA") Then + ElseIf Fonts.IsFontInstalled("TH-Tshyn-P2") Then + fontName = "TH-Tshyn-P2" + Else + fontName = vbNullString + End If + End If + If Not fontName = vbNullString Then + 'Docs.ChangeFontOfSurrogatePairs_Range "HanaMinA", rngChangeFontName, CJK_Compatibility_Ideographs_Supplement + Docs.ChangeFontOfSurrogatePairs_Range fontName, rngChangeFontName, CJK_Compatibility_Ideographs_Supplement + End If + Rem XRr 'HanaMinB٤䴩GH᪺ - Docs.ChangeFontOfSurrogatePairs_Range "HanaMinB", rngChangeFontName, CJK_Unified_Ideographs_Extension_E - Docs.ChangeFontOfSurrogatePairs_Range "HanaMinB", rngChangeFontName, CJK_Unified_Ideographs_Extension_F + fontName = "HanaMinB" + Docs.ChangeFontOfSurrogatePairs_Range fontName, rngChangeFontName, CJK_Unified_Ideographs_Extension_E + Docs.ChangeFontOfSurrogatePairs_Range fontName, rngChangeFontName, CJK_Unified_Ideographs_Extension_F returnVaule = True + Else '󤺤we GoSub refres SystemSetup.playSound 1.294 @@ -1060,7 +1080,7 @@ refres: 'If flgPaste Then'յLêiR 'ܷsKW奻 rng.SetRange endDocOld, endDocOld - Do Until rng.Font.ColorIndex = wdRed Or rng.End = d.Range.End - 1 + Do Until rng.font.ColorIndex = wdRed Or rng.End = d.Range.End - 1 rng.Move Loop e = rng.End @@ -1123,10 +1143,10 @@ Sub marking .ClearFormatting .ClearAllFuzzyOptions .ClearHitHighlight - With .Replacement - .Font.ColorIndex = fontColor 'wdRed - .Highlight = True - End With +' With .Replacement '{b wdReplaceAll ޼ƪkF +' .font.ColorIndex = fontColor 'wdRed +' .Highlight = True +' End With For Each e In arr 'MCӭnѪr ' If e = "jl" Then Stop 'just for test @@ -1240,7 +1260,7 @@ checkPhrases: ' Rem ɥiѮįաA]_ӤGSO[I file:///H:\ڪݵw\Ѯvݤu@\1ۤ奻\DMHwBI\}TI|NO.docx .HighlightColorIndex = defaultHighlightColorIndex - .Font.ColorIndex = fontColor + If .font.ColorIndex = wdAuto Then .font.ColorIndex = fontColor End With Else 'yyˬdL If rng.HighlightColorIndex = defaultHighlightColorIndex Then @@ -1248,7 +1268,7 @@ checkPhrases: ' ' .Select 'just for test .HighlightColorIndex = wdNoHighlight - .Font.ColorIndex = wdAuto + .font.ColorIndex = wdAuto End With End If End If @@ -1257,7 +1277,7 @@ checkPhrases: ' If rng.HighlightColorIndex = defaultHighlightColorIndex Then With rng .HighlightColorIndex = wdNoHighlight - .Font.ColorIndex = wdAuto + .font.ColorIndex = wdAuto End With End If End If @@ -1270,7 +1290,7 @@ checkPhrases: ' If rng.HighlightColorIndex = defaultHighlightColorIndex Then With rng .HighlightColorIndex = wdNoHighlight - .Font.ColorIndex = wdAuto + .font.ColorIndex = wdAuto End With End If End If @@ -1294,7 +1314,7 @@ checkPhrases: ' Rem YgHU|49DLLIsW~AogS|FAiO VBEsĶG 20240920 With rng .HighlightColorIndex = defaultHighlightColorIndex - .Font.ColorIndex = fontColor + If .font.ColorIndex = wdAuto Then .font.ColorIndex = fontColor End With Loop ' .Execute e, , , , , , True, wdFindStop, True, e, Replace:=wdReplaceAll 'btWs榡Ƥrɷ|F @@ -1414,7 +1434,7 @@ pc = d2.Paragraphs.Count If pi = 0 Then pi = 1 For pi = pi To pc Set p = d2.Paragraphs(pi) - If p.Range.Font.NameFarEast <> "з" And p.Range.HighlightColorIndex = 0 Then + If p.Range.font.NameFarEast <> "з" And p.Range.HighlightColorIndex = 0 Then px = p.Range x = VBA.Trim(VBA.Left(px, Len(px) - 1)) 'hqŸ If Len(x) > 2 Then @@ -1751,7 +1771,7 @@ Sub ChangeFontOfSurrogatePairs_ActiveDocument(fontName As String, Optional whatC ' Change the font name to HanaMinB ' Change the font name to fontName End Select - If change Then rng.Font.Name = fontName '"HanaMinB" + If change Then rng.font.Name = fontName '"HanaMinB" End If End If End If @@ -1819,7 +1839,7 @@ Sub ChangeFontOfSurrogatePairs_Range(fontName As String, rngtoChange As Range, O ' Change the font name to HanaMinB ' Change the font name to fontName End Select - If change Then rng.Font.Name = fontName '"HanaMinB" + If change Then rng.font.Name = fontName '"HanaMinB" End If End If ' End If @@ -1830,7 +1850,7 @@ End Sub Sub ChangeCharacterFontName(character As String, fontName As String, d As Document, Optional fontNameFarEast As String) With d.Range With .Find - With .Replacement.Font + With .Replacement.font .Name = fontName .NameFarEast = fontNameFarEast End With @@ -1842,8 +1862,8 @@ End Sub Sub ChangeCharacterFontNameAccordingSelection() Dim fontName As String, fontNameFarEast As String With Selection - fontName = .Font.Name - fontNameFarEast = .Font.NameFarEast + fontName = .font.Name + fontNameFarEast = .font.NameFarEast ChangeCharacterFontName .text, fontName, .Document, fontNameFarEast End With End Sub @@ -1854,10 +1874,10 @@ Sub FindMissingCharacters() ' Set Doc = ActiveDocument 'wqsөMзrX - Dim nmf As Font - Set nmf = Doc.Styles("Normal").Font - Dim kff As Font - Set kff = Doc.Styles("q").Font + Dim nmf As font + Set nmf = Doc.Styles("Normal").font + Dim kff As font + Set kff = Doc.Styles("q").font Dim p As Paragraph Dim r As Range @@ -1878,9 +1898,9 @@ Sub FindMissingCharacters() ' Or (AscW(VBA.Left(C, 1)) >= &H2B820 And AscW(VBA.Left(C, 1)) <= &H2CEAF) _ Or (AscW(VBA.Left(C, 1)) >= &HF900 And AscW(VBA.Left(C, 1)) <= &HFAFF) _ Or (AscW(VBA.Left(C, 1)) >= &H2F800 And AscW(VBA.Left(C, 1)) <= &H2FA1F) Then 'ǫSXIAw~AݧgIIIIIIII - If Not r.Font.Name = nmf.Name And Not r.Font.Name = kff.Name Then 'BΤzbIIII + If Not r.font.Name = nmf.Name And Not r.font.Name = kff.Name Then 'BΤzbIIII ' pGrŤbsөμзrAhNrאּHanaMinB - r.Font.Name = "HanaMinB" + r.font.Name = "HanaMinB" End If End If End If diff --git a/WordVBA/Fonts.bas b/WordVBA/Fonts.bas new file mode 100644 index 0000000..88c0eb3 --- /dev/null +++ b/WordVBA/Fonts.bas @@ -0,0 +1,23 @@ +Attribute VB_Name = "Fonts" +Option Explicit + +Rem DީҦPrާ@ + +Rem 20240920 CopilotjġGhttps://sl.bing.net/bfIsi0Ehd48 Word VBA rˬd +Function IsFontInstalled(fontName As String) As Boolean + Dim font As Variant + Dim fontInstalled As Boolean + fontInstalled = False + + ' MҦww˪r + For Each font In word.Application.FontNames + If font = fontName Then + fontInstalled = True + Exit For + End If + Next font + + IsFontInstalled = fontInstalled +End Function + +