using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; namespace Logof_Client.Wiki; public class WikiService { public WikiService(string wikiRoot = null) { // prefer global wiki storage path if configured if (Global._instance != null && !string.IsNullOrWhiteSpace(Global._instance.wiki_storage_path)) { var cfg = Global._instance.wiki_storage_path; WikiRootFullPath = Path.IsPathRooted(cfg) ? cfg : Path.Combine(Directory.GetCurrentDirectory(), cfg); WikiRoot = WikiRootFullPath; } else { if (wikiRoot == null) wikiRoot = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "logofclient", "wiki"); WikiRoot = wikiRoot; WikiRootFullPath = Path.Combine(Directory.GetCurrentDirectory(), wikiRoot); } } public string WikiRoot { get; } public string WikiRootFullPath { get; } public List GetRootItems() { var list = new List(); if (!Directory.Exists(WikiRootFullPath)) return list; var dirInfo = new DirectoryInfo(WikiRootFullPath); // Add folders foreach (var dir in dirInfo.GetDirectories()) list.Add(BuildFolderItem(dir)); // Add files in root foreach (var file in dirInfo.GetFiles("*.md")) list.Add(new WikiItem { Name = file.Name, Path = file.FullName, IsFolder = false }); return list.OrderBy(i => i.IsFolder ? 0 : 1).ToList(); } private WikiItem BuildFolderItem(DirectoryInfo dir) { var node = new WikiItem { Name = dir.Name, Path = dir.FullName, IsFolder = true }; foreach (var subdir in dir.GetDirectories()) node.Children.Add(BuildFolderItem(subdir)); foreach (var file in dir.GetFiles("*.md")) node.Children.Add(new WikiItem { Name = file.Name, Path = file.FullName, IsFolder = false }); return node; } public Task LoadFileContentAsync(string path) { if (!File.Exists(path)) return Task.FromResult(null); return File.ReadAllTextAsync(path); } }