Browse Source

代碼優化

CrazyIter_Bin 4 năm trước cách đây
mục cha
commit
7053b48faf

+ 1 - 0
HTEXLib/DOCX/Models/LangConfig.cs

@@ -24,5 +24,6 @@ namespace HTEXLib.DOCX.Models
         public string Point { get; set; }
         public string Filed { get; set; }
         public string Judge { get; set; }
+        public string Level { get; set; }
     }
 }

+ 3 - 6
HTEXLib/HTEXLib.csproj

@@ -4,9 +4,9 @@
     <Description>模板解析类型</Description>
     <PackageReleaseNotes>模板解析类型</PackageReleaseNotes>
     <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
-    <Version>2.2.6</Version>
-    <AssemblyVersion>2.2.6.6</AssemblyVersion>
-    <FileVersion>2.2.6.6</FileVersion>
+    <Version>2.2.8</Version>
+    <AssemblyVersion>2.2.8.8</AssemblyVersion>
+    <FileVersion>2.2.8.8</FileVersion>
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="DocumentFormat.OpenXml" Version="2.11.3" />
@@ -17,9 +17,6 @@
     <PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
     <PackageReference Include="System.Drawing.Common" Version="4.7.0" />
     <PackageReference Include="System.Text.Json" Version="4.7.2" />
-    <PackageReference Include="Selenium.Support" Version="3.141.0" />
-    <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
-    <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="87.0.4280.8800" />
   </ItemGroup>
   <ItemGroup>
     <Folder Include="HTEX\" />

+ 3 - 2
HTEXLib/Translator/HTML2ITEMTranslator.cs

@@ -89,7 +89,8 @@ namespace HTEXLib.Translator
             html = html.Replace("\t", " ").Replace("<span>", "").Replace("</span>", "").Replace("dir=\"ltr\"", "");
             //处理 【答案】【解析】【结束】标签中包含的空格字符
             html = BlankProcess(html);
-
+            
+            var rrrs = Regex.Split(html, "{([\\S]*?)}");
             Dictionary<string, List<string>> TestInType = ConvertTest(html);
             List<DOCX.Models.ItemInfo> tests = new List<DOCX.Models.ItemInfo>();
             foreach (string key in TestInType.Keys)
@@ -529,7 +530,7 @@ namespace HTEXLib.Translator
                         Point = doc.DocumentNode.InnerText;
                         Point = Regex.Replace(Point, dict[key].st, "");
                         Point = Regex.Replace(Point, dict[key].end, "");
