private vortoStruKt VortoStrukt(XmlNode nodedrv, string radiko)
        {
            //    <kap><ofc>*</ofc><tld/>i</kap>
            //    <kap><tld/>iĝi, <var><kap>sin <tld/>i</kap></var></kap>
            vortoStruKt aktuaVorto = new vortoStruKt();
            var         veravorto  = string.Empty;
            var         kap        = nodedrv.SelectSingleNode("kap");

            if (kap.FirstChild.NodeType == XmlNodeType.Text)
            {
                aktuaVorto.prefikso = kap.FirstChild.Value;
            }
            aktuaVorto.radiko = radiko;

            bool sekvantoEstosSufikso = false;

            foreach (XmlNode infanode in kap.ChildNodes)
            {
                if (sekvantoEstosSufikso && infanode.NodeType == XmlNodeType.Text)
                {
                    aktuaVorto.sufikso = infanode.Value.Replace(",", "").Trim();
                    break;
                }
                if (infanode.Name == "tld")
                {
                    sekvantoEstosSufikso = true;
                }
            }

            return(aktuaVorto);
        }
 private void aldonuEnDifinoj(List <Difino> dicospec, vortoStruKt vorto, string traduk, string fichier, int difno, bool test = true)
 {
     traduk = traduk.TrimEnd(':', ' ', ',', '.', ';');
     traduk = traduk.Replace(System.Environment.NewLine, " ").Replace('"', '\'').Trim();
     traduk = traduk.Replace("  ", " ").Replace(" )", ")").Replace("( ", "(");
     if (traduk.Length > 0)
     {
         string ekzemploKleo = difno > 0 ? string.Format("{0}{1}", vorto.vorto, difno) : string.Empty;
         Difino novavortaro  = new Difino {
             vorto = vorto.vorto, frazo = traduk, ekzemploKleo = ekzemploKleo, retavortaro = fichier
         };
         if (!test || !dicospec.Contains(novavortaro))
         {
             dicospec.Add(novavortaro);
         }
     }
 }
        private void AnalizuNodojn(XmlDocument document, string radiko, List <vortaro> dicospec, List <Leksemoj> leksemoj, string l, Func <List <vortaro>, vortoStruKt, List <Leksemoj>, string, XmlNode, bool> serĉuTradukojnEnNodo)
        {
            var nodedrvList = document.SelectNodes("vortaro/art/drv");

            foreach (XmlNode nodedrv in nodedrvList)
            {
                vortoStruKt vorto = VortoStrukt(nodedrv, radiko);
                serĉuTradukojnEnNodo(dicospec, vorto, leksemoj, l, nodedrv);
                var snc = nodedrv.SelectNodes("snc");
                foreach (XmlNode sncs in snc)
                {
                    serĉuTradukojnEnNodo(dicospec, vorto, leksemoj, l, sncs);
                }
                var subsnc = nodedrv.SelectNodes("snc/subsnc");
                foreach (XmlNode subsncs in subsnc)
                {
                    serĉuTradukojnEnNodo(dicospec, vorto, leksemoj, l, subsncs);
                }
            }
        }
        private bool serĉuTradukojnEnNodo(List <vortaro> dicospec, vortoStruKt vorto, List <Leksemoj> leksemoj, string l, XmlNode node)
        {
            var trd = node.SelectNodes("trd[@lng=\"" + l + "\"]");

            foreach (XmlNode trdu in trd)
            {
                aldonuNodoEnVortaro(dicospec, leksemoj, vorto, trdu.InnerText);
            }
            var trdgrp = node.SelectNodes("trdgrp[@lng=\"" + l + "\"]");

            foreach (XmlNode trdgrpu in trdgrp)
            {
                var trdv = trdgrpu.SelectNodes("trd");
                foreach (XmlNode trvdgrpu in trdv)
                {
                    aldonuNodoEnVortaro(dicospec, leksemoj, vorto, trvdgrpu.InnerText);
                }
            }
            return(true);
        }
        private List <Difino> AnalizuXMLPaĝonjKajTrovuDifinojnKajEkzemplojn(List <Ekzemplo> ekzemploj)
        {
            string[] dosieroj = Directory.GetFiles(xmlDosierujo, "*.xml");
            if (dosieroj == null || dosieroj.Length < 500)
            {
                skribuMesaĝon();
                return(null);
            }
            List <Difino> dicospec = new List <Difino>(55000);

            foreach (string dosiero in dosieroj)
            {
                string      retafile = Path.GetFileName(dosiero);
                XmlDocument document = new XmlDocument();
                document.Load(dosiero);
                var radiko = document.SelectSingleNode("vortaro/art/kap/rad").InnerText;
                if (radiko != null)
                {
                    var nodedrvList = document.SelectNodes("vortaro/art/drv");
                    foreach (XmlNode nodedrv in nodedrvList)
                    {
                        int         difno = 1;
                        vortoStruKt vorto = VortoStrukt(nodedrv, radiko);
                        serĉuDifinojnEnNodo(dicospec, ekzemploj, vorto, nodedrv, retafile, ref difno);
                        var snc = nodedrv.SelectNodes("snc");
                        foreach (XmlNode sncs in snc)
                        {
                            serĉuDifinojnEnNodo(dicospec, ekzemploj, vorto, sncs, retafile, ref difno);
                        }
                        var subsnc = nodedrv.SelectNodes("snc/subsnc");
                        foreach (XmlNode subsncs in subsnc)
                        {
                            serĉuDifinojnEnNodo(dicospec, ekzemploj, vorto, subsncs, retafile, ref difno);
                        }
                    }
                }
            }
            return(dicospec);
        }
        private void serĉuDifinojnKajEkzemplojnEnNodo(vortoStruKt vorto, XmlNode infanode, StringBuilder difi, ref bool spacoPost, string dosiero)
        {
            if (balizoj.Contains(infanode.Name))
            {
                difi.Append(FFF(infanode.InnerText, ref spacoPost));
            }
            else if (infanode.Name == "tld")
            {
                string rara = vorto.radiko;
                if (infanode.Attributes["lit"] != null)
                {
                    if (vorto.radiko.Length == 0)
                    {
                        rara = rara.ToUpper();
                    }
                    else
                    {
                        rara = char.ToUpper(rara[0]) + rara.Substring(1);
                    }
                }
                bool prefiksita = vorto.prefikso?.Length > 0;

                if (!string.IsNullOrWhiteSpace(vorto.prefikso))
                {
                    var difinoPeco = difi.ToString();
                    if (difinoPeco.Length > vorto.prefikso.Length)
                    {
                        var lastaPeco = difinoPeco.Substring(difinoPeco.Length - vorto.prefikso.Length);
                        if (!lastaPeco.Contains(vorto.prefikso))
                        {
                            prefiksita = false;
                        }
                    }
                }
                if (!prefiksita)
                {
                    difi.AppendFormat(" {0}", rara);
                }
                else
                {
                    difi.Append(rara);
                }
                spacoPost = false;
            }
            else if (infanode.Name == "lok")
            {
                difi.AppendFormat(" ({0})", infanode.InnerText);
            }
            else if (infanode.Name == "em")
            {
                difi.AppendFormat(" {0} ", infanode.InnerText);
            }
            else if (infanode.Name == "sub" || infanode.Name == "sup")
            {
                spacoPost = false;
                //Est-ce un nombre en indice?
                string indice      = infanode.InnerText.Trim();
                bool   estasSub    = infanode.Name == "sub";
                int    unicodeBase = estasSub ? 0X2080 : 0X2070;
                foreach (char c in indice)
                {
                    int unicode = 0;
                    if (int.TryParse(c.ToString(), out unicode))
                    {
                        if (!estasSub && unicode > 0 && unicode < 4)
                        {
                            if (unicode == 1)
                            {
                                unicode = 0X00B9;
                            }
                            else if (unicode == 2)
                            {
                                unicode = 0X00B2;
                            }
                            else if (unicode == 3)
                            {
                                unicode = 0X00B3;
                            }
                        }
                        else
                        {
                            unicode += unicodeBase;
                        }
                    }
                    else if (c == '+')
                    {
                        unicode = unicodeBase + 0XA;
                    }
                    else if (c == '-')
                    {
                        unicode = unicodeBase + 0XB;
                    }
                    else if (c == '=')
                    {
                        unicode = unicodeBase + 0XC;
                    }
                    else if (c == '(')
                    {
                        unicode = unicodeBase + 0XD;
                    }
                    else if (c == ')')
                    {
                        unicode = unicodeBase + 0XE;
                    }
                    //else
                    //	listeBalises.Add(string.Format("!!!!!UNICODE : Fichier {0}, Balise {1}, innerText={2}", fichier, infanode.Name, infanode.InnerText));
                    if (unicode != 0)
                    {
                        difi.Append(char.ConvertFromUtf32(unicode));
                    }
                    else
                    {
                        difi.Append(c);
                    }
                }
            }
            else
            {
                difi.Append(FFF(infanode.InnerText, ref spacoPost));
            }
        }
 private void AnalisuNodojnPorTroviDifinojKajEkzemploj(List <Ekzemplo> ekzemploj, vortoStruKt vorto, XmlNode difNode, StringBuilder difi, ref bool spacoPost, string dosiero, int difno)
 {
     if (difNode.ChildNodes.Count > 1 || (difNode.ChildNodes.Count == 1 && difNode.ChildNodes[0].Name != "#text"))
     {
         foreach (XmlNode infanode in difNode)
         {
             if (!eksbalizoj.Contains(infanode.Name))
             {
                 AnalisuNodojnPorTroviDifinojKajEkzemploj(ekzemploj, vorto, infanode, difi, ref spacoPost, dosiero, difno);
             }
             else if (infanode.Name == "ekz")
             {
                 StringBuilder defstring = new StringBuilder();
                 AnalisuNodojnPorTroviDifinojKajEkzemploj(ekzemploj, vorto, infanode, defstring, ref spacoPost, dosiero, difno);
                 aldonuEnEkzemploj(ekzemploj, vorto.vorto, defstring.ToString(), difno, dosiero);
             }
         }
     }
     else
     {
         serĉuDifinojnKajEkzemplojnEnNodo(vorto, difNode, difi, ref spacoPost, dosiero);
     }
 }
        private void serĉuDifinojnEnNodo(List <Difino> dicospec, List <Ekzemplo> ekzemploj, vortoStruKt vorto, XmlNode node, string dosiero, ref int difno)
        {
            var dif = node.SelectNodes("dif");

            foreach (XmlNode difNode in dif)
            {
                int    difdif   = 0;
                string diftekst = difNode.InnerText.Trim();
                if (difNode.HasChildNodes)
                {
                    StringBuilder difi         = new StringBuilder();
                    bool          spacoPost    = true; //post tld, ne aldonu spaco
                    int           antaŭaKompto = ekzemploj.Count;
                    AnalisuNodojnPorTroviDifinojKajEkzemploj(ekzemploj, vorto, difNode, difi, ref spacoPost, dosiero, difno);
                    if (ekzemploj.Count == antaŭaKompto)
                    {
                        difdif = 0;
                    }
                    else
                    {
                        difdif = difno;
                        difno++;
                    }

                    diftekst = difi.ToString();
                }

                aldonuEnDifinoj(dicospec, vorto, diftekst, dosiero, difdif, false);
            }
        }
 private void aldonuNodoEnVortaro(List <vortaro> dicospec, List <Leksemoj> leksemoj, vortoStruKt vorto, string traduk)
 {
     traduk = traduk.Replace(System.Environment.NewLine, " ").Replace('"', '\'');
     traduk = traduk.Replace("  ", " ").Trim();
     if (traduk.Length > 0)
     {
         vortaro novavortaro = new vortaro {
             vorto = vorto.vorto, traduko = traduk, leksemo = vorto.radiko, homografo = "1"
         };
         if (!dicospec.Contains(novavortaro))
         {
             dicospec.Add(novavortaro);
         }
         Leksemoj leks = new Leksemoj {
             leksemo = vorto.radiko, vorto = vorto.vorto
         };
         if (!leksemoj.Contains(leks))
         {
             leksemoj.Add(leks);
         }
     }
 }