Esempio n. 1
0
            /// <summary>
            /// Adds a single new entry to the dictionary.
            /// </summary>
            public void NewEntry(CedictEntry entry, string note)
            {
                tr = conn.BeginTransaction();
                string head, trg;

                entry.GetCedict(out head, out trg);
                // Check restrictions - can end up dropped entry
                checkRestrictions(entry.ChSimpl, trg);
                // Check for duplicate
                if (SqlDict.DoesHeadExist(head))
                {
                    throw new Exception("Headword already exists: " + head);
                }

                // Serialize, store in DB, index
                int binId = indexEntry(entry);
                // Populate entries table
                int entryId = storeEntry(entry.ChSimpl, head, trg, binId);

                // Record change
                cmdInsModifNew.Parameters["@timestamp"].Value = DateTime.UtcNow;
                cmdInsModifNew.Parameters["@user_id"].Value   = userId;
                cmdInsModifNew.Parameters["@note"].Value      = note;
                cmdInsModifNew.Parameters["@entry_id"].Value  = entryId;
                cmdInsModifNew.ExecuteNonQuery();
                int modifId = (int)cmdInsModifNew.LastInsertedId;

                // Also link from entry
                cmdUpdLastModif.Parameters["@entry_id"].Value      = entryId;
                cmdUpdLastModif.Parameters["@last_modif_id"].Value = modifId;
                cmdUpdLastModif.ExecuteNonQuery();
                // Commit. Otherwise, dispose will roll all this back if it finds non-null transaction.
                tr.Commit(); tr.Dispose(); tr = null;
            }
Esempio n. 2
0
        public override void Process()
        {
            string simp = Req.Params["simp"];

            if (simp == null)
            {
                throw new ApiException(400, "Missing 'simp' parameter.");
            }
            string trad = Req.Params["trad"];

            if (trad == null)
            {
                throw new ApiException(400, "Missing 'trad' parameter.");
            }
            string pinyin = Req.Params["pinyin"];

            if (pinyin == null)
            {
                throw new ApiException(400, "Missing 'pinyin' parameter.");
            }
            string trg = Req.Params["trg"];

            if (trg == null)
            {
                throw new ApiException(400, "Missing 'trg' parameter.");
            }
            string note = Req.Params["note"];

            if (note == null)
            {
                throw new ApiException(400, "Missing 'note' parameter.");
            }

            Result res = new Result {
                Success = true
            };

            SqlDict.SimpleBuilder builder = null;
            try
            {
                builder = new SqlDict.SimpleBuilder(0);
                CedictEntry entry = SqlDict.BuildEntry(simp, trad, pinyin, trg);
                builder.NewEntry(entry, note);
            }
            catch (Exception ex)
            {
                DiagLogger.LogError(ex);
                res.Success = false;
            }
            finally
            {
                if (builder != null)
                {
                    builder.Dispose();
                }
            }

            // Tell our caller
            Res = res;
        }
Esempio n. 3
0
 private bool hasHanzi(string query)
 {
     foreach (char c in query)
     {
         if (SqlDict.IsHanzi(c))
         {
             return(true);
         }
     }
     return(false);
 }