-                        Score = Regex.Replace(Point, @"\s", "");
+                        Point = Regex.Replace(Point, @"\s", "");
                         if (!string.IsNullOrWhiteSpace(Point))
                         {
                             string[] ps = Regex.Split(Point, "\\.|\\.|\\、|\\:|\\:|\\,|\\,|\\;|\\;");

+ 479 - 0
HTEXLib/Translator/HTML2ITEMV2Translator.cs

@@ -0,0 +1,479 @@
+using HTEXLib.COMM.Helpers;
+using HTEXLib.DOCX.Models;
+using HTEXLib.Helpers.ShapeHelpers;
+using HtmlAgilityPack;
+using System;
+using System.Collections.Generic;
+using System.IO;
+using System.Linq;
+using System.Text;
+using System.Text.Json;
+using System.Text.RegularExpressions;
+using System.Threading.Tasks;
+
+namespace HTEXLib.Translator
+{
+    public class HTML2ITEMV2Translator
+    {
+        public const string Answer = "Answer";
+        public const string Analysis = "Analysis";
+        public const string Ended = "Ended";
+        public const string Point = "Point";
+        public const string Score = "Score";
+        public const string Summary = "Summary";
+        public const string Filed = "Filed";
+        public const string Level = "Level";
+        public LangConfig langConfig { get; set; }
+        public HtmlDocument doc { get; set; } = new HtmlDocument();
+        public string[] optionsKeys { get; set; }
+        public Dictionary<string, string[]> dict { get; set; }
+        public string[] Fileds { get; set; }
+        public  List<LangConfig> _langConfigs { get; set; }
+        public HTML2ITEMV2Translator(string configPath)
+        {
+            FileStream fs = new FileStream(configPath+ "/LangConfig.json", System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
+            StreamReader sr = new StreamReader(fs, System.Text.Encoding.UTF8);
+            string line;
+            StringBuilder builder = new StringBuilder();
+            while ((line = sr.ReadLine()) != null)
+            {
+                builder.Append(line.ToString());
+            }
+            sr.Close();
+            string text = builder.ToString();
+            _langConfigs = text.FromJson<List<LangConfig>>();
+        }
+
+        /// <summary>
+        /// 处理标签中以及题型标签中包含的空格字符
+        /// </summary>
+        /// <param name="html"></param>
+        /// <returns></returns>
+        public string BlankProcess(string html)
+        {
+            string ans = langConfig.Item.Start + langConfig.Item.Answer + langConfig.Item.End;
+            string als = langConfig.Item.Start + langConfig.Item.Analysis + langConfig.Item.End;
+            string end = langConfig.Item.Start + langConfig.Item.Ended + langConfig.Item.End;
+            string pot = langConfig.Item.Start + langConfig.Item.Point + langConfig.Item.End;
+            string scr = langConfig.Item.Start + langConfig.Item.Score + langConfig.Item.End;
+            string lvl = langConfig.Item.Start + langConfig.Item.Level + langConfig.Item.End;
+            foreach (var filed in Fileds)
+            {
+                var fld=  langConfig.Item.Start + filed + langConfig.Item.End;
+                string[] fldarry = fld.Select(s => s.ToString()).ToArray();
+                string fldReg = string.Join("\\s*", fldarry);
+                html = Regex.Replace(html, fldReg, fld);
+            }
+            string[] ansarry = ans.Select(s => s.ToString()).ToArray();
+            string[] alsarry = als.Select(s => s.ToString()).ToArray();
+            string[] endarry = end.Select(s => s.ToString()).ToArray();
+            string[] potarry = pot.Select(s => s.ToString()).ToArray();
+            string[] scrarry = scr.Select(s => s.ToString()).ToArray();
+            string[] lvlarry = lvl.Select(s => s.ToString()).ToArray();
+            string ansReg = string.Join("\\s*", ansarry);
+            string alsReg = string.Join("\\s*", alsarry);
+            string endReg = string.Join("\\s*", endarry);
+            string potReg = string.Join("\\s*", potarry);
+            string scrReg = string.Join("\\s*", scrarry);
+            string lvlReg = string.Join("\\s*", lvlarry);
+            html = Regex.Replace(html, ansReg, ans);
+            html = Regex.Replace(html, alsReg, als);
+            html = Regex.Replace(html, endReg, end);
+            html = Regex.Replace(html, potReg, pot);
+            html = Regex.Replace(html, scrReg, scr);
+            html = Regex.Replace(html, lvlReg, lvl);
+            string blankReg = "\\s*";
+            foreach (string value in langConfig.Item.Type.Values)
+            {
+                //string tag = langConfig.Item.Start + "\\s*" + "\\d+\\s*" + string.Join("\\s*", value.Select(s => s.ToString()).ToArray()) + "\\s*" + langConfig.Item.End;
+                string tag = $"{langConfig.Item.Start}\\s*\\d+\\s*{string.Join("\\s*", value.Select(s => s.ToString()).ToArray())}\\s*{langConfig.Item.End}";
+                var m = Regex.Match(html, tag);
+                while (m.Success)
+                {
+                    string blankStr = Regex.Replace(m.Value, blankReg, "");
+                    html = html.Replace(m.Value, blankStr);
+                    m = m.NextMatch();
+                }
+            }
+            return html;
+        }
+
+        public List<DOCX.Models.ItemInfo> Translate(string html, JsonElement lang )
+        {
+            string mathjax = "<script type=\"text/javascript\" src=\"http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML\"></script>";
+            html = html.Replace(mathjax, "");
+            //去除class 以及span标签"
+            string classpattern = "class=\"([^\"]*)\"";
+            html = Regex.Replace(html, classpattern, "");
+            string pattern = "<span([^>]{0,})>";
+            html = Regex.Replace(html, pattern, "");
+            html = html.Replace(" close=\"\" separators=\" | \">", "");
+            html = html.Replace("\t", " ").Replace("<span>", "").Replace("</span>", "").Replace("dir=\"ltr\"", "");
+            doc.LoadHtml(html);
+            //初始化语言配置
+            langConfig = null;
+            var configArray = Regex.Split(doc.DocumentNode.InnerText, "{([\\S]*?)}");
+            for (int index = 1; index < configArray.Length; index++) {
+                if (index % 2 == 1) {
+                    langConfig = _langConfigs.Where(x => x.Lang.Equals(configArray[index],StringComparison.CurrentCultureIgnoreCase) ).FirstOrDefault();
+                    if (langConfig != null) {
+                        break;
+                    }
+                }
+            }
+            if (langConfig == null && lang.ValueKind== JsonValueKind.String) {
+                langConfig = _langConfigs.Where(x => x.Lang == lang.GetString()).FirstOrDefault();
+            }
+            if (langConfig == null) {
+                throw new Exception();
+            }
+            //初始化标签配置
+            Fileds = langConfig.Item.Filed.Split('|');
+            dict = new Dictionary<string, string[]>
+            {
+                { langConfig.Item.Answer, new string[] { Answer } },
+                { langConfig.Item.Analysis, new string[] { Analysis } },
+                { langConfig.Item.Ended, new string[] { Ended } },
+                { langConfig.Item.Point, new string[] { Point } },
+                { langConfig.Item.Score, new string[] { Score } },
+                { langConfig.Item.Level, new string[] { Level } }
+
+            };
+            foreach (string key in langConfig.Item.Type.Keys)
+            {
+                dict.Add(langConfig.Item.Type[key], new string[] { Summary, key });
+            }
+            foreach (var filed in Fileds)
+            {
+                dict.Add(filed, new string[] { Filed, $"{Array.IndexOf(Fileds, filed)}" });
+            }
+            optionsKeys = langConfig.Item.Options.Select(s => s.ToString()).ToArray();
+            //处理 标签中包含的空格字符
+            html = BlankProcess(html);
+            html = Regex.Replace(html, "{" + langConfig.Lang + "}","", RegexOptions.IgnoreCase);
+            var array = Regex.Split(html, "{([\\S]*?)}");
+            List<KeyValuePair<int[], List<string>>> composeKeys = new List<KeyValuePair<int[], List<string>>>();
+            //List<string>
+            //处理综合题 
+            for (int index = 1; index < array.Length; index++)
+            {
+                 
+                var tagValue = BlankTag(array[index]);
+                tagValue = Regex.Replace(tagValue, @"\d", "");
+                if (dict.TryGetValue(tagValue, out string[] keyInfo))
+                {
+                    if (keyInfo[0] == Summary && keyInfo[1].Equals("compose"))
+                    {
+                        var curr = index;
+                        List<string> comsArray = new List<string>() ;
+                        for (int composeIndex = index + 1; composeIndex < array.Length; composeIndex++) {
+                            var conIndex = BlankTag(array[composeIndex]);
+                            tagValue = Regex.Replace(tagValue, @"\d", "");
+                            if (conIndex.Equals(langConfig.Item.Ended) || conIndex.Equals(tagValue + langConfig.Item.Ended)) {
+                                comsArray.AddRange(array.ToList().GetRange(index+1, composeIndex - index-1));
+                                index = composeIndex + 1;
+                                break;
+                            }
+                        }
+                        //int[0]综合题开始标签位置,int[1]综合题结束标签位置,int[2]综合题第一个小题的开始标签位置
+                        KeyValuePair<int[], List<string>> coms = new KeyValuePair<int[], List<string>>(new int[] { curr, index }, comsArray);
+                        composeKeys.Add(coms);
+                    }
+                }
+            }
+            List<KeyValuePair<int[], List<ItemInfo>>> composeList = new List<KeyValuePair<int[], List<ItemInfo>>>();
+            foreach(var conskey in composeKeys) {
+                List<DOCX.Models.ItemInfo> consInner = ConvertTest(conskey.Value.ToArray(), null);
+                int stIndex = conskey.Key[0]+1;
+                if (consInner.IsNotEmpty())
+                {
+                    stIndex = consInner[0].order<=0? conskey.Key[0]+consInner[0].order:stIndex;
+                }
+                KeyValuePair<int[], List<ItemInfo>> innerComposeItem = new KeyValuePair<int[], List<ItemInfo>>(new int[] { conskey.Key[0], conskey.Key[1], stIndex }, consInner);
+                composeList.Add(innerComposeItem);
+            }
+            List<DOCX.Models.ItemInfo> tests= ConvertTest(array, composeList);
+            return tests;
+        }
+
+        private  string BlankTag(string tagHtml) {
+            //去掉标签中的Html
+            doc.LoadHtml(tagHtml);
+            var tagValue = doc.DocumentNode.InnerText.Replace("{", "").Replace("}", "")
+                        .Replace("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "")
+                        .Replace("&nbsp;", "").Replace("&emsp;", "").Replace("&emsp;", "");
+           // tagValue = Regex.Replace(tagValue, @"\d", "");
+            tagValue = Regex.Replace(tagValue, @"\s", "");
+            return tagValue;
+        }
+        public List<DOCX.Models.ItemInfo> ConvertTest(string[] array, List<KeyValuePair<int[], List<ItemInfo>>> composeList) {
+            List<DOCX.Models.ItemInfo> tests = new List<DOCX.Models.ItemInfo>();
+            //内容零时变量,追加完成后重新实例化  new StringBuilder()
+            StringBuilder content = new StringBuilder();
+            //告知遇到新标签,内容需要重新初始化实例
+            DOCX.Models.ItemInfo test=null;
+            string openTag = "";
+            string openTagVal = "";
+            bool openFlag = false;
+            for (int index = 1; index < array.Length; index++) {
+                if (index % 2 == 1)
+                {
+                    //去掉标签中的{} 空格换行制表符及Html空格数字等
+                    var tagValue = BlankTag(array[index]);
+                    tagValue = Regex.Replace(tagValue, @"\d", "");
+                    if (dict.TryGetValue(tagValue, out string[] keyInfo))
+                    {
+                        switch ( keyInfo[0] ) {
+                            case Summary:
+                                if (!string.IsNullOrEmpty(openTag) && openFlag && test != null)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                if (test != null)
+                                {
+                                    tests.Add(test);
+                                }
+                                //下列代码不能调整顺序
+                                if (keyInfo[1].Equals("compose"))
+                                {
+                                    var id = System.Guid.NewGuid().ToString();
+                                    var compose = new ItemInfo { type = keyInfo[1],objective=false,order=index,id=id };
+                                    if (composeList.IsNotEmpty())
+                                    {
+                                        var childItem = composeList.Where(x => x.Key[0] == index).FirstOrDefault();
+                                        childItem.Value.ForEach(x => x.pid = id);
+                                        compose.children = childItem.Value;
+                                        var ques= array.ToList().GetRange(childItem.Key[0]+1, childItem.Key[2]- childItem.Key[0]);
+                                        compose.question= string.Join("", ques);
+                                        index = childItem.Key[1] - 1;
+                                    }
+                                    tests.Add(compose);
+                                    openTag = "";
+                                    openTagVal = "";
+                                    openFlag = false;
+                                    test = null;
+                                }
+                                else {
+                                    var id = System.Guid.NewGuid().ToString();
+                                    test = new ItemInfo() { type = keyInfo[1], order = index, id = id };
+                                    if (keyInfo[1].Equals("single") || keyInfo[1].Equals("multiple") || keyInfo[1].Equals("judge"))
+                                    {
+                                        test.objective = true;
+                                    }
+                                    else
+                                    {
+                                        test.objective = false;
+                                    }
+                                    openTag = Summary;
+                                    openTagVal = tagValue;
+                                    openFlag = true;
+                                }
+                                break;
+                            case Answer: 
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Answer;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                            case Analysis:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Analysis;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                            case Ended: 
+                                break;
+                            case Point:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Point;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                            case Score:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Score;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                            case Level:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Level;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                            case Filed:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Filed;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                break;
+                        }
+                    }
+                    //如果不是标签内的则累加到内容上
+                    else {
+                        content.Append(array[index]);
+                    }
+                }
+                else {
+                    //偶数序列为内容
+                    content.Append(array[index]);
+                }
+            }
+            if (test != null)
+            {
+                DoOpenTag(openTag, openTagVal, openFlag, content, test);
+                tests.Add(test);
+            }
+            return tests;
+        }
+        public (List<CodeValue> options,string question) OptionProcess(string question) {
+            List<CodeValue> options = new List<CodeValue>();
+            string optsRgex = optionsKeys[0] + "\\s*(\\.|\\.|\\、|\\:|\\:)([\\s\\S]*?).*"; ;
+            string optsHtml = Regex.Match(question, optsRgex).Value;
+            StringBuilder textImg = new StringBuilder();
+            for (int i = 0; i < optionsKeys.Length - 1; i++)
+            {
+                string optRgex = optionsKeys[i] + "\\s*(\\.|\\.|\\、|\\:|\\:)([\\s\\S]*?)" + optionsKeys[i + 1] + "\\s*(\\.|\\.|\\、|\\:|\\:)";
+                string optHtml = Regex.Match(optsHtml, optRgex).Value;
+                if (string.IsNullOrWhiteSpace(optHtml)) {
+                    optRgex = optionsKeys[i] + "\\s*(\\.|\\.|\\、|\\:|\\:).*";
+                    optHtml = Regex.Match(optsHtml, optRgex).Value;
+                }
+                if (!string.IsNullOrEmpty(optHtml))
+                {
+                    optHtml = Regex.Replace(optHtml, optionsKeys[i + 1] + "\\s*(\\.|\\.|\\、|\\:|\\:)", "");
+                    optHtml = optHtml.Substring(2, optHtml.Length - 2);
+                    optHtml = HtmlHelper.DoUselessTag(optHtml);
+                    optHtml = optHtml.TrimStart().TrimEnd();
+                    textImg.Append(HtmlHelper.DoTextImg(optHtml));
+                    options.Add(new CodeValue { code = optionsKeys[i], value = optHtml });
+                }
+            }
+            if (!string.IsNullOrWhiteSpace(optsHtml))
+            {
+                return (options, question.Replace(optsHtml, ""));
+            }
+            else {
+                return (null, question);
+            }
+        }
+
+        public void  DoOpenTag (string openTag,string openTagVal, bool openFlag, StringBuilder  content , DOCX.Models.ItemInfo test) {
+            if (test != null) {
+                switch (openTag) {
+                    case Summary:
+                        if (test.type.Equals("single") || test.type.Equals("multiple")|| test.type.Equals("judge"))
+                        {
+                            (List<CodeValue> options, string question) = OptionProcess(content.ToString());
+                            test.option = options;
+                            test.question = HtmlHelper.DoUselessTag(question) ;
+                        }
+                        else {
+                            test.question = HtmlHelper.DoUselessTag(content.ToString());
+                        }
+                        break;
+                    case Answer:
+                        if (test.type.Equals("single") || test.type.Equals("multiple")|| test.type.Equals("judge"))
+                        {
+                            HashSet<string> ans = new HashSet<string>(); 
+                            var anstr = BlankTag(content.ToString());
+                            anstr.Select(s => s.ToString()).ToList().ForEach(x =>
+                            {
+                                ans.Add(x);
+                            });
+                            test.answer = ans.ToList();
+                            if (test.type.Equals("judge")) {
+                                string[] Judge = langConfig.Item.Judge.Split('|');
+                                List<CodeValue> option = new List<CodeValue>() { new CodeValue { code = "A", value = Judge[0] }, new CodeValue { code = "B", value = Judge[1] } };
+                                if (test.answer != null && test.answer.Count > 0)
+                                {
+                                    int index = 0;
+                                    foreach (var j in Judge)
+                                    {
+                                        if (String.Equals(test.answer[0], j, StringComparison.CurrentCultureIgnoreCase))
+                                        {
+                                            test.answer[0] = option[index].code;
+                                            test.option = option;
+                                            break;
+                                        }
+                                        index += 1;
+                                    }
+                                }
+                            }
+                        }
+                        else {
+                            test.answer = new List<string>() { HtmlHelper.DoUselessTag(content.ToString()) };
+                        }
+                        break;
+                    case Analysis:
+                        test.explain  = HtmlHelper.DoUselessTag(content.ToString());
+                        break;
+                    case Ended: break;
+                    case Point:
+                        string Points =BlankTag(content.ToString());
+                        if (!string.IsNullOrWhiteSpace(Points))
+                        {
+                            string[] ps = Regex.Split(Points, "\\.|\\.|\\、|\\:|\\:|\\,|\\,|\\;|\\;");
+                            if (ps != null && ps.Length > 0)
+                            {
+                                test.points = ps.Distinct().ToList();
+                            }
+                        }
+                        break;
+                    case Score:
+                        //单选或多选,判断答案 脱html标签
+                        string Scores = BlankTag(content.ToString());
+                        //正则匹配数字  整数和小数点
+                        var reg = "^[0-9]+(\\.?[0-9]+)?";
+                        Match m1t = Regex.Match(Scores, reg);
+                        double.TryParse(m1t.Value, out double sc);
+                        test.score = sc;
+                        break;
+                    case Level:
+                        //单选或多选,判断答案 脱html标签
+                        string Levels = BlankTag(content.ToString());
+                        //正则匹配数字  整数和小数点
+                        var lelreg = "^[0-9]+(\\.?[0-9]+)?";
+                        Match lelm1t = Regex.Match(Levels, lelreg);
+                        int.TryParse(lelm1t.Value, out int lvl);
+                        test.level = lvl;
+                        break;
+                    case Filed:
+                        test.field = Array.IndexOf(Fileds, openTagVal) + 1;
+                        break;
+                }
+            }
+        }
+    }
+}

+ 3 - 2
HTEXLib/Translator/HtexExtensions.cs

@@ -9,12 +9,13 @@ namespace HTEXLib.Translator
 {
     public static class HtexExtensions
     {
-        public static IServiceCollection AddHtexTranslator(this IServiceCollection services)
+        public static IServiceCollection AddHtexTranslator(this IServiceCollection services,string configPath)
         {
             if (services == null) throw new ArgumentNullException(nameof(services));
             services.TryAddScoped<PPTX2HTEXTranslator>();
             services.TryAddScoped<DOXC2HTMLTranslator>();
-            services.TryAddScoped<HTML2ITEMTranslator>();
+           services.TryAddScoped<HTML2ITEMTranslator>();
+            services.TryAddSingleton<HTML2ITEMV2Translator>(new HTML2ITEMV2Translator(configPath));
             return services;
         }
     }

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 38 - 4
HTEXTest/Program.cs


+ 6 - 0
HTEXWeb/Config/LangConfig.json

@@ -21,6 +21,7 @@
       "Filed": "知识|理解|应用|分析|综合|评鉴",
       "Judge": "对|错",
       "Ended": "结束",
+      "Level": "难度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -48,6 +49,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -75,6 +77,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -102,6 +105,7 @@
       "Filed": "知識|理解|應用|分析|綜合|評鑒",
       "Judge": "對|錯",
       "Ended": "結束",
+      "Level": "難度",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -129,6 +133,7 @@
       "Filed": "knowledge|understand|using|analyse|synthesize|discern",
       "Judge": "true|false",
       "Ended": "Ended",
+      "Level": "Level",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"
@@ -156,6 +161,7 @@
       "Filed": "knowledge|understand|using|analyse|synthesize|discern",
       "Judge": "true|false",
       "Ended": "Ended",
+      "Level": "Level",
       "Options": "ABCDEFGHIJKLMN",
       "Start": "{",
       "End": "}"

+ 9 - 22
HTEXWeb/Controllers/HtexController.cs

@@ -25,11 +25,12 @@ namespace HTEXWeb.Controllers
         public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
         public HTML2ITEMTranslator _HTML2ITEMTranslator { get; set; }
         public HTML2IMGSTranslator _HTML2IMGSTranslator { get; set; }
-        private List<LangConfig> langConfigs { get; set; }
-        public HtexController(PPTX2HTEXTranslator htexGenerator, DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMTranslator HTML2ITEMTranslator, HTML2IMGSTranslator HTML2IMGSTranslator,IWebHostEnvironment webHostEnvironment) {
+        public HTML2ITEMV2Translator _HTML2ITEMV2Translator { get; set; }
+        public HtexController(PPTX2HTEXTranslator htexGenerator, DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMTranslator HTML2ITEMTranslator, HTML2IMGSTranslator HTML2IMGSTranslator, HTML2ITEMV2Translator HTML2ITEMV2Translator ,IWebHostEnvironment webHostEnvironment) {
             _DOXC2HTMLTranslator = DOXC2HTMLTranslator;
             _HTML2ITEMTranslator = HTML2ITEMTranslator;
             _HTML2IMGSTranslator = HTML2IMGSTranslator;
+            _HTML2ITEMV2Translator = HTML2ITEMV2Translator;
             this.htexGenerator = htexGenerator;
             string path = webHostEnvironment.ContentRootPath + "/Config/LangConfig.json";
             FileStream fs = new FileStream(path, System.IO.FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
@@ -42,7 +43,7 @@ namespace HTEXWeb.Controllers
             }
             sr.Close();
             string text = builder.ToString();
-            langConfigs = text.FromJson<List<LangConfig>>();
+          //  langConfigs = text.FromJson<List<LangConfig>>();
         }
         [HttpPost("generator")]
         public object Generator([FromForm] IFormFile file)
@@ -73,25 +74,11 @@ namespace HTEXWeb.Controllers
         [HttpPost("parse-html")]
         public IActionResult AnalyzeHtml(JsonElement request)
         {
-            //ResponseBuilder builder = ResponseBuilder.custom();
-            Dictionary<string, object> dict = new Dictionary<string, object>();
-            var emobj = request.EnumerateObject();
-            while (emobj.MoveNext())
-            {
-                dict[emobj.Current.Name] = emobj.Current.Value;
-            }
-            bool flag = dict.TryGetValue("htmlString", out object htmlString);
-            bool flagLang = dict.TryGetValue("lang", out object lang);
-            if (flag && htmlString != null && !string.IsNullOrEmpty(htmlString.ToString()))
-            {
-                LangConfig langConfig = langConfigs.Where(x => x.Lang == lang.ToString()).FirstOrDefault();
-                var exercises = _HTML2ITEMTranslator.Translate(htmlString.ToString(), langConfig);
-                return Ok(exercises);
-            }
-            else
-            {
-                return BadRequest();
-            }
+
+            if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
+            request.TryGetProperty("lang", out JsonElement lang);
+            var exercises = _HTML2ITEMV2Translator.Translate(htmlString.GetString(), lang);
+            return Ok(exercises);
         }
         /// <summary>
         /// htmlString AnalyzeHtml

+ 3 - 0
HTEXWeb/HTEXWeb.csproj

@@ -6,6 +6,9 @@
 
   <ItemGroup>
     <PackageReference Include="Newtonsoft.Json" Version="12.0.3" />
+    <PackageReference Include="Selenium.Support" Version="3.141.0" />
+    <PackageReference Include="Selenium.WebDriver" Version="3.141.0" />
+    <PackageReference Include="Selenium.WebDriver.ChromeDriver" Version="87.0.4280.8800" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 2
HTEXWeb/Startup.cs

@@ -30,9 +30,9 @@ namespace HTEXWeb
         // This method gets called by the runtime. Use this method to add services to the container.
         public void ConfigureServices(IServiceCollection services)
         {
-            string path=  environment.ContentRootPath+ "/Config";
+            string path=$"{ environment.ContentRootPath}/Config";
             services.AddControllers().AddJsonOptions(options => { options.JsonSerializerOptions.IgnoreNullValues = false; });
-            services.AddHtexTranslator();
+            services.AddHtexTranslator(path);
             services.TryAddSingleton<HTML2IMGSTranslator>(new HTML2IMGSTranslator(path));
         }