private static string AplicaMacros(string linia, CanviaString canvis) { String inici = ""; String resta = linia; while (true) { Match match = CercaMacro.Match(resta); if (!match.Success) break; inici = inici + match.Groups[1].Value + canvis(match.Groups[2].Value); resta = match.Groups[3].Value; } return inici + resta; }
private static String AdaptaFitxer(String fitxer, CanviaString canvis, string finalLinia, Encoding encoding) { return String.Join(finalLinia, AdaptaFitxer(fitxer, canvis, encoding)); }
private static string[] AdaptaFitxer(String fitxer, CanviaString canvis, Encoding encoding) { String[] linies = File.ReadAllLines(fitxer, encoding); for (int i = 0; i < linies.Length; i++) linies[i] = AplicaMacros(linies[i], canvis); return linies; }
/// <summary> /// Afegeix una variant d'aspell. /// Genera un fitxer de paraules amb les entrades que no apareixen al fitxer de base. /// Els casos de les regles específiques per a aquesta variant no estan inclosos dins /// el fitxer d'afixos. Per tant (ja que només hi pot haver un fitxer d'afixos) s'han /// de posar totes les entrades desplegades emprant aquests casos. /// </summary> /// <param name="dirResultats">El directori base dels resultats.</param> /// <param name="nom">El nom base dels fitxers.</param> /// <param name="canvis">Els canvis que s'han aplicar als macros que apareixen als noms /// i als continguts dels fitxers</param> /// <param name="nomComuns">El nom dels fitxer amb les entrades comunes</param> /// <param name="filtre">Les marques que han de tenir les entrades i els casos de les regles per /// ser incloses dins el fitxer de paraules.</param> public static void VariantAspell(string dirResultats, string nom, CanviaString canvis, string nomComuns, Marques filtre) { StreamReader sr; sr = new StreamReader(dirResultats + @"myspell\" + nomComuns + @".myspell.dic", Encoding.Default); Dictionary<string, int> comuns = new Dictionary<string, int>(int.Parse(sr.ReadLine())); while (!sr.EndOfStream) comuns.Add(sr.ReadLine(), 1); sr.Close(); string affVar = Path.GetFullPath(dirResultats + @"myspell\" + nom + @".myspell.aff"); string affCom = Path.GetFullPath(dirResultats + @"myspell\" + nomComuns + @".myspell.aff"); Regles reglesDiff = Regles.Diferencia(Regles.LlegeixAff(affVar), Regles.LlegeixAff(affCom)); string[] ids = new string[reglesDiff.regles.Count]; reglesDiff.regles.Keys.CopyTo(ids, 0); Regex cercaReglesDiff = new Regex("/.*((" + String.Join(")|(", ids) + "))"); Regex arrelIFlags = new Regex("^(.*)/(.*)$"); Marques totesMarques = new Marques(true); List<string> nous = new List<string>(); sr = new StreamReader(dirResultats + @"myspell\" + nom + @".myspell.dic", Encoding.Default); sr.ReadLine(); while (!sr.EndOfStream) { string lin = sr.ReadLine(); if (cercaReglesDiff.IsMatch(lin)) { Match match = arrelIFlags.Match(lin); string arrel = match.Groups[1].Value, flags = match.Groups[2].Value; foreach (string id in reglesDiff.regles.Keys) if (flags.Contains(id)) foreach(CasRegla cas in reglesDiff.regles[id].Casos) if (cas.EsAplicable(arrel)) { List<Mot> arrels = new List<Mot>(); cas.Genera(arrel, ref arrels, null, reglesDiff, totesMarques, false); string nousFlags = (flags == id) ? "" : "/" + flags.Replace(id, ""); foreach (Mot novaArrel in arrels) nous.Add(novaArrel.Forma + nousFlags); } } if (!comuns.ContainsKey(lin)) nous.Add(lin); } sr.Close(); string nomDiff = AplicaMacros(Path.GetFullPath(dirResultats + @"aspell\%as_lang%.diff.txt"), canvis); string nomAwl = AplicaMacros(Path.GetFullPath(dirResultats + @"aspell\%as_lang%-mes.wl"), canvis); StreamWriter sw = new StreamWriter(nomDiff, false, Encoding.Default); foreach (string lin in nous) if (lin.Length > 0) sw.WriteLine(lin); sw.Close(); CreaFitxerCwl(nomDiff, nomAwl, Encoding.Default, false, 1); File.Delete(nomDiff); infoAspell.Add(""); infoAspell.Add("dict:"); infoAspell.Add(AplicaMacros(" name %as_lang%", canvis)); infoAspell.Add(" add " + baseAspell); infoAspell.Add(AplicaMacros(" add %as_lang%-mes", canvis)); string[] dat = AdaptaFitxer(dirResultats + @"..\aspell\%as_lng%.dat", canvis, Encoding.UTF8); string nomDat = AplicaMacros(Path.GetFullPath(dirResultats + @"aspell\%as_lng%.dat"), canvis); EscriuLinies(nomDat, dat, Encoding.Default, "\n"); }
public static void GeneraOXT(Regles regles, string dirFitxer, string nomFitxer, CanviaString canvis) { // genera .oxt String path = dirFitxer + nomFitxer + ".oxt"; File.Delete(path); using (ZipFile zip = new ZipFile(path)) { zip.AddFile(dirFitxer + nomFitxer + ".dic", "dictionaries"); zip.AddFile(dirFitxer + nomFitxer + ".aff", "dictionaries"); zip.AddFile(dirFitxer + @"..\..\OXT\" + "LICENSES-en.txt",""); zip.AddFile(dirFitxer + @"..\..\OXT\" + "LLICENCIES-ca.txt", ""); zip.AddStringAsFile(AdaptaFitxer(dirFitxer + @"..\..\OXT\" + nomFitxer + "\dictionaries.xcu", canvis, "\r\n", Encoding.UTF8), "dictionaries.xcu", ""); zip.AddStringAsFile(AdaptaFitxer(dirFitxer + @"..\..\OXT\" + nomFitxer + "\description.xml", canvis, "\r\n", Encoding.UTF8), "description.xml", ""); //zip.AddStringAsFile(AdaptaFitxer(dirFitxer + @"..\..\OXT\" + "release-notes_en.txt", canvia), "release-notes_en.txt", ""); //zip.AddStringAsFile(AdaptaFitxer(dirFitxer + @"..\..\OXT\" + "release-notes_ca.txt", canvia), "release-notes_ca.txt", ""); zip.AddFile(dirFitxer + @"..\..\OXT\META-INF\" + "manifest.xml", "META-INF/"); zip.AddFile(dirFitxer + @"..\..\OXT\" + "SC-logo.png",""); zip.Save(); } // genera update.xml, release-notes_en.txt i release-notes_ca.txt path = dirFitxer + nomFitxer + ".update.xml"; using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)) { sw.Write(AdaptaFitxer(dirFitxer + @"..\..\OXT\update.xml", canvis, "\r\n", Encoding.UTF8)); } string[] llengues = { "ca", "en" }; foreach (string llengua in llengues) { path = dirFitxer + "release-notes_" + llengua + ".html"; using (StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8)) { sw.Write(AdaptaFitxer(dirFitxer + @"..\..\OXT\" + "release-notes_" + llengua + ".html", canvis, "\r\n", Encoding.UTF8)); } } }
/// <summary> /// Prepara per generar el fitxer d'aspell /// </summary> public static void BaseAspell(string dirResultats, string nom, CanviaString canvis, List<string> copyright) { NetejaDirAspell(dirResultats, true); // Posa les dades del fitxer info infoAspell = new List<string>(); baseAspell = AplicaMacros("%as_lng%-common", canvis); infoAspell.Add("name_english Catalan"); infoAspell.Add("lang ca"); string nomAffix = "ca_affix.dat"; infoAspell.Add("data-file " + nomAffix); string[] linies = File.ReadAllLines(dirResultats + @"myspell\" + nom + ".myspell.aff", Encoding.Default); EscriuLinies(dirResultats + @"aspell\" + nomAffix, linies, Encoding.Default, "\n"); infoAspell.Add("copyright GPLv2"); infoAspell.Add(AplicaMacros("version %VERSION%", canvis)); infoAspell.Add("complete true"); infoAspell.Add("accurate true"); infoAspell.Add("author:"); infoAspell.Add(" name Joan Moratinos"); infoAspell.Add(" email jmo at softcatala org"); infoAspell.Add("url http://www.softcatala.org/wiki/Projectes/Corrector_ortografic"); CreaFitxerCwl(dirResultats + @"myspell\" + nom + ".myspell.dic", AplicaMacros(dirResultats + @"aspell\%as_lng%-common.wl", canvis), Encoding.Default, false, 1); infoAspell.Add(""); infoAspell.Add("alias ca catalan"); infoAspell.Add("dict:"); infoAspell.Add(AplicaMacros(" name %as_lang%", canvis)); infoAspell.Add(AplicaMacros(" alias %as_lng%", canvis)); infoAspell.Add(AplicaMacros(" add %as_lng%-common", canvis)); string[] dat = AdaptaFitxer(dirResultats + @"..\aspell\%as_lng%.dat", canvis, Encoding.Default); //string nomDat = AplicaMacros(Path.GetFullPath(dirResultats + @"aspell\%as_lang%.dat"), canvis); string nomDat = Path.GetFullPath(AplicaMacros(dirResultats + @"aspell\%as_lng%.dat", canvis)); EscriuLinies(nomDat, dat, Encoding.Default, "\n"); //string[] readme = AdaptaFitxer(dirResultats + @"..\aspell\README", canvis); //EscriuLinies(dirResultats + @"aspell\README", readme, Encoding.Default, "\n"); EscriuLinies(dirResultats + @"aspell\Copyright", copyright.ToArray(), Encoding.Default, "\n"); string[] changes = AdaptaFitxer(dirResultats + @"..\aspell\CHANGES", canvis, Encoding.Default); string dirDoc = Path.GetFullPath(dirResultats + @"aspell\doc"); if (!Directory.Exists(dirDoc)) Directory.CreateDirectory(dirDoc); EscriuLinies(dirDoc + @"\ChangeLog", changes, Encoding.Default, "\n"); }