Esempio n. 4
0
        /// <summary>
        /// Import new entries from file as a single bulk change.
        /// </summary>
        public void BulkAdd(string dictPath, string workingFolder)
        {
            CedictParser parser = new CedictParser();

            Startup.InitDB(config, null, false);
            SqlDict dict    = new SqlDict(null, mut);
            int     lineNum = 0;

            DateTime dt    = DateTime.Now;
            string   fnLog = "importlog-" + dt.Year + "-" + dt.Month.ToString("00") + "-" + dt.Day.ToString("00") + "!" + dt.Hour.ToString("00") + "-" + dt.Minute.ToString("00") + "-" + dt.Second.ToString("00") + ".txt";

            fnLog = Path.Combine(workingFolder, fnLog);
            using (FileStream fs = new FileStream(dictPath, FileMode.Open, FileAccess.Read))
                using (StreamReader sr = new StreamReader(fs))
                    using (FileStream fsLog = new FileStream(fnLog, FileMode.Create, FileAccess.ReadWrite))
                        using (StreamWriter swLog = new StreamWriter(fsLog))
                        {
                            // First two lines are commented and have metainfo
                            // First line: user name
                            // Second line: bulk change's comment
                            string user = sr.ReadLine().Substring(1).Trim();
                            string note = sr.ReadLine().Substring(1).Trim();
                            lineNum = 2;
                            using (SqlDict.ImportBuilder builder = dict.GetBulkBuilder(user, note))
                            {
                                string line;
                                while ((line = sr.ReadLine()) != null)
                                {
                                    ++lineNum;
                                    if (line == "" || line.StartsWith("#"))
                                    {
                                        continue;
                                    }
                                    CedictEntry entry = parser.ParseEntry(line, lineNum, swLog);
                                    if (entry == null)
                                    {
                                        swLog.WriteLine(line);
                                        continue;
                                    }
                                    entry.Status = EntryStatus.Approved;
                                    bool ok = builder.AddNewEntry(entry);
                                    if (!ok)
                                    {
                                        swLog.WriteLine("Line " + lineNum + ": Entry rejected by importer.");
                                        swLog.WriteLine(line);
                                        continue;
                                    }
                                }
                                builder.CommitRest();
                            }
                        }
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        public override void Process()
        {
            // Mucho TO-DO in this action:
            // - Escape slashes in senses
            // - Proper checking for all sorts of stuff

            string simp = Req.Params["simp"];

            if (simp == null)
            {
                throw new ApiException(400, "Missing 'simp' parameter.");
            }
            string trad = Req.Params["trad"];

            if (trad == null)
            {
                throw new ApiException(400, "Missing 'trad' parameter.");
            }
            string pinyin = Req.Params["pinyin"];

            if (pinyin == null)
            {
                throw new ApiException(400, "Missing 'pinyin' parameter.");
            }
            string trg = Req.Params["trg"];

            if (trg == null)
            {
                throw new ApiException(400, "Missing 'trg' parameter.");
            }

            Result res = new Result();

            res.Passed = true;

            CedictEntry   entry = SqlDict.BuildEntry(simp, trad, pinyin, trg);
            StringBuilder sb    = new StringBuilder();

            using (HtmlTextWriter writer = new HtmlTextWriter(new StringWriter(sb)))
            {
                EntryRenderer er = new EntryRenderer(entry, null, null);
                er.Render(writer);
            }
            res.Preview = sb.ToString();

            // Tell our caller
            Res = res;
        }
Esempio n. 6
0
        /// <summary>
        /// Verifies if string can serve as a simplified headword.
        /// </summary>
        public override void Process()
        {
            string simp = Req.Params["simp"];

            if (simp == null)
            {
                throw new ApiException(400, "Missing 'simp' parameter.");
            }
            Result res = new Result();

            UniHanziInfo[] uhis = Global.HWInfo.GetUnihanInfo(simp);

            // Has WS or punctuation
            bool hasSpaceOrPunct = false;
            // Chars that are neither hanzi nor A-Z0-9
            List <char> notHanziOrLD = new List <char>();
            // Unsupported hanzi: no Unihan info
            List <char> unsupportedHanzi = new List <char>();
            // Not simplified
            List <char> notSimp = new List <char>();

            // Check each character
            for (int i = 0; i != simp.Length; ++i)
            {
                char         c   = simp[i];
                UniHanziInfo uhi = uhis[i];

                // Space or punct
                if (char.IsWhiteSpace(c) || char.IsPunctuation(c))
                {
                    hasSpaceOrPunct = true; continue;
                }
                // Is it even a Hanzi or A-Z0-9?
                bool isHanziOrLD = SqlDict.IsHanzi(c) || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9');
                if (!isHanziOrLD)
                {
                    notHanziOrLD.Add(c); continue;
                }
                // No info?
                if (uhi == null)
                {
                    unsupportedHanzi.Add(c); continue;
                }
                // Cannot be simplified?
                if (!uhi.CanBeSimp)
                {
                    notSimp.Add(c); continue;
                }
            }

            // Passed or not
            if (!hasSpaceOrPunct && notHanziOrLD.Count == 0 && unsupportedHanzi.Count == 0 && notSimp.Count == 0)
            {
                res.Passed = true;
            }
            else
            {
                // Compile our errors
                res.Passed = false;
                res.Errors = new List <string>();
                if (hasSpaceOrPunct)
                {
                    res.Errors.Add(errSpacePunct);
                }
                if (notHanziOrLD.Count != 0)
                {
                    string err = errNotHanzi;
                    foreach (char c in notHanziOrLD)
                    {
                        err += ' '; err += c;
                    }
                    res.Errors.Add(err);
                }
                if (unsupportedHanzi.Count != 0)
                {
                    string err = errUnsupported;
                    foreach (char c in unsupportedHanzi)
                    {
                        err += ' '; err += c;
                    }
                    res.Errors.Add(err);
                }
                if (notSimp.Count != 0)
                {
                    string err = errNotSimp;
                    foreach (char c in notSimp)
                    {
                        err += ' '; err += c;
                    }
                    res.Errors.Add(err);
                }
            }

            // Tell our caller
            Res = res;
        }
Esempio n. 7
0
        private void histRenderChange(HtmlTextWriter writer, SqlDict.ChangeItem ci, bool trailingSeparator)
        {
            writer.WriteLine();
            writer.AddAttribute("class", "historyItem");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute("class", "changeHead");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

            writer.AddAttribute("class", "fa fa-lightbulb-o ctNew");
            writer.RenderBeginTag(HtmlTextWriterTag.I);
            writer.RenderEndTag();

            writer.AddAttribute("class", "changeSummary");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

            string changeMsg;
            string changeCls = "changeType";

            if (ci.ChangeType == SqlDict.ChangeType.New)
            {
                changeMsg = "Új szócikk";
            }
            else if (ci.ChangeType == SqlDict.ChangeType.Edit)
            {
                changeMsg = "Szerkesztve";
            }
            else if (ci.ChangeType == SqlDict.ChangeType.Note)
            {
                changeMsg = "Megjegyzés";
            }
            else
            {
                changeMsg = ci.ChangeType.ToString();
            }
            changeMsg += ": ";
            writer.AddAttribute("class", changeCls);
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            writer.WriteEncodedText(changeMsg);
            writer.RenderEndTag();

            writer.AddAttribute("class", "changeUser");
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            writer.WriteEncodedText(ci.User);
            writer.RenderEndTag();

            writer.Write(" &bull; ");

            writer.AddAttribute("class", "changeTime");
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            DateTime dt    = TimeZoneInfo.ConvertTimeFromUtc(ci.When, Global.TimeZoneInfo);
            string   dtFmt = "{0}-{1:00}-{2:00} {3:00}:{4:00}";

            dtFmt = string.Format(dtFmt, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);
            writer.WriteEncodedText(dtFmt);
            writer.RenderEndTag();

            writer.RenderEndTag();
            writer.AddAttribute("class", "changeNote");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.WriteEncodedText(ci.Note);
            writer.RenderEndTag();

            writer.RenderEndTag();
            writer.AddAttribute("class", "changeEntry");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

            writer.AddAttribute("class", "histEntryOps");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute("class", "opHistEdit fa fa-pencil-square-o");
            writer.RenderBeginTag(HtmlTextWriterTag.I);
            writer.RenderEndTag();
            writer.AddAttribute("class", "opHistComment fa fa-commenting-o");
            writer.RenderBeginTag(HtmlTextWriterTag.I);
            writer.RenderEndTag();
            writer.AddAttribute("class", "opHistFlag fa fa-flag-o");
            writer.RenderBeginTag(HtmlTextWriterTag.I);
            writer.RenderEndTag();
            writer.RenderEndTag();

            CedictEntry   entry = SqlDict.BuildEntry(ci.EntryHead, ci.EntryBody);
            EntryRenderer er    = new EntryRenderer(entry);

            er.OneLineHanziLimit = 12;
            er.Render(writer);

            writer.RenderEndTag();

            writer.RenderEndTag();

            if (trailingSeparator)
            {
                writer.AddAttribute("class", "historySep");
                writer.RenderBeginTag(HtmlTextWriterTag.Div);
                writer.RenderEndTag();
            }
        }
Esempio n. 8
0
        /// <summary>
        /// Import dictionary data including version history.
        /// Only used to initialize from scratch.
        /// </summary>
        public void ImportDict(string dictPath, string workingFolder)
        {
            Startup.InitDB(config, null, false);
            SqlDict             dict = new SqlDict(null, mut);
            List <EntryVersion> vers = new List <EntryVersion>();

            using (FileStream fs = new FileStream(dictPath, FileMode.Open, FileAccess.Read))
                using (StreamReader sr = new StreamReader(fs))
                {
                    EntryBlockParser ebp = new EntryBlockParser(sr);
                    // Two passes. In the first we collect user names and bulk changes.
                    var users = new HashSet <string>();
                    var bulks = new Dictionary <int, SqlDict.ImportBuilder.BulkChangeInfo>();
                    while (true)
                    {
                        vers.Clear();
                        int id = ebp.ReadBlock(vers);
                        if (id == -1)
                        {
                            break;
                        }
                        for (int i = 0; i != vers.Count; ++i)
                        {
                            var ver = vers[i];
                            users.Add(ver.User);
                            // First change referencing this bulk
                            if (ver.BulkRef != -1 && !bulks.ContainsKey(ver.BulkRef))
                            {
                                SqlDict.ImportBuilder.BulkChangeInfo bci = new SqlDict.ImportBuilder.BulkChangeInfo
                                {
                                    Timestamp      = ver.Timestamp,
                                    UserName       = ver.User,
                                    Comment        = ver.Comment,
                                    NewEntries     = i == 0 ? 1 : 0,
                                    ChangedEntries = i != 0 ? 1 : 0,
                                };
                                bulks[ver.BulkRef] = bci;
                            }
                            // Bulk, and seen before
                            else if (ver.BulkRef != -1)
                            {
                                if (i == 0)
                                {
                                    ++bulks[ver.BulkRef].NewEntries;
                                }
                                else
                                {
                                    ++bulks[ver.BulkRef].ChangedEntries;
                                }
                            }
                        }
                    }
                    // Enrich known built-in user names with "about"
                    HashSet <string> richUsers = new HashSet <string>();
                    foreach (string x in users)
                    {
                        if (x == "HanDeDict")
                        {
                            richUsers.Add(x + "\t" + "Platzhalter für das ursprüngliche HanDeDict-Team");
                        }
                        if (x == "zydeo-robot")
                        {
                            richUsers.Add(x + "\t" + "Platzhalter für automatische Datenverarbeitung");
                        }
                        else
                        {
                            richUsers.Add(x + "\t");
                        }
                    }
                    // Second pass. Actual import.
                    fs.Position = 0;
                    using (SqlDict.ImportBuilder builder = dict.GetBulkBuilder(richUsers, bulks))
                    {
                        while (true)
                        {
                            vers.Clear();
                            int id = ebp.ReadBlock(vers);
                            if (id == -1)
                            {
                                break;
                            }
                            builder.AddEntry(id, vers);
                        }
                        builder.CommitRest();
                    }
                }
        }
Esempio n. 9
0
        protected override void Render(HtmlTextWriter writer)
        {
            writer.WriteLine();
            writer.AddAttribute("class", "historyItem");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute("class", "changeHead");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute("class", "changeSummary");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.AddAttribute("class", "changeUser");
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            writer.WriteEncodedText(ci.User);
            writer.RenderEndTag();

            writer.Write(" &bull; ");

            writer.AddAttribute("class", "changeTime");
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            DateTime dt    = TimeZoneInfo.ConvertTimeFromUtc(ci.When, Global.TimeZoneInfo);
            string   dtFmt = "{0}-{1:00}-{2:00} {3:00}:{4:00}:{5:00}";

            dtFmt = string.Format(dtFmt, dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second);
            writer.WriteEncodedText(dtFmt);
            writer.RenderEndTag();

            writer.Write(" &bull; ");

            string changeMsg;
            string changeCls = "changeType";

            if (ci.ChangeType == SqlDict.ChangeType.New)
            {
                changeMsg  = "új szócikk";
                changeCls += " ctNew";
            }
            else if (ci.ChangeType == SqlDict.ChangeType.Edit)
            {
                changeMsg  = "szerkesztve";
                changeCls += " ctEdit";
            }
            else if (ci.ChangeType == SqlDict.ChangeType.Note)
            {
                changeMsg  = "megjegyzés";
                changeCls += " ctNote";
            }
            else
            {
                changeMsg = ci.ChangeType.ToString();
            }
            writer.AddAttribute("class", changeCls);
            writer.RenderBeginTag(HtmlTextWriterTag.Span);
            writer.WriteEncodedText(changeMsg);
            writer.RenderEndTag();

            writer.RenderEndTag();
            writer.AddAttribute("class", "changeNote");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);
            writer.WriteEncodedText("~~ " + ci.Note);
            writer.RenderEndTag();

            writer.RenderEndTag();
            writer.AddAttribute("class", "entry");
            writer.RenderBeginTag(HtmlTextWriterTag.Div);

            CedictEntry   entry = SqlDict.BuildEntry(ci.EntryHead, ci.EntryBody);
            EntryRenderer er    = new EntryRenderer(entry, null, null);

            er.Render(writer);

            writer.RenderEndTag();

            writer.RenderEndTag();
        }