diff --git a/YaeBlog.Core/Abstractions/IEssayScanService.cs b/YaeBlog.Core/Abstractions/IEssayScanService.cs new file mode 100644 index 0000000..56957c8 --- /dev/null +++ b/YaeBlog.Core/Abstractions/IEssayScanService.cs @@ -0,0 +1,10 @@ +using YaeBlog.Core.Models; + +namespace YaeBlog.Core.Abstractions; + +public interface IEssayScanService +{ + public Task ScanContents(); + + public Task SaveBlogContent(BlogContent content, bool isDraft = true); +} diff --git a/YaeBlog.Core/Extensions/ServiceCollectionExtensions.cs b/YaeBlog.Core/Extensions/ServiceCollectionExtensions.cs index 2b617fa..ab9a02e 100644 --- a/YaeBlog.Core/Extensions/ServiceCollectionExtensions.cs +++ b/YaeBlog.Core/Extensions/ServiceCollectionExtensions.cs @@ -20,12 +20,14 @@ public static class ServiceCollectionExtensions public static IServiceCollection AddYamlParser(this IServiceCollection collection) { - DeserializerBuilder builder = new(); + DeserializerBuilder deserializerBuilder = new(); + deserializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + deserializerBuilder.IgnoreUnmatchedProperties(); + collection.AddSingleton(deserializerBuilder.Build()); - builder.WithNamingConvention(CamelCaseNamingConvention.Instance); - builder.IgnoreUnmatchedProperties(); - - collection.AddSingleton(_ => builder.Build()); + SerializerBuilder serializerBuilder = new(); + serializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + collection.AddSingleton(serializerBuilder.Build()); return collection; } diff --git a/YaeBlog.Core/Extensions/WebApplicationBuilderExtensions.cs b/YaeBlog.Core/Extensions/WebApplicationBuilderExtensions.cs index d469a33..03d4ad0 100644 --- a/YaeBlog.Core/Extensions/WebApplicationBuilderExtensions.cs +++ b/YaeBlog.Core/Extensions/WebApplicationBuilderExtensions.cs @@ -20,7 +20,7 @@ public static class WebApplicationBuilderExtensions builder.Services.AddMarkdig(); builder.Services.AddYamlParser(); builder.Services.AddSingleton(_ => Configuration.Default); - builder.Services.AddSingleton(); + builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(provider => diff --git a/YaeBlog.Core/Models/BlogContent.cs b/YaeBlog.Core/Models/BlogContent.cs index f7999d6..4cf6c22 100644 --- a/YaeBlog.Core/Models/BlogContent.cs +++ b/YaeBlog.Core/Models/BlogContent.cs @@ -4,5 +4,7 @@ public class BlogContent { public required string FileName { get; init; } + public required MarkdownMetadata Metadata { get; init; } + public required string FileContent { get; set; } } diff --git a/YaeBlog.Core/Models/BlogContents.cs b/YaeBlog.Core/Models/BlogContents.cs new file mode 100644 index 0000000..9514903 --- /dev/null +++ b/YaeBlog.Core/Models/BlogContents.cs @@ -0,0 +1,10 @@ +using System.Collections.Concurrent; + +namespace YaeBlog.Core.Models; + +public sealed class BlogContents(ConcurrentBag drafts, ConcurrentBag posts) +{ + public ConcurrentBag Drafts { get; } = drafts; + + public ConcurrentBag Posts { get; } = posts; +} diff --git a/YaeBlog.Core/Processors/ImagePostRenderProcessor.cs b/YaeBlog.Core/Processors/ImagePostRenderProcessor.cs index 0592899..e0f3ab0 100644 --- a/YaeBlog.Core/Processors/ImagePostRenderProcessor.cs +++ b/YaeBlog.Core/Processors/ImagePostRenderProcessor.cs @@ -3,6 +3,7 @@ using AngleSharp.Dom; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using YaeBlog.Core.Abstractions; +using YaeBlog.Core.Exceptions; using YaeBlog.Core.Models; namespace YaeBlog.Core.Processors; @@ -47,12 +48,12 @@ public class ImagePostRenderProcessor(ILogger logger, filename = Path.Combine(essayFilename, filename); } - filename = Path.Combine(_options.Root, filename); + filename = Path.Combine(_options.Root, "posts", filename); if (!Path.Exists(filename)) { logger.LogError("Failed to found image: {}.", filename); - throw new InvalidOperationException(); + throw new BlogFileException($"Image {filename} doesn't exist."); } string imageLink = "api/files/" + filename; diff --git a/YaeBlog.Core/README.md b/YaeBlog.Core/README.md deleted file mode 100644 index 20e3510..0000000 --- a/YaeBlog.Core/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# YaeBlog.Core - -A blog generation totally based on Blazor. - -You can using this to create your blog all in .NET stack! diff --git a/YaeBlog.Core/Services/EssayScanService.cs b/YaeBlog.Core/Services/EssayScanService.cs index b486c8f..5ac4036 100644 --- a/YaeBlog.Core/Services/EssayScanService.cs +++ b/YaeBlog.Core/Services/EssayScanService.cs @@ -1,20 +1,104 @@ using System.Collections.Concurrent; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using YaeBlog.Core.Abstractions; using YaeBlog.Core.Exceptions; using YaeBlog.Core.Models; +using YamlDotNet.Core; +using YamlDotNet.Serialization; namespace YaeBlog.Core.Services; public class EssayScanService( + ISerializer yamlSerializer, + IDeserializer yamlDeserializer, IOptions blogOptions, - ILogger logger) + ILogger logger) : IEssayScanService { private readonly BlogOptions _blogOptions = blogOptions.Value; - public async Task> ScanAsync() + public async Task ScanContents() { - string root = Path.Combine(Environment.CurrentDirectory, _blogOptions.Root); + ValidateDirectory(_blogOptions.Root, out DirectoryInfo drafts, out DirectoryInfo posts); + + return new BlogContents( + await ScanContentsInternal(drafts), + await ScanContentsInternal(posts)); + } + + public async Task SaveBlogContent(BlogContent content, bool isDraft = true) + { + ValidateDirectory(_blogOptions.Root, out DirectoryInfo drafts, out DirectoryInfo posts); + + FileInfo targetFile = isDraft + ? new FileInfo(Path.Combine(drafts.FullName, content.FileName + ".md")) + : new FileInfo(Path.Combine(posts.FullName, content.FileName + ".md")); + + if (targetFile.Exists) + { + logger.LogWarning("Blog {} exists, overriding.", targetFile.Name); + } + + await using StreamWriter writer = targetFile.CreateText(); + + await writer.WriteAsync("---\n"); + await writer.WriteAsync(yamlSerializer.Serialize(content.Metadata)); + await writer.WriteAsync("---\n"); + await writer.WriteAsync("\n"); + } + + private async Task> ScanContentsInternal(DirectoryInfo directory) + { + IEnumerable markdownFiles = from file in directory.EnumerateFiles() + where file.Extension == ".md" + select file; + + ConcurrentBag<(string, string)> fileContents = []; + + await Parallel.ForEachAsync(markdownFiles, async (file, token) => + { + using StreamReader reader = file.OpenText(); + fileContents.Add((file.Name, await reader.ReadToEndAsync(token))); + }); + + ConcurrentBag contents = []; + + await Task.Run(() => + { + foreach ((string filename, string content) in fileContents) + { + int endPos = content.IndexOf("---", 4, StringComparison.Ordinal); + if (!content.StartsWith("---") || endPos is -1 or 0) + { + logger.LogWarning("Failed to parse metadata from {}, skipped.", filename); + return; + } + + string metadataString = content[4..endPos]; + + try + { + MarkdownMetadata metadata = yamlDeserializer.Deserialize(metadataString); + logger.LogDebug("Scan metadata title: '{}' for {}.", metadata.Title, filename); + + contents.Add(new BlogContent + { + FileName = filename[..^3], Metadata = metadata, FileContent = content[(endPos + 3)..] + }); + } + catch (YamlException e) + { + logger.LogWarning("Failed to parser metadata from {} due to {}, skipping", filename, e); + } + } + }); + + return contents; + } + + private void ValidateDirectory(string root, out DirectoryInfo drafts, out DirectoryInfo posts) + { + root = Path.Combine(Environment.CurrentDirectory, root); DirectoryInfo rootDirectory = new(root); if (!rootDirectory.Exists) @@ -22,36 +106,17 @@ public class EssayScanService( throw new BlogFileException($"'{root}' is not a directory."); } - List markdownFiles = []; - - await Task.Run(() => + if (rootDirectory.EnumerateDirectories().All(dir => dir.Name != "drafts")) { - foreach (FileInfo fileInfo in rootDirectory.EnumerateFiles()) - { - if (fileInfo.Extension != ".md") - { - continue; - } + throw new BlogFileException($"'{root}/drafts' not exists."); + } - logger.LogDebug("Scan markdown file: {}.", fileInfo.Name); - markdownFiles.Add(fileInfo); - } - }); - - ConcurrentBag contents = []; - - await Parallel.ForEachAsync(markdownFiles, async (info, token) => + if (rootDirectory.EnumerateDirectories().All(dir => dir.Name != "posts")) { - StreamReader reader = new(info.OpenRead()); + throw new BlogFileException($"'{root}/posts' not exists."); + } - BlogContent content = new() - { - FileName = info.Name.Split('.')[0], FileContent = await reader.ReadToEndAsync(token) - }; - - contents.Add(content); - }); - - return contents.ToList(); + drafts = new DirectoryInfo(Path.Combine(root, "drafts")); + posts = new DirectoryInfo(Path.Combine(root, "posts")); } } diff --git a/YaeBlog.Core/Services/RendererService.cs b/YaeBlog.Core/Services/RendererService.cs index e5b1d96..17e3177 100644 --- a/YaeBlog.Core/Services/RendererService.cs +++ b/YaeBlog.Core/Services/RendererService.cs @@ -7,16 +7,13 @@ using Microsoft.Extensions.Logging; using YaeBlog.Core.Abstractions; using YaeBlog.Core.Exceptions; using YaeBlog.Core.Models; -using YamlDotNet.Core; -using YamlDotNet.Serialization; namespace YaeBlog.Core.Services; public partial class RendererService( ILogger logger, - EssayScanService essayScanService, + IEssayScanService essayScanService, MarkdownPipeline markdownPipeline, - IDeserializer yamlDeserializer, EssayContentService essayContentService) { private readonly Stopwatch _stopwatch = new(); @@ -30,30 +27,30 @@ public partial class RendererService( _stopwatch.Start(); logger.LogInformation("Render essays start."); - List contents = await essayScanService.ScanAsync(); - IEnumerable preProcessedContents = await PreProcess(contents); + BlogContents contents = await essayScanService.ScanContents(); + List posts = contents.Posts.ToList(); + IEnumerable preProcessedContents = await PreProcess(posts); List essays = []; await Task.Run(() => { foreach (BlogContent content in preProcessedContents) { - MarkdownMetadata? metadata = TryParseMetadata(content); uint wordCount = GetWordCount(content); BlogEssay essay = new() { - Title = metadata?.Title ?? content.FileName, + Title = content.Metadata.Title ?? content.FileName, FileName = content.FileName, Description = GetDescription(content), WordCount = wordCount, ReadTime = CalculateReadTime(wordCount), - PublishTime = metadata?.Date ?? DateTime.Now, + PublishTime = content.Metadata.Date ?? DateTime.Now, HtmlContent = content.FileContent }; - if (metadata?.Tags is not null) + if (content.Metadata.Tags is not null) { - essay.Tags.AddRange(metadata.Tags); + essay.Tags.AddRange(content.Metadata.Tags); } essays.Add(essay); @@ -138,45 +135,6 @@ public partial class RendererService( }); } - private MarkdownMetadata? TryParseMetadata(BlogContent content) - { - string fileContent = content.FileContent.Trim(); - - if (!fileContent.StartsWith("---")) - { - return null; - } - - // 移除起始的--- - fileContent = fileContent[3..]; - - int lastPos = fileContent.IndexOf("---", StringComparison.Ordinal); - if (lastPos is -1 or 0) - { - return null; - } - - string yamlContent = fileContent[..lastPos]; - // 返回去掉元数据之后的文本 - lastPos += 3; - content.FileContent = fileContent[lastPos..]; - - try - { - MarkdownMetadata metadata = - yamlDeserializer.Deserialize(yamlContent); - logger.LogDebug("Title: {}, Publish Date: {}.", - metadata.Title, metadata.Date); - - return metadata; - } - catch (YamlException e) - { - logger.LogWarning("Failed to parse '{}' metadata: {}", yamlContent, e); - return null; - } - } - [GeneratedRegex(@"(?enable - - YaeBlog.Core - 0.1.0 - Ricardo Ren - Ricardo Ren - MIT - README.md - - - @@ -32,12 +22,6 @@ - - - - - - diff --git a/YaeBlog.sln b/YaeBlog.sln index c74cbfb..9d88b9d 100644 --- a/YaeBlog.sln +++ b/YaeBlog.sln @@ -14,6 +14,13 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{ .gitea\workflows\build.yaml = .gitea\workflows\build.yaml EndProjectSection EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{753B998C-1B9E-498F-B949-845CE86C4075}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + .gitattributes = .gitattributes + .gitignore = .gitignore + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/YaeBlog/Commands/Binders/BlogOptionsBinder.cs b/YaeBlog/Commands/Binders/BlogOptionsBinder.cs new file mode 100644 index 0000000..9f3cb54 --- /dev/null +++ b/YaeBlog/Commands/Binders/BlogOptionsBinder.cs @@ -0,0 +1,36 @@ +using System.CommandLine.Binding; +using System.Text.Json; +using Microsoft.Extensions.Options; +using YaeBlog.Core.Models; + +namespace YaeBlog.Commands.Binders; + +public sealed class BlogOptionsBinder : BinderBase> +{ + protected override IOptions GetBoundValue(BindingContext bindingContext) + { + bindingContext.AddService>(_ => + { + FileInfo settings = new(Path.Combine(Environment.CurrentDirectory, "appsettings.json")); + if (!settings.Exists) + { + throw new InvalidOperationException("Failed to load YaeBlog configurations."); + } + + using StreamReader reader = settings.OpenText(); + using JsonDocument document = JsonDocument.Parse(reader.ReadToEnd()); + JsonElement root = document.RootElement; + JsonElement optionSection = root.GetProperty(BlogOptions.OptionName); + + BlogOptions? result = optionSection.Deserialize(); + if (result is null) + { + throw new InvalidOperationException("Failed to load YaeBlog configuration in appsettings.json."); + } + + return new OptionsWrapper(result); + }); + + return bindingContext.GetRequiredService>(); + } +} diff --git a/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs b/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs new file mode 100644 index 0000000..b0613c8 --- /dev/null +++ b/YaeBlog/Commands/Binders/EssayScanServiceBinder.cs @@ -0,0 +1,32 @@ +using System.CommandLine.Binding; +using Microsoft.Extensions.Options; +using YaeBlog.Core.Abstractions; +using YaeBlog.Core.Models; +using YaeBlog.Core.Services; +using YamlDotNet.Serialization; +using YamlDotNet.Serialization.NamingConventions; + +namespace YaeBlog.Commands.Binders; + +public sealed class EssayScanServiceBinder : BinderBase +{ + protected override IEssayScanService GetBoundValue(BindingContext bindingContext) + { + bindingContext.AddService(provider => + { + DeserializerBuilder deserializerBuilder = new(); + deserializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + deserializerBuilder.IgnoreUnmatchedProperties(); + + SerializerBuilder serializerBuilder = new(); + serializerBuilder.WithNamingConvention(CamelCaseNamingConvention.Instance); + + IOptions options = provider.GetRequiredService>(); + ILogger logger = provider.GetRequiredService>(); + + return new EssayScanService(serializerBuilder.Build(), deserializerBuilder.Build(), options, logger); + }); + + return bindingContext.GetRequiredService(); + } +} diff --git a/YaeBlog/Commands/Binders/LoggerBinder.cs b/YaeBlog/Commands/Binders/LoggerBinder.cs new file mode 100644 index 0000000..47bd24c --- /dev/null +++ b/YaeBlog/Commands/Binders/LoggerBinder.cs @@ -0,0 +1,18 @@ +using System.CommandLine.Binding; + +namespace YaeBlog.Commands.Binders; + +public sealed class LoggerBinder : BinderBase> +{ + protected override ILogger GetBoundValue(BindingContext bindingContext) + { + bindingContext.AddService(_ => LoggerFactory.Create(builder => builder.AddConsole())); + bindingContext.AddService>(provider => + { + ILoggerFactory factory = provider.GetRequiredService(); + return factory.CreateLogger(); + }); + + return bindingContext.GetRequiredService>(); + } +} diff --git a/YaeBlog/Commands/BlogOptionsBinder.cs b/YaeBlog/Commands/BlogOptionsBinder.cs deleted file mode 100644 index 2641dbd..0000000 --- a/YaeBlog/Commands/BlogOptionsBinder.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System.CommandLine.Binding; -using System.Text.Json; -using YaeBlog.Core.Models; - -namespace YaeBlog.Commands; - -public sealed class BlogOptionsBinder : BinderBase -{ - protected override BlogOptions GetBoundValue(BindingContext bindingContext) - { - FileInfo settings = new(Path.Combine(Environment.CurrentDirectory, "appsettings.json")); - if (!settings.Exists) - { - throw new InvalidOperationException("Failed to load YaeBlog configurations."); - } - - using StreamReader reader = settings.OpenText(); - using JsonDocument document = JsonDocument.Parse(reader.ReadToEnd()); - JsonElement root = document.RootElement; - JsonElement optionSection = root.GetProperty(BlogOptions.OptionName); - - BlogOptions? result = optionSection.Deserialize(); - if (result is null) - { - throw new InvalidOperationException("Failed to load YaeBlog configuration in appsettings.json."); - } - - return result; - } -} diff --git a/YaeBlog/Commands/CommandExtensions.cs b/YaeBlog/Commands/CommandExtensions.cs index b5b0b03..cc025f5 100644 --- a/YaeBlog/Commands/CommandExtensions.cs +++ b/YaeBlog/Commands/CommandExtensions.cs @@ -1,12 +1,15 @@ using System.CommandLine; +using YaeBlog.Commands.Binders; using YaeBlog.Components; using YaeBlog.Core.Extensions; +using YaeBlog.Core.Models; +using YaeBlog.Core.Services; namespace YaeBlog.Commands; public static class CommandExtensions { - public static Command AddServeCommand(this RootCommand rootCommand) + public static void AddServeCommand(this RootCommand rootCommand) { Command serveCommand = new("serve", "Start http server."); rootCommand.AddCommand(serveCommand); @@ -34,11 +37,9 @@ public static class CommandExtensions CancellationToken token = context.GetCancellationToken(); await application.RunAsync(token); }); - - return rootCommand; } - public static Command AddNewCommand(this RootCommand rootCommand) + public static void AddNewCommand(this RootCommand rootCommand) { Command newCommand = new("new", "Create a new blog file and image directory."); rootCommand.AddCommand(newCommand); @@ -46,45 +47,40 @@ public static class CommandExtensions Argument filenameArgument = new(name: "blog name", description: "The created blog filename."); newCommand.AddArgument(filenameArgument); - newCommand.SetHandler(async (file, blogOptions) => + newCommand.SetHandler(async (file, _, _, essayScanService) => + { + await essayScanService.SaveBlogContent(new BlogContent + { + FileName = file, + FileContent = string.Empty, + Metadata = new MarkdownMetadata { Title = file, Date = DateTime.Now } + }); + + Console.WriteLine($"Created new blog '{file}."); + }, filenameArgument, new BlogOptionsBinder(), new LoggerBinder(), + new EssayScanServiceBinder()); + } + + public static void AddListCommand(this RootCommand rootCommand) + { + Command command = new("list", "List all blogs"); + rootCommand.Add(command); + + command.SetHandler(async (_, _, essyScanService) => { - string fileWithExtension; - if (file.EndsWith(".md")) + BlogContents contents = await essyScanService.ScanContents(); + + Console.WriteLine($"All {contents.Posts.Count} Posts:"); + foreach (BlogContent content in contents.Posts) { - fileWithExtension = file; - file = fileWithExtension[..fileWithExtension.LastIndexOf('.')]; - } - else - { - fileWithExtension = file + ".md"; + Console.WriteLine($" - {content.FileName}"); } - DirectoryInfo rootDir = new(Path.Combine(Environment.CurrentDirectory, blogOptions.Root)); - if (!rootDir.Exists) + Console.WriteLine($"All {contents.Drafts.Count} Drafts:"); + foreach (BlogContent content in contents.Drafts) { - throw new InvalidOperationException($"Blog source directory '{blogOptions.Root} doesn't exist."); + Console.WriteLine($" - {content.FileName}"); } - - if (rootDir.EnumerateFiles().Any(f => f.Name == fileWithExtension)) - { - throw new InvalidOperationException($"Target blog '{file}' has been created!"); - } - - FileInfo newBlogFile = new(Path.Combine(rootDir.FullName, fileWithExtension)); - await using StreamWriter newStream = newBlogFile.CreateText(); - - await newStream.WriteAsync($""" - --- - title: {file} - tags: - --- - - """); - - Console.WriteLine($"Created new blog '{file}."); - }, filenameArgument, new BlogOptionsBinder()); - - - return newCommand; + }, new BlogOptionsBinder(), new LoggerBinder(), new EssayScanServiceBinder()); } } diff --git a/YaeBlog/Program.cs b/YaeBlog/Program.cs index fc5acd2..d7c52a1 100644 --- a/YaeBlog/Program.cs +++ b/YaeBlog/Program.cs @@ -5,5 +5,6 @@ RootCommand rootCommand = new("YaeBlog CLI"); rootCommand.AddServeCommand(); rootCommand.AddNewCommand(); +rootCommand.AddListCommand(); await rootCommand.InvokeAsync(args); diff --git a/YaeBlog/source/drafts/test-essay.md b/YaeBlog/source/drafts/test-essay.md new file mode 100644 index 0000000..2eb5d88 --- /dev/null +++ b/YaeBlog/source/drafts/test-essay.md @@ -0,0 +1,6 @@ +--- +title: test-essay +date: 2024-08-22T22:31:34.3177253+08:00 +tags: +--- + diff --git a/YaeBlog/source/2021-final.md b/YaeBlog/source/posts/2021-final.md similarity index 100% rename from YaeBlog/source/2021-final.md rename to YaeBlog/source/posts/2021-final.md diff --git a/YaeBlog/source/2021-final/1.png b/YaeBlog/source/posts/2021-final/1.png similarity index 100% rename from YaeBlog/source/2021-final/1.png rename to YaeBlog/source/posts/2021-final/1.png diff --git a/YaeBlog/source/2022-final.md b/YaeBlog/source/posts/2022-final.md similarity index 100% rename from YaeBlog/source/2022-final.md rename to YaeBlog/source/posts/2022-final.md diff --git a/YaeBlog/source/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.jpg b/YaeBlog/source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.jpg similarity index 100% rename from YaeBlog/source/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.jpg rename to YaeBlog/source/posts/2022-final/2022-12-30-14-26-19-QQ_Image_1672381538441.jpg diff --git a/YaeBlog/source/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.jpg b/YaeBlog/source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.jpg similarity index 100% rename from YaeBlog/source/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.jpg rename to YaeBlog/source/posts/2022-final/2022-12-30-14-28-12-QQ_Image_1672381543836.jpg diff --git a/YaeBlog/source/2022-summer-vacation.md b/YaeBlog/source/posts/2022-summer-vacation.md similarity index 100% rename from YaeBlog/source/2022-summer-vacation.md rename to YaeBlog/source/posts/2022-summer-vacation.md diff --git a/YaeBlog/source/2022-summer-vacation/result1.png b/YaeBlog/source/posts/2022-summer-vacation/result1.png similarity index 100% rename from YaeBlog/source/2022-summer-vacation/result1.png rename to YaeBlog/source/posts/2022-summer-vacation/result1.png diff --git a/YaeBlog/source/2023-final.md b/YaeBlog/source/posts/2023-final.md similarity index 100% rename from YaeBlog/source/2023-final.md rename to YaeBlog/source/posts/2023-final.md diff --git a/YaeBlog/source/2023-final/image-20240303165826486.png b/YaeBlog/source/posts/2023-final/image-20240303165826486.png similarity index 100% rename from YaeBlog/source/2023-final/image-20240303165826486.png rename to YaeBlog/source/posts/2023-final/image-20240303165826486.png diff --git a/YaeBlog/source/archlinux-sop.md b/YaeBlog/source/posts/archlinux-sop.md similarity index 100% rename from YaeBlog/source/archlinux-sop.md rename to YaeBlog/source/posts/archlinux-sop.md diff --git a/YaeBlog/source/big-homework.md b/YaeBlog/source/posts/big-homework.md similarity index 100% rename from YaeBlog/source/big-homework.md rename to YaeBlog/source/posts/big-homework.md diff --git a/YaeBlog/source/big-homework/1.png b/YaeBlog/source/posts/big-homework/1.png similarity index 100% rename from YaeBlog/source/big-homework/1.png rename to YaeBlog/source/posts/big-homework/1.png diff --git a/YaeBlog/source/build-blog-record.md b/YaeBlog/source/posts/build-blog-record.md similarity index 100% rename from YaeBlog/source/build-blog-record.md rename to YaeBlog/source/posts/build-blog-record.md diff --git a/YaeBlog/source/build-blog-record/1.png b/YaeBlog/source/posts/build-blog-record/1.png similarity index 100% rename from YaeBlog/source/build-blog-record/1.png rename to YaeBlog/source/posts/build-blog-record/1.png diff --git a/YaeBlog/source/build-blog-record/2.png b/YaeBlog/source/posts/build-blog-record/2.png similarity index 100% rename from YaeBlog/source/build-blog-record/2.png rename to YaeBlog/source/posts/build-blog-record/2.png diff --git a/YaeBlog/source/c-include-problems.md b/YaeBlog/source/posts/c-include-problems.md similarity index 100% rename from YaeBlog/source/c-include-problems.md rename to YaeBlog/source/posts/c-include-problems.md diff --git a/YaeBlog/source/c-include-problems/1.png b/YaeBlog/source/posts/c-include-problems/1.png similarity index 100% rename from YaeBlog/source/c-include-problems/1.png rename to YaeBlog/source/posts/c-include-problems/1.png diff --git a/YaeBlog/source/c-include-problems/2.png b/YaeBlog/source/posts/c-include-problems/2.png similarity index 100% rename from YaeBlog/source/c-include-problems/2.png rename to YaeBlog/source/posts/c-include-problems/2.png diff --git a/YaeBlog/source/compile-mediapipe.md b/YaeBlog/source/posts/compile-mediapipe.md similarity index 100% rename from YaeBlog/source/compile-mediapipe.md rename to YaeBlog/source/posts/compile-mediapipe.md diff --git a/YaeBlog/source/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.png b/YaeBlog/source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.png similarity index 100% rename from YaeBlog/source/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.png rename to YaeBlog/source/posts/compile-mediapipe/2023-01-15-22-05-41-Screenshot_20230115_220521.png diff --git a/YaeBlog/source/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.png b/YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.png similarity index 100% rename from YaeBlog/source/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.png rename to YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-20-40-Screenshot_20230119_202008.png diff --git a/YaeBlog/source/compile-mediapipe/2023-01-19-20-21-30-Screenshot_20230119_202008.png b/YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-21-30-Screenshot_20230119_202008.png similarity index 100% rename from YaeBlog/source/compile-mediapipe/2023-01-19-20-21-30-Screenshot_20230119_202008.png rename to YaeBlog/source/posts/compile-mediapipe/2023-01-19-20-21-30-Screenshot_20230119_202008.png diff --git a/YaeBlog/source/computer-architecture-pipeline.md b/YaeBlog/source/posts/computer-architecture-pipeline.md similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline.md rename to YaeBlog/source/posts/computer-architecture-pipeline.md diff --git a/YaeBlog/source/computer-architecture-pipeline/image-20240612184855300.png b/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184855300.png similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline/image-20240612184855300.png rename to YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184855300.png diff --git a/YaeBlog/source/computer-architecture-pipeline/image-20240612184949777.png b/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184949777.png similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline/image-20240612184949777.png rename to YaeBlog/source/posts/computer-architecture-pipeline/image-20240612184949777.png diff --git a/YaeBlog/source/computer-architecture-pipeline/image-20240612190426368.png b/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612190426368.png similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline/image-20240612190426368.png rename to YaeBlog/source/posts/computer-architecture-pipeline/image-20240612190426368.png diff --git a/YaeBlog/source/computer-architecture-pipeline/image-20240612192700169.png b/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612192700169.png similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline/image-20240612192700169.png rename to YaeBlog/source/posts/computer-architecture-pipeline/image-20240612192700169.png diff --git a/YaeBlog/source/computer-architecture-pipeline/image-20240612193301372.png b/YaeBlog/source/posts/computer-architecture-pipeline/image-20240612193301372.png similarity index 100% rename from YaeBlog/source/computer-architecture-pipeline/image-20240612193301372.png rename to YaeBlog/source/posts/computer-architecture-pipeline/image-20240612193301372.png diff --git a/YaeBlog/source/daily-linux-0.md b/YaeBlog/source/posts/daily-linux-0.md similarity index 100% rename from YaeBlog/source/daily-linux-0.md rename to YaeBlog/source/posts/daily-linux-0.md diff --git a/YaeBlog/source/daily-linux-0/2023-01-12-13-28-11-Screenshot_20230112_132756.png b/YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-11-Screenshot_20230112_132756.png similarity index 100% rename from YaeBlog/source/daily-linux-0/2023-01-12-13-28-11-Screenshot_20230112_132756.png rename to YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-11-Screenshot_20230112_132756.png diff --git a/YaeBlog/source/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.png b/YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.png similarity index 100% rename from YaeBlog/source/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.png rename to YaeBlog/source/posts/daily-linux-0/2023-01-12-13-28-38-Screenshot_20230112_132829.png diff --git a/YaeBlog/source/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.png b/YaeBlog/source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.png similarity index 100% rename from YaeBlog/source/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.png rename to YaeBlog/source/posts/daily-linux-0/2023-01-12-13-36-45-Screenshot_20230112_133628.png diff --git a/YaeBlog/source/daily-linux-1.md b/YaeBlog/source/posts/daily-linux-1.md similarity index 100% rename from YaeBlog/source/daily-linux-1.md rename to YaeBlog/source/posts/daily-linux-1.md diff --git a/YaeBlog/source/daily-linux-2.md b/YaeBlog/source/posts/daily-linux-2.md similarity index 100% rename from YaeBlog/source/daily-linux-2.md rename to YaeBlog/source/posts/daily-linux-2.md diff --git a/YaeBlog/source/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.jpg b/YaeBlog/source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.jpg similarity index 100% rename from YaeBlog/source/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.jpg rename to YaeBlog/source/posts/daily-linux-2/df4211f6be2724b3b4725f7ce5a4078818844857.jpg diff --git a/YaeBlog/source/daily-linux-2/image-20230702205919301.png b/YaeBlog/source/posts/daily-linux-2/image-20230702205919301.png similarity index 100% rename from YaeBlog/source/daily-linux-2/image-20230702205919301.png rename to YaeBlog/source/posts/daily-linux-2/image-20230702205919301.png diff --git a/YaeBlog/source/daily-linux-2/image-20230720202327220.png b/YaeBlog/source/posts/daily-linux-2/image-20230720202327220.png similarity index 100% rename from YaeBlog/source/daily-linux-2/image-20230720202327220.png rename to YaeBlog/source/posts/daily-linux-2/image-20230720202327220.png diff --git a/YaeBlog/source/daily-linux-3.md b/YaeBlog/source/posts/daily-linux-3.md similarity index 100% rename from YaeBlog/source/daily-linux-3.md rename to YaeBlog/source/posts/daily-linux-3.md diff --git a/YaeBlog/source/daily-linux-3/Screenshot_20230904_144149.png b/YaeBlog/source/posts/daily-linux-3/Screenshot_20230904_144149.png similarity index 100% rename from YaeBlog/source/daily-linux-3/Screenshot_20230904_144149.png rename to YaeBlog/source/posts/daily-linux-3/Screenshot_20230904_144149.png diff --git a/YaeBlog/source/daily-linux-4.md b/YaeBlog/source/posts/daily-linux-4.md similarity index 100% rename from YaeBlog/source/daily-linux-4.md rename to YaeBlog/source/posts/daily-linux-4.md diff --git a/YaeBlog/source/daily-linux-4/Screenshot_20240309_115143.png b/YaeBlog/source/posts/daily-linux-4/Screenshot_20240309_115143.png similarity index 100% rename from YaeBlog/source/daily-linux-4/Screenshot_20240309_115143.png rename to YaeBlog/source/posts/daily-linux-4/Screenshot_20240309_115143.png diff --git a/YaeBlog/source/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.jpg b/YaeBlog/source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.jpg similarity index 100% rename from YaeBlog/source/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.jpg rename to YaeBlog/source/posts/daily-linux-4/cfd17cff0701a8e8c69fecf247f17fc1-1709963611271-2.jpg diff --git a/YaeBlog/source/daily-linux-4/image-20240309130329784.png b/YaeBlog/source/posts/daily-linux-4/image-20240309130329784.png similarity index 100% rename from YaeBlog/source/daily-linux-4/image-20240309130329784.png rename to YaeBlog/source/posts/daily-linux-4/image-20240309130329784.png diff --git a/YaeBlog/source/daily-linux-4/image-20240309131750535.png b/YaeBlog/source/posts/daily-linux-4/image-20240309131750535.png similarity index 100% rename from YaeBlog/source/daily-linux-4/image-20240309131750535.png rename to YaeBlog/source/posts/daily-linux-4/image-20240309131750535.png diff --git a/YaeBlog/source/daily-linux-4/image-20240309134847166.png b/YaeBlog/source/posts/daily-linux-4/image-20240309134847166.png similarity index 100% rename from YaeBlog/source/daily-linux-4/image-20240309134847166.png rename to YaeBlog/source/posts/daily-linux-4/image-20240309134847166.png diff --git a/YaeBlog/source/environment-setting.md b/YaeBlog/source/posts/environment-setting.md similarity index 100% rename from YaeBlog/source/environment-setting.md rename to YaeBlog/source/posts/environment-setting.md diff --git a/YaeBlog/source/environment-setting/6.png b/YaeBlog/source/posts/environment-setting/6.png similarity index 100% rename from YaeBlog/source/environment-setting/6.png rename to YaeBlog/source/posts/environment-setting/6.png diff --git a/YaeBlog/source/genshin-gacha-1.md b/YaeBlog/source/posts/genshin-gacha-1.md similarity index 100% rename from YaeBlog/source/genshin-gacha-1.md rename to YaeBlog/source/posts/genshin-gacha-1.md diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-13-06-36-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-13-06-36-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-06-36-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-13-20-46-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-13-20-46-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-20-46-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-13-21-11-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-13-21-11-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-21-11-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-13-24-26-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-13-24-26-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-13-24-26-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-15-59-20-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-15-59-20-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-20-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-15-59-42-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-15-59-42-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-15-59-42-image.png diff --git a/YaeBlog/source/genshin-gacha-1/2022-12-31-16-00-10-image.png b/YaeBlog/source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.png similarity index 100% rename from YaeBlog/source/genshin-gacha-1/2022-12-31-16-00-10-image.png rename to YaeBlog/source/posts/genshin-gacha-1/2022-12-31-16-00-10-image.png diff --git a/YaeBlog/source/install-pytorch.md b/YaeBlog/source/posts/install-pytorch.md similarity index 100% rename from YaeBlog/source/install-pytorch.md rename to YaeBlog/source/posts/install-pytorch.md diff --git a/YaeBlog/source/install-pytorch/1.png b/YaeBlog/source/posts/install-pytorch/1.png similarity index 100% rename from YaeBlog/source/install-pytorch/1.png rename to YaeBlog/source/posts/install-pytorch/1.png diff --git a/YaeBlog/source/install-pytorch/2.png b/YaeBlog/source/posts/install-pytorch/2.png similarity index 100% rename from YaeBlog/source/install-pytorch/2.png rename to YaeBlog/source/posts/install-pytorch/2.png diff --git a/YaeBlog/source/install-pytorch/3.png b/YaeBlog/source/posts/install-pytorch/3.png similarity index 100% rename from YaeBlog/source/install-pytorch/3.png rename to YaeBlog/source/posts/install-pytorch/3.png diff --git a/YaeBlog/source/install-pytorch/4.png b/YaeBlog/source/posts/install-pytorch/4.png similarity index 100% rename from YaeBlog/source/install-pytorch/4.png rename to YaeBlog/source/posts/install-pytorch/4.png diff --git a/YaeBlog/source/laptop-for-computer.md b/YaeBlog/source/posts/laptop-for-computer.md similarity index 100% rename from YaeBlog/source/laptop-for-computer.md rename to YaeBlog/source/posts/laptop-for-computer.md diff --git a/YaeBlog/source/laptop-for-computer/c.png b/YaeBlog/source/posts/laptop-for-computer/c.png similarity index 100% rename from YaeBlog/source/laptop-for-computer/c.png rename to YaeBlog/source/posts/laptop-for-computer/c.png diff --git a/YaeBlog/source/laptop-for-computer/clion.png b/YaeBlog/source/posts/laptop-for-computer/clion.png similarity index 100% rename from YaeBlog/source/laptop-for-computer/clion.png rename to YaeBlog/source/posts/laptop-for-computer/clion.png diff --git a/YaeBlog/source/laptop-for-computer/csharp.png b/YaeBlog/source/posts/laptop-for-computer/csharp.png similarity index 100% rename from YaeBlog/source/laptop-for-computer/csharp.png rename to YaeBlog/source/posts/laptop-for-computer/csharp.png diff --git a/YaeBlog/source/laptop-for-computer/web.png b/YaeBlog/source/posts/laptop-for-computer/web.png similarity index 100% rename from YaeBlog/source/laptop-for-computer/web.png rename to YaeBlog/source/posts/laptop-for-computer/web.png diff --git a/YaeBlog/source/linux-genshin-cloud.md b/YaeBlog/source/posts/linux-genshin-cloud.md similarity index 100% rename from YaeBlog/source/linux-genshin-cloud.md rename to YaeBlog/source/posts/linux-genshin-cloud.md diff --git a/YaeBlog/source/minecraft-wayland.md b/YaeBlog/source/posts/minecraft-wayland.md similarity index 100% rename from YaeBlog/source/minecraft-wayland.md rename to YaeBlog/source/posts/minecraft-wayland.md diff --git a/YaeBlog/source/minecraft-wayland/image-20240105212744116.png b/YaeBlog/source/posts/minecraft-wayland/image-20240105212744116.png similarity index 100% rename from YaeBlog/source/minecraft-wayland/image-20240105212744116.png rename to YaeBlog/source/posts/minecraft-wayland/image-20240105212744116.png diff --git a/YaeBlog/source/minecraft-wayland/image-20240105213439528.png b/YaeBlog/source/posts/minecraft-wayland/image-20240105213439528.png similarity index 100% rename from YaeBlog/source/minecraft-wayland/image-20240105213439528.png rename to YaeBlog/source/posts/minecraft-wayland/image-20240105213439528.png diff --git a/YaeBlog/source/minecraft-wayland/image-20240105213942445.png b/YaeBlog/source/posts/minecraft-wayland/image-20240105213942445.png similarity index 100% rename from YaeBlog/source/minecraft-wayland/image-20240105213942445.png rename to YaeBlog/source/posts/minecraft-wayland/image-20240105213942445.png diff --git a/YaeBlog/source/parser-combinator-performance.md b/YaeBlog/source/posts/parser-combinator-performance.md similarity index 100% rename from YaeBlog/source/parser-combinator-performance.md rename to YaeBlog/source/posts/parser-combinator-performance.md diff --git a/YaeBlog/source/parser-combinator-performance/image-20240819140523087.png b/YaeBlog/source/posts/parser-combinator-performance/image-20240819140523087.png similarity index 100% rename from YaeBlog/source/parser-combinator-performance/image-20240819140523087.png rename to YaeBlog/source/posts/parser-combinator-performance/image-20240819140523087.png diff --git a/YaeBlog/source/parser-combinator.md b/YaeBlog/source/posts/parser-combinator.md similarity index 100% rename from YaeBlog/source/parser-combinator.md rename to YaeBlog/source/posts/parser-combinator.md diff --git a/YaeBlog/source/parser-combinator/image-20240813214315576.png b/YaeBlog/source/posts/parser-combinator/image-20240813214315576.png similarity index 100% rename from YaeBlog/source/parser-combinator/image-20240813214315576.png rename to YaeBlog/source/posts/parser-combinator/image-20240813214315576.png diff --git a/YaeBlog/source/parser-combinator/image-20240813220521028.png b/YaeBlog/source/posts/parser-combinator/image-20240813220521028.png similarity index 100% rename from YaeBlog/source/parser-combinator/image-20240813220521028.png rename to YaeBlog/source/posts/parser-combinator/image-20240813220521028.png diff --git a/YaeBlog/source/parser-combinator/image-20240813220530717.png b/YaeBlog/source/posts/parser-combinator/image-20240813220530717.png similarity index 100% rename from YaeBlog/source/parser-combinator/image-20240813220530717.png rename to YaeBlog/source/posts/parser-combinator/image-20240813220530717.png diff --git a/YaeBlog/source/program-design-introduction.md b/YaeBlog/source/posts/program-design-introduction.md similarity index 100% rename from YaeBlog/source/program-design-introduction.md rename to YaeBlog/source/posts/program-design-introduction.md diff --git a/YaeBlog/source/program-design-introduction/1.png b/YaeBlog/source/posts/program-design-introduction/1.png similarity index 100% rename from YaeBlog/source/program-design-introduction/1.png rename to YaeBlog/source/posts/program-design-introduction/1.png diff --git a/YaeBlog/source/program-design-introduction/2.png b/YaeBlog/source/posts/program-design-introduction/2.png similarity index 100% rename from YaeBlog/source/program-design-introduction/2.png rename to YaeBlog/source/posts/program-design-introduction/2.png diff --git a/YaeBlog/source/program-design-introduction/3.png b/YaeBlog/source/posts/program-design-introduction/3.png similarity index 100% rename from YaeBlog/source/program-design-introduction/3.png rename to YaeBlog/source/posts/program-design-introduction/3.png diff --git a/YaeBlog/source/qt-learning.md b/YaeBlog/source/posts/qt-learning.md similarity index 100% rename from YaeBlog/source/qt-learning.md rename to YaeBlog/source/posts/qt-learning.md diff --git a/YaeBlog/source/qt-learning/1.png b/YaeBlog/source/posts/qt-learning/1.png similarity index 100% rename from YaeBlog/source/qt-learning/1.png rename to YaeBlog/source/posts/qt-learning/1.png diff --git a/YaeBlog/source/question-in-install-vs-2019.md b/YaeBlog/source/posts/question-in-install-vs-2019.md similarity index 100% rename from YaeBlog/source/question-in-install-vs-2019.md rename to YaeBlog/source/posts/question-in-install-vs-2019.md diff --git a/YaeBlog/source/question-in-install-vs-2019/1.png b/YaeBlog/source/posts/question-in-install-vs-2019/1.png similarity index 100% rename from YaeBlog/source/question-in-install-vs-2019/1.png rename to YaeBlog/source/posts/question-in-install-vs-2019/1.png diff --git a/YaeBlog/source/software-engineer.md b/YaeBlog/source/posts/software-engineer.md similarity index 100% rename from YaeBlog/source/software-engineer.md rename to YaeBlog/source/posts/software-engineer.md diff --git a/YaeBlog/source/software-engineer/image-20240620211321957.png b/YaeBlog/source/posts/software-engineer/image-20240620211321957.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620211321957.png rename to YaeBlog/source/posts/software-engineer/image-20240620211321957.png diff --git a/YaeBlog/source/software-engineer/image-20240620212101864.png b/YaeBlog/source/posts/software-engineer/image-20240620212101864.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620212101864.png rename to YaeBlog/source/posts/software-engineer/image-20240620212101864.png diff --git a/YaeBlog/source/software-engineer/image-20240620214307906.png b/YaeBlog/source/posts/software-engineer/image-20240620214307906.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620214307906.png rename to YaeBlog/source/posts/software-engineer/image-20240620214307906.png diff --git a/YaeBlog/source/software-engineer/image-20240620214739548.png b/YaeBlog/source/posts/software-engineer/image-20240620214739548.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620214739548.png rename to YaeBlog/source/posts/software-engineer/image-20240620214739548.png diff --git a/YaeBlog/source/software-engineer/image-20240620215022645.png b/YaeBlog/source/posts/software-engineer/image-20240620215022645.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620215022645.png rename to YaeBlog/source/posts/software-engineer/image-20240620215022645.png diff --git a/YaeBlog/source/software-engineer/image-20240620220155962.png b/YaeBlog/source/posts/software-engineer/image-20240620220155962.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620220155962.png rename to YaeBlog/source/posts/software-engineer/image-20240620220155962.png diff --git a/YaeBlog/source/software-engineer/image-20240620224318982.png b/YaeBlog/source/posts/software-engineer/image-20240620224318982.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620224318982.png rename to YaeBlog/source/posts/software-engineer/image-20240620224318982.png diff --git a/YaeBlog/source/software-engineer/image-20240620224519243.png b/YaeBlog/source/posts/software-engineer/image-20240620224519243.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240620224519243.png rename to YaeBlog/source/posts/software-engineer/image-20240620224519243.png diff --git a/YaeBlog/source/software-engineer/image-20240621114540033.png b/YaeBlog/source/posts/software-engineer/image-20240621114540033.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240621114540033.png rename to YaeBlog/source/posts/software-engineer/image-20240621114540033.png diff --git a/YaeBlog/source/software-engineer/image-20240623160826903.png b/YaeBlog/source/posts/software-engineer/image-20240623160826903.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240623160826903.png rename to YaeBlog/source/posts/software-engineer/image-20240623160826903.png diff --git a/YaeBlog/source/software-engineer/image-20240623162229404.png b/YaeBlog/source/posts/software-engineer/image-20240623162229404.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240623162229404.png rename to YaeBlog/source/posts/software-engineer/image-20240623162229404.png diff --git a/YaeBlog/source/software-engineer/image-20240623163647935.png b/YaeBlog/source/posts/software-engineer/image-20240623163647935.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240623163647935.png rename to YaeBlog/source/posts/software-engineer/image-20240623163647935.png diff --git a/YaeBlog/source/software-engineer/image-20240623170058679.png b/YaeBlog/source/posts/software-engineer/image-20240623170058679.png similarity index 100% rename from YaeBlog/source/software-engineer/image-20240623170058679.png rename to YaeBlog/source/posts/software-engineer/image-20240623170058679.png diff --git a/YaeBlog/source/spring-boot-custom-authorize.md b/YaeBlog/source/posts/spring-boot-custom-authorize.md similarity index 100% rename from YaeBlog/source/spring-boot-custom-authorize.md rename to YaeBlog/source/posts/spring-boot-custom-authorize.md diff --git a/YaeBlog/source/spring-boot-custom-authorize/image-20230727175807814.png b/YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175807814.png similarity index 100% rename from YaeBlog/source/spring-boot-custom-authorize/image-20230727175807814.png rename to YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175807814.png diff --git a/YaeBlog/source/spring-boot-custom-authorize/image-20230727175955817.png b/YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175955817.png similarity index 100% rename from YaeBlog/source/spring-boot-custom-authorize/image-20230727175955817.png rename to YaeBlog/source/posts/spring-boot-custom-authorize/image-20230727175955817.png diff --git a/YaeBlog/source/update-windows-break-archlinux.md b/YaeBlog/source/posts/update-windows-break-archlinux.md similarity index 100% rename from YaeBlog/source/update-windows-break-archlinux.md rename to YaeBlog/source/posts/update-windows-break-archlinux.md diff --git a/YaeBlog/source/using-vpn-elegant.md b/YaeBlog/source/posts/using-vpn-elegant.md similarity index 100% rename from YaeBlog/source/using-vpn-elegant.md rename to YaeBlog/source/posts/using-vpn-elegant.md diff --git a/YaeBlog/source/vscode-in-browser.md b/YaeBlog/source/posts/vscode-in-browser.md similarity index 100% rename from YaeBlog/source/vscode-in-browser.md rename to YaeBlog/source/posts/vscode-in-browser.md diff --git a/YaeBlog/source/vscode-in-browser/1.png b/YaeBlog/source/posts/vscode-in-browser/1.png similarity index 100% rename from YaeBlog/source/vscode-in-browser/1.png rename to YaeBlog/source/posts/vscode-in-browser/1.png diff --git a/YaeBlog/source/vscode-in-browser/2.png b/YaeBlog/source/posts/vscode-in-browser/2.png similarity index 100% rename from YaeBlog/source/vscode-in-browser/2.png rename to YaeBlog/source/posts/vscode-in-browser/2.png diff --git a/YaeBlog/source/whats-new-of-dotnet-8.md b/YaeBlog/source/posts/whats-new-of-dotnet-8.md similarity index 100% rename from YaeBlog/source/whats-new-of-dotnet-8.md rename to YaeBlog/source/posts/whats-new-of-dotnet-8.md diff --git a/YaeBlog/source/whats-new-of-dotnet-8/AOTOptimizations4.png b/YaeBlog/source/posts/whats-new-of-dotnet-8/AOTOptimizations4.png similarity index 100% rename from YaeBlog/source/whats-new-of-dotnet-8/AOTOptimizations4.png rename to YaeBlog/source/posts/whats-new-of-dotnet-8/AOTOptimizations4.png diff --git a/YaeBlog/source/whats-new-of-dotnet-8/image-20231122100930849.png b/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122100930849.png similarity index 100% rename from YaeBlog/source/whats-new-of-dotnet-8/image-20231122100930849.png rename to YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122100930849.png diff --git a/YaeBlog/source/whats-new-of-dotnet-8/image-20231122101012416.png b/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101012416.png similarity index 100% rename from YaeBlog/source/whats-new-of-dotnet-8/image-20231122101012416.png rename to YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101012416.png diff --git a/YaeBlog/source/whats-new-of-dotnet-8/image-20231122101142080.png b/YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101142080.png similarity index 100% rename from YaeBlog/source/whats-new-of-dotnet-8/image-20231122101142080.png rename to YaeBlog/source/posts/whats-new-of-dotnet-8/image-20231122101142080.png diff --git a/YaeBlog/source/wsl-setup-csapp.md b/YaeBlog/source/posts/wsl-setup-csapp.md similarity index 100% rename from YaeBlog/source/wsl-setup-csapp.md rename to YaeBlog/source/posts/wsl-setup-csapp.md diff --git a/YaeBlog/source/wsl-setup-csapp/1.png b/YaeBlog/source/posts/wsl-setup-csapp/1.png similarity index 100% rename from YaeBlog/source/wsl-setup-csapp/1.png rename to YaeBlog/source/posts/wsl-setup-csapp/1.png diff --git a/YaeBlog/source/wsl-setup-csapp/2.png b/YaeBlog/source/posts/wsl-setup-csapp/2.png similarity index 100% rename from YaeBlog/source/wsl-setup-csapp/2.png rename to YaeBlog/source/posts/wsl-setup-csapp/2.png diff --git a/YaeBlog/source/wsl-setup-csapp/3.png b/YaeBlog/source/posts/wsl-setup-csapp/3.png similarity index 100% rename from YaeBlog/source/wsl-setup-csapp/3.png rename to YaeBlog/source/posts/wsl-setup-csapp/3.png