123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546 |
- using Microsoft.Office.Core;
- using Microsoft.Office.Interop.Word;
- using Microsoft.Office.Tools.Ribbon;
- using Microsoft.Office.Tools.Word;
- using PdfSharp.Pdf;
- using PdfSharp;
- using System;
- using System.Collections;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Net;
- using System.Net.Http;
- using System.Reflection;
- using System.Text;
- using System.Text.Json;
- using System.Text.RegularExpressions;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using static HTEXMark.QRCodeForm;
- using Task = System.Threading.Tasks.Task;
- using TheArtOfDev.HtmlRenderer.WinForms;
- using Xceed.Words.NET;
- namespace HTEXMark
- {
- public partial class MarkRibbon
- {
- public static MarkLanguage lang = null;
- public KnowledgeUserControl knowledgeUserControl;
- public System.Windows.Forms.ListBox knowledgeListBox;
- private HttpClient httpClient;
- public Microsoft.Office.Tools.CustomTaskPane customTaskPane;
- public static List<IdCodeNameCount> periodSubjects = new List<IdCodeNameCount>();
- public static string domain;
- private void MarkRibbon_Load(object sender, RibbonUIEventArgs e)
- {
-
- // 获取 Office 应用程序的语言设置
- LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
- // 获取主语言 ID
- int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
- // 判断语言版本
- System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(LangResource));
- var data = LangResource.lang;
- string str = System.Text.Encoding.UTF8.GetString(data);
- var json = JsonSerializer.Deserialize<JsonElement>(str);
- switch (languageId)
- {
- case 2052:
- // 2052 是简体中文的语言 ID
- //System.Windows.Forms.MessageBox.Show("Office 语言版本:简体中文");
- {
- json.TryGetProperty("cn", out JsonElement cn);
- lang = JsonSerializer.Deserialize<MarkLanguage>(cn);
- SetLang(lang);
- break;
- }
- case 1028:
- // 1028 是繁体中文的语言 ID
- // System.Windows.Forms.MessageBox.Show("Office 语言版本:繁体中文");
-
- {
- json.TryGetProperty("tw", out JsonElement tw);
- lang = JsonSerializer.Deserialize<MarkLanguage>(tw);
- SetLang(lang);
- break;
- }
-
- case 1033:
- // 1033 是英语的语言 ID
- // System.Windows.Forms.MessageBox.Show("Office 语言版本:英语");
-
- {
- json.TryGetProperty("en", out JsonElement en);
- lang = JsonSerializer.Deserialize<MarkLanguage>(en);
- SetLang(lang);
- break;
- }
- default:
- // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
- {
- json.TryGetProperty("en", out JsonElement en);
- lang = JsonSerializer.Deserialize<MarkLanguage>(en);
- SetLang(lang);
- break;
- }
- }
- domain="www.teammodel.cn";
- var itemCN = this.Factory.CreateRibbonDropDownItem();
- itemCN.Label=lang.china;
- itemCN.Tag="www.teammodel.cn";
- dataCenter.Items.Add(itemCN);
- var itemNet = this.Factory.CreateRibbonDropDownItem();
- itemNet.Label=lang.global;
- itemNet.Tag="www.teammodel.net";
- dataCenter.Items.Add(itemNet);
- dataCenter.SelectionChanged+=DataCenterSelectionChanged;
- knowledgeUserControl =new KnowledgeUserControl();
- customTaskPane = Globals.ThisAddIn.CustomTaskPanes.Add(knowledgeUserControl, lang.paneTitle);
- customTaskPane.Visible = false;
- knowledgeListBox= new System.Windows.Forms.ListBox();
- knowledgeListBox.Dock = DockStyle.Fill;
- knowledgeUserControl.Controls.Add(knowledgeListBox);
- httpClient = HttpClientFactory.Create();
- }
- private void DataCenterSelectionChanged(object sender, RibbonControlEventArgs e)
- {
- var data = sender as RibbonDropDown;
- knowledgeListBox.Items.Clear();
- schoolDropDown.Items.Clear();
- subjectDropDown.Items.Clear();
- user.Visible = false;
- qrcode.Visible=true;
- schoolDropDown.Visible=false;
- subjectDropDown.Visible=false;
- customTaskPane.Visible=false;
- domain=data.SelectedItem.Tag.ToString();
- }
- public async void SchoolSelectionChanged(object sender, RibbonControlEventArgs e)
- {
- var data = sender as RibbonDropDown;
- knowledgeListBox.Items.Clear();
- await AppendSubjectDropDown(data.SelectedItem.Tag.ToString(), httpClient);
- }
- public async Task AppendSubjectDropDown(string school,HttpClient httpClient)
- {
- subjectDropDown.Items.Clear();
- subjectDropDown.SelectionChanged-=SubjectSelectionChanged;
- knowledgeListBox.SelectedValueChanged-= KnowledgeListBoxSelectedValueChanged;
- knowledgeListBox.Items.Clear();
- var response = await httpClient.GetAsync($"https://{domain}/hita/get-school-data?school={school}&id_token={UserSettings.Default.id_token}");
- if (response.IsSuccessStatusCode)
- {
- string content = await response.Content.ReadAsStringAsync();
- if (!string.IsNullOrWhiteSpace(content))
- {
- var json = JsonSerializer.Deserialize<JsonElement>(content);
- periodSubjects = JsonSerializer.Deserialize<List<IdCodeNameCount>>(json.GetProperty("periodSubjects"));
- string auth_token = $"{json.GetProperty("auth_token")}";
- if (!string.IsNullOrWhiteSpace(auth_token)) {
- UserSettings.Default.x_auth_token= auth_token;
- }
- if (periodSubjects!=null && periodSubjects.Count>0)
- {
- var data = periodSubjects.OrderByDescending(x => x.count);
- foreach (var subject in data)
- {
- var item = this.Factory.CreateRibbonDropDownItem();
- item.Label=$"{subject.name}({subject.count})";
- item.Tag=$"{school}:{subject.periodId}:{subject.subjectId}";
- subjectDropDown.Items.Add(item);
- }
- subjectDropDown.SelectionChanged+=SubjectSelectionChanged;
- var blocks= await AppendKnowledge(school, data.First().periodId, data.First().subjectId, httpClient);
- knowledgeUserControl.InitializeTreeView(knowledgeListBox, blocks);
- knowledgeListBox.SelectedValueChanged+= KnowledgeListBoxSelectedValueChanged;
- }
- else
- {
- var itemDefault = this.Factory.CreateRibbonDropDownItem();
- itemDefault.Label=$"--------------";
- subjectDropDown.Items.Add(itemDefault);
- }
- }
- }
- }
-
- private void KnowledgeListBoxSelectedValueChanged(object sender, EventArgs e)
- {
- var box = sender as System.Windows.Forms.ListBox;
- var point =$"{box.SelectedItem}";
- Microsoft.Office.Interop.Word.Selection selection = Globals.ThisAddIn.Application.Selection;
- // 获取当前选择的范围
- Range selectedRange = selection.Range;
- // 获取当前光标所在行的范围
- Range lineRange = selectedRange.Paragraphs[1].Range;
- if (!string.IsNullOrWhiteSpace(lineRange.Text) && lineRange.Text.Contains(lang.point))
- {
- string str = lineRange.Text.TrimEnd();
- string textBeforeCursor = str.Substring(str.Length-1, 1);
- if ("..、::,,;".Contains(textBeforeCursor))
- {
- selection.TypeText($"{point}");
- }
- else
- {
- if (textBeforeCursor.Equals("}"))
- {
- selection.TypeText($"{point}");
- }
- else
- {
- selection.TypeText($",{point}");
- }
- }
- }
- else
- {
- MessageBox.Show(lang.pointMsgShow);
- }
- }
- private async void SubjectSelectionChanged(object sender, RibbonControlEventArgs e)
- {
- List<Block> blocks = new List<Block>();
- var data = sender as RibbonDropDown;
- knowledgeListBox.Items.Clear();
- knowledgeListBox.SelectedValueChanged-= KnowledgeListBoxSelectedValueChanged;
- string tag = data.SelectedItem.Tag.ToString();
- string[] tags = tag.Split(':');
- if (tags.Length==3)
- {
- blocks= await AppendKnowledge(tags[0], tags[1], tags[2], httpClient);
- knowledgeUserControl.InitializeTreeView(knowledgeListBox, blocks);
- knowledgeListBox.SelectedValueChanged+= KnowledgeListBoxSelectedValueChanged;
- }
- }
- public async Task<List<Block>> AppendKnowledge(string school, string periodId, string subjectId, HttpClient httpClient)
- {
- var response = await httpClient.GetAsync($"https://{domain}/hita/get-school-knowledge?school={school}&id={subjectId}&code={periodId}");
- if (response.IsSuccessStatusCode)
- {
- string content = await response.Content.ReadAsStringAsync();
- if (!string.IsNullOrWhiteSpace(content))
- {
- List<Block> block = new List<Block>();
- var json = JsonSerializer.Deserialize<JsonElement>(content);
- if (json.TryGetProperty("code", out JsonElement _code)&& $"{_code}".Equals("200"))
- {
- var points = JsonSerializer.Deserialize<List<string>>(json.GetProperty("points"));
- if (points!=null && points.Count>0)
- {
- block.Add(new Block { name="未归类", points=points });
- }
- //var blocks = JsonSerializer.Deserialize<List<Block>>(json.GetProperty("blocks"));
- //if (blocks!=null && blocks.Count>0)
- //{
- // block.AddRange(blocks);
- //}
- }
- return block;
- }
- }
- return null;
- }
- private void SetLang(MarkLanguage language) {
- item_mark_tab.Label=language.item_mark_tab;
- item_type.Label=language.item_type;
- item_taxonomy.Label=language.item_taxonomy;
- item_tool.Label=language.item_tool;
- //item_user.Label=language.item_user;
- single.Label=$"{language.single}\n";
- multiple.Label=$"{language.multiple}\n";
- judge.Label=$"{language.judge}\n";
- subjective.Label=$"{language.subjective}\n";
- complete.Label=$"{language.complete}\n";
- correct.Label=$"{language.correct}\n";
- draw.Label=$"{language.draw}\n";
- connector.Label=$"{language.connector}\n";
- compose.Label=$"{language.compose}\n";
- sortmultiple.Label=$"{language.sortmultiple}\n";
- remember.Label=$"{language.remember}\n";
- understand.Label=$"{language.understand}\n";
- apply.Label=$"{language.apply}\n";
- analyze.Label=$"{language.analyze}\n";
- evaluate.Label=$"{language.evaluate}\n";
- create.Label=$"{language.create}\n";
- taxonomy.Label=$"{language.taxonomy}\n";
- answer.Label=$"{language.answer}\n";
- analysis.Label=$"{language.analysis}\n";
- score.Label=$"{language.score}\n";
- point.Label=$"{language.point}\n";
- itrue.Label=$"{language.itrue}\n";
- ifalse.Label=$"{language.ifalse}\n";
- ended.Label=$"{language.ended}\n";
- level.Label=$"{language.level}\n";
- count.Label=$"{language.count}\n";
- qrcode.Label=$"{language.qrcode}\n";
- user.Label=$"{language.user}\n";
- item_user.Label=$"{language.item_user}";
- qrcode.Label=$"{language.qrcode}\n";
- user.Label=$"{language.user}\n";
- schoolDropDown.Label=$"{language.schoolDropDown}";
- subjectDropDown.Label=$"{language.subjectDropDown}";
- dataCenter.Label=$"{language.dataCenter}";
- //
- single.Tag=language.single;
- multiple.Tag=language.multiple;
- judge.Tag=language.judge;
- subjective.Tag=language.subjective;
- complete.Tag=language.complete;
- correct.Tag=language.correct;
- draw.Tag=language.draw;
- connector.Tag=language.connector;
- compose.Tag=language.compose;
- sortmultiple.Tag=language.sortmultiple;
- remember.Tag=language.remember;
- understand.Tag=language.understand;
- apply.Tag=language.apply;
- analyze.Tag=language.analyze;
- evaluate.Tag=language.evaluate;
- create.Tag=language.create;
- taxonomy.Tag=language.taxonomy;
- answer.Tag=language.answer;
- analysis.Tag=language.analysis;
- score.Tag=language.score;
- point.Tag=language.point;
- itrue.Tag=language.itrue;
- ifalse.Tag=language.ifalse;
- ended.Tag=language.ended;
- level.Tag=language.level;
- count.Tag=language.count;
-
- }
- private void QRCode_Click(object sender, RibbonControlEventArgs e) {
- // 创建 Windows Forms 窗口
- var qrcode_button = sender as RibbonButton;
- QRCodeForm qrCodeForm = new QRCodeForm(AI, qrcode_button, user, schoolDropDown, subjectDropDown, lang, this, customTaskPane,domain);
- CenterFormOnScreen(qrCodeForm);
- qrCodeForm.ShowDialog();
- }
- public void CenterFormOnScreen(Control qrCodeForm)
- {
- // 获取屏幕的工作区域
- var workingArea = System.Windows.Forms.Screen.GetWorkingArea(qrCodeForm);
- // 计算窗体应该显示的位置
- int x = (workingArea.Width - qrCodeForm.Width) / 2 + workingArea.Left;
- int y = (workingArea.Height - qrCodeForm.Height) / 2 + workingArea.Top;
- // 设置窗体位置
- qrCodeForm.Location = new System.Drawing.Point(x, y);
- }
- private bool IsCursorAtLineStart(Selection selection)
- {
- // 获取当前选择的范围
- Range selectedRange = selection.Range;
- // 获取当前光标所在行的范围
- Range lineRange = selectedRange.Paragraphs[1].Range;
- // 判断光标是否在行的开始
- bool isAtLineStart = (selectedRange.Start == lineRange.Start);
- return isAtLineStart;
- }
- private void MarkTags_Click(object sender, RibbonControlEventArgs e)
- { // 在这里根据按钮的标识执行相应的操作
- var button = sender as RibbonButton;
- string buttonId = button.Id;
- string buttonTag = button.Tag.ToString();
- Microsoft.Office.Interop.Word.Selection selection = Globals.ThisAddIn.Application.Selection;
- string br = string.Empty;
- if (!IsCursorAtLineStart(selection))
- {
- br="\n";
- }
- if (buttonId.Equals("compose"))
- {
- // 获取 Office 应用程序的语言设置
- LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
- // 获取主语言 ID
- int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
- // 判断语言版本
- switch (languageId)
- {
- case 2052:
- // 2052 是简体中文的语言 ID
- selection.TypeText(br+"{" + buttonTag + "}\n\n{综合题结束}\n"); break;
- case 1028:
- // 1028 是繁体中文的语言 ID
- selection.TypeText(br+"{" + buttonTag + "}\n\n{題組題結束}\n"); break;
- case 1033:
- // 1033 是英语的语言 ID
- selection.TypeText(br+"{" + buttonTag + "}\n\n{QuestionGroupEnded}\n"); break;
- default:
- // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
- selection.TypeText(br+"{" + buttonTag + "}");
- break;
- }
- }
- else if (buttonId.Equals("ended")) {
- // 获取 Office 应用程序的语言设置
- LanguageSettings languageSettings = Globals.ThisAddIn.Application.LanguageSettings;
- // 获取主语言 ID
- int languageId = languageSettings.get_LanguageID(MsoAppLanguageID.msoLanguageIDUI);
- // 判断语言版本
- switch (languageId)
- {
- case 2052:
- // 2052 是简体中文的语言 ID
- selection.TypeText(br+"{综合题结束}\n"); break;
- case 1028:
- // 1028 是繁体中文的语言 ID
- selection.TypeText(br+"{題組題結束}\n"); break;
- case 1033:
- // 1033 是英语的语言 ID
- selection.TypeText(br+"{QuestionGroupEnded}\n"); break;
- default:
- // System.Windows.Forms.MessageBox.Show("未知的 Office 语言版本:" + languageId.ToString());
- selection.TypeText(br+"{QuestionGroupEnded}\n");
- break;
- }
- }
- else
- {
- if (buttonId.Equals("remember")||buttonId.Equals("understand")||buttonId.Equals("apply")||buttonId.Equals("analyze")
- ||buttonId.Equals("evaluate")||buttonId.Equals("create"))
- {
- // 获取当前选择的范围
- Range selectedRange = selection.Range;
- // 获取当前光标所在行的范围
- Range lineRange = selectedRange.Paragraphs[1].Range;
- if (lineRange.Text.Contains(lang.taxonomy))
- {
- selection.TypeText( buttonTag+"\n");
- }
- else {
- selection.TypeText(br + "{" + buttonTag + "}\n");
- }
-
- }
- else if (buttonId.Equals("itrue")||buttonId.Equals("ifalse")) {
- selection.TypeText(br + "{" + buttonTag + "}\n");
- }
- else
- {
- selection.TypeText(br+"{" + buttonTag + "}");
- }
- }
- }
- private async void XKW_Click(object sender, RibbonControlEventArgs e)
- {
-
-
-
- Microsoft.Office.Interop.Word.Application wordApp = Globals.ThisAddIn.Application;
- // string html = await SparkAI("");
- //string processedHtml = ProcessRemoteImages(html);
- //InsertHtmlIntoWord(wordApp, processedHtml);
- // 在Word中粘贴HTML内容
- }
-
-
- private string ConvertHtmlToDocx(string htmlContent)
- {
- using (DocX document = DocX.Create(new MemoryStream()))
- {
- document.InsertParagraph(htmlContent);
- // Save DOCX content to string
- string docxContent = document.Xml.ToString();
- return docxContent;
- }
- }
- private void InsertHtmlIntoWord(Microsoft.Office.Interop.Word.Application wordApp, string htmlContent)
- {
- // 获取当前光标位置的 Range 对象
- Range range = wordApp.Selection.Range;
- // 将HTML文本放入剪贴板
- //Clipboard.SetText(htmlContent, TextDataFormat.Html);
-
- string rtfContent = "{\\rtf1\\ansi\\ansicpg1252\\uc1\\htmautsp\\deff2{\\fonttbl{\\f0\\fcharset0 Times New Roman;}{\\f2\\fcharset0 Microsoft YaHei UI;}}{\\colortbl\\red0\\green0\\blue0;\\red255\\green255\\blue255;}\\loch\\hich\\dbch\\pard\\plain\\ltrpar\\itap0{\\lang1033\\fs43\\f2\\cf0 \\cf0\\ql{\\f2 {\\ltrch Hello, World!}\\li0\\ri0\\sa0\\sb0\\fi0\\ql\\par}\r\n}\r\n}";
- // 使用 Clipboard 将 HTML 内容转换为 RTF 格式
- System.Windows.Forms.Clipboard.SetText(rtfContent, TextDataFormat.Rtf);
- // 检查剪贴板是否包含文本
-
- // Create a range at the end of the document
-
- // Paste HTML from clipboard into the range
- wordApp.ActiveDocument.Application.Selection.Range.PasteSpecial(DataType: WdPasteDataType.wdPasteRTF);
- // 清除 Clipboard 内容
- System.Windows.Forms.Clipboard.Clear();
- }
- private string ConvertPdfToRtf(string htmlContent)
- {
- using (RichTextBox richTextBox = new RichTextBox())
- {
- // Load HTML into RichTextBox
- richTextBox.Rtf = null;
- // Get RTF content
- string rtfContent = richTextBox.Rtf;
- return rtfContent;
- }
- }
- private string ProcessRemoteImages(string htmlContent)
- {
- // 匹配HTML中的img标签
- Regex imgRegex = new Regex("<img.*?src=['\"](.*?)['\"].*?>", RegexOptions.IgnoreCase);
- // 替换img标签中的远程图片链接
- string processedHtml = imgRegex.Replace(htmlContent, match =>
- {
- string imageUrl = match.Groups[1].Value;
- // 下载远程图片并转为Base64
- string base64Image = Task.Run(async () => await DownloadAndConvertToBase64(imageUrl)).Result;
- // 返回Base64编码的图片数据作为替换
- return $"<img src='data:image/jpeg;base64,{base64Image}' alt='Remote Image'>";
- });
- return processedHtml;
- }
- private async Task<string> DownloadAndConvertToBase64(string imageUrl)
- { // 设置支持 TLS 1.2
- ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
- // 下载远程图片的字节数组
- byte[] imageBytes = await httpClient.GetByteArrayAsync(imageUrl);
- // 转为Base64编码
- string base64Image = Convert.ToBase64String(imageBytes);
- return base64Image;
- }
- private void AI_Click(object sender, RibbonControlEventArgs e)
- {
- var ai_button = sender as RibbonButton;
- AI_Form aiForm = new AI_Form(periodSubjects, ai_button, user, schoolDropDown, subjectDropDown, lang, this, customTaskPane, domain);
- CenterFormOnScreen(aiForm);
- aiForm.ShowDialog();
- }
-
- }
- }
|