瀏覽代碼

处理标签,去掉语言参数

CrazyIter_Bin 4 年之前
父節點
當前提交
d9e6fbdd3c

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

@@ -4,6 +4,13 @@ using System.Text;
 
 namespace HTEXLib.DOCX.Models
 {
+    public class TagConfig {
+
+        public string Options{ get; set; }
+        public string Start { get; set; }
+        public string End { get; set; }
+        public List<LangConfig> LangConfig { get; set; }
+    }
     public class LangConfig
     {
         public string Lang { get; set; }

+ 495 - 0
HTEXLib/Translator/HTML2ITEMV3Translator.cs

@@ -0,0 +1,495 @@
+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 HTML2ITEMV3Translator
+    {
+        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 TagConfig _TagConfig { get; set; }
+        public HTML2ITEMV3Translator(string configPath)
+        {
+            FileStream fs = new FileStream(configPath+ "/LangConfigV3.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();
+            _TagConfig = text.FromJson<TagConfig>();
+            dict = new Dictionary<string, string[]>();
+            foreach (var _langConfig in _TagConfig.LangConfig)
+            {
+                string[] Fileds = _langConfig.Item.Filed.Split('|');
+               
+                foreach (var filed in Fileds)
+                {
+                    dict[filed] = new string[] { _langConfig.Lang, Filed, $"{Array.IndexOf(Fileds, filed)}" };
+                }
+                string[] Judges = _langConfig.Item.Judge.Split('|');
+                foreach (var Judge in Judges)
+                {
+                    dict[Judge] = new string[] { _langConfig.Lang, Judge, $"{Array.IndexOf(Judges, Judge)}" };
+                }
+                dict[_langConfig.Item.Answer] = new string[] { _langConfig.Lang, Answer };
+                dict[_langConfig.Item.Analysis] = new string[] { _langConfig.Lang, Analysis };
+                dict[_langConfig.Item.Ended] = new string[] { _langConfig.Lang, Ended };
+                dict[_langConfig.Item.Point] = new string[] { _langConfig.Lang, Point };
+                dict[_langConfig.Item.Score] = new string[] { _langConfig.Lang, Score };
+                dict[_langConfig.Item.Level] = new string[] { _langConfig.Lang, Level };
+                foreach (string key in _langConfig.Item.Type.Keys)
+                {
+                    dict[_langConfig.Item.Type[key]] = new string[] { _langConfig.Lang, Summary, key };
+                }
+            }
+            optionsKeys = _TagConfig.Options.Select(s => s.ToString()).ToArray();
+        }
+
+        /// <summary>
+        /// 处理标签中以及题型标签中包含的空格字符
+        /// </summary>
+        /// <param name="html"></param>
+        /// <returns></returns>
+        public string BlankProcess(string html)
+        {
+
+            foreach (var _langConfig in _TagConfig.LangConfig) {
+                string ans = _TagConfig.Start + _langConfig.Item.Answer + _TagConfig.End;
+                string als = _TagConfig.Start + _langConfig.Item.Analysis + _TagConfig.End;
+                string end = _TagConfig.Start + _langConfig.Item.Ended + _TagConfig.End;
+                string pot = _TagConfig.Start + _langConfig.Item.Point + _TagConfig.End;
+                string scr = _TagConfig.Start + _langConfig.Item.Score + _TagConfig.End;
+                string lvl = _TagConfig.Start + _langConfig.Item.Level + _TagConfig.End;
+                string[] Fileds = _langConfig.Item.Filed.Split('|');
+                foreach (var filed in Fileds)
+                {
+                    var fld = _TagConfig.Start + filed + _TagConfig.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 = $"{_TagConfig.Start}\\s*\\d+\\s*{string.Join("\\s*", value.Select(s => s.ToString()).ToArray())}\\s*{_TagConfig.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 )
+        {
+            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);
+            //处理 标签中包含的空格字符
+            html = BlankProcess(html);
+            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[1] == Summary && keyInfo[2].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", "");
+                            var langStr = keyInfo[0];
+                            var langfig= _TagConfig.LangConfig.Where(x => x.Lang == langStr).FirstOrDefault();
+                            if (conIndex.Equals(langfig.Item.Ended) || conIndex.Equals(tagValue + langfig.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;
+            string openTagLang = "";
+            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[1] ) {
+                            case Summary:
+                                if (!string.IsNullOrEmpty(openTag) && openFlag && test != null)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                if (test != null)
+                                {
+                                    tests.Add(test);
+                                }
+                                //下列代码不能调整顺序
+                                if (keyInfo[2].Equals("compose"))
+                                {
+                                    var id = System.Guid.NewGuid().ToString();
+                                    var compose = new ItemInfo { type = keyInfo[2],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;
+                                    openTagLang = keyInfo[0];
+                                    test = null;
+                                }
+                                else {
+                                    var id = System.Guid.NewGuid().ToString();
+                                    test = new ItemInfo() { type = keyInfo[2], order = index, id = id };
+                                    if (keyInfo[2].Equals("single") || keyInfo[2].Equals("multiple") || keyInfo[2].Equals("judge"))
+                                    {
+                                        test.objective = true;
+                                    }
+                                    else
+                                    {
+                                        test.objective = false;
+                                    }
+                                    openTag = Summary;
+                                    openTagVal = tagValue;
+                                    openFlag = true;
+                                    openTagLang = keyInfo[0];
+                                }
+                                break;
+                            case Answer: 
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Answer;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                            case Analysis:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Analysis;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                            case Ended: 
+                                break;
+                            case Point:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Point;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                            case Score:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Score;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                            case Level:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Level;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                            case Filed:
+                                //下列代码不能调整顺序
+                                if (!string.IsNullOrEmpty(openTag) && openFlag)
+                                {
+                                    DoOpenTag(openTag, openTagVal, openFlag, openTagLang, content, test);
+                                    content = new StringBuilder();
+                                }
+                                openTag = Filed;
+                                openTagVal = tagValue;
+                                openFlag = true;
+                                openTagLang = keyInfo[0];
+                                break;
+                        }
+                    }
+                    //如果不是标签内的则累加到内容上
+                    else {
+                        content.Append(array[index]);
+                    }
+                }
+                else {
+                    //偶数序列为内容
+                    content.Append(array[index]);
+                }
+            }
+            if (test != null)
+            {
+                DoOpenTag(openTag, openTagVal, openFlag, openTagLang, 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, string  openTagLang , 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());
+                            if (!test.type.Equals("judge"))
+                            {
+                                anstr.Select(s => s.ToString()).ToList().ForEach(x =>
+                                {
+                                    ans.Add(x);
+                                });
+                            }
+                            else {
+                                ans.Add(anstr);
+                            }
+                            test.answer = ans.ToList();
+                            if (test.type.Equals("judge")) {
+                                if (test.answer != null && test.answer.Count > 0)
+                                {
+                                    test.answer = new List<string>() { ans.ToList().First() };
+                                    if (dict.TryGetValue(test.answer[0].ToLower(), out string[] keyInfoas))
+                                    {
+                                        var lang = keyInfoas[0];
+                                        var LangConfigAs =_TagConfig.LangConfig.Where(x => x.Lang == lang).FirstOrDefault();
+                                        string[] Judge = LangConfigAs.Item.Judge.Split('|');
+                                        List<CodeValue> option = new List<CodeValue>() { new CodeValue { code = "A", value = Judge[0] }, new CodeValue { code = "B", value = Judge[1] } };
+                                        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:
+                        if (dict.TryGetValue(openTagVal, out string[] keyInfo)) {
+                            var LangConfigfd = _TagConfig.LangConfig.Where(x => x.Lang == keyInfo[0]).FirstOrDefault();
+                            var Fileds= LangConfigfd.Item.Filed.Split('|');
+                            test.field = Array.IndexOf(Fileds, openTagVal) + 1;
+                        }
+                        break;
+                }
+            }
+        }
+    }
+}

+ 3 - 2
HTEXLib/Translator/HtexExtensions.cs

@@ -14,8 +14,9 @@ namespace HTEXLib.Translator
             if (services == null) throw new ArgumentNullException(nameof(services));
             services.TryAddScoped<PPTX2HTEXTranslator>();
             services.TryAddScoped<DOXC2HTMLTranslator>();
-           services.TryAddScoped<HTML2ITEMTranslator>();
-            services.TryAddSingleton<HTML2ITEMV2Translator>(new HTML2ITEMV2Translator(configPath));
+            //services.TryAddScoped<HTML2ITEMTranslator>();
+            // services.TryAddSingleton<HTML2ITEMV2Translator>(new HTML2ITEMV2Translator(configPath));
+            services.TryAddSingleton<HTML2ITEMV3Translator>(new HTML2ITEMV3Translator(configPath));
             return services;
         }
     }

+ 79 - 0
HTEXWeb/Config/LangConfigV3.json

@@ -0,0 +1,79 @@
+{
+  "Options": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
+  "Start": "{",
+  "End": "}",
+  "LangConfig": [
+    {
+      "Lang": "简体",
+      "Alias": "简体中文",
+      "Item": {
+        "Type": {
+          "compose": "综合题",
+          "single": "单选题",
+          "multiple": "多选题",
+          "judge": "判断题",
+          "complete": "填空题",
+          "subjective": "问答题",
+          "connector": "连线题",
+          "correct": "改错题"
+        },
+        "Answer": "答案",
+        "Analysis": "解析",
+        "Score": "配分",
+        "Point": "知识点",
+        "Filed": "知识|理解|应用|分析|综合|评鉴",
+        "Judge": "对|错",
+        "Ended": "结束",
+        "Level": "难度"
+      }
+    },
+    {
+      "Lang": "繁體",
+      "Alias": "繁體中文",
+      "Item": {
+        "Type": {
+          "compose": "綜合題",
+          "single": "選擇題",
+          "multiple": "複選題",
+          "judge": "是非題",
+          "complete": "填充題",
+          "subjective": "問答題",
+          "connector": "連綫題",
+          "correct": "改錯題"
+        },
+        "Answer": "答案",
+        "Analysis": "解析",
+        "Score": "配分",
+        "Point": "知識點",
+        "Filed": "知識|理解|應用|分析|綜合|評鑒",
+        "Judge": "對|錯",
+        "Ended": "結束",
+        "Level": "難度"
+      }
+    },
+    {
+      "Lang": "EN",
+      "Alias": "English",
+      "Item": {
+        "Type": {
+          "compose": "QuestionGroup",
+          "single": "MultipleChoice",
+          "multiple": "MultipleAnswers",
+          "judge": "TrueFalse",
+          "complete": "Blank",
+          "subjective": "Essay",
+          "connector": "Connector",
+          "correct": "Correct"
+        },
+        "Answer": "Answer",
+        "Analysis": "Explain",
+        "Score": "Score",
+        "Point": "Point",
+        "Filed": "knowledge|understand|using|analyse|synthesize|discern",
+        "Judge": "true|false",
+        "Ended": "Ended",
+        "Level": "Level"
+      }
+    }
+  ]
+}

+ 5 - 19
HTEXWeb/Controllers/HtexController.cs

@@ -25,25 +25,13 @@ namespace HTEXWeb.Controllers
         public DOXC2HTMLTranslator _DOXC2HTMLTranslator { get; set; }
         public HTML2ITEMTranslator _HTML2ITEMTranslator { get; set; }
         public HTML2IMGSTranslator _HTML2IMGSTranslator { get; set; }
-        public HTML2ITEMV2Translator _HTML2ITEMV2Translator { get; set; }
-        public HtexController(PPTX2HTEXTranslator htexGenerator, DOXC2HTMLTranslator DOXC2HTMLTranslator, HTML2ITEMTranslator HTML2ITEMTranslator, HTML2IMGSTranslator HTML2IMGSTranslator, HTML2ITEMV2Translator HTML2ITEMV2Translator ,IWebHostEnvironment webHostEnvironment) {
+        public HTML2ITEMV3Translator _HTML2ITEMV3Translator { get; set; }
+        public HtexController(PPTX2HTEXTranslator htexGenerator, DOXC2HTMLTranslator DOXC2HTMLTranslator,  HTML2IMGSTranslator HTML2IMGSTranslator,
+            HTML2ITEMV3Translator HTML2ITEMV3Translator, IWebHostEnvironment webHostEnvironment) {
             _DOXC2HTMLTranslator = DOXC2HTMLTranslator;
-            _HTML2ITEMTranslator = HTML2ITEMTranslator;
             _HTML2IMGSTranslator = HTML2IMGSTranslator;
-            _HTML2ITEMV2Translator = HTML2ITEMV2Translator;
+            _HTML2ITEMV3Translator = HTML2ITEMV3Translator;
             this.htexGenerator = htexGenerator;
-            string path = webHostEnvironment.ContentRootPath + "/Config/LangConfig.json";
-            FileStream fs = new FileStream(path, 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>>();
         }
         [HttpPost("generator")]
         public object Generator([FromForm] IFormFile file)
@@ -74,10 +62,8 @@ namespace HTEXWeb.Controllers
         [HttpPost("parse-html")]
         public IActionResult AnalyzeHtml(JsonElement request)
         {
-
             if (!request.TryGetProperty("htmlString", out JsonElement htmlString)) { return BadRequest(); }
-            request.TryGetProperty("lang", out JsonElement lang);
-            var exercises = _HTML2ITEMV2Translator.Translate(htmlString.GetString(), lang);
+            var exercises = _HTML2ITEMV3Translator.Translate(htmlString.GetString());
             return Ok(exercises);
         }
         /// <summary>