using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Text; using UnityEditor; using UnityEngine; namespace jp.lilxyzw.avatarutils { internal static partial class DocsGeneratorMenu { private static int frameCount = 0; private static string currentLang; private static HashSet queue = new(); private static Type[] types; [MenuItem("Help/DocsGenerator/lilAvatarUtils")] private static void Generate() { var sceneView = SceneView.lastActiveSceneView; sceneView.pivot = new(-0.07f, 1.04f, -0.41f); sceneView.rotation = new(-0.00663f, 0.99329f, -0.07495f, -0.08783f); sceneView.size = 0.616483f; currentLang = AvatarUtilsSettings.instance.language; var asms = new HashSet(){Assembly.GetExecutingAssembly()}; types = asms.SelectMany(a => a.GetTypes()).Where(t => t.GetCustomAttribute() != null).ToArray(); var langs = L10n.GetLanguages(); queue.UnionWith(langs); EditorApplication.update += Next; BuildIndexMts(langs); } private static void Next() { EditorApplication.update -= Next; frameCount = 0; windowQueue.Clear(); if(queue.Count > 0) { var lang = queue.First(); queue.Remove(lang); AvatarUtilsSettings.instance.language = lang; L10n.Load(); var path = AssetDatabase.GUIDToAssetPath("f4bbb8506708257469d53648b2e0854f") + "/" + lang + ".po"; var localizationAsset = AssetDatabase.LoadAssetAtPath(path); Func loc = localizationAsset.GetLocalizedString; var code = lang.Replace('-', '_'); var root = $"docs/{code}"; DocsGenerator.Generate( (t) => TypeToPath(root, t), loc, GetHeader, GetTooltip, NeedToDraw, (t,sb) => ActionPerType(t,sb,code), types); BuildHome(root, code, loc); BuildDocsIndex(root, code, loc); BuildIndex(root, code, loc); } else { AvatarUtilsSettings.instance.language = currentLang; } } private static (string,string) GetHeader(FieldInfo field) { var header = field.GetCustomAttribute()?.header; return (header, null); } private static string GetTooltip(FieldInfo field) => field.GetCustomAttribute()?.tooltip; private static bool NeedToDraw(FieldInfo field) => field.GetCustomAttribute() != null || !field.IsNotSerialized && !field.IsStatic && field.IsPublic; private static string TypeToPath(string root, Type type) { return $"{root}/docs/{type.Name}.md"; } private static void WriteText(string path, string text) { var directory = Path.GetDirectoryName(path); if(!Directory.Exists(directory)) Directory.CreateDirectory(directory); File.WriteAllText(path, text, Encoding.UTF8); } private static void WriteBytes(string path, byte[] bytes) { var directory = Path.GetDirectoryName(path); if(!Directory.Exists(directory)) Directory.CreateDirectory(directory); File.WriteAllBytes(path, bytes); } } }