1
0
Fork 0
mirror of https://github.com/Nioux/AideDeJeu.git synced 2025-10-30 15:06:06 +00:00
AideDeJeu/AideDeJeu/AideDeJeuCmd/Program.cs

589 lines
23 KiB
C#
Raw Normal View History

2018-06-30 18:43:16 +02:00
using AideDeJeu.Tools;
2018-07-11 18:34:43 +02:00
using AideDeJeuLib;
2018-06-12 18:52:30 +02:00
using Markdig;
2018-05-21 21:48:18 +02:00
using System;
using System.Collections.Generic;
2018-05-27 01:03:00 +02:00
using System.Globalization;
2018-05-21 21:48:18 +02:00
using System.IO;
2018-05-27 01:03:00 +02:00
using System.Linq;
2018-05-21 21:48:18 +02:00
using System.Runtime.Serialization.Json;
2018-05-27 01:03:00 +02:00
using System.Text;
using System.Text.RegularExpressions;
2018-05-21 21:48:18 +02:00
using System.Threading.Tasks;
namespace AideDeJeuCmd
{
class Program
{
2018-06-12 17:59:19 +02:00
2018-07-07 12:36:09 +02:00
//static async Task<IEnumerable<Spell>> TestMarkdown(string filename)
//{
// using (var sr = new StreamReader(filename))
// {
// var md = await sr.ReadToEndAsync();
// var document = Markdig.Parsers.MarkdownParser.Parse(md);
// //DumpMarkdownDocument(document);
2018-06-06 20:41:57 +02:00
2018-07-07 12:36:09 +02:00
// var spellss = document.ToSpells<SpellHD>();
// Console.WriteLine("ok");
// var md2 = spellss.ToMarkdownString();
// if (md.CompareTo(md2) != 0)
// {
// Debug.WriteLine("failed");
// }
// return spellss;
// }
//}
2018-06-06 20:41:57 +02:00
2018-06-12 17:59:19 +02:00
static async Task<IEnumerable<Monster>> TestMarkdownMonsters(string filename)
2018-05-21 21:48:18 +02:00
{
2018-06-07 14:16:31 +02:00
using (var sr = new StreamReader(filename))
2018-06-12 17:59:19 +02:00
{
2018-06-07 14:16:31 +02:00
var md = await sr.ReadToEndAsync();
2018-06-12 18:52:30 +02:00
var pipeline = new MarkdownPipelineBuilder()
.UsePipeTables()
.Build();
2018-07-13 18:42:23 +02:00
//var document = Markdig.Parsers.MarkdownParser.Parse(md, pipeline);
2018-06-07 14:16:31 +02:00
//DumpMarkdownDocument(document);
2018-06-12 17:59:19 +02:00
2018-07-13 18:42:23 +02:00
var monsters = AideDeJeu.Tools.MarkdownExtensions.ToItem(md) as IEnumerable<Monster>; // document.ToMonsters<MonsterHD>();
//document.Dump();
2018-06-07 14:16:31 +02:00
Console.WriteLine("ok");
2018-06-12 17:59:19 +02:00
//var md2 = monsters.ToMarkdownString();
//if (md.CompareTo(md2) != 0)
//{
// Debug.WriteLine("failed");
//}
return monsters;
2018-06-07 14:16:31 +02:00
}
2018-06-06 20:41:57 +02:00
}
2018-06-24 12:06:27 +02:00
static async Task CreateIndexes()
2018-06-06 20:41:57 +02:00
{
2018-06-18 22:42:02 +02:00
string dataDir = @"..\..\..\..\..\Data\";
2018-06-23 23:56:13 +02:00
var result = string.Empty;
var md = await LoadStringAsync(dataDir + "spells_hd.md");
2018-07-13 18:42:23 +02:00
var items = AideDeJeu.Tools.MarkdownExtensions.ToItem(md) as IEnumerable<Spell>;
2018-06-23 23:56:13 +02:00
var classes = new string[]
{
"Barde",
"Clerc",
"Druide",
"Ensorceleur",
"Magicien",
"Paladin",
"Rôdeur",
"Sorcier"
};
2018-06-24 12:06:27 +02:00
var levels = new string[]
2018-06-23 23:56:13 +02:00
{
"0",
"1",
"2",
"3",
"4",
"5",
"6",
"7",
"8",
"9",
//"tour de magie",
//"niveau 1",
//"niveau 2",
//"niveau 3",
//"niveau 4",
//"niveau 5",
//"niveau 6",
//"niveau 7",
//"niveau 8",
//"niveau 9"
};
foreach (var classe in classes)
{
2018-06-24 15:59:41 +02:00
//Console.WriteLine(classe);
2018-06-29 12:21:13 +02:00
result += string.Format("## {0}\n\n", classe);
2018-06-23 23:56:13 +02:00
foreach (var level in levels)
{
2018-06-24 15:59:41 +02:00
//Console.WriteLine(level);
2018-06-23 23:56:13 +02:00
var spells = items.Where(s => s.Level == level && s.Source.Contains(classe)).OrderBy(s => s.Name).Select(s => string.Format("* [{0}](spells_hd.md#{1})", s.Name, Helpers.IdFromName(s.Name))).ToList();
if (spells.Count > 0)
{
2018-06-29 12:21:13 +02:00
result += string.Format("### {0}\n\n", level == "0" ? "Tours de magie" : "Niveau " + level);
result += spells.Aggregate((s1, s2) => s1 + "\n" + s2);
result += "\n\n";
2018-06-23 23:56:13 +02:00
}
}
}
2018-06-24 15:59:41 +02:00
Console.WriteLine(result);
2018-06-23 23:56:13 +02:00
await SaveStringAsync(dataDir + "spells_hd_by_class_level.md", result);
2018-06-24 12:06:27 +02:00
}
2018-07-23 14:43:11 +02:00
static async Task<IEnumerable<string>> GetAllAnchorsAsync()
{
var anchors = new List<string>();
var allitems = new Dictionary<string, Item>();
var names = Helpers.GetResourceNames();
foreach(var name in names)
{
2018-07-23 22:58:41 +02:00
//if (name.Contains("_hd."))
//{
2018-07-23 14:43:11 +02:00
var md = await Helpers.GetResourceStringAsync(name);
var item = AideDeJeu.Tools.MarkdownExtensions.ToItem(md);
allitems.Add(name, item);
2018-07-23 22:58:41 +02:00
//}
2018-07-23 14:43:11 +02:00
}
foreach(var allitem in allitems)
{
if (allitem.Value is Items)
{
var items = allitem.Value as Items;
foreach (var item in items)
{
if (!string.IsNullOrWhiteSpace(item.Name))
{
//Console.WriteLine(item.Name);
anchors.Add(item.Name);
}
}
}
else if(allitem.Value != null)
{
if (!string.IsNullOrWhiteSpace(allitem.Value.Name))
{
//Console.WriteLine(allitem.Value.Name);
anchors.Add(allitem.Value.Name);
}
}
}
return anchors;
}
static async Task SearchAsync(string anchor)
{
var first = true;
var names = Helpers.GetResourceNames();
foreach (var name in names)
{
2018-07-23 22:58:41 +02:00
if (name.EndsWith("_hd.md"))
2018-07-23 14:43:11 +02:00
{
2018-07-23 22:58:41 +02:00
var md = await Helpers.GetResourceStringAsync(name);
using (var reader = new StringReader(md))
2018-07-23 14:43:11 +02:00
{
2018-07-23 22:58:41 +02:00
var line = await reader.ReadLineAsync();
while (line != null)
2018-07-23 14:43:11 +02:00
{
2018-07-23 22:58:41 +02:00
if (line.FirstOrDefault() != '#' &&
!line.StartsWith("- AltName") &&
line.Contains(anchor) &&
!line.Contains($"[{anchor}") &&
!line.Contains($"{anchor}]")
)
2018-07-23 14:43:11 +02:00
{
2018-07-23 22:58:41 +02:00
if (first)
{
first = false;
Console.WriteLine();
Console.WriteLine(anchor);
Console.WriteLine();
}
Console.WriteLine(line);
2018-07-23 14:43:11 +02:00
Console.WriteLine();
}
2018-07-23 22:58:41 +02:00
line = await reader.ReadLineAsync();
2018-07-23 14:43:11 +02:00
}
}
}
}
//Console.WriteLine();
}
2018-08-19 14:08:20 +02:00
static async Task ReorderSpellsAsync()
{
string dataDir = @"..\..\..\..\..\Data\";
var mdVF = await LoadStringAsync(dataDir + "spells_hd.md");
var mdVO = await LoadStringAsync(dataDir + "spells_vo.md");
var md = mdVO;
StringBuilder mdOut = new StringBuilder();
using (var writer = new StringWriter(mdOut) { NewLine = "\n" })
{
using (var reader = new StringReader(md))
{
var line = await reader.ReadLineAsync();
string levelType = null;
string castingTime = null;
string range = null;
string components = null;
string duration = null;
string classes = null;
string source = null;
while (line != null)
{
if (line.StartsWith("- ") && !line.StartsWith("- AltName:"))
{
if (line.StartsWith("- LevelType:"))
{
levelType = line;
}
else if (line.StartsWith("- **Temps d'incantation :**") || line.StartsWith("- **Casting Time :**"))
{
castingTime = line;
}
else if (line.StartsWith("- **Portée :**") || line.StartsWith("- **Range :**"))
{
range = line;
}
else if (line.StartsWith("- **Composantes :**") || line.StartsWith("- **Components :**"))
{
components = line;
}
else if (line.StartsWith("- **Durée :**") || line.StartsWith("- **Duration :**"))
{
duration = line;
}
else if (line.StartsWith("- Classes:"))
{
classes = line;
}
else if (line.StartsWith("- Source:"))
{
source = line;
}
else
{
Console.WriteLine(line);
Console.ReadLine();
}
}
else
{
if(levelType != null)
{
await writer.WriteLineAsync(levelType);
if(castingTime != null) await writer.WriteLineAsync(castingTime);
if(range != null) await writer.WriteLineAsync(range);
if(components != null) await writer.WriteLineAsync(components);
if(duration != null) await writer.WriteLineAsync(duration);
if(classes != null) await writer.WriteLineAsync(classes);
if(source != null) await writer.WriteLineAsync(source);
levelType = null;
castingTime = null;
range = null;
components = null;
duration = null;
classes = null;
source = null;
}
await writer.WriteLineAsync(line);
}
line = await reader.ReadLineAsync();
}
}
}
await SaveStringAsync(dataDir + "spells_vo_rev.md", mdOut.ToString());
Console.Write(mdOut);
Console.ReadLine();
}
2018-06-24 12:06:27 +02:00
static async Task Main(string[] args)
{
2018-08-19 14:08:20 +02:00
await ReorderSpellsAsync();
return;
2018-06-24 12:06:27 +02:00
string dataDir = @"..\..\..\..\..\Data\";
2018-07-07 23:56:28 +02:00
await CheckAllLinks();
2018-07-24 10:33:06 +02:00
//var anchors = await GetAllAnchorsAsync();
//foreach (var anchor in anchors)
//{
// await SearchAsync(anchor);
//}
Console.ReadLine();
2018-07-07 23:56:28 +02:00
return;
2018-06-29 12:05:19 +02:00
var mdVO = await LoadStringAsync(dataDir + "monsters_vo.md");
var mdVF = await LoadStringAsync(dataDir + "monsters_hd.md");
2018-07-05 17:41:52 +02:00
//var regex = new Regex("# (?<namevo>.*?)\n- NameVO: \\[(?<namevf>.*?)\\]\n");
//var matches = regex.Matches(mdVO);
//foreach(Match match in matches)
//{
// var nameVF = match.Groups["namevf"].Value;
// var nameVO = match.Groups["namevo"].Value;
// var replaceOld = string.Format("# {0}\n", nameVF);
// var replaceNew = string.Format("# {0}\n- NameVO: [{1}](monsters_vo.md#{2})\n", nameVF, nameVO, Helpers.IdFromName(nameVO));
// mdVF = mdVF.Replace(replaceOld, replaceNew);
//}
var regex = new Regex("_\\[(?<name>.*?)\\]_");
var matches = regex.Matches(mdVF);
var names = new List<string>();
foreach (Match match in matches)
{
2018-07-05 17:41:52 +02:00
var name = match.Groups["name"].Value;
if (!mdVF.Contains($"[{name}]:"))
{
//Console.WriteLine(name);
names.Add(name);
}
}
2018-07-05 17:41:52 +02:00
//names.Sort();
names = names.OrderBy(n => n).Distinct().ToList();
2018-07-08 21:33:02 +02:00
foreach (var name in names)
2018-07-05 17:41:52 +02:00
{
Console.WriteLine($"[{name}]: spells_hd.md#{Helpers.IdFromName(Helpers.Capitalize(name))}");
}
2018-06-29 12:05:19 +02:00
Console.WriteLine(mdVF);
2018-07-06 08:17:04 +02:00
//await SaveStringAsync(dataDir + "monsters_hd_tmp.md", mdVF);
2018-06-29 12:05:19 +02:00
2018-06-23 22:47:10 +02:00
return;
2018-05-23 21:52:38 +02:00
2018-05-21 21:48:18 +02:00
}
2018-05-23 20:28:50 +02:00
2018-07-07 23:56:28 +02:00
public static async Task CheckAllLinks()
{
2018-07-23 22:58:41 +02:00
// string dataDir = @"..\..\..\..\..\Data\";
2018-07-07 23:56:28 +02:00
2018-07-23 14:43:11 +02:00
var allmds = new Dictionary<string, string>();
2018-07-07 23:56:28 +02:00
var allanchors = new Dictionary<string, IEnumerable<string>>();
var alllinks = new Dictionary<string, IEnumerable<Tuple<string, string>>>();
2018-07-23 14:43:11 +02:00
var allnames = new Dictionary<string, IEnumerable<string>>();
var resnames = Helpers.GetResourceNames();
foreach (var resname in resnames)
{
2018-07-23 22:58:41 +02:00
if (resname.EndsWith(".md"))
2018-07-23 14:43:11 +02:00
{
var name = resname.Substring(15, resname.Length - 18);
var md = await Helpers.GetResourceStringAsync(resname);
allmds.Add(name, md);
2018-07-23 23:57:14 +02:00
var anchors = GetMarkdownAnchors(md).ToList();
allanchors.Add(name, anchors);
var links = GetMarkdownLinks(md).ToList();
alllinks.Add(name, links);
var names = GetMarkdownAnchorNames(md).ToList();
allnames.Add(name, names);
2018-08-10 21:41:03 +02:00
}
}
foreach (var resname in resnames)
{
if (resname.EndsWith(".md"))
{
var name = resname.Substring(15, resname.Length - 18);
var md = await Helpers.GetResourceStringAsync(resname);
2018-07-23 23:57:14 +02:00
var unlinkedrefs = GetMarkdownUnlinkedRefs(md).ToList();
2018-07-24 10:33:06 +02:00
if (unlinkedrefs.Count > 0)
2018-07-23 23:57:14 +02:00
{
2018-07-24 10:33:06 +02:00
Console.WriteLine($"{name} :");
Console.WriteLine();
foreach (var unlinkedref in unlinkedrefs.Distinct().OrderBy(i => i))
{
2018-08-10 21:41:03 +02:00
//var file = "";
var files = new Dictionary<string, string>();
foreach(var aalinks in alllinks)
{
var found = aalinks.Value.FirstOrDefault(t => t.Item2 == Helpers.IdFromName(unlinkedref));
if(found != null)
{
files[found.Item1] = $"{found.Item1}.md";
//file = $"{found.Item1}.md";
//Console.WriteLine($"[{unlinkedref}]: {file}#{Helpers.IdFromName(unlinkedref)}");
}
}
2018-08-10 18:59:41 +02:00
foreach(var aanchors in allanchors)
{
if(aanchors.Value.Contains(Helpers.IdFromName(unlinkedref)))
{
2018-08-10 21:41:03 +02:00
files[aanchors.Key] = $"{aanchors.Key}.md";
//file = $"{aanchors.Key}.md";
//Console.WriteLine($"[{unlinkedref}]: {file}#{Helpers.IdFromName(unlinkedref)}");
//break;
2018-08-10 18:59:41 +02:00
}
}
2018-08-10 21:41:03 +02:00
if(files.Count == 0)
{
2018-08-16 12:22:00 +02:00
files[""] = "";
2018-08-10 21:41:03 +02:00
}
foreach (var file in files)
{
Console.WriteLine($"[{unlinkedref}]: {file.Value}#{Helpers.IdFromName(unlinkedref)}");
}
2018-07-24 10:33:06 +02:00
}
Console.WriteLine();
Console.WriteLine();
2018-07-23 23:57:14 +02:00
}
2018-07-23 14:43:11 +02:00
}
}
2018-07-07 23:56:28 +02:00
foreach (var links in alllinks)
{
2018-07-08 21:33:02 +02:00
foreach (var link in links.Value)
2018-07-07 23:56:28 +02:00
{
var file = link.Item1;
var anchor = link.Item2;
2018-08-18 21:58:57 +02:00
if (allanchors.ContainsKey(file))
2018-07-07 23:56:28 +02:00
{
2018-08-18 21:58:57 +02:00
if (!allanchors[file].Contains(anchor))
{
Console.WriteLine($"{links.Key} => {file} {anchor}");
}
2018-07-07 23:56:28 +02:00
}
}
}
2018-07-08 21:33:02 +02:00
2018-07-23 14:43:11 +02:00
//foreach (var names in allnames)
//{
// foreach (var name in names.Value)
// {
// foreach(var mdkv in allmds)
// {
// FindName(mdkv.Value, name);
// }
// }
//}
2018-07-08 21:33:02 +02:00
}
public static void FindName(string md, string name)
{
var index = md.IndexOf(name);
while (index >= 0)
{
if ((md.Substring(index - 1, 1) != "[" ||
md.Substring(index + name.Length, 1) != "]") &&
md.Substring(index - 1, 1) != "#" &&
md.Substring(index - 2, 2) != "# ")
{
Console.WriteLine(name);
Console.WriteLine(md.Substring(index - 10, name.Length + 20).Replace("\n", "\\n"));
Console.WriteLine();
}
index = md.IndexOf(name, index + 1);
}
2018-07-07 23:56:28 +02:00
}
public static IEnumerable<Tuple<string, string>> GetMarkdownLinks(string md)
{
var regex = new Regex("[ \\(](?<file>[a-z_]*?)\\.md#(?<anchor>.*?)[\\n\\)]");
var matches = regex.Matches(md);
2018-07-08 21:33:02 +02:00
foreach (Match match in matches)
2018-07-07 23:56:28 +02:00
{
var file = match.Groups["file"].Value;
var anchor = match.Groups["anchor"].Value;
yield return new Tuple<string, string>(file, anchor);
}
}
2018-07-23 23:57:14 +02:00
public static IEnumerable<string> GetMarkdownUnlinkedRefs(string md)
{
var regex = new Regex("\\[(?<ref>.+?)\\]", RegexOptions.IgnoreCase);
var matches = regex.Matches(md);
md = md.ToLower();
foreach (Match match in matches)
{
var rref = match.Groups["ref"].Value;
var lref = rref.ToLower();
if (!md.Contains($"[{lref}]:") &&
!md.Contains($"[{lref}](") &&
2018-07-24 09:13:23 +02:00
!lref.Contains("]["))
2018-07-23 23:57:14 +02:00
{
yield return rref;
}
}
}
2018-07-08 21:33:02 +02:00
public static IEnumerable<string> GetMarkdownAnchors(string md)
{
foreach (var name in GetMarkdownAnchorNames(md))
{
yield return Helpers.IdFromName(name);
}
}
public static IEnumerable<string> GetMarkdownAnchorNames(string md)
2018-07-07 23:56:28 +02:00
{
2018-08-10 21:41:03 +02:00
var regex = new Regex($"\\n##* (?<name>.*?)\\s*?\\n");
2018-07-07 23:56:28 +02:00
var matches = regex.Matches(md);
foreach (Match match in matches)
{
2018-07-08 21:33:02 +02:00
var name = match.Groups["name"].Value;
2018-07-07 23:56:28 +02:00
yield return name;
}
}
2018-05-28 12:57:15 +02:00
public static string Capitalize(string text)
{
return string.Concat(text.Take(1)).ToUpper() + string.Concat(text.Skip(1)).ToString().ToLower();
}
2018-05-27 01:03:00 +02:00
public static string RemoveDiacritics(string text)
{
if (string.IsNullOrWhiteSpace(text))
return text;
text = text.Normalize(NormalizationForm.FormD);
var chars = text.Where(c => CharUnicodeInfo.GetUnicodeCategory(c) != UnicodeCategory.NonSpacingMark).ToArray();
return new string(chars).Normalize(NormalizationForm.FormC);
}
static string IdFromName(string name)
{
return RemoveDiacritics(name.ToLower().Replace(" ", "-"));
2018-05-24 21:40:16 +02:00
}
2018-05-23 20:28:50 +02:00
private static T LoadJSon<T>(string filename) where T : class
{
var serializer = new DataContractJsonSerializer(typeof(T));
using (var stream = new FileStream(filename, FileMode.Open))
{
return serializer.ReadObject(stream) as T;
}
}
private static void SaveJSon<T>(string filename, T objT) where T : class
{
2018-06-04 21:37:22 +02:00
var settings = new DataContractJsonSerializerSettings { UseSimpleDictionaryFormat = true };
2018-05-23 20:28:50 +02:00
var serializer = new DataContractJsonSerializer(typeof(T));
using (var stream = new FileStream(filename, FileMode.Create))
{
2018-06-04 21:37:22 +02:00
using (var writer = JsonReaderWriterFactory.CreateJsonWriter(stream, Encoding.UTF8, true, true, " "))
{
serializer.WriteObject(writer, objT);
}
2018-05-23 20:28:50 +02:00
}
}
2018-05-27 01:03:00 +02:00
2018-06-23 23:56:13 +02:00
private static async Task SaveStringAsync(string filename, string text)
2018-06-06 20:41:57 +02:00
{
2018-06-23 22:47:10 +02:00
using (var sw = new StreamWriter(path: filename, append: false, encoding: Encoding.UTF8))
{
await sw.WriteAsync(text);
}
}
private static async Task<string> LoadStringAsync(string filename)
{
using (var sr = new StreamReader(filename, Encoding.UTF8))
2018-06-06 20:41:57 +02:00
{
2018-06-23 22:47:10 +02:00
return await sr.ReadToEndAsync();
2018-06-06 20:41:57 +02:00
}
}
2018-05-27 01:03:00 +02:00
private static async Task<IEnumerable<string>> LoadList(string filename)
{
using (var stream = new StreamReader(filename))
{
var lines = new List<string>();
var line = await stream.ReadLineAsync();
while (line != null)
{
2018-06-23 23:56:13 +02:00
if (!string.IsNullOrEmpty(line))
2018-05-27 01:03:00 +02:00
{
lines.Add(line);
}
line = await stream.ReadLineAsync();
}
return lines;
}
}
2018-05-21 21:48:18 +02:00
}
}