public ReglaMyspell(Regla reglaOriginal, Regles regles, GetAfinaReglaMyspell getAfinaGrup) { this.reglaOriginal = reglaOriginal; this.regles = regles; casos = new List<CasRegla>(); afixosContraris = new List<Regla>(); afixosIguals = new List<Regla>(); getAfinador = getAfinaGrup; afinador = null; regla = null; }
private Regles AMyspell(string nomFitxer, List<ItemDic> itemsVells, Marques filtre, Comparison<string> comparador, GetAfinaReglaMyspell afinaRegla) { Regles novesRegles = new Regles(); novesRegles.regles = new Dictionary<string, Regla>(); novesRegles.marques = new Dictionary<string, Marca>(marques); novesRegles.descripcio = new List<string>(descripcio); novesRegles.set = set; novesRegles.caracters = caracters; novesRegles.rep = rep; char nomNou = '1'; char nomNouInv = 'a'; Dictionary<string, List<ReglaMyspell>> vellANou = new Dictionary<string, List<ReglaMyspell>>(); foreach (KeyValuePair<string, Regla> kvReglaVella in regles) { string idReglaVella = kvReglaVella.Key; Regla reglaVella = kvReglaVella.Value; vellANou.Add(idReglaVella, new List<ReglaMyspell>()); List<ReglaMyspell> reglesMyspell = reglaVella.GrupsMyspell(this, filtre, afinaRegla); int maxCasos = 0; ReglaMyspell millorRegla = null; foreach (ReglaMyspell regla in reglesMyspell) if (regla.EsRegla && regla.NCasos > maxCasos) { maxCasos = regla.NCasos; millorRegla = regla; } foreach (ReglaMyspell regla in reglesMyspell) { string id; string desc; if (regla == millorRegla) { id = reglaVella.Id; desc = reglaVella.Descripcio; } else { desc = string.Format("Part de la regla {0} ({1})", reglaVella.Id, reglaVella.Descripcio); if (regla.EsRegla) { id = nomNou.ToString(); ++nomNou; } else { id = nomNouInv.ToString(); ++nomNouInv; } } regla.Descripcio = desc; regla.Id = id; vellANou[idReglaVella].Add(regla); if (regla.EsRegla) novesRegles.regles[id] = regla.Regla; } } List<ItemDic> itemsNous = new List<ItemDic>(); Dictionary<string, List<CreaDicMyspell>> creadors = new Dictionary<string, List<CreaDicMyspell>>(); foreach (ItemDic itemVell in itemsVells) { string flags = itemVell.FlagsComLletres; if (!creadors.ContainsKey(flags)) creadors.Add(flags, CreaDicMyspell.GeneraCreadors(itemVell, vellANou, novesRegles)); foreach (CreaDicMyspell creador in creadors[flags]) { ItemDic itemNou = creador.Converteix(itemVell); if (itemNou != null) itemsNous.Add(itemNou); } } // Unim tots els ítems que comparteixen la mateixa arrel // Ho feim per una limitació de MySpell, que no permet arrels repetides, // a diferència d'Hunspell. itemsNous = ItemDic.CompactaLlista(itemsNous, comparador); StreamWriter sw = new StreamWriter(nomFitxer + ".dic", false, Encoding.Default); sw.WriteLine(itemsNous.Count); foreach (ItemDic item in itemsNous) sw.WriteLine(item.ToString()); sw.Close(); return novesRegles; }
/// <summary> /// Genera una llista de GrupMyspell /// </summary> public List<ReglaMyspell> GrupsMyspell(Regles regles, Marques filtre, GetAfinaReglaMyspell getAfina) { List<ReglaMyspell> grups = new List<ReglaMyspell>(); foreach (CasRegla cas in casos) { if (!filtre.Conte(cas.Marca)) continue; ReglaMyspell grup = grups.Find(delegate(ReglaMyspell g) { return g.CasPertany(cas); }); if (grup == null) { grup = new ReglaMyspell(this, regles, getAfina); grups.Add(grup); } grup.NouCas(cas); } return grups; }
public void GeneraAffDicMyspell(string nomFitxer, List<Entrada> entrades, Marques filtre, Comparison<string> comparador, GetAfinaReglaMyspell afinaRegla) { List<ItemDic> itemsVells = Entrada.GeneraItemsDic(entrades, filtre, Entrada.Speller.HUNSPELL, comparador); Regles reglesMyspell = AMyspell(nomFitxer, itemsVells, filtre, comparador, afinaRegla); reglesMyspell.CreaFitxerAff(nomFitxer, filtre); }